서버 보안 기준점
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_root | root 계정도 정책 적용 | 활성화 |
| 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개 이상