CentOS 8 - 보안설정

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

Designed by JB FACTORY