서버의 초기 설정 작업 중, 그리고 가끔씩 인터넷을 뒤져가며 SSH 서버 설정 중 일부를 보안을 향상시키고자 변경하거나, 추가했다.

몇 가지는 다음과 같다.

/etc/ssh/sshd_config:

Port XXXXX

방화벽 로그를 보면 SSH의 기본 서비스 포트인 22를 다른 포트로 변경하기 전엔 2~3분에 한번씩 터키나 러시아쪽에서 접근을 시도했다. 잘 알려진 서비스 포트들로 접근하려는 시도가 참 많아서 놀랬더라는…

ListenAddress XXX.XXX.XXX.XXX
Protocol 2

SSH 리스닝에 사용할 IPv4 주소 하나만 지정하고, SSH 프로토콜은 무조건 버전 2만 쓰는 것으로 했다.

# Authentication:
AllowUsers [MY_LOGIN_ID]
LoginGraceTime 10
MaxAuthTries 3
PermitRootLogin no
StrictModes yes

root 로그인 차단은 원래 기본 설정이고… SSH 로그인 허용 계정을 내가 사용하는 계정 하나로 제한하고, 로그인 프롬프트 출력 시간은 10초로 줄였다. 인증 시도 횟수는 아무 것도 지정하지 않으면 기본 6회인데, 3회로 줄였다. 계속 인증에 실패하는 IP 주소는 차단하도록 fail2ban을 사용한다.

RSAAuthentication no
PubkeyAuthentication yes

RSA 인증은 SSH 버전 1에서 유효한 방법이다, 버전 2에서는 필요없으므로 no로 변경하고, 공개키를 이용한 인증을 사용하도록 설정했다.

ChallengeResponseAuthentication no
PasswordAuthentication no
GSSAPIAuthentication no

패스워드에 바탕을 둔 인증은 모두 사용하지 않으므로 Keyboard-Interactive든, 패스워드든, GSSAPI든 모두 no.

X11Forwarding no
X11DisplayOffset 10
AllowTcpForwarding no
GatewayPorts no
PermitTunnel no

터널링도 사용하지 않을 계획이므로 no!

ClientAliveInterval 15
ClientAliveCountMax 3

TCPKeepAlive와 별도로, 저 두 설정을 추가했다. TCPKeepAlive는 스푸핑이 가능하지만, ClientAlive는 SSH 세션 내부에서 이뤄지므로 스푸핑할 수 없다. 서버는 클라이언트가 15초간 아무 활동이 없으면 클라이언트의 응답을 세 번 요청한다. 세 번 이내에 응답이 없으면 SSH 세션은 자동 종료(45초간 아무 작업이 없으면 세션을 닫는다). 찾아보면 클라이언트 설정 어딘가에 이것도 KeepAlive 옵션을 사용할 수 있도록 할 수 있을 것같다.

# Allow client to pass locale environment variables
#AcceptEnv LANG LC_*
PermitUserEnvironment no

환경 변수를 변경해 권한 우회를 시도할 수 있으므로 SSH 클라이언트가 넘겨주는 환경 변수를 모두 거부하도록 설정했다.

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM no

마지막으로, PAM을 사용한 인증을 모두 꺼버렸다. 잘 한 짓인지는 모르겠지만, 인증서 기반 인증에 별 영향을 주지 않기 때문에 꺼두는게 안전하다는 판단을 했다.

인터넷 검색으로 유용한 팁을 많이 찾았지만, 결국은 man 페이지에 다 있더라…

UPDATE: Feb, 1, 2015 Secure Secure Shell을 참고해서 키 교환 알고리즘, 암호화 알고리즘, MAC 알고리즘 설정을 추가했다. Tor를 사용한 IP 주소 세탁도 링크된 블로그에서 다루고 있다.

참고: