Linux 시스템 보안 기초 · 06/50편
이 글은
리눅스 시스템 기초·파일 · 권한 · 사용자 관리·서비스 · 프로세스 관리시리즈를 선행 학습으로 두고, 동일한 개념을 보안관제(SOC) 관점에서 한 단계 확장합니다.
/etc/passwd는 '누가 이 시스템의 사용자인가'를 담은 명부입니다. 선행 시리즈에서 각 필드의 의미는 다뤘으니, 이번 편은 그 지식을 바탕으로 비정상 계정을 탐지하는 실무 기법에 집중합니다.
한 줄의 구조를 다시 봅니다.
username : x : UID : GID : comment : home : shell
1 2 3 4 5 6 7
보안 분석에서 중요한 필드는 3(UID), 7(shell), 6(home) 입니다. 2번 필드 x는 실제 비밀번호가 /etc/shadow에 있다는 표식인데, 여기에 해시가 직접 들어 있으면 그 자체가 심각한 이상입니다.
점검 포인트
├─ 필드3(UID) == 0 이 root 외에 있는가?
├─ 필드7(shell) 서비스 계정인데 /bin/bash 인가?
├─ 필드2 'x'가 아니라 해시가 박혀 있는가?
└─ 전체 예상 밖의 최근 추가 계정이 있는가?
/etc/passwd는 모든 사용자가 읽을 수 있습니다(0644). 그래서 정보 수집(enumeration)의 1차 대상이며, 공격자가 계정을 추가할 때도 이 파일을 직접 편집하는 경우가 많습니다. useradd를 쓰면 로그가 남지만, 파일을 직접 편집하면 로그가 안 남을 수 있어 파일 변경 감사가 중요합니다.
# 서비스 계정인데 인터랙티브 쉘을 가진 계정 (의심)
awk -F: '$3<1000 && $7 ~ /bash|sh|zsh/ {print $1, $3, $7}' /etc/passwd
# 2번 필드가 x가 아닌 계정 (해시 직박입 등 이상)
awk -F: '$2!="x" && $2!="*" && $2!="!" {print $1, $2}' /etc/passwd
# 최근 변경 시각 확인
stat -c '%n %y' /etc/passwd
실습 환경에서 서비스 계정 점검 결과입니다. (실제 캡처)
$ awk -F: '$3<1000 && $7 ~ /bash|sh|zsh/ {print $1, $3, $7}' /etc/passwd
(출력 없음)
$ awk -F: '$3<1000 && $7 !~ /nologin|false/ {print $1,$3,$7}' /etc/passwd | tail -3
sync 4 /bin/sync
출력이 없다는 것은 '서비스 계정 중 대화형 쉘을 가진 것이 없다'는 정상 신호입니다. 만약 svc_web 996 /bin/bash 같은 줄이 나오면, 서비스 계정이 로그인 가능하게 바뀐 것이므로 침해 의심입니다.
nologin/false 쉘, 2번 필드는 x./bin/bash 부여 (백도어 로그인)/etc/passwd는 08편의 /etc/shadow와 항상 함께 봐야 전체 그림이 나옵니다.
auditd -w /etc/passwd -p wa -k identity(44편)sha256sum /etc/passwd 저장 후 주기 비교Wazuh의 FIM(File Integrity Monitoring)은 /etc/passwd 변경을 실시간 감지해 '무엇이 추가/삭제되었는지' diff까지 보여줍니다. SIEM에서는 이 변경 이벤트를 SSH 로그인·sudo 이벤트와 상관분석해 '침입 후 계정 생성' 시나리오를 탐지합니다. 탐지된 의심 계정명은 그대로 IOC로 등록합니다.
[ ] 시스템 계정의 쉘이 nologin인지 점검
[ ] 2번 필드가 x/*/!인지 확인
[ ] passwd 최근 변경 시각 확인
[ ] 무결성 기준선(해시) 저장
다음 편에서는 07. /etc/shadow 보안 분석 를 다룹니다. 실제 비밀번호 해시가 저장된 /etc/shadow를, 해시 알고리즘과 계정 잠금 관점에서 봅니다.
본 실습은 격리된 테스트 VM(Rocky Linux / Ubuntu, VMware) 및 테스트 계정 환경을 기준으로 하며, 운영 서버를 대상으로 하지 않습니다. 실행 결과는 실제 캡처와 예시 출력을 명확히 구분해 표기합니다.