[Linux] RHEL 8 / Rocky 8 | OS 보안 설정 방법
Red Hat Enterprise Linux에서 파생된 리눅스 배포판 CentOS가 2021년 12월 31일 기준으로 수명이 다 되었다고 합니다.
CentOS는 RHEL의 소스를 기반으로 철저하게 최신 버전의 RHEL을 포킹하는데 중점을 두어 사용되었으나 이제부터는 RHEL배포 이전에 테스트 기반(Stream버전)만 지원하므로 더이상 우리가 안정적으로 사용했던 CentOS의 장점이 사라졌다.
다행스럽게 새롭게 RHEL을 포킹하는 Rocky Linux가 생겨났고, 기존 CentOS를 Rocky로 대체하는 분위기가 형성되어있다.
Rocky Linux는 RHEL8 버전을 포킹하는 프로젝트라 기존 7버전까지 잘 사용하던 보안 설정과 tcp_wrappers부분 (host.allow설정)이 미지원되어 새로운 방법으로 보안설정이 필요로 하게 되었다.
[보안 설정]
보안 설정에서 /etc/pam.d/ 이하 system-auth 설정으로 계정 보안 설정이 필요했으나, 8버전 부터 해당 설정 파일을 수동으로 변경하기보다 명령어를 통해 변경하는 것을 권장한다고 합니다.
패스워드 길이 정책은 아래 경로에서 (기본은 전부 주석) 주석을 해제하고, 필요한 값으로 대체해야 합니다.
1. pam_pwquality 모듈 설정
[root@localhost ~]# vi /etc/security/pwquality.conf
minlen = 8 (최소 패스워드 길이 8로 설정)
dcredit = 1 (최소 1개 이상 숫자 포함)
ucredit = 1 (최소 1개 이상 대문자 포함)
lcredit = 1 (최소 1개 이상 소문자 포함)
ocredit = 1 (최소 1개 이상 특수문자 포함)
maxrepeat =3 (최대 연속된 동일한 숫자 또는 문자 3회 이상 안됨) 111
maxclassrepeat = 3 (최대 연속된 숫자 또는 문자 반복 3회 이상 안됨) 123
usercheck = 1 (패스워드에 사용자ID 포함 여부- 1 체크, 0 No체크)
2. vi /etc/pam.d/system-auth
아래와 같이 system-auth 파일을 수정하였고, root 또는 사용자 계정으로 접속할 때 특이사항은 없었다.
파란색으로 표기한 내용이 보안 설정을 위해 추가한 내용이며, 그 외는 기본 Default 설정이다.
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authselect is run.
auth required pam_env.so
auth required pam_faillock.so preauth silent audit deny=5 even_deny_root unlock_time=600
auth required pam_faillock.so delay=2000000
auth sufficient pam_fprintd.so
auth [default=1 ignore=ignore success=ok] pam_succeed_if.so uid>=1000 quiet
auth [default=1 ignore=ignore success=ok] pam_localuser.so
auth sufficient pam_unix.so nullok try_first_pass
auth [default=die] pam_faillock.so authfail audit deny=5 even_deny_root unlock_time=600
auth requisite pam_succeed_if.so uid>=1000 quiet_success
auth sufficient pam_sss.so forward_pass
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 [default=bad success=ok user_unknown=ignore] pam_sss.so
account required pam_permit.so
account required pam_faillock.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
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 optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
3. tcp_wrappers 대신 firewall 모듈 사용으로 ssh접근 호스트 정책 제어
아래와 같이 파란색표기된 zone에 IP를 넣어두지 않으면 외부에서 SSH접근 불가
RHEL 7버전 이하에서는 hosts.allow, hosts.deny 파일에 접근 허용할 호스트 IP를 등록하면 되었으나 8버전부터는 모듈이 지원되지 않아 사용이 불가능하다.
firewalld 패키지를 사용하여 특정 호스트에 대한 접속 허용을 아래와 같이 지정하면 됩니다.## ssh 서비스를 기본 방화벽에서 제거
# firewall-cmd --permanent --remove-service=ssh
## newzone 이름으로 새로운 zone 추가
# firewall-cmd --permanent --new-zone=newzone
# firewall-cmd --permanent --zone=newzone --add-source=10.0.0.0/24
## 추가된 newzone에 ssh서비스를 추가
# firewall-cmd --permanent --zone=newzone --add-service=ssh
## 방화벽 다시 로드
# firewall-cmd --reload
등록된 Zone 정보를 보고 싶을 때 조회 명령어
# firewall-cmd --list-all-zone
# firewall-cmd --get-zones
# firewall-cmd --get-active-zones
등록된 source를 제거하고 싶을 때 (10.10.10.30 IP를 등록된 zone에서 제거할 때)
# firewall-cmd --permanent --zone=newzone --remove-service=10.10.10.30
4. root 계정 su 제한 설정
# /etc/pam.d/su 파일에 주석 처리되어 있는 아래 부분 주석 해제
(수정전) #auth required pam_wheel.so use_uid
(수정후) auth required pam_wheel.so use_uid
위와같이 저장 후 사용자 계정에서 root접속을 허여할 사용자 계정ID에 아래와 같이 명령어 실행
# usermod --groups wheel 사용자ID
(예시) # usermod --groups wheel infraboy
5. 기본 셋팅(Application 성격에 맞게) ulimits 제한 설정 --- 보안설정은 아님
* soft core unlimited
* hard core unlimited
사용자ID soft nproc 16384
사용자ID hard nproc 16384
사용자ID soft nofile 131072
사용자ID hard nofile 131072
root soft nofile 131072
root hard nofile 131072
6. 패스워드 만료일 설정 (이후 설정된 계정에만 적용되며 기존 계정에는 적용 안됨)
아래와 같이 적용해야 보안 심사에서 귀찮게 안함.
# vi /etc/login.defs
PASS_MAX_DAYS 90 (90~180일 권장)
PASS_MIN_DAYS 90 (MAX값과 동일하게 설정)
PASS_MIN_LEN 8 (패스워드 최소 길이 설정)
PASS_WARN_AGE 7
* 특정 계정에는 패스워드 만료를 안먹이도록 설정이 필요할 수 있음.
(스케줄링에 의한 계정 등)
# chage -l 사용자ID (사용자ID에 대한 패스워드 정책 조회)
# chage -E -1 -I 0 -m 0 -M 99999 사용자ID (사용자ID에 대해 패스워드 만료 안되게 설정)
7. 로그인 접속 세션 시간 설정 및 History 조회 시 타임라인 설정
# vi /etc/profile
HISTSIZE=2000 (기본 1000)
HISTTIMEFORMAT="%F %T " (%T뒤에 스페이스 붙여야 시간과 명령어가 떨어져서 보임)
TMOUT=600 (세션 타임아웃 설정- 보안 가이드에 맞게 설정)
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL HISTTIMEFORMAT TMOUT
8. 부팅 시 서비스 자동 시작
# systemctl -t service list-unit-files
# systemctl enable "서비스 Unit"