Linux 시스템 보안 기준점 설정 가이드

서버 보안 기준점

1. 기준점 점검의 필요성

업무 시스템의 현재 보안 상태를 평가하여 취약점과 잠재적 위험을 식별합니다. 이를 통해 공격자의 악의적인 침입이나 불법 접근을 예방할 수 있습니다.

Linux 환경에서 핵심 설정 파일들:

/etc/passwd          --- 사용자 기본 속성 정보, root 수정 가능, 모든 사용자 읽기 가능
/etc/shadow          --- 사용자 암호 해시값 저장
/etc/group           --- 사용자 그룹 속성 정보
/etc/login.defs      --- 암호 정책 기본 설정
/etc/pam.d/system-auth --- PAM 기반 암호 복잡도 규칙

2. 점검 범위 개요

보안 기준점 점검은 네 가지 영역으로 구분됩니다:

1. 계정 보안     --- 고유한 식별 체계
2. 인증 관리     --- 사용자 신원 확인
3. 권한 부여     --- 허가된 접근 범위
4. 감사 기록     --- 수행 가능한 작업 추적
운영체제 버전 확인
cat /etc/os-release

RHEL 계열 및 호환 배포판 적용

3. 암호 정책 설정

3.1 암호 복잡도 요구사항

자동 점검 스크립트

#!/bin/bash

TARGET_FILE="/etc/pam.d/system-auth"

if [[ ! -f "$TARGET_FILE" ]]; then
    echo "result=파일을 찾을 수 없음: $TARGET_FILE"
    exit 1
fi

PAM_LINE=$(grep -v '^[[:space:]]*#' "$TARGET_FILE" | \
           grep -E "password[[:space:]]+requisite[[:space:]]+pam_cracklib\.so")

if [[ -z "$PAM_LINE" ]]; then
    echo "result=pam_cracklib.so 설정 미발견"
    exit 1
fi

echo "$PAM_LINE"

PARAMS=(minlen dcredit ucredit lcredit ocredit)
IDX=1

for PARAM in "${PARAMS[@]}"; do
    VAL=$(echo "$PAM_LINE" | grep -oP "${PARAM}=\K[^[:space:]]+" | head -1)
    if [[ -n "$VAL" ]]; then
        echo "result${IDX}=${VAL}"
    else
        echo "result${IDX}=미설정"
    fi
    ((IDX++))
done

점검 기준:

항목기준값비교 연산
최소 암호 길이8
숫자 최소 포함 수-4=
대문자 최소 포함 수-2=
소문자 최소 포함 수-1=
특수문자 최소 포함 수-1=

매개변수 의미:

minlen=N     : 새 암호의 최소 길이
dcredit=N    : N>0 최대 허용 횟수, N<0 최소 필요 횟수 (숫자)
ucredit=N    : 동일 규칙 적용 (대문자)
lcredit=N    : 동일 규칙 적용 (소문자)
ocredit=N    : 동일 규칙 적용 (특수문자)</code>

적용 방법:

# 1. 백업 생성
cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak

# 2. 설정 파일 수정
vi /etc/pam.d/system-auth

# 다음 내용 추가:
password requisite pam_cracklib.so minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
3.2 암호 유효 기간

점검 명령어:

grep -Ev '^[[:space:]]*#|^$' /etc/login.defs | \
    grep -wE 'PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_MIN_LEN|PASS_WARN_AGE'

점검 기준:

항목기준값비교 연산
단 변경 간격(일)1
최장 사용 기간(일)180
최소 길이8
만료 전 알림(일)28=

적용 방법:

# 1. 백업
cp /etc/login.defs /etc/login.defs.bak

# 2. 설정 수정
vi /etc/login.defs

PASS_MAX_DAYS   90
PASS_MIN_DAYS   1
PASS_MIN_LEN    8
PASS_WARN_AGE   28
3.3 개별 사용자별 암호 정책 적용 여부

점검 스크립트:

#!/bin/bash

while IFS=: read -r USERNAME _ _ _ _ _ SHELL; do
    [[ "$SHELL" == *"nologin"* ]] && continue
    
    SHADOW_ENTRY=$(awk -F: -v u="$USERNAME" '$1==u {print}' /etc/shadow 2>/dev/null)
    [[ -z "$SHADOW_ENTRY" ]] && continue
    
    PASS_HASH=$(echo "$SHADOW_ENTRY" | awk -F: '{print $2}')
    [[ "$PASS_HASH" =~ ^(\*|\!|\!\!) ]] && continue
    
    MIN_DAYS=$(echo "$SHADOW_ENTRY" | awk -F: '{print $4}')
    MAX_DAYS=$(echo "$SHADOW_ENTRY" | awk -F: '{print $5}')
    
    MIN_DAYS=${MIN_DAYS:-null}
    MAX_DAYS=${MAX_DAYS:-null}
    
    echo "USER_NAME=${USERNAME}  PASS_MIN_DAYS=${MIN_DAYS}  PASS_MAX_DAYS=${MAX_DAYS}"
    
