서버에 접근을 할때 패스워드가 일정 횟수 이상 틀릴 경우 잠깐이라도 해당 계정을 잠금 처리 하는것이 사전 대입 방지(brute force attack) 공격에 대비 할 수 있다.
이방법은 pam.d 에 설정하는것으로 pam.d를 이용하는 모든 접속 서비스 sasl, pop3, smtp,ssh , ftp 에 공통 적용이 된다. (물론 pam.d 설정을 별도로 해서 쓴다면 이야기는 바뀌겠다.)
물론 이러한 사전 공격 대응 방법은 일반적으로 iptables 로직이나 hosts.deny 쪽에서 설정도 가능하지만…
최근 공격 방식은 port scan 이후에 ssh 공격4회 -> pop3 공격4회 -> smtp 공격 4회 -> ftp 공격 4회 의 순서로 이루어 진다.
즉 iptables 로 3 ~ 5회 제한으로 하는경우가 많기 때문에 프로토콜을 바꾸어 가며 로그인을 사전대입 공격을 하고 공격이후 일정시간 interval 이후에 다시 순차 공격을 한다.
때문에 이와 같은 설정을 추가로 한다.
pam_tally2 를 이용하여 CentOS 7 및 ubuntu 14.04 에 설정을 하는 방법이다.
-
CentOS 7
vi /etc/pam.d/system-auth (2번째 줄은 변경, 13번째 줄은 추가 한다.)
1 2 3 4 5 6 7 8 9 10 11 |
auth required pam_env.so auth required pam_tally2.so deny=5 unlock_time=600 auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 1000 quiet_success auth required pam_deny.so account required pam_unix.so account required pam_tally2.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet account required pam_permit.so |
vi /etc/pam.d/password-auth (2번째 줄, 8번째줄을 추가한다.)
1 2 3 4 5 6 7 8 9 10 11 |
auth required pam_env.so auth required pam_tally2.so deny=5 unlock_time=600 auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 1000 quiet_success auth required pam_deny.so account required pam_unix.so account required pam_tally2.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet account required pam_permit.so |
-
Ubuntu 14.04 LTS
vi /etc/pam.d/common-auth (16번째줄을 추가한다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# # /etc/pam.d/common-auth - authentication settings common to all services # # This file is included from other service-specific PAM config files, # and should contain a list of the authentication modules that define # the central authentication scheme for use on the system # (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the # traditional Unix authentication mechanisms. # # As of pam 1.0.1-6, this file is managed by pam-auth-update by default. # To take advantage of this, it is recommended that you configure any # local modules either before or after the default block, and use # pam-auth-update to manage selection of other modules. See # pam-auth-update(8) for details. auth required pam_tally2.so onerr=fail even_deny_root deny=5 unlock_time=600 # here are the per-package modules (the "Primary" block) auth [success=1 default=ignore] pam_unix.so nullok_secure # here's the fallback if no module succeeds auth requisite pam_deny.so # prime the stack with a positive return value if there isn't one already; # this avoids us returning an error just because nothing sets a success code # since the modules above will each just jump around auth required pam_permit.so # and here are more per-package modules (the "Additional" block) auth optional pam_cap.so # end of pam-auth-update config |
추가되는 줄의 deny=5 는 몇 회 틀렸을 경우 잠금을 할지 선언하는 부분이다.
unlock_time=600 잠금시간을 설정 한다. (10분=600초)
이후 적용되었는지 다른 세션을 열어 접속시도 및 잘못된 패스워드를 대입하면서 테스트 해볼 수 있다.
1 2 3 4 5 6 7 |
~]# pam_tally2 -u 아이디 Login Failures Latest failure From 아이디 1 06/05/17 05:19:42 123.123.123.123 ~]# pam_tally2 -u 아이디 Login Failures Latest failure From 아이디 2 06/05/17 05:19:46 123.123.123.123 |
로그인 테스트를 하면서 패스워드 임계값 5회 를 초과한경우 아래와 같은 메세지를 볼 수 있다.
1 2 3 4 5 |
~]# ssh 아이디@123.123.123.123 Account locked due to 5 failed logins Password: Account locked due to 6 failed logins Password: |
잠긴 상태이므로 설정한 10분을 기다린 뒤에 접속을 할수 있으며, 필요시 pam_tally2 명령어로 누적 카운트를 초기화 해줄 수 있다.
1 2 3 4 5 6 7 |
~]# pam_tally2 -r -u 아이디 Login Failures Latest failure From 아이디 6 06/05/17 05:21:35 123.123.123.123 ~]# pam_tally2 -r -u 아이디 Login Failures Latest failure From 아이디 0 |