SSH 서버 보안 강화를 위한 10가지 필수 모범 사례
Secure Shell(SSH)은 원격 서버 관리의 중추로서, 안전한 데이터 통신, 원격 명령 실행 및 기타 네트워크 서비스를 위한 암호화 네트워크 프로토콜을 제공합니다. 그러나 SSH의 광범위한 사용은 공격자에게 주요 표적이 되기도 합니다. 부적절하게 보호된 SSH 서버는 치명적인 취약점을 열어 무단 액세스, 데이터 유출 및 시스템 침해로 이어질 수 있습니다. 원격 액세스 환경을 보호하는 것은 좋은 관행일 뿐만 아니라 필수 사항입니다.
이 기사에서는 SSH 서버 구성을 강화하기 위한 10가지 필수 모범 사례를 설명합니다. 이러한 중요한 구성 지침, 권장 권한 설정 및 보안 팁을 구현하여 무단 액세스 및 무차별 대입 공격, 자격 증명 도용과 같은 일반적인 공격 벡터로부터 서버의 방어를 크게 강화할 수 있습니다. 이러한 지침을 따르면 원격 관리가 안전하게 유지되고 서버 인프라가 보호되는 것을 보장하는 데 도움이 될 것입니다.
1. 기본 SSH 포트 변경
기본 SSH 포트는 22입니다. 이 포트는 자동화된 봇이 취약한 서버를 찾기 위해 끊임없이 스캔하는 보편적으로 알려진 포트입니다. 기본 포트를 변경하면 간단하면서도 효과적인 은폐 계층을 제공합니다. 자체적으로는 보안 조치가 아니지만 자동화된 스캔의 노이즈를 크게 줄이고 많은 기회주의적 공격을 피하는 데 도움이 됩니다.
포트를 변경하려면 일반적으로 /etc/ssh/sshd_config에 있는 sshd_config 파일을 편집합니다.
sudo nano /etc/ssh/sshd_config
Port 22 줄을 찾아서(없으면 추가) 22를 표준이 아니거나 할당되지 않은 포트 번호(예: 2222, 49152-65535는 사용자/동적 포트)로 변경합니다.
#Port 22
Port 2222
파일을 저장한 후 SSH 서비스를 다시 시작합니다. 새 포트에 대한 트래픽을 허용하고 이전 포트는 차단하도록 방화벽 규칙을 업데이트해야 합니다.
sudo systemctl restart sshd
# UFW (Uncomplicated Firewall)의 경우:
sudo ufw allow 2222/tcp
sudo ufw deny 22/tcp
sudo ufw reload
# Firewalld의 경우:
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --remove-port=22/tcp
sudo firewall-cmd --reload
팁: 구성 변경을 테스트하는 동안 항상 하나 이상의 SSH 세션을 열어 두십시오. 잠기는 경우 활성 세션에서 변경 사항을 되돌릴 수 있습니다.
2. 루트 로그인 비활성화
SSH를 통한 직접 루트 로그인은 강력히 권장되지 않습니다. root 사용자는 제한 없는 권한을 가지고 있어 공격자에게 주요 표적이 됩니다. 공격자가 루트 액세스 권한을 얻으면 시스템을 완전히 제어할 수 있습니다. 대신 일반 비권한 사용자로 로그인한 다음 sudo를 사용하여 관리 작업을 수행하십시오.
sshd_config에서 PermitRootLogin 지시어를 찾아 no로 설정합니다.
PermitRootLogin no
SSH 서비스를 저장하고 다시 시작합니다.
sudo systemctl restart sshd
3. 키 기반 인증 사용
비밀번호 기반 인증은 사용자가 약한 비밀번호를 선택하는 경우 무차별 대입 공격 및 사전 공격에 취약합니다. SSH 키 기반 인증은 훨씬 더 안전한 대안입니다. 서버에 저장된 공개 키와 로컬 컴퓨터에 보관된 개인 키라는 두 개의 암호화 키 쌍을 사용합니다. 일치하는 개인 키를 가진 클라이언트만 인증할 수 있습니다.
키 기반 인증 구현 단계 (간략):
- 로컬 컴퓨터에서 키 쌍 생성:
bash ssh-keygen -t ed25519 -b 4096 -C "[email protected]"ed25519는 최신 보안 알고리즘입니다.rsa도 일반적이며, 키 강도를 위해 종종-b 4096을 사용합니다.
- 서버로 공개 키 복사:
bash ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your_server_ip
또는 로그인하려는 사용자의 서버에서~/.ssh/id_ed25519.pub의 내용을~/.ssh/authorized_keys에 수동으로 추가합니다. -
서버에서 올바른 권한 확인:
~/.ssh디렉토리:700(소유자만 읽기/쓰기/실행)~/.ssh/authorized_keys파일:600(소유자만 읽기/쓰기)
bash chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
4. 비밀번호 인증 비활성화
모든 필요한 사용자에 대해 키 기반 인증을 성공적으로 설정하고 테스트한 후에는 비밀번호 인증을 완전히 비활성화해야 합니다. 이렇게 하면 무차별 대입 비밀번호 공격이 불가능해져 SSH 보안의 가장 약한 고리가 제거됩니다.
sshd_config에서 PasswordAuthentication을 no로 설정합니다.
PasswordAuthentication no
SSH 서비스를 저장하고 다시 시작합니다.
sudo systemctl restart sshd
경고: 절대 액세스해야 하는 모든 사용자에 대해 키 기반 인증이 올바르게 작동하는지 확인하기 전에 비밀번호 인증을 비활성화하지 마십시오. 그렇지 않으면 서버 액세스가 차단될 위험이 있습니다.
5. 사용자 액세스 제한
기본적으로 서버의 모든 사용자 계정은 SSH를 통해 로그인할 수 있습니다. 공격 표면을 최소화하기 위해 특정 사용자 또는 그룹으로만 SSH 액세스를 제한할 수 있습니다.
sshd_config에서 AllowUsers 또는 AllowGroups 지시어를 사용합니다.
특정 사용자(예: adminuser, devuser)만 허용하려면:
AllowUsers adminuser devuser
특정 그룹(예: sshusers)의 구성원만 허용하려면:
AllowGroups sshusers
팁: 여러 사용자가 있는 경우 AllowGroups를 사용하는 것이 좋습니다. SSH 액세스를 위한 전용 그룹을 만들고 승인된 사용자를 추가합니다.
sudo groupadd sshusers
sudo usermod -aG sshusers adminuser
sudo usermod -aG sshusers devuser
변경 후 SSH를 저장하고 다시 시작합니다.
6. SSH 키에 강력한 암호 사용
키 기반 인증은 강력하지만 개인 키는 여전히 중요한 자산입니다. 공격자가 로컬 컴퓨터에 액세스하면 개인 키를 훔칠 수 있습니다. 강력한 암호는 개인 키를 암호화하여 사용하기 전에 잠금을 해제해야 합니다. 이렇게 하면 개인 키가 잘못된 손에 들어가더라도 보호할 수 있는 추가 보안 계층이 추가됩니다.
SSH 키를 생성할 때(3단계 참조) 암호를 입력하라는 메시지가 표시됩니다. 다른 비밀번호와 다른 길고 복잡하며 기억하기 쉬운 암호를 선택하십시오.
7. 연결 속도 제한 구현 (Fail2Ban)
키 기반 인증을 사용하더라도 SSH 서버는 여전히 연결 시도에 노출될 수 있습니다. Fail2Ban과 같은 도구는 동일한 IP 주소의 반복적인 로그인 실패 시도를 능동적으로 모니터링하고 설정된 기간 동안 방화벽 규칙을 사용하여 해당 IP 주소를 자동으로 차단할 수 있습니다.
설치 (Debian/Ubuntu 예시):
sudo apt update
sudo apt install fail2ban
Fail2Ban은 기본 SSH 규칙으로 즉시 작동하지만 jail.conf를 jail.local로 복사하여 편집하여 구성을 사용자 정의할 수 있습니다.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
jail.local 내에서 [sshd] 섹션의 bantime, findtime 및 maxretry를 조정할 수 있습니다.
[sshd]
enabled = true
port = 2222 # 새 SSH 포트
logpath = %(sshd_log)s
maxretry = 3
bantime = 1h # 1시간 동안 차단
findtime = 10m # 10분 내 3회 실패 시
구성 변경 후 Fail2Ban을 다시 시작합니다.
sudo systemctl restart fail2ban
8. SSH 서버 소프트웨어 업데이트 유지
소프트웨어 취약점은 끊임없이 발견되고 패치됩니다. 최신이 아닌 SSH 데몬 소프트웨어(OpenSSH)를 실행하면 알려진 익스플로잇에 노출될 수 있습니다. 서버의 소프트웨어(OpenSSH 서버 패키지 포함)를 정기적으로 업데이트하는 것은 보안 취약점을 패치하는 데 중요합니다.
# Debian/Ubuntu의 경우:
sudo apt update && sudo apt upgrade
# CentOS/RHEL의 경우:
sudo yum update
# 또는
sudo dnf update
적절한 경우 보안 업데이트를 자동으로 적용하도록 시스템을 구성하거나 수동 업데이트 루틴을 설정합니다.
9. 의심스러운 활동에 대한 SSH 로그 모니터링
강력한 예방 조치를 취하더라도 경계는 중요합니다. SSH 인증 로그를 정기적으로 검토하여 비정상적인 패턴, 실패한 로그인 시도 또는 무단 액세스 시도를 감지합니다. 이를 통해 잠재적인 침해 또는 진행 중인 공격을 식별할 수 있습니다.
SSH 로그는 일반적으로 다음 위치에서 찾을 수 있습니다.
/var/log/auth.log(Debian/Ubuntu)/var/log/secure(CentOS/RHEL)journalctl사용 (systemd 시스템):
bash sudo journalctl -u sshd -f
반복되는 인증 실패 시도, 비정상적인 IP 주소에서의 로그인 또는 익숙하지 않은 사용자의 성공적인 로그인 등을 확인합니다. Logwatch 또는 Elastic Stack(ELK)과 같은 도구는 대규모 환경을 위해 로그 분석 및 경고를 자동화할 수 있습니다.
10. 액세스를 제한하기 위한 방화벽 규칙 구성
방화벽은 첫 번째 방어선입니다. 기본적으로 명시적으로 노출해야 하는 서비스 제외한 모든 들어오는 트래픽을 차단해야 합니다. SSH의 경우 선택한 포트(예: 2222)에 대한 연결만 허용하고 이상적으로는 특정 신뢰할 수 있는 IP 주소 또는 네트워크에서만 허용해야 합니다.
UFW (Uncomplicated Firewall) 사용 예시:
포트 2222에서 특정 IP 주소 192.168.1.100의 SSH 허용:
sudo ufw allow from 192.168.1.100 to any port 2222
특정 서브넷 192.168.1.0/24의 SSH 허용:
sudo ufw allow from 192.168.1.0/24 to any port 2222
Firewalld (CentOS/RHEL) 사용 예시:
포트 2222에서 특정 IP 주소 192.168.1.100의 SSH 허용:
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port=2222 protocol="tcp" accept'
sudo firewall-cmd --reload
경고: 동적 IP 주소에서 서버를 관리하는 경우 엄격한 방화벽 규칙에 주의하십시오. 더 넓은 범위의 액세스를 허용하거나 VPN을 사용해야 할 수 있습니다.
추가 강화 팁
필수 10가지 외에 더 높은 보안을 위해 다음 지시어를 고려하십시오.
MaxAuthTries: 연결당 인증 시도 횟수를 제한합니다. 기본값은 6입니다. 이를 줄이면(예:3) 무차별 대입 가능성이 줄어듭니다.sshd_config에 설정합니다.
config MaxAuthTries 3LoginGraceTime: 사용자가 인증할 수 있는 시간을 제한합니다. 기본값은 2분입니다. 이를 줄이면(예:30s) 느린 공격의 창이 줄어듭니다.
config LoginGraceTime 30sClientAliveInterval및ClientAliveCountMax: 유휴 SSH 세션이 무기한 열려 있는 것을 방지합니다.ClientAliveInterval은 X초마다 null 패킷을 보냅니다.ClientAliveCountMax(기본값 3) 응답을 놓치면 연결이 종료됩니다.
config ClientAliveInterval 300 ClientAliveCountMax 0 # 세션이 무기한 지속되도록 하려면 클라이언트 활성 확인을 비활성화합니다.Banner: 인증 전에 경고 메시지를 표시합니다. 이는 잠재적인 무단 사용자에게 법적 고지 역할을 합니다.
config Banner /etc/issue.net
원하는 경고 메시지로/etc/issue.net파일을 만듭니다.
결론
SSH 서버 강화는 일회성 설정이 아닌 지속적인 프로세스입니다. 기본 포트 변경, 루트 로그인 비활성화, 키 기반 인증 시행, 방화벽 배포 등 10가지 필수 모범 사례를 구현함으로써 원격 액세스에 대한 강력한 보안 태세를 구축합니다. 항상 변경 사항을 신중하게 테스트하고, 시스템을 최신 상태로 유지하며, 의심스러운 활동에 대해 로그를 정기적으로 모니터링하는 것을 잊지 마십시오. 일관된 경계는 안전하고 안정적인 원격 관리 환경을 유지하는 데 중요합니다.
이러한 관행은 모든 서버 관리자에게 기본적이므로 일반적인 사이버 위협에 대한 노출을 크게 줄이고 무단 액세스 및 잠재적 침해로부터 서버 인프라를 보호할 것입니다.