인프라 진단/주•통기반 리눅스 서버 점검

U-03. 계정 잠금 임계값 설정

sheow13 2024. 6. 23. 15:40
728x90

 

  주요정보통신기반시설 기술적 취약점 분석 평가

- 과학기술정보통신부 및 한국인터넷진흥원에서 발행한 가이드로, IDC, ISP 등 민간, 공공시설을 불문하고 침해사고 등이

발생할 경우 경제사회와 국가안정에 미치는 영향이 큰 시설들을 말하며, 이 시설들을 보호하기 위해 내부에 존재하는 취약점을 파악 및 조치하는 방법을 기술해놓은 가이드로, 국내 많은 기업들이 해당 가이드를 토대로 점검 및 조치를 진행하고 있다.

- 주요정보통신기반시설 기술적 취약점 분석 평가에는 주요 점검 대상으로 유닉스, 윈도우즈, 보안장비, 네트워크 장비, 데이터베이스, 웹 등을 다루고 있으며 해당 챕터에서는 유닉스(리눅스)서버를 다룰 예정

- 해당 가이드는 한국인터넷진흥원 가이드라인에서 참고

- https://www.kisa.or.kr/2060204/form?postSeq=12&page=1

 

 

  유닉스(리눅스) 서버 점검 항목

- Unix(Linux) 서버 점검 항목으로 크게 계정 관리, 파일 및 디렉터리 관리, 서비스 관리, 패치 관리, 로그 관리 등을 다루고 있다.

- 계정 관리의 경우, root 계정 원격 접속 제한, 계정 잠금 등에 대한 부분을 다루고 있으며, 파일 및 디렉터리 관리에서는 root 홈, 패스 디렉터리 권한 설정, UMASK 설정 등을 다루고 있으며, 서비스에서는 보안상 취약한 서비스(ex, finger) 비활성화 등을 다루고 있으며, 패치 관리는 최신 보안 패치 여부를 점검하며, 로그 관리는 정기적으로 로그를 검토 및 점검하고 있는지 여부를 확인하고 있다. 

- 해당 챕터에서는 CentOS 7.9 버전에서 진행하였으며, CentOS 이외에 다른 OS 점검 방법은 상기에 기재된 가이드 참고

 

 

  계정 잠금 임계값 설정

점검 내용
- 사용자 계정 로그인 실패 시 계정잠금 임계값이 설정되어 있는지 점검
- (양호) : 계정 잠금 임계값이 10회 이하의 값으로 설정되어 있는 경우
- (취약) : 계정 잠금 임계값이 설정되어 있지 않거나, 10회 이하의 값으로 설정되어 있지 않은 경우

 

보안 위협
- 사용자 계정 잠금 임계값 설정이 되어 있지 않은 경우, 공격자는 무작위 대입 공격(brute force) 등을 통해 손쉽게 사용자 계정을 탈취할 수 있다.

 

점검 방법
- /etc/pam.d/system-auth 파일에서 계정 잠금 임계값 설정 여부 확인(잠금 설정 활성화 및 10 이하로 설정 여부)
- auth required pam_tally2.so deny=5 unlock_time=60   
- account required pam_tally2.so

 

/etc/pam.d/system-auth 파일

 

- PAM(Pluggable Authentication Modules) 설정 파일로서, 시스템 전반의 인증 설정하는 파일. 주로 통합 인증 설정 및 모듈화된 접근 방식을 통해 인증 절차를 설정하는 파일이다.
- 해당 파일은 주로 사용자 인증(auth), 사용자 계정 관리(account), 비밀번호 관리(password), 세션 설정(session)을 다루고 있다.
- 해당 파일의 내용은 'type control-flag module-path module-arguments' 형식으로 동작한다.
  ● type : PAM 모듈의 유형을 지정
   ☞ auth : 사용자 인증   
   ☞ account : 사용자 계정 관리
   ☞ password : 비밀번호 관리
   ☞ session : 세션 설정

  ● control-flag : PAM 모듈의 동작 방식을 제어
   ☞ required : 해당 모듈이 실패하면 모든 스택이 실패
   ☞ requisite : 해당 모듈이 실패하면 즉시 실패하고 남은 모듈을 처리하지 않음
   ☞ sufficient : 해당 모듈이 성공하면 남은 모듈을 처리하지 않고 성공으로 간주
   ☞ optional : 해당 모듈이 성공여부와 상관없이 전체 결과에 영향을 미치지 않음


  ● module-path : 호출할 PAM 모듈의 경로를 지정.
  - 대부분 '/lib/security' 또는 '/lib64/security' 디렉토리에 존재


  ● module-arguments : PAM 모듈에 전달할 인수를 지정
  - pam_tally2.so deny=5 unlock_time=60 : 계정 잠금 정책을 5회로 설정하고, 잠금시간은 60초로 설정

 

