SSH 프로토콜 작동 방식과 보안 강화 설정 가이드
SSH 프로토콜의 기본 원리를 이해하고, 키 기반 인증 및 기타 보안 설정을 통해 원격 접속 보안을 강화하는 방법을 안내합니다.
SSH 프로토콜이란?
SSH(Secure Shell)는 네트워크 상의 다른 컴퓨터에 안전하게 접속하기 위한 암호화된 통신 프로토콜입니다. 기존의 텔넷(Telnet)이나 FTP와 같이 평문으로 데이터를 주고받는 프로토콜의 보안 취약점을 해결하기 위해 개발되었습니다. SSH는 클라이언트와 서버 간의 모든 통신을 암호화하여 중간에서 데이터를 가로채더라도 내용을 알아볼 수 없도록 합니다.
SSH의 주요 기능
- 안전한 원격 로그인: 암호화된 채널을 통해 터미널 접속 및 명령어 실행
- 안전한 파일 전송: SCP(Secure Copy Protocol) 또는 SFTP(SSH File Transfer Protocol)를 이용한 파일 전송
- 포트 포워딩 (Tunneling): 비암호화된 프로토콜을 SSH 터널을 통해 안전하게 전송
SSH 작동 방식
SSH는 기본적으로 클라이언트-서버 모델로 작동합니다. 사용자가 SSH 클라이언트 프로그램을 통해 원격 서버에 접속을 요청하면, 다음과 같은 과정으로 통신이 이루어집니다.
- 연결 설정: 클라이언트가 서버의 SSH 데몬(sshd)에 접속을 시도합니다. 기본 포트는 22번입니다.
- 프로토콜 협상: 클라이언트와 서버는 사용할 SSH 프로토콜 버전, 암호화 알고리즘, 압축 방식 등을 협상합니다.
- 키 교환: 서버는 자신의 공개키를 클라이언트에 전달합니다. 클라이언트는 이를 이용해 세션 키를 생성하고, 서버의 공개키로 암호화하여 서버에 전달합니다. 이 과정에서 서버의 공개키가 위변조되지 않았는지 확인하는 호스트 키 검증 절차가 포함됩니다.
- 인증: 사용자는 비밀번호 또는 SSH 키 쌍을 이용해 서버에 자신을 인증합니다.
- 세션 시작: 인증이 성공하면, 클라이언트와 서버 간의 모든 통신은 앞서 교환된 세션 키를 사용하여 암호화됩니다. 사용자는 원격 서버에서 명령을 실행하고 결과를 받아볼 수 있습니다.
SSH 보안 강화 방법
SSH는 강력한 보안 기능을 제공하지만, 설정을 잘못하거나 기본값 그대로 사용할 경우 보안에 취약해질 수 있습니다. 다음은 SSH 보안을 강화하기 위한 몇 가지 설정 방법입니다.
1. SSH 키 기반 인증 사용 (비밀번호 인증 비활성화)
SSH 키 기반 인증은 비밀번호보다 훨씬 안전합니다. 비밀번호는 무작위 대입 공격(Brute-force attack)에 취약하지만, SSH 키는 무작위로 생성된 복잡한 문자열로 이루어져 있어 추측하거나 무작위로 알아내기 거의 불가능합니다.
- 키 쌍 생성: 클라이언트에서
ssh-keygen명령어를 사용하여 공개키와 개인키를 생성합니다.
(여기서ssh-keygen -t rsa -b 4096-t rsa는 키 종류,-b 4096은 키 길이) - 공개키 서버에 복사: 생성된 공개키(
~/.ssh/id_rsa.pub등)를 접속하려는 원격 서버의~/.ssh/authorized_keys파일에 추가합니다.
(이 명령어가 없을 경우, 수동으로 공개키 내용을 복사하여ssh-copy-id user@remote_hostauthorized_keys파일에 붙여넣기) - SSH 설정 파일 수정: 서버의 SSH 설정 파일(
/etc/ssh/sshd_config)에서 비밀번호 인증을 비활성화합니다.
설정 변경 후 SSH 서비스를 재시작해야 합니다. (예:PasswordAuthentication no PubkeyAuthentication yessudo systemctl restart sshd또는sudo service ssh restart)
2. 루트(root) 계정 직접 로그인 비활성화
최고 관리자인 루트 계정으로 직접 SSH 접속을 허용하면, 시스템 보안에 심각한 위협이 될 수 있습니다. 루트 계정 직접 로그인을 비활성화하고, 일반 사용자로 로그인한 후 sudo 명령어를 사용하여 필요한 권한을 얻는 것이 안전합니다.
- SSH 설정 파일 수정: 서버의 SSH 설정 파일(
/etc/ssh/sshd_config)에서 다음 설정을 변경합니다.
설정 변경 후 SSH 서비스를 재시작합니다.PermitRootLogin no
3. SSH 기본 포트 변경
SSH의 기본 포트인 22번은 알려져 있어 많은 공격 시도가 집중됩니다. 다른 포트(예: 2222, 4422 등)로 변경하면 자동화된 스캔 공격을 상당 부분 피할 수 있습니다.
- SSH 설정 파일 수정: 서버의 SSH 설정 파일(
/etc/ssh/sshd_config)에서Port설정을 변경합니다.
(포트 번호는 1024~65535 사이의 사용되지 않는 번호로 지정) 방화벽 설정도 변경된 포트 번호에 맞게 수정해야 합니다. (예:Port 2222sudo ufw allow 2222/tcp) 설정 변경 후 SSH 서비스를 재시작합니다. 접속 시에는 변경된 포트 번호를 명시해야 합니다. (예:ssh user@remote_host -p 2222)
4. SSH 로그인 시도 횟수 및 시간 제한
무차별 대입 공격을 방지하기 위해 로그인 시도 횟수와 제한 시간을 설정할 수 있습니다.
- SSH 설정 파일 수정: 서버의 SSH 설정 파일(
/etc/ssh/sshd_config)에서 다음 설정을 조정합니다.
설정 변경 후 SSH 서비스를 재시작합니다.MaxAuthTries 3 # 최대 인증 시도 횟수 LoginGraceTime 30s # 로그인 시도 허용 시간 (30초)
5. Fail2Ban과 같은 침입 탐지 시스템 사용
Fail2Ban은 로그인 시도 실패 기록을 분석하여 악의적인 IP 주소를 자동으로 차단하는 도구입니다. SSH뿐만 아니라 웹 서버 등 다양한 서비스에 대한 공격을 막는 데 유용합니다.
- 설치 및 설정: Fail2Ban을 설치하고 SSH 관련 설정을 구성합니다. (설치 및 상세 설정은 운영체제 및 배포판에 따라 다름)
주의사항
- SSH 설정 파일을 수정할 때는 반드시 원격 서버에 접속 가능한 다른 방법(예: 물리적 콘솔, KVM 등)을 확보한 상태에서 진행해야 합니다. 잘못된 설정으로 SSH 접속이 불가능해질 경우 복구가 어려울 수 있습니다.
- 변경 사항 적용 후에는 반드시 SSH 서비스를 재시작해야 합니다.
- 모든 보안 설정은 시스템 환경 및 요구사항에 맞게 적절히 조절해야 합니다. 과도한 보안 설정은 오히려 사용자 편의성을 해치거나 정상적인 접속을 방해할 수 있습니다.
요약
SSH는 강력한 보안 기능을 제공하는 프로토콜이지만, 설정 관리가 중요합니다. SSH 키 기반 인증 사용, 루트 로그인 비활성화, 포트 변경, 로그인 시도 제한, Fail2Ban 활용 등을 통해 SSH 접속 보안을 효과적으로 강화할 수 있습니다.