시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 34/50편 (전체 084/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
서비스 계정은 데몬(웹·DB 등)이 권한을 낮춰 실행하기 위한 계정입니다. 사람이 로그인할 일이 없으므로, 처음부터 로그인 불가 상태로 묶어 둬야 합니다.
서비스 계정의 올바른 상태
셸 : /sbin/nologin 또는 /bin/false → 대화형 로그인 차단
비밀번호: ! 또는 * (잠김) → 비밀번호 로그인 불가
SSH : AllowGroups/DenyUsers로 제외 → 키가 있어도 SSH 차단
UID : 시스템 범위(< 1000)
→ 이 네 가지가 유지되면, 설령 키가 심겨도(017편) SSH 접근 제어에서 막힘
서비스 계정이 "할 일(데몬 실행)"은 로그인 없이도 가능합니다. systemd가 해당 UID로 프로세스를 직접 띄우기 때문입니다.
| 점검 | 명령 |
|---|---|
| 서비스 계정 셸 | `awk -F: '$3<1000 && $7!~/(nologin |
| 비밀번호 잠금 | sudo passwd -S -a | awk '$2=="PS"||$2=="P"{print}'(설정됨) |
| SSH 차단 | sudo sshd -T | grep -E 'allowgroups|denyusers'(011편) |
| 로그인 이력 | last 서비스계정(있으면 비정상) |
| 기준선 | 서비스 계정 목록·상태 저장 |
# 1) 로그인 가능한 서비스 계정 찾기 (셸이 nologin/false가 아닌 시스템 계정)
awk -F: '$3>0 && $3<1000 && $7 !~ /(nologin|false|sync|shutdown|halt)$/ {print $1, $3, $7}' /etc/passwd
# 2) 비밀번호가 설정된 서비스 계정 (잠겨 있어야 정상)
sudo passwd -S -a 2>/dev/null | awk '$2=="PS"{print $1" 비밀번호 설정됨"}' | while read u _; do
id=$(getent passwd "$u"|cut -d: -f3); [ "$id" -lt 1000 ] && echo "서비스계정 $u 비밀번호 설정됨"
done
# 3) 서비스 계정 로그인 이력 (있으면 비정상)
for u in apache nginx mysql postgres www-data; do
getent passwd $u >/dev/null && { n=$(last -w $u 2>/dev/null|grep -vc 'wtmp begins'); echo "$u 로그인이력=$n"; }
done
$ (로그인 가능 서비스 계정)
$ (비밀번호 설정 서비스 계정)
apache 로그인이력=0
mysql 로그인이력=0
모든 서비스 계정이 nologin·비밀번호 잠금·로그인 이력 0인 상태가 정상입니다.
$ awk -F: '$3>0 && $3<1000 && $7!~/(nologin|false)/{print $1,$3,$7}' /etc/passwd
apache 48 /bin/bash
$ (비밀번호) 서비스계정 apache 비밀번호 설정됨
apache 로그인이력=2
apache에 셸 + 비밀번호 설정 + 로그인 이력 발생 → 서비스 계정이 로그인 발판으로 전환됨(030편 usermod)서비스 계정 상태 변화와 로그인입니다(가상의 예시 로그).
02:15:40 usermod: change user 'apache' shell ... to '/bin/bash'
02:16:xx chpasswd: password changed for apache
02:20:05 sshd: Accepted publickey for apache from 192.168.56.77 (017편 심은 키)
| 단계 | 방어선 돌파 |
|---|---|
| 셸 변경 | nologin 방어선 |
| 비밀번호 설정 | 비밀번호 잠금 방어선 |
| SSH 성공 | SSH 차단 방어선(011편 AllowGroups에 없었다면) |
세 방어선 중 하나라도 유지됐다면 로그인이 막혔을 것입니다. 이것이 중첩 방어의 의미입니다.
<group name="local,syssec_b,account,">
<rule id="101310" level="11">
<if_sid>550</if_sid>
<field name="file">^/etc/passwd$</field>
<regex type="pcre2">^(apache|nginx|www-data|mysql|postgres|redis):.*:/(usr/)?bin/(ba|z|k)?sh</regex>
<description>서비스 계정에 로그인 셸 부여(passwd)</description>
</rule>
</group>
서비스 계정 목록은 환경마다 다르므로 CDB 리스트로 관리합니다. 035편(서비스 계정 대화형 로그인)과 함께 운영하면 "상태 변화 → 실제 로그인"을 연결할 수 있습니다.
| 방어선 | 올바른 상태 |
|---|---|
| 셸 | /sbin/nologin 또는 /bin/false |
| 비밀번호 | ! 또는 * (잠김) |
| SSH | AllowGroups/DenyUsers로 제외 |
| UID | 시스템 범위(<1000) |
| 면접 포인트 | "서비스 계정은 로그인 없이도 데몬 실행 가능 — 로그인 불가 유지가 방어선" |
다음 편 085. 계정 · 인증 보안 — 서비스 계정 대화형 로그인 탐지 에서는 그 방어선이 뚫렸을 때의 서비스 계정 대화형 로그인 탐지를 다룹니다.
이전 편: 083. 계정 · 인증 보안 — 비활성·휴면 계정 식별과 정리
📚 시리즈 전체 보기: 시스템 보안 · 취약점