CentOS 8 - 보안설정
- ◈『OS』/Linux[CentOS (Stream)]
- 2020. 6. 16.
CentOS 8 - Security Settings
처음 리눅스를 설치하고 나서는 대부분이 기본값이므로 보안에 매우 취약한 상태입니다.
보안은 완벽하게 막을 수는 없겠지만 최소한으로 줄이기 위해 어떤 설정을 사용하면 좋을지 알아보도록 하겠습니다.
■ [설치환경 및 준비물]
CentOS 8 리눅스 설치 서버 [포스팅 참고]
※ 해당 포스팅은 추가 내용이 있다면 계속 수정 작업이 들어갑니다.
※ Cent OS 8부터는 소프트웨어나 모듈이 대체되는 게 많습니다.
실제 적용 후 테스트를 하여 정상 작동이 되는지 확인 되었습니다.
□ SSH ROOT 접근 관련 보안 설정[순차적 진행]
1. 일반계정 생성 및 패스워드
의외로 서버 관리자가 ROOT로 원격 접속을 바로하는 경우가 많습니다. 만약 무작위 대입 공격[Brute Force Attack]에 의해 패스워드가 탈취당할 경 우 서버는 그대로 해커에 의해 노출이 됩니다. 이를 막기 위해 SSH를 접근할 경우 일반계정을 생성하고 일부 특정 계정만 ROOT로 접근할 수 있도록 권한 설정을 하는 게 좋습니다.
계정 생성[useradd]
[root@localhost ~]# useradd test
생성 확인
[root@localhost ~]# cat /etc/passwd | grep test
test:x:1000:1000::/home/test:/bin/bash
패스워드 설정[passwd]
[root@localhost ~]# passwd test
test 사용자의 비밀 번호 변경 중
새 암호: (암호 입력)
새 암호 재입력: (암호 입력)
passwd: 모든 인증 토큰이 성공적으로 업데이트되었습니다.
2. SU 명령어 제한
일반계정이 ROOT로 접근하기 위해서는 SU 명령어를 통해 권한을 상승해야 합니다.
보안을 위해 wheel 그룹에 속한 사용자만 SU 명령어를 사용할 수 있게 설정합니다.
SU 설정[수정 후 저장]
[root@localhost ~]# vi /etc/pam.d/su
#% PAM-1.0
auth required pam_env.so
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.
(사용자가 "wheel"그룹에 속하도록 하려면 다음 줄의 주석을 해제하십시오.)
auth required pam_wheel.so use_uid [해당 부분 주석(#) 제거]
auth substack system-auth
auth include postlogin
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
session include postlogin
session optional pam_xauth.so
wheel 그룹이 존재하지 않을 시 그룹 추가 [이미 존재]
[root@localhost ~]# cat /etc/group | grep wheel
wheel:x:10:
만약 그룹이 없을 경우는 다음과 같이 추가 [없을 경우만 입력]
[root@localhost ~]# groupadd wheel
SU 명령을 허용할 계정을 wheel 그룹으로 설정[# usermod -G wheel <일반계정명>]
[root@localhost ~]# usermod -G wheel test
생성 확인
[root@localhost ~]# cat /etc/group | grep wheel
wheel:x:10:test [추가 확인]
3. ROOT 계정의 원격 접속 제한 및 포트 변경
SSH접근을 하기 위한 포트(PORT)는 기본적으로 [22] 포트입니다. 잘 알려진 만큼 해당 포트에 대한 공격 시도가 많습니다.
관리자만 접근하는 포트를 별도로 설정하는 게 좋습니다. 또한 ROOT로 바로 접속하지 못하도록 설정을 하는 것도 좋습니다. 다만 포트 변경은 RFC에 의해 표준화된 포트[위키백과 참고]를 제외하고 설정하는 것을 권고. 예를 들어 21(FTP), 23(Telnet), 25(SMTP), 110(POP3)등을 동일하게 사용하면 포트가 충돌이 날 수 있으므로 피하는 게 좋습니다.
설정 파일[수정 후 저장]
[root@localhost ~]# vi /etc/ssh/sshd_config
Port 8888 [주석(#) 삭제 후 원하는 포트 번호 입력]
PermitRootLogin no [yes → no] 변경
SSH 재시작
[root@localhost ~]# systemctl restart sshd
IPTABLES 방화벽 수정 [순서 중요하므로 의미를 모르실 경우는 동일하게 진행]
[root@localhost ~]# vi /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED, ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8888 -j ACCEPT [포트 수정]
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
IPTABLES 방화벽 재시작
[root@localhost ~]# systemctl restart iptables
적용 확인
[root@localhost ~]# iptables -nL | grep 8888
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:8888
4. 적용 확인 테스트[스크린샷]
□ 계정 패스워드 관련 보안 설정
1. 계정 패스워드[login.defs]
설정 파일[수정 후 저장]
[root@localhost ~]# vi /etc/login.defs
PASS_MAX_DAYS 90 [99999 → 90] - 패스워드 최대 사용(만료) 기간 [권장 90~180일]
PASS_MIN_DAYS 90 [0 → 90] - 패스워드 최소 사용기간(MAX 똑같이 설정) [권장 90~180일]
PASS_MIN_LEN 8 [5 → 8] - 패스워드 최소 길이 설정 [권장 8자 이상]
PASS_WARN_AGE 7 [동일] - 패스워드 기간 만료 경고 표시 [사용자에 맞게 설정]
※ 기존 계정은 적용 안되며 새로 생성된 계정들은 위 정책에 의해 자동으로 적용됩니다.
기존 계정 설정[패스워드 최대 사용 기간 제한]
[root@localhost ~]# passwd -x 90 test
test 사용자의 사용 기한 데이터 조정 중
passwd: 성공
변경 확인[방법 1]
[root@localhost ~]# chage -l test
마지막으로 암호를 바꾼 날 : 6월 15, 2020
암호 만료 : 9월 13, 2020
암호가 비활성화 기간 :안 함
계정 만료 :안 함
암호를 바꿀 수 있는 최소 날 수 : 0
암호를 바꿔야 하는 최대 날 수 : 90
암호 만료 예고를 하는 날 수 : 7
변경 확인[방법 2]
[root@localhost ~]# cat /etc/shadow | grep test
test:암호화::18428:0:90:7::: [해당 위치가 90일로 설정되어있는지 확인]
변경 확인[방법 3]
[root@localhost ~]# passwd -S test
test PS 2020-06-14 0 90 7 -1 (비밀번호가 설정되어있습니다, SHA512 암호화. )
2. 패스워드 복잡도
Cent OS 8부터는 pam_cracklib 대신에 pam_pwquality 모듈이 적용됩니다.
아래 정책을 꼭 따를 필요는 없으며 필요한 정책만 적용할 것
설정 파일[수정 후 저장]
[root@localhost ~]# vi /etc/security/pwquality.conf
minlen = 8 [주석(#) 제거] - 최소 패스워드 길이 설정 [6자 이하는 설정 안 됨, 최소 8 이상 권장]
dcredit = 1 [주석(#) 제거, 0 → 1] - 최소 필요한 숫자 수 [최소 1 이상 권장]
ucredit = 1 [주석(#) 제거, 0 → 1] - 최소 필요한 대문자 수 [최소 1 이상 권장]
lcredit = 1 [주석(#) 제거, 0 → 1] - 최소 필요한 소문자 수 [최소 1 이상 권장]
ocredit = 1 [주석(#) 제거, 0 → 1] - 최소 필요한 특수문자 수 [최소 1 이상 권장]
maxrepeat = 3 [주석(#) 제거, 0 → 3] - 최대 연속된 동일한 반복 수 [최소 3 이상 권장] (예 aaa,111 형태를 사용 못함)
maxclassrepeat = 3 [주석(#) 제거, 0 → 3] - 최대 연속 문자 반복 수 [최소 3 이상 권장] (예 abc,123 형태를 사용 못함)
usercheck = 1 [주석(#) 제거, 그대로] - 패스워드에 유저 ID가 포함되어 있는지 점검 [1 권장/0 체크 안 함]
(예 ID:LOVE PASS:LOVE123 형태를 사용 못함)
pwquality.conf 정보를 불러올 수 있게 PAM 모듈 추가 [이미 존재]
[ ROOT도 적용 시local_users_only → enforce_for_root 변경 ]
[root@localhost pam.d]# vi /etc/pam.d/system-auth
password requisite pam_pwquality.so try_first_pass local_users_only
[root@localhost pam.d]# vi /etc/pam.d/password-auth
password requisite pam_pwquality.so try_first_pass local_users_only
※ 이 설정은 ROOT 권한이 있는 사용자가 수정할 시에는 무시합니다. 일반계정 사용자가 패스워드가 만료 후 패스워드를 재설정했을 때 적용되는 정책입니다.
□ 로그인 잠금 설정 및 접속 세션 관련
1. 로그인 실패 잠금 설정
Cent OS 8부터는 pam_tally2 더 이상 기본으로 사용되지 않으며 faillock으로 이용하게 됩니다. 동일하게 pam_faillock.so 모듈을 이용하며 일정 간격 동안 사용자별로 실패한 인증 시도 목록을 유지 관리하고 인증 실패가 연속적으로 거부될 경우 계정을 잠급니다.
설정 파일 [수정 후 저장](※ 이 줄의 순서는 매우 중요하므로 꼭 해당 라인 사이에 추가할 것)
[root@localhost pam.d]# vi /etc/pam.d/system-auth
# Generated by authselect on Mon Jun 15 04:15:03 2020
# Do not modify this file manually.
auth required pam_env.so
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=600 [라인 추가]
auth required pam_faildelay.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 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 [라인 추가]
..
※[옵션 설명]
audit - 사용자(일반계정) 감사를 활성화
deny - 실패 횟수를 의미하며 설정상 [=5]되어 있을 경우 5회 로그인 실패 시 계정 잠금
unlock_time - 계정이 잠길 시 유지되는 시간 [=600(10분)]초 단위이며 시간이 지나면 자동 해제됩니다. 설정하지 않으면 무조건 잠기게 되므로 [faillock] 명령어를 이용해 수동으로 해제
ROOT의 계정도 적용하고 싶을 경우는 아래의 옵션 추가
even_deny_root [예시]
auth required pam_faillock.so preauth silent audit deny=5 even_deny_root unlock_time=600
auth [default=die] pam_faillock.so authfail audit deny=5 even_deny_root unlock_time=600
설정 파일 [수정 후 저장](동일)
[root@localhost pam.d]# vi /etc/pam.d/password-auth
# Generated by authselect on Mon Jun 15 04:15:03 2020
# Do not modify this file manually.
auth required pam_env.so
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=600 [라인 추가]
auth required pam_faildelay.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 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 [라인 추가]
..
faillock 명령어를 통해 로그인 실패 확인 여부
전체 사용자 확인
[root@localhost faillock]# faillock
test:
When Type Source Valid
2020-06-16 02:02:14 RHOST 192.168.232.1 V
2020-06-16 02:02:19 RHOST 192.168.232.1 V
2020-06-16 02:02:37 RHOST 192.168.232.1 V
2020-06-16 02:05:17 RHOST 192.168.232.1 V
2020-06-16 02:05:25 RHOST 192.168.232.1 V
test2:
When Type Source Valid
2020-06-16 02:08:00 RHOST 192.168.232.1 V
특정 사용자만 확인
[root@localhost faillock]# faillock --user test
수동 차단 해제
[root@localhost faillock]# faillock --user test --reset
로그인 한 번이라도 실패한 계정은 아래의 경로에 관리됨
[root@localhost faillock]# ls /var/run/faillock/
test
2. 로그인 접속 세션 시간 설정
위 보안설정이 아무리 잘 되어있더라도 관리자가 로그인 상태에서 잊어버리고 방치를 하게 되면 관리자 PC가 해킹을 당 할 경우 보안에 아무 의미가 없게 됩니다. 이러한 문제를 방지하기 위해 자동 로그아웃 기능을 이용하는 게 좋습니다.
설정 파일[수정 후 저장]
[root@localhost ~]# vi /etc/profile
..
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000 [1000 → 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 [추가]
..
예시) 아래와 같이 명령어 시간도 같이 표시
[root@localhost ~]# history
108 2020-06-16 04:36:43 yum --enablerepo=elrepo-kernel install kernel-ml
109 2020-06-16 04:36:43 ifconfig -a
110 2020-06-16 04:36:43 reboot
111 2020-06-16 04:36:43 useradd test2
112 2020-06-16 04:36:43 passwd test
113 2020-06-16 04:36:43 logout
114 2020-06-16 04:36:43 id
115 2020-06-16 04:36:45 history
'◈『OS』 > Linux[CentOS (Stream)]' 카테고리의 다른 글
CentOS 8 - FTP 서버 구축(VSFTPD) 설치 (0) | 2020.06.25 |
---|---|
CentOS 8 - 웹 서버 구축 [APM] 설치 (2) | 2020.06.24 |
CentOS 8 - GUI 설치 (0) | 2020.06.14 |
CentOS 8 - 최신 kernel(5.X) 설치 [ELRepo(YUM)] (0) | 2020.06.11 |
CentOS 8 - 설치 및 기본설정 (0) | 2020.06.05 |