1. SSH 포트 변경

기본적으로 OpenSSH는 TCP 22번 포트를 사용하여 통신한다. 그러나 보안을 강화하기 위해 기본 포트를 변경하는 방법이 권장된다. 이를 통해 자동화된 스캐닝 공격으로부터 서버를 어느 정도 보호할 수 있다. 다음은 SSH 포트를 변경하는 방법이다.

  1. 설정 파일 수정: SSH 데몬의 설정 파일인 sshd_config에서 포트를 변경할 수 있다. 해당 파일의 경로는 일반적으로 /etc/ssh/sshd_config이다. 이 파일을 열고, Port 지시자를 수정하여 사용할 포트를 설정한다.

Port 2222

위의 예에서는 기본 포트 22 대신 2222번 포트를 사용하도록 설정한 것이다.

  1. 포트 충돌 방지: 변경할 포트 번호가 다른 서비스와 충돌하지 않도록 주의해야 한다. 리눅스 시스템에서 사용 중인 포트를 확인하려면 다음 명령어를 사용할 수 있다.

sudo netstat -tuln | grep LISTEN

위 명령어는 현재 사용 중인 모든 포트를 출력한다. 새로 지정할 포트 번호가 이 목록에 없으면 충돌이 발생하지 않는다.

  1. 방화벽 규칙 업데이트: SSH 포트를 변경한 후에는 해당 포트를 방화벽에서 허용해야 한다. 예를 들어, UFW를 사용하는 경우에는 다음 명령어를 실행하여 새 포트를 허용할 수 있다.

sudo ufw allow 2222/tcp

iptables를 사용하는 경우에는 다음과 같은 명령을 추가할 수 있다.

sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

  1. SSH 서비스 재시작: 설정 파일을 수정한 후에는 SSH 서비스를 재시작해야 한다.

sudo systemctl restart sshd

  1. 새 포트로 접속: SSH 클라이언트를 사용할 때 새로운 포트로 접속하려면 -p 옵션을 사용한다.

ssh -p 2222 user@server_ip

여기서 2222는 새로 설정한 포트 번호이다.

2. 접근 제어 설정

OpenSSH에서는 접근 제어를 통해 특정 사용자 또는 IP 주소만 SSH 접속을 허용하거나 차단할 수 있다. 이를 통해 보다 강력한 보안 설정을 할 수 있다.

2.1 AllowUsersDenyUsers

AllowUsers user1 user2

위의 설정은 user1user2만 SSH로 접속할 수 있도록 한다.

DenyUsers user3

위의 설정은 user3의 접속을 차단한다.

2.2 AllowGroupsDenyGroups

AllowGroups sshusers

위 설정은 sshusers 그룹에 속한 사용자들만 접속할 수 있도록 허용한다.

DenyGroups admin

위 설정은 admin 그룹에 속한 사용자들의 SSH 접속을 차단한다.

2.3 IP 기반 접근 제어

OpenSSH에서는 특정 IP 주소에서만 접속을 허용하거나 차단하는 설정도 가능한다.

AllowUsers user1@192.168.1.*

위 설정은 192.168.1.x 네트워크 대역에서만 user1이 접속할 수 있도록 한다.

sshd: 192.168.1.0/24

위 설정은 192.168.1.0 대역에서만 SSH 접속을 허용한다. 반대로 /etc/hosts.deny 파일에서 설정하면 해당 대역을 차단할 수 있다.

2.4 비밀번호 기반 인증 비활성화

비밀번호 기반 인증을 비활성화하고 공개키 기반 인증만 허용하는 것은 보안을 강화하는 중요한 방법 중 하나이다. 이를 통해 비밀번호 크래킹 공격으로부터 보호할 수 있다.

  1. 비밀번호 인증 비활성화: sshd_config 파일에서 PasswordAuthentication 지시자를 찾아 no로 설정한다.

PasswordAuthentication no

이 설정은 비밀번호 기반 인증을 완전히 비활성화하여, SSH 클라이언트가 공개키를 사용해야만 접속할 수 있도록 만든다.

  1. 공개키 인증 활성화: 공개키 인증이 제대로 동작하도록 PubkeyAuthentication 설정을 확인해야 한다. 기본적으로 yes로 설정되어 있다.

PubkeyAuthentication yes

  1. 비밀번호 로그인 재시도 방지: MaxAuthTries 설정을 통해 인증 실패 시 재시도 횟수를 제한할 수 있다. 예를 들어, 다음 설정은 3회 이상 인증 실패 시 연결을 종료한다.

MaxAuthTries 3

  1. 비활성화 확인: 설정이 올바르게 적용되었는지 확인하려면 SSH 데몬을 재시작한 후, 다음과 같은 명령으로 확인할 수 있다.

ssh user@server_ip -o PasswordAuthentication=yes

위 명령이 실패하면 비밀번호 인증이 성공적으로 비활성화된 것이다.

2.5 Root 사용자 접속 제한

보안을 강화하기 위해 root 사용자의 SSH 접속을 제한하는 것이 좋다. 기본적으로 root 사용자는 매우 강력한 권한을 가지고 있기 때문에, root로 직접 접속하지 못하게 하고 대신 일반 사용자로 접속한 후 sudo를 사용하여 필요한 명령을 수행하는 방식이 권장된다.

  1. Root 접속 차단: PermitRootLogin 설정을 no로 변경하여 root 사용자로 직접 SSH 접속하는 것을 차단할 수 있다.

PermitRootLogin no

  1. 대체 방법: Root 접속 허용 후 공개키 인증만 허용: 만약 root 사용자가 꼭 접속해야 하는 경우라면, 다음과 같이 공개키 인증만을 허용할 수 있다.

PermitRootLogin without-password

이 설정은 root 사용자로의 접속을 허용하되, 비밀번호 인증이 아닌 공개키 인증만을 허용하는 것이다.

2.6 SSH 접속 제한 시간 설정

서버 보안을 강화하기 위한 또 다른 방법으로, 접속 시간이 제한된 상황에서만 SSH 접속을 허용할 수 있다. 이를 통해 접속 제한 시간 외에는 불필요한 접근을 차단할 수 있다.

  1. ClientAliveInterval: 클라이언트가 아무런 활동을 하지 않더라도 연결을 계속 유지하기 위해 서버가 클라이언트에게 주기적으로 패킷을 보내는 시간 간격을 설정할 수 있다.

ClientAliveInterval 300

이 값은 초 단위로, 300초(5분) 동안 클라이언트가 아무런 응답을 보내지 않으면 서버에서 패킷을 보낸다.

  1. ClientAliveCountMax: ClientAliveInterval에 설정된 간격으로 전송된 패킷에 대해 클라이언트가 응답하지 않으면 연결을 종료하는 횟수를 설정할 수 있다.

ClientAliveCountMax 3

이 설정은 3번까지 응답하지 않으면 연결을 종료하게 된다. 따라서 총 900초(15분) 후에 비활성 클라이언트의 연결이 종료된다.

  1. TCPKeepAlive: 클라이언트와 서버 간에 TCP 연결 상태를 확인하여 클라이언트가 비활성 상태일 때도 연결을 유지하거나 끊을 수 있는 설정이다. 기본적으로 yes로 설정되어 있지만, 더 엄격하게 비활성 클라이언트를 처리하고 싶다면 no로 설정할 수 있다.

TCPKeepAlive no