SSH 보안설정

리눅스공통 2017. 7. 22. 13:47 Posted by juvenile

아래 글을 참조하여 제가 이해한 것만 요악했습니다.

0. 우선 iptable 설정 (별도글로 분리)

UFW 써보니까 참 좋던데..

1. SSH 설정

  • host key 재생성
    clean 설치의 경우엔 상관이 없겠지만 VPS의 기본환경이 어떻게 만들어졌는지 알게 뭐야.. 쿨하게 리셋했습니다.
    Desktop 버전의 ubuntu는 최초 설치 과정에서 키를 새로 만듭니다. 당연하게도..
    # rm /etc/ssh/ssh_host_* 
    # dpkg-reconfigure openssh-server
  • /etc/ssh/sshd_config 수정
    Port 12345      # 포트 변경 [기본:22] 
    Protocol 2      # ssh 프로토콜 2만 사용하도록 지정. [기본:없음] 
                    # 1도 쓰려면 2,1로 적으면 되는데, rpi os buster에서는 protocol 1용 호스트키가 없네요. 
                    # 궂이 Protocol 2라고 옵션을 정해주지 않아도 1이 사용되지는 않을 것 같습니다. 
    PermitRootLogin no    # root login 금지 [기본:prohibit-password] 
    MaxAuthTries 3     # 인증 재시도 횟수 3회로 제한 [기본:6] 
    UsePAM yes         # 운영체제에 유저 인증을 맡기는 방식으로 안쓰는 것이 이상합니다. [기본:yes] 
    UseDNS no          # 로긴 느려지니 끄라는 말은 많은데, 애초에 UseDNS가 왜 필요한지는 못 찾겠네요. [기본:no] 
    X11Forwarding no   # SSH 접속하여 X11용 프로그램을 로컬에서 띄우는 기능인데 저는 안쓰니까 no [기본:yes] 
    TCPKeepAlive no    # 접속 유지 설정이라고 알려져 있지만, 반은 맞고 반은 틀립니다. 
                       # 접속 장애 발생 시 유령 유저의 세션을 끊기 위해 작동합니다. 
                       # 클라이언트와 비보안 채널로 접속유지 확인을 합니다. 
    ClientAliveInterval 600  # 접속 장애여부를 확인하기 위한 접속확인 패킷을 전송할 주기입니다. [기본:0] 
    ClientAliveCountMax 3    # 접속확인 횟수입니다. 설정횟수만큼 반응이 없으면 세션을 닫습니다. [기본:3] 
                             # 예시는 10분(600초) 마다 한번 접속확인해서 세번 다 반응이 없으면 세션을 닫습니다. 
                             # 1800초x1회와 같을 것 같지만, 마침 패킷 보낼 때 순간적인 네트웍 문제가 발생하면.. 
    AllowUsers 유저1 유저2     # 지정한 사용자(유저1,유저2)만 SSH 접속 허용, 띄워쓰기로 구분 [기본:없음]
  • 적용
    $ sudo systemctl restart sshd

 

2. Fail2ban에 sshd 추가

설정파일 위치는 /etc/fail2ban/ 이며, jail.conf가 주 설정파일입니다.
jail.conf는 업데이트 시 초기화되므로 jail.conf를 jail.local로 복사한 후 수정하여 사용하면 됩니다.

각 필터별 사설 포트를 사용한다면 jail.local에서 꼭 바꿔주어야 합니다.
예를 들어 ssh 포트를 22에서 1234로 바꿨을 경우 아래와 같이 수정합니다.
안그러면 실제 사용하는 포트가 아니라 기본 포트인 22를 블럭합니다.

[sshd]
enabled = true
port = 1234


fail2ban에서 똑같이 설정했는데, Debian 서버와 CentOS 서버에서 fail2ban의 동작이 다르네요.

Debian은 비번오류 누적(sshd의 MaxAuthTries)으로 강제로 session 종료된 횟수(F2B의 maxretry)를 기준으로 동작합니다.
반면, CentOS에서는 비번오류 횟수가 F2B의 maxretry 도달하면 바로 차단합니다.

sshd 설정에서 지정한 로깅 방식에 따라 결정되는데, 각 배포판의 기본 설정은 아래와 같습니다.
저는 CentOS 방식이 맘에 드네요.

  Debian: SyslogFacility AUTH
  CentOS: SyslogFacility AUTHPRIV