auth        required      pam_env.so
auth        required      pam_unix.so try_first_pass
auth        optional      pam_faillock.so preauth
auth        [success=1 default=bad] pam_unix.so
auth        [default=die] pam_faillock.so authfail
auth        sufficient    pam_faillock.so authsucc
auth        required      pam_deny.so

account     required      pam_unix.so
account     required      pam_faillock.so
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     required      pam_limits.so
session     required      pam_unix.so
session     optional      pam_permit.so

                                                                              [ /etc/pam.d/system-auth 파일 ]

점검 방법 확인 명령어

 

1. '/etc/pam.d/system-auth' 파일에서 계정 잠금 설정 활성화 여부 확인

  - egrep 명령을 사용하여 정규표현식으로 공백문자 다음에 오는 문자가 존재하는지 확인

cat /etc/pam.d/system-auth | egrep "^auth\s+required\s+pam_tally2.so"

 

 

2. '/etc/pam.d/system-auth' 파일에서 계정 잠금 임계값이 10 이하인지 확인

 - egrep 및 grep, cut 명령을 사용하여 정규표현식으로 임계값만 가져오도록 수행

cat /etc/pam.d/system-auth | egrep "^auth\s+required\s+pam_tally2.so" | grep -oP "deny=\d+" | cut -d '=' -f 2

 

계정 잠금 임계값 설정 스크립트 코드

 

#!/bin/bash

# 해당 코드는 계정 잠금 모듈로 pam_tally2.so로 설정되어 있다고 가정하고 점검 스크립트 생성
# 해당 모듈이 아닌 pam_faillock.so 등으로 구현 가능

FILE="U-03.txt"

echo "U-03. 계정 잠금 임계값 설정" >> $FILE 2>&1
echo "===============================================================================" >> $FILE 2>&1
echo "" >> $FILE 2>&1

echo "계정 임계값 설정 여부 및 계정 임계값이 10이하로 설정되어 있는지 확인" >> $FILE 2>&1
echo "===============================================================================" >> $FILE 2>&1
echo "" >> $FILE 2>&1

# 상태값 설정(초기값은 양호)
status="양호"

# /etc.pam.d/system-auth에서 계정 잠금 임계값 모듈 설정 여부 체크
# 정규표현식 ^로 주석처리 되어 있을 경우, 해당 변수에 저장되지 않음
auth_pam_lock=$(grep -E "^auth\s+required\s+pam_tally2.so" /etc/pam.d/system-auth)
account_tally2=$(grep -E "^account\s+required\s+pam_tally2.so" /etc/pam.d/system-auth)

# 해당 변수에 값이 저장되어 있을 경우 해당 조건문이 동작하도록 설정
if [ -n "$auth_pam_lock" ] && [ -n "$account_tally2" ]; then
	echo "계정 잠금을 설정하는 모듈인 pam_tally2.so 모듈이 설정되어 있습니다. " >> $FILE 2>&1

 
	echo "===============================================================================" >> $FILE 2>&1
	echo "" >> $FILE 2>&1
    
    # 계정 잠금 임계값만을 출력하기 위해 grep 및 cut 명령어를 사용하여 출력 
	auth_deny=$(echo "$auth_pam_lock" | grep -oP "deny=\d+" | cut -d '=' -f 2)
	auth_unlock_time=$(echo "$auth_pam_lock" | grep -oP "unlock_time=\d+" | cut -d '=' -f 2)	

	if [ -n "$auth_deny" ] && [ -n "$auth_unlock_time" ]; then
		echo "계정 잠금 임계값 설정:" >> $FILE 2>&1

		echo "===============================================================================" >> $FILE 2>&1
		echo "" >> $FILE 2>&1
		echo "계정 잠금 임계값은 :" "$auth_deny" >> $FILE 2>&1
		echo "계정 잠금 시간은 :" "$auth_unlock_time" >> $FILE 2>&1
		echo "===============================================================================" >> $FILE 2>&1
		echo "" >> $FILE 2>&1


		if [ "$auth_deny" -ge 10 ]; then
			echo "계정 잠금 임계값이 10 이상으로 설정되어 있습니다. 취약합니다." >> $FILE 2>&1

			echo "===============================================================================" >> $FILE 2>&1
			echo "" >> $FILE 2>&1
			status="취약"
		fi
	else
		status="취약"
	fi
else
	status="취약"
fi

# 상태값에 따라 결과 출력
if [ "$status" == "취약" ]; then
	echo "해당 항목 취약합니다." >> $FILE 2>&1
else
	echo "해당 항목 양호합니다." >> $FILE 2>&1
fi

 

 

계정 잠금 임계값 설정 스크립트 코드 결과값