5 간단한 팁으로 리눅스 서버 보호하기

리눅스 서버는 현대 인터넷의 중추입니다. 오늘날 웹 브라우저를 통해 접근할 수 있는 거의 모든 웹사이트와 서비스는 리눅스 배포판에서 실행됩니다. 여기서 리눅스 서버를 안전하게 보호하는 방법을 보여드립니다.
목차
- 루트 SSH 접근 제거
- SSH 접근을 위한 공개 키 쌍 사용
- 리눅스 서버의 방화벽 강화
- 모든 서비스에 대한 새로운 사용자 생성
- 서버의 커널 강화
- 자주 묻는 질문
주의: 이 튜토리얼은 우분투 서버를 사용해 작성되었지만, 다른 리눅스 배포판 및 로컬 웹 서버에도 적용될 수 있습니다.
1. 루트 SSH 접근 제거
우분투 서버를 보호하는 가장 빠른 방법 중 하나는 루트 SSH 접근을 비활성화하여 SSH 데몬을 보호하는 것입니다. 기본적으로 OpenSSH 서버는 모든 들어오는 연결이 루트 사용자로 로그인할 수 있도록 허용합니다.
예를 들어, 보안이 취약한 서버에서 다음 명령을 실행하면 로그인 프롬프트가 제공됩니다:

이것은 문제를 야기할 수 있습니다. 왜냐하면 이는 비밀번호 무작위 대입 공격에 취약한 서버를 열어 두기 때문입니다. 이를 해결하려면 리눅스 서버에 로그인하고 SSH 데몬의 구성 파일을 업데이트합니다.
리눅스 서버에 들어가면 SSH 구성 파일을 수정합니다:
sudonano/etc/ssh/sshd_config
GNU Nano에서 Ctrl + W를 눌러 PermitRootLogin 변수를 검색하고 PermitRootLogin을 입력합니다.

PermitRootLogin 값을 “yes”에서 “no”로 변경한 후 Ctrl + o를 눌러 파일을 저장하고 Ctrl + x를 눌러 종료합니다.
새 설정을 적용하려면 systemctl을 통해 서버의 SSH 데몬을 다시 시작합니다:
sudo systemctl restart ssh
2. SSH 접근을 위한 공개 키 쌍 사용
리눅스 서버를 보호하는 또 다른 빠른 방법은 로컬 및 SSH 사용자 계정 간에 공개 키 쌍을 생성하는 것입니다. 이 접근법은 비밀번호 로그인 프로세스를 건너뛰고 자동으로 원격 서버에 인증합니다.
공개 키 쌍을 생성하려면 먼저 로컬 머신에서 다음 명령을 실행해야 합니다:
ssh-keygenkeygen 프로그램이 만들고자 하는 키에 대한 여러 세부정보를 요청할 것입니다. 이 옵션들은 기본값으로 안전하게 유지할 수 있으며, Enter를 세 번 눌러 계속 진행합니다.

ssh-copy-id 프로그램을 사용하여 새로운 공개 키 쌍을 원격 서버로 내보냅니다. 이것은 SSH를 통한 공개 키 인증을 위해 로컬 및 원격 머신을 준비하는 간단한 유틸리티입니다.
ssh-copy-id [email protected]
다음 명령을 실행하여 원격 머신에 로그인합니다:
SSH에서 로그인 프롬프트를 제거하여 리눅스 서버를 추가로 보호할 수도 있습니다. 다음 명령을 사용하여 데몬의 구성 파일을 엽니다:
sudonano/etc/ssh/sshd_configPasswordAuthentication 변수를 찾아 값을 “yes”에서 “no”로 변경합니다.

다음 명령을 실행하여 SSH 데몬을 다시 로드합니다:
sudo systemctl restart sshd3. 리눅스 서버의 방화벽 강화
SSH 접근 제한 외에도 방화벽을 구성하여 리눅스 서버의 보안을 향상시킬 수 있습니다. 기본적으로 새로운 리눅스 머신은 모든 포트에서 모든 들어오는 연결을 수락합니다.
이는 문제가 될 수 있으며, 이는 서버를 포트 스캔 공격에 취약하게 만듭니다. 예를 들어, 악의적인 사용자가 귀하의 머신을 스캔하여 보안이 취약한 포트를 찾고 이를 이용하여 적절한 공격을 감행할 수 있습니다.

이를 해결하는 방법 중 하나는 ufw를 설치하는 것입니다. ufw는 외부 세계에서 사용할 수 있는 포트와 주소를 제어할 수 있는 간단한 방화벽 클라이언트입니다.
우분투에 ufw를 설치하려면 다음 명령을 실행합니다:
sudo apt install ufw
ufw의 기본 규칙을 설정합니다. 이는 사용자 지정하지 않은 모든 포트에 대해 방화벽이 따를 정책입니다. 모든 들어오는 연결을 차단하는 것이 좋습니다:
sudo ufw default deny incoming
sudo ufw default allow outgoing
머신에서 실행할 서비스에 대해 방화벽을 구성합니다. 예를 들어, 다음 명령을 실행하면 SSH로 로그인하고 웹 서버를 호스팅할 수 있습니다:
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443마지막으로, sudo ufw enable 명령을 실행하여 새로운 방화벽 구성을 활성화합니다. 또한 다음 명령을 실행하여 방화벽이 활성화되어 있는지 확인할 수 있습니다:
sudo ufw status
4. 모든 서비스에 대한 새로운 사용자 생성
기본적으로 리눅스 시스템의 모든 파일과 프로그램은 특정 사용자 및 그룹에 속합니다. 시스템을 수정하려면 올바른 폴더에 대한 권한이 필요합니다.
리눅스 서버의 보안을 강화하는 방법 중 하나는 새로운 서비스마다 새로운 사용자 계정을 생성하는 것입니다. 이 접근 방식은 각 서비스의 권한을 해당 사용자 계정으로 제한할 수 있습니다.

