SSH 보안 강화: 🔒 안전한 원격 접속 설정 A to Z
얼마 전, 새벽에 홈서버에 접속하려다 윈도우 미니 PC의 이벤트 로그에 수십 건의 SSH 접속 실패 기록이 찍힌 것을 발견했습니다. IP를 추적해보니 해외 IP들이었습니다. 즉시 SSH 보안 설정을 점검하고 강화하기로 결심했습니다. 이 글에서는 제가 직접 적용한 SSH 보안 강화 방법들을 공유합니다. 급한 분들을 위해 30초 안에 점검할 사항부터 먼저 확인해보겠습니다.
30초 안에 체크해야 할 3가지: 1) SSH 포트가 기본 포트(22번)인지 확인하고, 2) root 계정의 SSH 접속이 허용되어 있는지 확인하고, 3) 비밀번호 인증 방식만 사용하고 있는지 확인해야 합니다. 이 중 하나라도 해당된다면 즉시 아래 설정을 변경해야 합니다.
SSH 포트 변경의 중요성
SSH는 서버 관리에 필수적인 원격 접속 프로토콜입니다. 하지만 기본 포트인 22번을 그대로 사용할 경우, 무작위 대입 공격(Brute-force attack)에 노출될 위험이 큽니다. 실제 제 서버 로그에도 22번 포트로의 접속 시도가 꾸준히 발생하고 있었습니다. 따라서 SSH 포트 변경은 가장 기본적인 보안 강화 방법 중 하나입니다. 하지만 이것만으로는 완벽한 보안을 보장할 수 없다는 점을 명심해야 합니다.

포트 변경은 10분 내외로 완료할 수 있지만, 방화벽 설정 변경이 필요합니다. 포트 스캔에 취약하다는 단점도 있습니다. 그럼에도 불구하고 자동화된 공격 시도를 줄이는 데 효과적입니다.
SSH 포트 변경 방법
먼저 SSH 설정 파일인 `/etc/ssh/sshd_config` 파일을 엽니다. 터미널에서 `sudo nano /etc/ssh/sshd_config` 명령어를 사용하면 됩니다. 파일 안에서 `#Port 22` 부분을 찾아서 주석을 해제하고 원하는 포트 번호로 변경합니다. 예를 들어, 9022번 포트를 사용하려면 `Port 9022`로 수정합니다. 1024 미만의 포트는 시스템 예약 포트이므로 피하고, 1024~65535 사이의 사용하지 않는 포트를 선택하는 것이 좋습니다.
다음으로, 방화벽 설정을 변경해야 합니다. `sudo ufw allow 9022` 명령어를 사용하여 9022번 포트를 열어줍니다. SELinux가 활성화된 경우, `sudo semanage port -a -t ssh_port_t -p tcp 9022` 명령어를 사용하여 SELinux 설정을 변경해야 합니다. 마지막으로, SSH 데몬을 재시작합니다. `sudo systemctl restart sshd` 명령어를 사용하면 됩니다. 변경 사항 적용 후에는 반드시 새로운 포트로 SSH 접속이 가능한지 확인해야 합니다. 저는 처음에 방화벽 설정을 빼먹어서 1시간 동안 삽질했습니다.
SSH 키 인증 설정: 비밀번호 없는 안전한 접속
비밀번호 인증은 아무리 복잡하게 설정해도 무작위 대입 공격에 취약합니다. SSH 키 인증은 공개키 암호 방식을 사용하여 비밀번호 없이 안전하게 접속할 수 있도록 해줍니다. RSA 키를 사용하는 경우 최소 3072비트 이상, 가능하다면 4096비트의 키 길이를 권장하며, 모든 기기가 지원한다면 ed25519 키를 사용하는 것이 좋습니다. 2025년에는 ed25519 알고리즘을 사용하는 것이 권장된다고 합니다.
키 관리의 필요성과 초기 설정의 복잡성 때문에 SSH 키 인증 설정이 다소 번거로울 수 있습니다. 하지만 비밀번호 노출 위험을 줄여 보안을 크게 강화할 수 있습니다. 키 분실 시 접속이 불가능해지므로, 키 관리에 주의해야 합니다.
SSH 키 인증 설정 방법
먼저 로컬 PC에서 SSH 키를 생성합니다. 터미널에서 `ssh-keygen -t ed25519` 명령어를 실행합니다. 키 저장 위치와 비밀 문구를 입력하라는 메시지가 나타나는데, 비밀 문구는 선택 사항입니다. 키가 생성되면 공개키 파일(~/.ssh/id_ed25519.pub)을 서버에 복사해야 합니다. `ssh-copy-id -i ~/.ssh/id_ed25519.pub 사용자계정@서버주소` 명령어를 사용하면 됩니다. 서버에 접속하여 `~/.ssh/authorized_keys` 파일에 공개키 내용이 추가되었는지 확인합니다.

