반응형
[리눅스 보안취약점 점검] 자동화 스크립트 공통 함수 및 환경 설정

1. 점검 목적
- 시스템 진단에 앞서 필요한 환경 변수(날짜, OS 종류, 권한 등)를 초기화하고, 진단 결과를 저장할 파일 및 디렉터리를 자동 생성하는 것이 일차적인 목적입니다.
- 또한, 스크립트 전반에서 사용될 화면 출력 포맷과 결과 파일 저장 로직을 함수화하여 코드의 중복을 방지하고 진단 결과의 가독성과 신뢰성을 확보하고자 합니다.
2. 점검 항목 (환경 설정 및 공통 함수)
- 대상 OS: Linux
- 주요 기능: 환경 변수 정의, 로그/결과 파일 초기화, 결과 출력 함수 정의(양호/취약/정보), 타임아웃 처리 로직, root 권한 검증
3. 점검 방법 (스크립트 소스 코드 분석)
아래 코드는 제공된 자동 점검 스크립트의 환경 설정 및 공통 함수 선언부입니다.
Bash
#!/bin/bash
# ==============================================================================
# 1. 환경 설정 및 변수 초기화
# ==============================================================================
START_TIME=$(date +%s) # 스크립트 시작 시간 기록 (유닉스 타임)
TODAY=$(date +%y%m%d) # 오늘 날짜 (YYMMDD 포맷)
mkdir -p "$TODAY-result" # 결과 저장 디렉터리 생성
LOG="./$TODAY-result/check.log" # 상세 로그 파일 경로
RESULT="./$TODAY-result/$TODAY-result.txt" # 최종 진단 결과 파일 경로
OS_NAME=$(uname -s) # 운영체제 이름 확인 (Linux)
# 기존 로그 및 결과 파일 초기화 (0 바이트로 만듦)
> "$LOG"
> "$RESULT"
# 요약을 위한 배열 선언
WARN_LIST=() # 취약 항목 메시지 저장 배열
INFO_LIST=() # 정보/수동점검 항목 메시지 저장 배열
CURRENT_CODE="" # 현재 점검 중인 항목 코드 (예: U-01)
CURRENT_ID="" # 현재 점검 중인 항목 ID (숫자 추출용)
# ==============================================================================
# 2. 화면 출력 및 결과 파일 저장 공통 함수 정의
# ==============================================================================
# 구분선 출력 함수
BAR() {
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" | tee -a "$RESULT"
}
# 주요 요약 정보 출력 함수 (Cyan 색상)
SUMMARY() {
printf '\033[36m %s\033[0m\n' "$*" | tee -a "$RESULT"
}
# 양호 결과 출력 함수 (Green 색상)
OK() {
echo -e '\033[32m'"[ 양호 ] : $1"'\033[0m' | tee -a "$RESULT"
if [ -n "$2" ]; then
echo -e '\033[90m'" => 판단 사유: $2"'\033[0m' | tee -a "$RESULT"
fi
}
# 취약 결과 출력 함수 (Red 색상) 및 WARN_LIST 배열 추가
WARN() {
local msg="[ 취약 $CURRENT_ID ] : $1"
echo -e '\033[31m'"$msg"'\033[0m' | tee -a "$RESULT"
if [ -n "$2" ]; then
echo -e '\033[90m'" => 판단 사유: $2"'\033[0m' | tee -a "$RESULT"
fi
WARN_LIST+=("$msg") # 최종 요약을 위해 배열에 저장
}
# 정보/수동점검 결과 출력 함수 (Yellow 색상) 및 INFO_LIST 배열 추가
INFO() {
local msg="[ 정보/수동점검 $CURRENT_ID ] : $1"
echo -e '\033[33m'"$msg"'\033[0m' | tee -a "$RESULT"
if [ -n "$2" ]; then
echo -e '\033[90m'" => 참고 내용: $2"'\033[0m' | tee -a "$RESULT"
fi
INFO_LIST+=("$msg") # 최종 요약을 위해 배열에 저장
}
# 점검 항목 시작 알림 함수 (Cyan 색상 및 ID 추출)
CODE(){
CURRENT_CODE="$*"
CURRENT_ID=$(echo "$CURRENT_CODE" | grep -oE 'U-[0-9]{1,2}') # 항목에서 U-번호 추출
echo "" | tee -a "$RESULT" # 가독성을 위한 개행
echo -e '\033[36m'"■ $CURRENT_CODE"'\033[0m' | tee -a "$RESULT"
}
# 항목 점검 완료 처리 및 구분선 출력 함수
FINISH() {
echo -e '\033[90m'"▶ $*"'\033[0m' | tee -a "$RESULT" # 참고 링크 등 출력
BAR
}
# ==============================================================================
# 3. 진단 결과 파일 헤더 작성 및 기본 정보 기록
# ==============================================================================
cat << EOF > $RESULT
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[ 2026 주요정보통신기반시설 기반 보안 취약점 점검 스크립트(리눅스)]
- 스크립트 사용 전 충분한 검증을 수행하시고 사용하기 바랍니다.
- 스크립트 사용에 대한 책임은 사용자에게 있습니다.
- 2026 주요정보통신기반시설 기술적 취약점 분석 평가 방법 상세가이드를 기반으로 작성되었습니다.
- 총 67개의 항목을 점검합니다.
- 수동점검 항목이 존재하며, 사용자가 직접 확인 후 판단하여야 합니다.
- 해당 스크립트는 취약점을 자동으로 조치하여 주지 않습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
EOF
SUMMARY "운영체제: $OS_NAME"
SUMMARY "진단일시: $(date)"
BAR
# ==============================================================================
# 4. 타임아웃 실행 함수 (명령어 지연/Hang 방지)
# ==============================================================================
EXEC_TIMEOUT() {
local WAIT_TIME=$1 # 첫 번째 인자: 제한 시간(초)
shift
local COMMAND="$*" # 나머지 인자: 실행할 명령어 전체
# 1. timeout 명령어가 지원되는 환경 (대부분의 최신 리눅스)
if command -v timeout >/dev/null 2>&1; then
timeout "$WAIT_TIME" bash -c "$COMMAND"
local STATUS=$?
return "$STATUS" # timeout 종료 시 124 반환
else
# 지원되지 않는 경우 수동 구현 (백그라운드 실행 후 PID 감시)
bash -c "$COMMAND" &
local CMD_PID=$!
local COUNT=0
# 프로세스 생존 여부를 1초마다 확인
while kill -0 "$CMD_PID" 2>/dev/null; do
sleep 1
COUNT=$((COUNT + 1))
# 제한 시간 도달 시 강제 종료 (kill -9)
if [ "$COUNT" -ge "$WAIT_TIME" ]; then
kill -9 "$CMD_PID" 2>/dev/null
return 124 # 타임아웃 반환 코드 고정
fi
done
wait "$CMD_PID" 2>/dev/null
return $?
fi
}
# ==============================================================================
# 5. 사전 검증: root 권한 확인
# ==============================================================================
if [ "$(id -u)" -ne 0 ]; then
echo "=============================================================================="
echo "[ 실행 오류 ] 이 진단 스크립트는 시스템 주요 설정 파일을 점검합니다."
echo " 따라서 반드시 root 권한(관리자)으로 실행해야 합니다."
echo ""
echo " ▶ 현재 접속 계정: $(whoami)"
echo " ▶ 올바른 실행 방법: sudo $0"
echo "=============================================================================="
exit 1 # root가 아니면 스크립트 강제 종료
fi
[라인 바이 라인(Line-by-Line) 코드 해설]
- 1~16 라인 (환경 변수 초기화 및 디렉터리 생성):
- 스크립트 실행에 필요한 시간 정보(START_TIME), 날짜(TODAY), 운영체제 종류(uname -s)를 변수에 저장합니다.
- 날짜별로 결과 디렉터리를 생성(mkdir -p)하고, 상세 로그(check.log)와 최종 결과 파일(YYMMDD-result.txt)의 경로를 정의합니다.
- > "$LOG" 구문을 통해 진단 시작 전 기존 파일 내용을 초기화하여 0 바이트로 만듭니다.
- 18~22 라인 (요약용 배열 선언):
- WARN_LIST=(), INFO_LIST=()를 선언하여 진단 중 발견된 취약(FAIL) 항목과 수동점검(INFO) 항목의 메시지를 저장했다가 스크립트 최하단에서 요약 출력하는 데 사용합니다.
- 28~86 라인 (출력 및 저장 공통 함수 정의 - BAR, SUMMARY, OK, WARN, INFO, CODE, FINISH):
- ANSI 색상 코드(Green, Red, Yellow, Cyan 등)를 활용하여 터미널 화면에서 진단 결과를 시각적으로 명확하게 구분합니다.
- 모든 함수 내 명령어 뒤에 | tee -a "$RESULT"를 붙여 화면 출력과 동시에 최종 결과 파일에 내용을 누적 저장(-a 옵션)합니다.
- WARN, INFO 함수는 색상 출력과 동시에 앞서 선언한 배열(WARN_LIST, INFO_LIST)에 메시지를 누적(+=)합니다.
- CODE 함수는 점검 시작 시 grep을 이용하여 점검 항목 문자열에서 CURRENT_ID(예: U-01)를 자동으로 추출하여 이후 WARN, INFO 함수에서 사용하도록 합니다.
- 91~107 라인 (결과 파일 헤더 작성):
- cat << EOF > $RESULT 구문을 사용하여 스크립트의 버전, 출처, 주의사항 등을 담은 긴 텍스트 블록을 결과 파일의 맨 윗부분에 저장합니다.
- 110~112 라인 (기본 정보 기록):
- 앞서 정의한 SUMMARY, BAR 함수를 호출하여 운영체제 이름과 진단 일시를 결과 파일에 기록합니다.
- 119~150 라인 (EXEC_TIMEOUT 함수 정의):
- 진단 중 응답이 없거나 매우 느린 명령어(Hang 현상)로 인해 스크립트 전체가 멈추는 것을 방지하는 핵심 함수입니다.
- 시스템에 timeout 명령어가 존재(command -v)하면 이를 활용하고, 없는 구형 Unix 시스템의 경우 명령어를 백업그라운드(&)로 실행한 후 PID를 감시하여 수동으로 제한 시간을 처리하도록 구현되어 호환성을 확보했습니다. 타임아웃 발생 시 결과 코드 124를 반환합니다.
- 155~166 라인 (root 권한 사전 검증):
- 시스템 보안 설정을 진단하기 위해서는 주요 설정 파일(/etc/shadow, /etc/ssh/sshd_config 등)에 대한 읽기 권한이 필수적입니다.
- id -u 명령어의 결과가 0(root의 UID)이 아닌 경우 에러 메시지를 출력하고 스크립트를 즉시 강제 종료(exit 1)하여 오진을 방지합니다.
[스크립트 보완 및 예외 처리 제안]
- 보완 필요 요소: 전반적으로 매우 완성도 높은 초기 선언부입니다. 다만, 다수의 리눅스 배포판 및 구형 Unix 시스템과의 호환성을 더욱 강화하기 위해 아래와 같은 개선안을 제안해 드립니다.
- 권한 확인 로직 보완: id -u를 지원하지 않는 아주 오래된 유닉스 시스템 환경을 고려하여 사용자를 확인하는 방식을 강화할 수 있습니다.
- 날짜 포맷 변경: 결과 파일의 가독성과 파일 정렬을 위해 날짜 포맷을 YYMMDD에서 YYYYMMDD 형식으로 변경하는 것을 권장합니다.
Bash
# 권장 개선 코드 (2 라인)
START_TIME=$(date +%s 2>/dev/null || perl -e 'print time') # date +%s 미지원 유닉스 대응
TODAY=$(date +%Y%m%d) # 20260101 포맷으로 변경
# 권장 개선 코드 (155~156 라인 - root 권한 확인 강화)
CURRENT_USER=$(id -u 2>/dev/null || whoami)
if [ "$CURRENT_USER" != "0" ] && [ "$CURRENT_USER" != "root" ]; then
# ... 에러 메시지 출력 로직 ...
exit 1
fi
안내문 및 면책조항
- 본 포스팅에서 제공하는 스크립트 상세 설명 및 조치 가이드는 리눅스 시스템 보안 강화를 목적으로 작성되었습니다. 시스템의 특성, 운영 서비스의 종류 및 배포판 버전에 따라 설정을 적용한 후 로그인 불가 등의 영향도가 발생할 수 있으므로 반드시 테스트 환경에서 사전 검증을 거친 후 적용하시기 바랍니다.
- 리눅스 서버 진단 전체 자동화 스크립트 원본 압축파일의 비밀번호는 비밀댓글을 남겨 주시면 확인 후 송부해 드리겠습니다. 본 가이드의 코드를 활용하여 발생하는 시스템 장애 및 불이익에 대한 책임은 사용자 본인에게 있습니다.
반응형
'보안취약점점검_요약' 카테고리의 다른 글
| [리눅스 보안취약점 점검] 설정 파일 및 특수 권한 점검 U-19~U-23 자동화 스크립트 분석 (0) | 2026.09.09 |
|---|---|
| [리눅스 보안취약점 점검] 파일 및 디렉터리 관리 U-14~U-18 자동화 스크립트 분석 (0) | 2026.09.08 |
| Linux 서버 계정 관리 보안점검 U-11~U-13 | Bash 자동화 스크립트 포함 (0) | 2026.09.04 |
| Linux 서버 계정 관리 보안점검 U-06~U-10 | Bash 자동화 스크립트 포함 (0) | 2026.09.04 |
| Linux 서버 계정 관리 보안점검 U-01~U-05 | Bash 자동화 스크립트 포함 (0) | 2026.09.04 |