084. 계정 · 인증 보안 — 서비스 계정 관리와 로그인 차단

changseop lee·3일 전

시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 34/50편 (전체 084/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.

선행 학습

1. 개념

서비스 계정은 데몬(웹·DB 등)이 권한을 낮춰 실행하기 위한 계정입니다. 사람이 로그인할 일이 없으므로, 처음부터 로그인 불가 상태로 묶어 둬야 합니다.

서비스 계정의 올바른 상태
 셸     : /sbin/nologin 또는 /bin/false   → 대화형 로그인 차단
 비밀번호: ! 또는 * (잠김)                → 비밀번호 로그인 불가
 SSH    : AllowGroups/DenyUsers로 제외     → 키가 있어도 SSH 차단
 UID    : 시스템 범위(< 1000)

→ 이 네 가지가 유지되면, 설령 키가 심겨도(017편) SSH 접근 제어에서 막힘

서비스 계정이 "할 일(데몬 실행)"은 로그인 없이도 가능합니다. systemd가 해당 UID로 프로세스를 직접 띄우기 때문입니다.

2. 왜 중요한가

  • 서비스 계정에 셸·비밀번호가 생기면, 웹·DB 취약점으로 그 계정이 장악됐을 때 바로 로그인 가능한 발판이 됩니다(A영역 006편의 apache 사례).
  • 서비스 계정은 수가 많고 평소 아무도 로그인하지 않아, 상태 변화가 눈에 띄지 않습니다. 기준선으로 묶어 관리해야 합니다.
  • "로그인 불가 유지"가 핵심 방어선이므로, 셸·비밀번호·SSH 세 경로를 모두 막아야 합니다.

3. 핵심 명령어 / 설정

점검명령
서비스 계정 셸`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 서비스계정(있으면 비정상)
기준선서비스 계정 목록·상태 저장

4. 실습 (실습 예시)

# 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

5. 정상 상태

$ (로그인 가능 서비스 계정)
$ (비밀번호 설정 서비스 계정)
apache 로그인이력=0
mysql 로그인이력=0

모든 서비스 계정이 nologin·비밀번호 잠금·로그인 이력 0인 상태가 정상입니다.

6. 이상 상태

$ 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)
  • 세 방어선(셸·비밀번호·SSH)이 모두 뚫린 상태
  • 035편에서 이 계정의 실제 대화형 로그인을 탐지

7. 로그 분석 (분석 방법)

서비스 계정 상태 변화와 로그인입니다(가상의 예시 로그).

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에 없었다면)

세 방어선 중 하나라도 유지됐다면 로그인이 막혔을 것입니다. 이것이 중첩 방어의 의미입니다.

8. SOC 관제 포인트

  • 서비스 계정 목록과 "로그인 불가 상태(nologin+잠금+SSH 제외)"를 기준선으로 관리합니다.
  • 서비스 계정의 셸·비밀번호 상태 변화, 로그인 이력 발생을 탐지합니다.
  • 셸 변경(030편)·키 추가(017편)·SSH 성공(035편)을 서비스 계정 기준으로 묶어 봅니다.

9. 탐지 규칙

<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편(서비스 계정 대화형 로그인)과 함께 운영하면 "상태 변화 → 실제 로그인"을 연결할 수 있습니다.

10. 대응 방법

  1. 초기 확인 — 로그인 가능해진 서비스 계정의 셸·비밀번호·SSH 상태와 변경 시각을 확인합니다.
  2. 범위 확인 — 해당 계정의 로그인 이력·심긴 키·소속 그룹을 확인합니다.
  3. 증거 확보 — passwd/shadow FIM, 상태 변경 로그, 로그인 로그를 보존합니다.
  4. 차단/조치 — 셸 nologin 복원·비밀번호 잠금·심긴 키 제거·SSH 제외를 적용합니다.
  5. 재발 방지 — 서비스 계정 상태 기준선과 셸 부여 탐지 룰을 운영합니다.

11. 핵심 정리

방어선올바른 상태
셸/sbin/nologin 또는 /bin/false
비밀번호! 또는 * (잠김)
SSHAllowGroups/DenyUsers로 제외
UID시스템 범위(<1000)
면접 포인트"서비스 계정은 로그인 없이도 데몬 실행 가능 — 로그인 불가 유지가 방어선"

12. 다음 편 예고

다음 편 085. 계정 · 인증 보안 — 서비스 계정 대화형 로그인 탐지 에서는 그 방어선이 뚫렸을 때의 서비스 계정 대화형 로그인 탐지를 다룹니다.


이전 편: 083. 계정 · 인증 보안 — 비활성·휴면 계정 식별과 정리
📚 시리즈 전체 보기: 시스템 보안 · 취약점

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글