다음으로, SSH 설정 파일을 수정합니다. `/etc/ssh/sshd_config` 파일에서 `PasswordAuthentication yes` 부분을 `PasswordAuthentication no`로 변경하여 비밀번호 인증을 비활성화합니다. `PubkeyAuthentication yes` 와 `AuthorizedKeysFile .ssh/authorized_keys` 설정이 활성화되어 있는지 확인합니다. SSH 데몬을 재시작하여 변경 사항을 적용합니다. 이제 비밀번호 없이 SSH 키로만 접속할 수 있습니다.
Root 계정 SSH 접속 제한: 관리자 권한 보호
root 계정으로 직접 SSH 접속을 허용하는 것은 매우 위험합니다. root 계정이 탈취당할 경우 시스템 전체가 위험에 노출될 수 있습니다. 따라서 sudo 권한을 가진 일반 계정을 생성하여 관리하고, root 계정의 SSH 접속을 제한하는 것이 좋습니다.
root 계정 접속 제한은 간단하지만, 관리자 권한으로의 무분별한 접근을 방지하여 보안을 강화합니다.
Root 계정 SSH 접속 제한 방법
`/etc/ssh/sshd_config` 파일을 열어서 `PermitRootLogin yes` 부분을 `PermitRootLogin no`로 변경합니다. SSH 데몬을 재시작하여 변경 사항을 적용합니다. 이제 root 계정으로는 SSH 접속이 불가능하며, sudo 권한을 가진 일반 계정을 통해 관리 작업을 수행해야 합니다. 저는 처음에 이 설정을 안 했다가 해킹 시도에 노출될 뻔했습니다.
Fail2ban 설치 및 설정: 자동 IP 차단 시스템
Fail2ban은 비정상적인 로그인 시도를 감지하고, 악성 IP 주소를 자동으로 차단하는 프로그램입니다. SSH 뿐만 아니라 FTP, HTTP 등 다양한 서비스에 대한 공격을 방어할 수 있습니다. Fail2ban을 설치하면 서버의 보안 수준을 크게 향상시킬 수 있습니다. 특히 OpenSSH 취약점(CVE-2024-6387)과 같이 알려진 취약점을 악용한 공격을 방어하는 데 유용합니다.

