먼저  SSH 서버를 안전하게 구성하기 위해서 꼭 알아두어야 할 설정 파일인 /etc/ssh/sshd_config 의 주요 보안 관련 설정의 의미와 권장하는 설정을 알아봅시다.


방화벽 적용

SSH 서버는 보안상 매우 중요하므로 SSH 로 연결할 수 있는 클라이언트의 IP 를 명시적으로 등록하도록 시스템의 방화벽을 설정할 필요가 있습니다. 특히 SSH 는 전 장에서 설명한 베스천 호스트 를 두고 이 서버를 통해서만 접속하도록 방화벽을 설정하는 것을 권장합니다. (참고: firewalld 방화벽 사용)


22번이 아닌 포트 사용

SSH 의 기본 포트는 22번이지만 외부에서 22 번 포트에 대해 오픈되었는지 스캔후 에 열려있다면 무작위 공격(Brute-force attack) 을 시도할 수가 있습니다. 

공용으로 SSH 를 오픈해야 한다면 기본 포트를 변경하는 게 좋습니다.


세션 타임아웃 설정

정해진 시간동안 사용하지 않으면 강제로 세션을 종료하도록 설정합니다. 종료 시간은 (ClientAliveInterval * ClientAliveCountMax) 이며 단위는 초입니다.

아래 설정은 30분동안 사용하지 않으면 ssh 세션을 자동으로 종료합니다.

ClientAliveInterval 600
ClientAliveCountMax 3
CODE


root login 차단

root 사용자 로그인을 허용하지 여부를 설정하며 SSH 가 공용으로 열렸고 root 로그인까지 허용한다면 시스템의 모든 권한을 탈취당할 수 있으니 root 로 바로 로그인은 허용하지 않아야 합니다.

PermitRootLogin no
CODE


우분투나 Amazon Linux 는 아래와 같이 설정되어 있는데 이는 rsync 로 원격지에서 백업등 root 로 특정 명령어를 실행하기 위해서이며 root 로그인을 허용할 경우 반드시 암호가 아닌 공개키 방식으로 허용해야 합니다.

PermitRootLogin forced-commands-only
CODE



UsePrivilegeSeparation sandbox  

CentOS 7 의 sshd 에서는 sandbox가 기본 설정이며 기존 버전인 6은 yes 로 설정되어 있습니다.

yes 일 경우 ssh 인증을 통과한 후에 sshd 가 해당 세션용 ssh 프로세스를 로그인한 사용자의 권한으로 실행하며 sandbox 일 경우 사전에 인증되지 않은 권한없는 프로세스는 추가적으로 여러 가지 기능이 제한됩니다.

no 경우 일반 사용자로 로그인해도 root 로 sshd 가 실행되므로 절대 설정하면 안됩니다.

UsePrivilegeSeparation yes
CODE


PermitEmptyPasswords

기본 설정은 no 이며 암호가 없는 계정에 대해서는 로그인을 허용하지 않습니다.

PermitEmptyPasswords no
CODE



암호 대신 공개키로 인증

공개키 인증(PubkeyAuthentication)을 켜고 암호 기반 인증(PasswordAuthentication)을 끄면 공개키 방식으로만 인증하므로 훨씬 보안이 강화됩니다.

PubkeyAuthentication yes
PasswordAuthentication no
CODE

공개키 인증만 사용하려면 사전에 client 의 공개키를 등록해 두어야 합니다.


연결하려는 계정에서 공개키가 없을 경우 ssh-keygen 명령어를 사용하여 공개키(~/.ssh/id_rsa.pub)와 개인키(~/.ssh/id_rsa) 를 생성할 수 있습니다.

생성한 개인키는 잘 보관해야 하며 공개키를 연결하려는 SSH 서버에 복사해 주면 공개키 기반으로 로그인할 수 있습니다.

다음은 원격지 SSH  서버가 192.168.10.1 일 경우 lesstif 계정으로 공개키를 복사하는 예제입니다.



MaxAuthTries

옵션에 지정한 숫자 이상으로 로그인 시도에 실패하면 접속이 강제로 종료됩니다. 기본 설정은 6이며 SSH 를 any 로 오픈할 경우 다음 절에서 설명하는 fail2ban 을 적용하는 것이 좋습니다.

MaxAuthTries 5
CODE


LoginGraceTime

여기에 지정된 시간 내에 로그인하지 않을 경우 접속이 강제로 종료됩니다. 기본은 2분이지만 이보다 더 짧게 하는 것이 좋으며 0 으로 설정하면 시간 제한 옵션이 비활성화됩니다.

LoginGraceTime 30
CODE


AllowUsers / DenyUsers

SSH 는 기본적으로 모든 사용자가 사용할 수 있지만 특정 사용자만 허용하겠다면 AllowUsers 에 허용할 사용자를 지정합니다. 이럴 경우 다른 사용자는 SSH 로그인을 할 수 없게 됩니다.

다음은 lesstif 사용자와 centos7 사용자만 SSH 를 사용하도록 하는 예제이며 여러 사용자를 지정할 경우에는 공백으로 구분하면 됩니다.


사용자와 호스트를 묶어서 특정 사용자는 특정 호스트에서만 접속하도록  설정할 수도 있습니다. 다음은 IP 주소가 192.168.10.3 인 호스트의 lesstif 사용자만 SSH 로 접속할 수 있도록 설정하는 예제입니다.

또는 사용자의 ID 에 와일드 카드(*)를 사용하여 호스트만을 지정할수 있습니다. 다음 예는 192.168.10.3 인 호스트의 모든 사용자에게 SSH 사용을 허용합니다.

이와는 달리 DenyUsers 를 사용하면 지정한 사용자 외의 모든 사용자의 SSH 사용을 허가하게 됩니다. 혼동의 우려가 있으니 AllowUsersDenyUsers  를 혼용해서 사용하는 것보다는 하나의 키워드만 사용해서 접근 권한을 설정하는 게 좋으며 whitelist 방식인 AllowUsers  가 더 관리가 용이합니다.


데몬 재구동

변경한 설정을 반영하려면 ssh 데몬 프로세스를 재구동해야 합니다.

우분투는 ssh 서비스 이름이 ssh 이므로 sudo systemctl restart ssh 로 구동하면 됩니다.