이를 위해 다음 명령을 실행합니다:
sudo useradd -s/bin/bash-d/home/new-service -m-Gsudo new-service
sudopasswd new-service-s플래그는 새로운 사용자 계정의 시스템 셸을 설정합니다. 제 경우, 신규 계정은 Bash를 셸로 사용합니다.-d및-m플래그는 새로운 계정의 기본 사용자 디렉토리를 설정합니다.- 반면
-G플래그는 지정한 보조 그룹에 새로운 계정을 추가합니다. 예를 들어, sudo 그룹에 새로운 계정을 추가하면 슈퍼유저 명령을 실행할 수 있습니다. passwd명령은 새로운 사용자 계정에 대한 새 비밀번호를 설정할 수 있게 해줍니다.
완료되면 현재 계정을 로그오프하거나 su new-service 명령을 실행하여 새로운 사용자 계정을 사용할 수 있습니다.

5. 서버의 커널 강화
커널은 리눅스 시스템에서 가장 중요한 부분 중 하나로, 머신의 하드웨어와 소프트웨어를 연결하는 역할을 합니다. 예를 들어, 자신만의 리눅스 커널을 컴파일하여 특이한 하드웨어 및 기능에 대한 지원을 활성화할 수 있습니다.

그 외에도 커널은 운영 체제의 루트 프로세스로서의 역할을 수행합니다. 커널을 보호하는 것은 리눅스 서버를 보호하는데 있어 가장 중요한 부분 중 하나입니다.
커널을 보호하는 가장 빠른 방법 중 하나는 sysctl을 사용하는 것입니다. 이는 리눅스 커널의 런타임 옵션을 조정할 수 있게 해주는 내장 유틸리티입니다.

그러나 sysctl은 전체 커널 강화 프로세스를 다루지 않으므로, 커널의 보안 수준은 필요한 사항에 따라 달라질 수 있습니다.
이러한 점을 인지하고, 다음 명령을 실행하여 커널이 진단 정보를 보고하지 못하도록 설정할 수 있습니다:
sudo sysctl kernel.kptr_restrict=2
sudo sysctl kernel.dmesg_restrict=1
sudo sysctl kernel.kexec_load_disabled=1
서버로 보내는 가짜 연결 요청을 접수할 수 없도록 커널에 지시하는 다음 명령도 실행할 수 있습니다:
sudo sysctl net.ipv4.tcp_syncookies=1
sudo sysctl net.ipv4.tcp_rfc1337=1
또한, 다음 명령을 실행하면 커널이 들어오는 각 연결을 검증하도록 강제할 수 있습니다:
sudo sysctl net.ipv4.conf.all.rp_filter=1
sudo sysctl net.ipv4.conf.default.rp_filter=1
마지막으로, 다음 명령 세트를 사용하면 어떤 들어오는 연결도 네트워크 트래픽을 다른 게이트웨이로 리디렉션할 수 없도록 막을 수 있습니다. 이렇게 하면 미들맨 공격에 휘말리는 것을 방지할 수 있습니다.
sudo sysctl net.ipv4.conf.all.accept_redirects=0
sudo sysctl net.ipv4.conf.default.accept_redirects=0
sudo sysctl net.ipv4.conf.all.secure_redirects=0
sudo sysctl net.ipv4.conf.default.secure_redirects=0
sudo sysctl net.ipv6.conf.all.accept_redirects=0
sudo sysctl net.ipv6.conf.default.accept_redirects=0
sudo sysctl net.ipv4.conf.all.send_redirects=0
sudo sysctl net.ipv4.conf.default.send_redirects=0
팁: 위의 팁 외에도 리눅스 서버를 보호하기 위해 이러한 오픈 소스 도구도 활용할 수 있습니다.
자주 묻는 질문
로컬 머신을 잃어버렸습니다. SSH를 통해 우분투 서버에 로그인할 수 있나요?
대부분의 경우, 공개 키 인증만 사용하는 경우 SSH를 통해 로그인하는 것은 불가능합니다. 그러나 PasswordAuthentication 변수를 비활성화하지 않았다면 SSH 프롬프트에 접근할 수 있는 가능성은 여전히 존재합니다.
그 외에는 물리적으로 머신에 접근하여 “/etc/ssh/sshd_config”를 업데이트하거나 VPS 제공업체의 루트 콘솔에 접근할 수 있습니다.
제 서버는 iptables와 ufw를 모두 가지고 있습니다. 방화벽을 위해 두 가지 모두 구성해야 하나요?
아니요! iptables와 ufw는 동일한 주소 범위와 포트를 제어하는 방화벽 소프트웨어입니다. 리눅스 서버에서 작동하는 방화벽을 갖기 위해서는 둘 중 하나만 구성하면 됩니다.
제가 만든 사용자의 슈퍼유저 권한을 제거할 수 있나요?
네! 기존 사용자를 그룹에서 제거하는 것은 가능합니다. usermod 유틸리티를 사용하세요. 예를 들어, usermod -G video new-service를 실행하면 “new-service” 사용자가 “sudo” 그룹에서 제거되고 “video” 그룹에 추가됩니다.
이미지 출처: Unsplash. 모든 수정 및 스크린샷 제공: Ramces Red.