가상 서버(VPS)를 운영할 때 가장 중요한 요소 중 하나는 바로 보안입니다. 보안이 제대로 설정되지 않은 서버는 해킹, 데이터 유출, 시스템 손상 등의 위험에 노출되기 쉽습니다. 하지만 기본적인 보안 조치만으로도 이러한 위험을 상당 부분 예방할 수 있습니다. 이번 글에서는 VPS의 보안을 강화하기 위한 주요 설정을 하나씩 살펴보겠습니다. 이 글을 통해 서버를 더욱 안전하게 운영하는 방법을 알아보세요.
1. SSH 보안 강화
SSH는 서버에 원격으로 접속할 때 사용하는 프로토콜로, 그만큼 보안 강화가 필수입니다. 비밀번호로만 SSH 접속을 허용하는 것은 보안에 큰 취약점이 될 수 있습니다. 대안으로 SSH 키를 사용하는 방법이 있습니다.
1.1 비밀번호 대신 SSH 키 사용하기
SSH 키는 비밀번호보다 안전하며, 무작위 대입 공격에 더 강력한 방어막을 제공합니다.
1. 로컬 컴퓨터에서 SSH 키를 생성합니다:
ssh-keygen -t rsa -b 4096
2. 생성된 공개 키를 서버에 업로드합니다:
ssh-copy-id user@your_server_ip
3. 서버에서 비밀번호 인증을 비활성화합니다:
sudo nano /etc/ssh/sshd_config
여기서 `PasswordAuthentication no`로 설정한 후 저장합니다.
4. SSH 서비스를 재시작합니다:
sudo systemctl restart ssh
1.2 SSH 포트 변경하기
기본적으로 SSH는 포트 22번을 사용하지만, 이를 변경하면 무작위 대입 공격을 어느 정도 피할 수 있습니다.
1. `/etc/ssh/sshd_config` 파일에서 포트를 수정합니다:
sudo nano /etc/ssh/sshd_config
예를 들어, 포트를 2222로 변경할 수 있습니다:
Port 2222
2. 방화벽에서 새로운 포트를 열어줍니다:
sudo ufw allow 2222/tcp
3. SSH 서비스를 재시작합니다:
sudo systemctl restart ssh
2. 방화벽 설정(UFW)
방화벽은 외부로부터 서버를 보호하는 기본적인 도구입니다. Ubuntu에서는 `UFW(Uncomplicated Firewall)`를 사용하여 쉽게 방화벽을 설정할 수 있습니다.
UFW 설치 및 설정
1. UFW를 설치합니다:
sudo apt install ufw
2. SSH, HTTP, HTTPS 포트만 열어둡니다:
sudo ufw allow 2222/tcp # SSH 포트
sudo ufw allow 80/tcp # HTTP 포트
sudo ufw allow 443/tcp # HTTPS 포트
3. 방화벽을 활성화합니다:
sudo ufw enable
4. 방화벽 상태를 확인합니다:
sudo ufw status
3. Fail2Ban 설치
서버가 무차별 대입 공격을 당할 경우, `Fail2Ban`을 설치하면 공격자의 IP를 차단할 수 있습니다. 이 툴은 서버의 로그를 분석해 의심스러운 활동을 감지하고 자동으로 차단해줍니다.
Fail2Ban 설정하기
1. Fail2Ban을 설치합니다:
sudo apt install fail2ban
2. SSH 공격을 방어하도록 설정 파일을 수정합니다:
sudo nano /etc/fail2ban/jail.local
아래와 같은 내용을 추가합니다:
[sshd]
enabled = true
port = 2222
maxretry = 5
findtime = 600
bantime = 3600
3. 서비스를 재시작합니다:
sudo systemctl restart fail2ban
4. 자동 업데이트 설정
서버의 보안을 유지하는 또 다른 중요한 요소는 보안 패치입니다. 보안 취약점을 빠르게 패치하는 것은 해커로부터 서버를 보호하는 데 필수적입니다. 이를 위해 자동 업데이트를 설정하는 방법을 살펴보겠습니다.
1. 자동 업데이트 패키지를 설치합니다:
sudo apt install unattended-upgrades
2. 설정 파일을 편집하여 자동 업데이트를 활성화합니다:
sudo dpkg-reconfigure --priority=low unattended-upgrades
5. 루트 계정으로 SSH 접속 비활성화
루트 계정으로 직접 SSH에 접속하는 것은 보안상 매우 위험합니다. 일반 계정을 사용한 후 필요한 경우 `sudo` 명령어로 루트 권한을 얻는 방식이 더 안전합니다.
1. `/etc/ssh/sshd_config` 파일을 수정하여 루트 계정 접속을 금지합니다:
sudo nano /etc/ssh/sshd_config
아래의 설정을 찾고 수정합니다:
PermitRootLogin no
2. SSH 서비스를 재시작합니다:
sudo systemctl restart ssh
루트 계정으로 직접 SSH에 접속하는 것이 보안상 매우 위험한 이유
- 무차별 대입 공격(Brute Force Attack)의 표적이 되기 쉬움: 루트 계정은 모든 서버에서 기본적으로 존재하는 계정입니다. 공격자는 서버에 접근하려고 할 때 가장 먼저 루트 계정을 시도하는 경우가 많습니다. 공격자가 무작위로 비밀번호를 대입하는 브루트포스 공격을 통해 루트 계정에 접근할 수 있는 위험이 커집니다.
- 모든 시스템 권한을 즉시 획득 가능: 루트 계정은 시스템 전체에 대한 최고 권한을 가지고 있기 때문에, 공격자가 루트 계정에 접근할 경우 시스템의 모든 파일, 설정, 데이터에 무제한적으로 접근할 수 있습니다. 이는 시스템의 완전한 통제권을 넘기는 것과 같아서 매우 치명적일 수 있습니다.
- 권한 관리의 부재: 루트 계정은 모든 권한을 가진 상태로 작업을 수행하므로 실수로 중요한 시스템 파일을 삭제하거나 손상시킬 위험이 높습니다. 반면, 일반 계정을 사용하면 필요한 경우에만 `sudo` 명령어로 권한을 얻을 수 있어, 불필요한 시스템 변경을 방지할 수 있습니다.
- 보안 사고 시 추적 어려움: 루트 계정으로 직접 접속하면 누가 어떤 작업을 했는지 기록을 남기기가 어렵습니다. 여러 사용자가 루트 계정을 사용할 경우, 시스템에서 발생한 문제의 책임자를 파악하는 데 어려움이 생깁니다. 반면, 일반 계정과 `sudo` 명령어를 사용하면 각 사용자의 작업 로그가 남기 때문에 추적이 용이합니다.
- 기본적인 보안 설정 부족: 대부분의 보안 가이드에서는 루트 계정의 직접 접속을 비활성화할 것을 권장합니다. 이를 무시할 경우, 기본적인 보안 취약점이 될 수 있으며, 서버가 공격에 노출될 가능성이 커집니다.
이러한 이유들로 인해, 루트 계정으로의 직접 SSH 접속을 차단하고, 일반 계정을 통한 접속 후 필요할 때만 `sudo` 명령어로 권한을 얻는 방식이 보안상 훨씬 안전합니다.
6. 서버 모니터링 도구 설치
서버의 상태를 지속적으로 모니터링하는 것도 보안을 유지하는 중요한 요소입니다. Fail2Ban 로그와 같은 기본 로그부터, CPU, 메모리, 네트워크 사용량 등을 모니터링하는 도구도 유용합니다.
Netdata 설치하기
`Netdata`는 실시간 모니터링 도구로, CPU, 메모리, 트래픽 등을 시각화하여 확인할 수 있습니다.
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
7. 보안 업데이트 확인
정기적으로 보안 패치를 확인하고 적용하는 것은 서버 보안 유지에 필수적입니다.
업데이트 확인 및 설치
업데이트를 확인하고 적용합니다:
sudo apt update && sudo apt upgrade
8. 로그 확인
로그 파일을 정기적으로 확인하여 서버에 이상이 없는지 살펴보는 것도 중요합니다. 예를 들어, SSH 로그인 시도를 확인할 수 있는 로그는 다음과 같은 명령어로 확인할 수 있습니다.
sudo cat /var/log/auth.log
결론: 보안이 곧 안정적인 서버 운영의 핵심입니다
지금까지 살펴본 보안 설정들은 서버 운영 시 필수적인 요소들입니다. 특히 SSH 보안, 방화벽 설정, 그리고 자동 업데이트는 기본 중의 기본이라고 할 수 있습니다. 이러한 조치를 제대로 취한다면 서버의 보안을 크게 향상시킬 수 있습니다. 서버가 언제나 공격의 대상이 될 수 있다는 사실을 인지하고, 꾸준히 보안 점검을 하는 것이 중요합니다. 여러분도 오늘부터 서버의 보안을 강화해보세요!