Fail2ban은 초기 설정이 다소 복잡하지만, 자동화된 공격 방어 시스템을 구축할 수 있습니다. 잘못된 설정은 정상적인 접속까지 차단할 수 있으므로, 주의해야 합니다.
Fail2ban 설치 및 설정 방법
먼저 Fail2ban을 설치합니다. `sudo apt update` 명령어를 사용하여 패키지 목록을 업데이트하고, `sudo apt install fail2ban` 명령어를 사용하여 Fail2ban을 설치합니다. 다음으로, Fail2ban 설정 파일을 수정합니다. `/etc/fail2ban/jail.conf` 파일을 직접 수정하는 대신, `/etc/fail2ban/jail.d/sshd.conf` 파일을 생성하여 설정을 덮어쓰는 방식을 추천합니다. `sudo nano /etc/fail2ban/jail.d/sshd.conf` 명령어를 사용하여 파일을 생성하고, 다음과 같은 내용을 입력합니다.
[sshd]
enabled = true
port = 9022 # SSH 포트 변경 시 해당 포트로 수정
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
`enabled = true`는 Fail2ban을 활성화하고, `port`는 SSH 포트를 지정합니다. `filter = sshd`는 SSH 공격을 감지하기 위한 필터를 사용하고, `logpath`는 SSH 로그 파일 경로를 지정합니다. `maxretry = 3`은 3번의 로그인 실패 시 차단하고, `bantime = 3600`은 3600초(1시간) 동안 차단합니다. Fail2ban을 재시작하여 변경 사항을 적용합니다. `sudo systemctl restart fail2ban` 명령어를 사용하면 됩니다.
최신 보안 업데이트 유지: OpenSSH 버전 관리
OpenSSH를 포함한 운영체제에 대한 정기적인 보안 패치를 적용하는 것은 매우 중요합니다. OpenSSH는 지속적으로 취약점이 발견되고 있으며, 최신 버전으로 업데이트하지 않으면 공격에 노출될 위험이 있습니다. 2024년 7월 1일에는 OpenSSH 8.5p1 ~ 9.8p1 버전에서 심각한 취약점(CVE-2024-6387)이 발견되기도 했습니다. 이 취약점을 악용하면 인증되지 않은 원격 코드 실행이 루트 권한으로 발생할 수 있습니다.
보안 업데이트는 번거롭지만, 알려진 취약점을 해결하여 서버를 안전하게 보호할 수 있습니다.
최신 보안 업데이트 유지 방법
`sudo apt update` 명령어를 사용하여 패키지 목록을 업데이트하고, `sudo apt upgrade` 명령어를 사용하여 설치된 패키지를 최신 버전으로 업데이트합니다. OpenSSH 관련 패키지가 업데이트되는지 확인하고, 업데이트 후에는 서버를 재부팅하는 것이 좋습니다. Amazon Linux 2023에서는 ssh-rsa 서명이 기본적으로 비활성화되어 있으므로, 관련 설정을 확인해야 합니다.
SSH 보안 강화 방법 비교
SSH 보안 강화를 위해 다양한 방법을 사용할 수 있습니다. 각각의 방법은 장단점이 있으며, 서버 환경과 보안 요구 사항에 따라 적절한 방법을 선택해야 합니다. 다음은 SSH 보안 강화 방법들을 비교한 표입니다.
| 구분 | SSH 포트 변경 | SSH 키 인증 | Fail2ban |
|---|---|---|---|
| 비용 | 무료 | 무료 | 무료 |
| 시간 | 10분 내외 | 15분 ~ 30분 | 30분 ~ 1시간 |
| 편의성 | 비교적 간단, 방화벽 설정 변경 필요 | 키 관리 필요, 초기 설정 다소 복잡 | 초기 설정 복잡, 설정 오류 시 문제 발생 가능 |
| 장점 | 자동화된 스캔 공격 감소 | 강력한 보안, 비밀번호 노출 위험 감소 | 비정상적인 로그인 시도 자동 차단 |
| 단점 | 실제 보안 조치 대체 불가, 포트 스캔에 취약 | 키 분실 시 접속 불가 | 잘못된 설정 시 정상적인 접속까지 차단 |
보안 강화 외 추가 설정
보안 강화를 넘어, SSH 접속 자체를 더 편리하게 만들 수도 있습니다. `.ssh/config` 파일을 활용하면 됩니다. 이 파일에 서버 접속 정보를 미리 등록해두면, 매번 긴 명령어를 입력할 필요 없이 간단하게 접속할 수 있습니다. 예를 들어, 다음과 같이 설정할 수 있습니다.
Host myserver
HostName 192.168.1.100
User myuser
Port 9022
IdentityFile ~/.ssh/id_ed25519
이렇게 설정하면 `ssh myserver` 명령어만으로 서버에 접속할 수 있습니다. 저는 여러 서버를 관리하기 때문에 이 기능을 적극적으로 활용하고 있습니다.
마무리: 🔒 지금 바로 SSH 보안 점검하세요!
SSH 보안은 서버 관리의 기본입니다. 오늘 소개한 방법들을 통해 SSH 보안을 강화하고, 안전한 홈서버 환경을 구축하시기 바랍니다. 지금 바로 SSH 설정을 확인하고, root 계정 접속 제한 설정을 적용해보세요.