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