done < <(grep -v '^[[:space:]]*#' /etc/passwd 2>/dev/null)

수동 확인:

cat /etc/shadow

shadow 파일 필드 구조: 사용자명:암호해시:최종변경일:최소변경간격:최대사용기간:경고기간:유예기간:계정만료일:예약

개별 사용자 정책 강제 적용:

chage -m 1 -M 90 -W 28 사용자명
3.4 로그인 실패 처리

모듈 버전 확인:

find /lib* -name 'pam_tally*.so' 2>/dev/null

설정 방식 (pam_tally.so):

auth     required /lib/security/pam_tally.so onerr=fail no_magic_root
account  required /lib/security/pam_tally.so deny=5 no_magic_root reset

설정 방식 (pam_tally2.so):

auth required pam_tally2.so deny=5 even_deny_root_account audit

login.defs 추가 설정:

LOGIN_RETRIES    5
LOGIN_TIMEOUT  900

통합 점검 스크립트:

#!/bin/bash

check_tally_module() {
    local MOD_NAME=$1
    local AUTH_LINE
    
    AUTH_LINE=$(grep -v '^\s*#' /etc/pam.d/system-auth 2>/dev/null | \
                grep -E "auth[[:space:]]+required[[:space:]]+\S*${MOD_NAME}\.so")
    
    if [[ -n "$AUTH_LINE" ]]; then
        echo "$AUTH_LINE"
        
        local DENY_VAL
        DENY_VAL=$(echo "$AUTH_LINE" | grep -oP 'deny=\K[^[:space:]]+' | head -1)
        echo "deny=${DENY_VAL:-미설정}"
        
        if echo "$AUTH_LINE" | grep -qE 'even_deny_root_account|even_deny_root'; then
            echo "root_제한=적용됨"
        else
            echo "root_제한=미적용"
        fi
    fi
}

if ls /lib*/security/pam_tally2.so &>/dev/null; then
    check_tally_module "pam_tally2"
elif ls /lib*/security/pam_tally.so &>/dev/null; then
    check_tally_module "pam_tally"
else
    echo "result=pam_tally 모듈 미설치"
fi

for CFG in LOGIN_RETRIES LOGIN_TIMEOUT; do
    VAL=$(grep -v '^[[:space:]]*#' /etc/login.defs | grep -w "$CFG" | awk '{print $2}')
    echo "${CFG}=${VAL:-미설정}"
done

잠금 상태 확인 및 해제:

# 특정 사용자 잠금 상태 조회
faillock --user 사용자명

# 잠금 해제
faillock --user 사용자명 --reset

UOS(统信) 계열 적용

4. 암호 정책

4.1 복잡도 규칙

권장 설정값:

매개변수의미권장값
retry오류 시 재시도 횟수3
enforce_for_rootroot 계정도 정책 적용활성화
minlen최소 길이8
minclass필수 문자 종류 수4
maxsequence연속 문자 최대 길이3
maxrepeat반복 문자 최대 횟수3

적용 방법:

# 1. 백업
cp /etc/pam.d/common-password /etc/pam.d/common-password.bak

# 2. 설정 추가
vi /etc/pam.d/common-password

password requisite pam_pwquality.so retry=3 enforce_for_root minlen=8 minclass=4 maxsequence=3 maxrepeat=3
4.2 유효 기간 설정
cp /etc/login.defs /etc/login.defs.bak

vi /etc/login.defs

PASS_MAX_DAYS   90
PASS_MIN_DAYS    1
PASS_WARN_AGE   28
4.4 로그인 실패 처리

로컬 콘솔 로그인:

cp /etc/pam.d/login /etc/pam.d/login.bak

vi /etc/pam.d/login

auth required pam_tally2.so deny=10 unlock_time=900 even_deny_root root_unlock_time=900

SSH 원격 접속:

cp /etc/pam.d/sshd /etc/pam.d/sshd.bak

vi /etc/pam.d/sshd

auth required pam_tally2.so deny=10 unlock_time=900 even_deny_root root_unlock_time=900

매개변수 설명:

deny=10              : 일반/root 계정 최대 10회 오류 시 잠금
unlock_time=900      : 일반 계정 900초(15분) 후 자동 해제
even_deny_root       : root 계정도 동일 정책 적용
root_unlock_time=900 : root 계정 900초 후 자동 해제

이터베이스 보안

DM(达梦) 데이터베이스

閑置 연결 종료 및 로그인 잠금:

ALTER USER "계정명" LIMIT 
    CONNECT_IDLE_TIME 15 
    FAILED_LOGIN_ATTEMPS 5 
    PASSWORD_LOCK_TIME 30;

암호 유효 기간:

ALTER USER "계정명" LIMIT PASSWORD_LIFE_TIME 90;

암호 복잡도 정책 (비트마스크 30):

ALTER USER "계정명" PASSWORD_POLICY 30;

정책 30 = 길이 9자 이상 + 대문자 1개 이상 + 숫자 1개 이상 + 특수문자 1개 이상

태그: linux 보안 기준점 pam pam_cracklib pam_pwquality

7월 9일 20:57에 게시됨