RHEL 사용시 일반적인 보안 취약점 점검 사항 조치를 위한 조치방안에 대해 안내드리는 페이지 입니다.
아래 사항은 각 RHEL 버전에서 테스트 된 것이며 참조링크를 확인하시면 더욱 정확하게 사용하실 수 있습니다.
모든 내용에 대한 문의는 koovis@gmail.com으로 문의 바랍니다.
콘솔 root 로그인 차단을 하게되면 물리 장비의 console에서도 root로그인이 불가능해진다.
방법은 /etc/securetty
의 내용을 모두 삭제하면 된다.
RHEL 8
이후버전은 해당 기능이 기본적으로 비활성화 되어있다. 따라서 해당 기능을 활성화 하려면 아래 문서를 참고하여 기능을 추가하면 된다.
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/considerations_in_adopting_rhel_8/security_considerations-in-adopting-rhel-8#securetty_security
echo > /etc/securetty
이 기능을 적용하려면 아래의 내용을 관련 설정에 적용하여야 한다.
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
위 설정을 적용하기 위한 파일들은 아래와 같다.
/etc/pam.d/gdm /etc/pam.d/gdm-autologin /etc/pam.d/gdm-fingerprint /etc/pam.d/gdm-password /etc/pam.d/gdm-smartcard /etc/pam.d/kdm /etc/pam.d/kdm-np /etc/pam.d/xdm
위 사항을 적용한다고 하여도 원격에서 root권한 접속(SSH)을 막을수는 없다. 원격 root 접속을 차단하기 위해서는 아래의 SSH root login 차단방법을 참조한다.
/etc/ssh/sshd_config
파일에 아래 설정을 적용하도록 한다.
PermitRootLogin no
인터넷에 여러가지 방법에 대해 안내된 문서가 많지만 대부분이 맞지 않으며 제대로 된 설정이 아니다. 잘못설정하는경우 정책이 적용되지 않거나 문제가 발생하므로 아래 내용을 보고 정확하게 따라서 적용하기 바란다.
/etc/pam.d/system-auth
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth sufficient pam_unix.so try_first_pass nullok auth required pam_deny.so account required pam_unix.so password requisite pam_cracklib.so try_first_pass retry=3 type= minlen=8 minclass=4 # <-- 수정 password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so
/etc/pam.d/password-auth
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth sufficient pam_unix.so try_first_pass nullok auth required pam_deny.so account required pam_unix.so password requisite pam_cracklib.so try_first_pass retry=3 type= minlen=8 minclass=4 # <-- 수정 password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so
위 두부분에만 적용하고 /etc/pam.d/passwd
는 수정하지 않는다. passwd
정책까지 변경하면 중복 설정되어 암호 변경시 3회 물어본다.
pam_cracklib
관련 옵션은 아래 페이지 참조
기본적으로 pam_cracklib.so
모듈은 root 사용자는 적용되지 않는다. root 사용자도 동일하게 적용하기 위해서는 pam_passwdqc.so
모듈을 사용하여야 한다.
# rpm -qf /lib64/security/pam_passwdqc.so pam_passwdqc-1.0.5-6.el6.x86_64
해당 모듈이 설치되어있는지 확인 후
/etc/pam.d/system-auth
password requisite pam_cracklib.so try_first_pass retry=3 # <- cracklib 모듈 부분을 아래와 같이 변경한다. password requisite pam_passwdqc.so min=disabled,12,8,6,5 max=40 passphrase=3 match=4 similar=deny random=42 enforce=everyone retry=3 # <- 변경
RHEL7에서는 pam_cracklib 대신에 pam_pwquality
모듈이 사용된다. 기본적으로 적용되어있으며 정책파일만 수정해주면 된다.
복잡성 옵션에 대한 설정은 /etc/security/pwquality.conf
파일을 변경하여야 한다.
/etc/security/pwquality.conf
minlen = 8 minclass = 4
또는 아래와 같이 authconfig
명령어를 이용해도 된다.
# authconfig --passminlen=<number> --passminclass=<number> --passmaxrepeat=<number>
PasssssssWord
에서 s
의 갯수P@ssword
에서 ssword
는 연속된 같은 소문자
옵션에 대한 설정은 pwquality.conf를 참조. 또는 man authconfig
위 설정은 root
사용자는 적용받지 않는다. root
사용자도 강제적으로 적용하기 위해서는 아래 내용을 추가로 설정하여야 한다.
root
사용자도 pwquality 적용을 하기 위해서는 /etc/pam.d/system-auth
파일과 /etc/pam.d/password-auth
파일의 내용을 수정하여야 한다.
해당 파일내에 local_users_only
라고 되어있는 부분을 enforce_for_root
로 변경해주면 된다.
/etc/pam.d/system-auth
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth required pam_faildelay.so delay=2000000 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 sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet account required pam_permit.so #password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= # <-- 기존 내용 password requisite pam_pwquality.so try_first_pass enforce_for_root retry=3 authtok_type= # <-- 이렇게 수정한다. password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so -session optional pam_systemd.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so
암호 변경시 예전에 사용한 암호는 재사용하지 못하도록 이전에 설정했던 암호를 기억하기 위한 설정
/etc/pam.d/system-auth
와 /etc/pam.d/password-auth
의 내용중 pam_unix.so
인자값에 remember=N
을 추가하도록 한다.
password sufficient pam_unix.so md5 remember=6 shadow nullok try_first_pass use_authtok # <- remember=6 추가
아래 내용을 /etc/pam.d/system-auth
와 /etc/pam.d/password-auth
의 pam_pwquality.so
라인 아래에 추가하도록 한다.
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password requisite pam_pwhistory.so remember=5 use_authtok # <- 여기에 추가 password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
RHEL7/CentOS7 에서 저장된 암호 히스토리는 /etc/security/opasswd
에 저장된다. 이것을 초기화하기 위해서는 아래와 같이 하면 해결된다.
echo > /etc/security/opasswd
무작위 대입 시도시 일정 횟수 이상 실패하면 차단하는 설정
pam.tally 모듈을 사용하여 적용한다.
/etc/pam.d/system-auth
파일의 맨 윗부분에 아래의 내용을 추가한다.
auth required pam_tally.so deny=3 onerr=fail unlock_time=1200 no_magic_root account required pam_tally.so no_magic_root reset
pam.tally2 모듈을 사용하여 적용한다.
/etc/pam.d/system-auth
파일의 맨 윗부분에 아래의 내용을 추가한다.
auth required pam_tally2.so deny=3 onerr=fail unlock_time=1200 no_magic_root
RHEL 6 부터는 pam_faillock
모듈을 사용한다.
1. root 사용자를 제외한 모든 사용자에 대해서 3회 이상 실패시 600초(10분) 동안 차단하는 설정이다.
/etc/pam.d/system-auth
파일과 /etc/pam.d/password-auth
파일의 auth
섹션에 아래 내용을 추가한다.
auth required pam_faillock.so preauth silent audit deny=3 unlock_time=600 auth sufficient pam_unix.so nullok try_first_pass auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=600
2. account
섹션에도 아래 내용을 추가한다.
account required pam_faillock.so
3. root
사용자도 동일하게 적용하기 위해서는 1번 항목 적용시 even_deny_root
속성을 추가하도록 한다.
auth required pam_faillock.so preauth silent audit deny=3 even_deny_root unlock_time=600 auth sufficient pam_unix.so nullok try_first_pass auth [default=die] pam_faillock.so authfail audit deny=3 even_deny_root unlock_time=600 account required pam_faillock.so
4. 로그조회는 faillock
명령어를 통해 조회 가능함.
[root@localhost ~]# faillock john: When Type Source Valid 2013-03-05 11:44:14 TTY pts/0 V
5. 차단된 사용자를 즉시 해제하려면 아래의 명령어를 사용하도록 한다.
faillock --user <username> --reset
/etc/pam.d/system-auth
파일과 /etc/pam.d/password-auth
파일에 아래처럼 수정하도록 한다.
/etc/pam.d/system-auth
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth required pam_faillock.so preauth silent audit deny=3 unlock_time=600 # 추가 auth sufficient pam_unix.so nullok try_first_pass auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=600 # 추가 auth requisite pam_succeed_if.so uid >= 1000 quiet_success auth required pam_deny.so account required pam_faillock.so # 추가 account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet account required pam_permit.so password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so -session optional pam_systemd.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so
wheel
그룹에 속한 사용자만 su명령어를 사용할 수 있도록 설정
/etc/pam.d/su
#%PAM-1.0 auth sufficient pam_rootok.so # Uncomment the following line to implicitly trust users in the "wheel" group. #auth sufficient pam_wheel.so trust use_uid # 주석해제 시 해당 그룹사용자는 무조건 신뢰(패스워드확인 안함) # Uncomment the following line to require a user to be in the "wheel" group. #auth required pam_wheel.so use_uid # 주석해제 시 해당 그룹사용자는 패스워드 확인 후 신뢰 auth include system-auth account sufficient pam_succeed_if.so uid = 0 use_uid quiet account include system-auth password include system-auth session include system-auth session optional pam_xauth.so
상황에 따라 trust 옵션을 사용할 지 결정하도록 한다.
login.defs
설정은 shadow-utils
패키지에 포함된 명령어에만 유효한 설정임을 명심한다.
해당 패키지에 포함된 명령어는 아래와 같다.
따라서 /usr/bin/passwd
같이 패스워드 변경 명령어는 login.defs 의 내용에 영향을 받지 않는다. 이부분은 pam.d
모듈과 관련이 있다
/etc/login.defs
파일은 새로운 사용자를 생성
하는 경우에만 적용된다. 이미 만들어진 사용자들에 대한 정책은 pam.d 를 사용하여야 한다.
pam.d 설정 없이 login.defs 내용만 변경한다고 해서 적용되지 않는다. 본 문서 위쪽의 암호 복잡성 설정
부분 참조.
/etc/login.defs
파일에 패스워드 관련 기본 설정 변경
# Password aging controls: # # PASS_MAX_DAYS Maximum number of days a password may be used. # PASS_MIN_DAYS Minimum number of days allowed between password changes. # PASS_MIN_LEN Minimum acceptable password length. # PASS_WARN_AGE Number of days warning given before a password expires. # PASS_MAX_DAYS 99999 # 패스워드 최대 사용기간 (일반적으로 기간을 제한하는것보다 복잡성을 설정하는것이 보안에 좋음) PASS_MIN_DAYS 0 PASS_MIN_LEN 9 # 9글자 이상으로 변경 PASS_WARN_AGE 7
/etc/profile
내에 TMOUT
환경 변수 설정 아울러 히스토리 사이즈도 5000으로 수정해준다.
HOSTNAME=`/usr/bin/hostname 2>/dev/null` HISTSIZE=5000 # 히스토리 저장 갯수 5000으로 변경 HISTTIMEFORMAT="%F %T " # 히스토리 저장시 날짜 시간 같이 저장 TMOUT=300 # 세션 타임아웃 시간 설정 if [ "$HISTCONTROL" = "ignorespace" ] ; then export HISTCONTROL=ignoreboth else export HISTCONTROL=ignoredups fi export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL HISTTIMEFORMAT TMOUT # 환경변수 적용