시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 4/50편 (전체 054/450)
학습 단계: 1단계 · 기본 개념
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
Linux 권한은 사용자뿐 아니라 그룹 소속으로도 결정됩니다. 특정 그룹에 들어가는 것만으로 root와 같은 권한이나 민감한 로그·장치 접근 권한을 얻을 수 있습니다.
/etc/group : 그룹명:x:GID:구성원1,구성원2 (보조 그룹 구성원)
/etc/gshadow : 그룹명:그룹비밀번호:그룹관리자:구성원 (newgrp 용, 보통 ! 또는 비어 있음)
/etc/passwd : 4번째 필드 = 기본 그룹 GID
사용자 devops 의 실제 그룹 = 기본 그룹(passwd) + 보조 그룹(group 파일의 구성원 목록)
→ id devops 로 확인
그룹 변경은 설정 파일·실행 파일을 건드리지 않고 권한을 늘리는 방법이라, 점검 범위에서 빠지기 쉽습니다.
docker 그룹 구성원은 컨테이너에 호스트 루트 파일시스템을 마운트할 수 있어 사실상 root입니다. lxd, disk도 비슷한 수준의 위험이 있습니다.adm(Ubuntu)·systemd-journal 그룹은 시스템 로그를 읽을 수 있어, 공격자가 다른 사용자의 행위·인증 정보를 엿볼 수 있습니다.| 그룹 | 배포판 | 주는 권한 | 위험도 |
|---|---|---|---|
wheel / sudo | Rocky / Ubuntu | sudo 사용(sudoers 기본 규칙) | 높음 |
docker | 공통(설치 시) | Docker 소켓 → 호스트 root 수준 | 매우 높음 |
lxd | Ubuntu | 컨테이너 → 호스트 root 수준 | 매우 높음 |
disk | 공통 | 블록 장치 직접 읽기/쓰기 | 매우 높음 |
shadow | Ubuntu | /etc/shadow 읽기 | 높음 |
adm | Ubuntu | /var/log 대부분 읽기 | 중간 |
systemd-journal | 공통 | 전체 journal 읽기 | 중간 |
root(GID 0) | 공통 | root 그룹 권한 파일 접근 | 높음 |
# 1) 특권 그룹 구성원 일괄 확인
for g in wheel sudo docker lxd disk shadow adm systemd-journal root; do
getent group "$g" >/dev/null && printf '%-16s %s\n' "$g" "$(getent group $g | cut -d: -f4)"
done
# 2) 사용자별 실제 소속 그룹
id devops
groups apache
# 3) 기본 그룹(GID)이 특권 그룹인 사용자 (passwd 4번째 필드)
for g in 0 $(getent group wheel sudo docker | cut -d: -f3); do awk -F: -v g=$g '$4==g{print $1" 기본GID="g}' /etc/passwd; done
# 4) gshadow 그룹 비밀번호 설정 여부 (! 또는 빈 값이 정상)
sudo awk -F: '$2!="" && $2!="!" && $2!="*" {print $1": 그룹 비밀번호 설정됨"}' /etc/gshadow
wheel admin1
docker
disk
adm syslog
systemd-journal
root
$ id devops
uid=1002(devops) gid=1002(devops) groups=1002(devops)
특권 그룹 구성원이 관리자 명단과 일치하고, 서비스·일반 계정은 자기 그룹에만 속한 상태가 정상입니다.
wheel admin1,devops
docker apache
systemd-journal testuser
$ sudo awk -F: '$2!="" && $2!="!" && $2!="*" {print $1}' /etc/gshadow
disk
| 변화 | 의미 |
|---|---|
devops → wheel | sudo 사용 권한 획득 |
apache → docker | 웹 서비스 계정이 호스트 root 수준 권한 획득 → 웹 침해 시 즉시 상승 경로 |
testuser → systemd-journal | 전체 로그 열람(정찰) |
disk 그룹 비밀번호 | newgrp disk로 비밀번호만 알면 누구나 그룹 진입 가능 |
그룹 변경 명령별 로그입니다(가상의 예시 로그).
Oct 2 02:28:01 rocky9-web01 usermod[11501]: add 'devops' to group 'wheel'
Oct 2 02:28:01 rocky9-web01 usermod[11501]: add 'devops' to shadow group 'wheel'
Oct 2 02:28:30 rocky9-web01 gpasswd[11510]: user apache added by root to group docker
Oct 2 02:29:02 rocky9-web01 gpasswd[11520]: group disk password changed by root
type=SYSCALL msg=audit(1759339682.110:3401): syscall=82 success=yes auid=1002 uid=0 comm="gpasswd" exe="/usr/bin/gpasswd" key="identity"
| 필드 | 분석 |
|---|---|
add 'devops' to group 'wheel' | usermod -aG로 보조 그룹 추가 |
added by root to group docker | gpasswd -a 사용 |
group disk password changed | gpasswd 그룹으로 그룹 비밀번호 설정 |
audit auid=1002 | root로 실행했지만 실제 행위자는 devops |
변경 후 실제 권한이 적용되려면 새 로그인 세션이 필요합니다. 따라서 그룹 추가 직후의 재로그인(Accepted ...)이나 newgrp 실행을 이어서 확인합니다.
/etc/group, /etc/gshadow는 identity 키(A영역 030편)와 FIM 대상에 포함합니다.<group name="local,syssec_b,account,privilege,">
<rule id="101030" level="12">
<regex type="pcre2">add '\S+' to group '(wheel|sudo|docker|lxd|disk|shadow|root)'|added by \S+ to group (wheel|sudo|docker|lxd|disk|shadow|root)$</regex>
<description>특권 그룹 구성원 추가</description>
</rule>
<rule id="101031" level="10">
<match>password changed by</match>
<regex type="pcre2">gpasswd\[\d+\]: group \S+ password changed</regex>
<description>그룹 비밀번호 설정(newgrp 경로 생성)</description>
</rule>
</group>
/etc/group·gshadow 사본, 변경 로그, 이후 행위 로그를 보존합니다.gpasswd -d)하고 그룹 비밀번호를 제거하며 세션을 재시작시킵니다.| 그룹 | 위험 요약 |
|---|---|
| wheel / sudo | sudo 사용 권한 |
| docker / lxd / disk | 사실상 root 권한 |
| shadow / adm / systemd-journal | 비밀번호 해시·로그 열람 |
| 로그 | usermod add ... to group, gpasswd added by ... to group |
| 면접 포인트 | "docker 그룹 = root — 설정 변경 없이 권한을 늘리는 경로" |
다음 편 055. 계정 · 인증 보안 — UID·GID 범위 정책과 login.defs 에서는 계정 생성 기본값을 결정하는 UID·GID 범위 정책과 login.defs를 점검합니다.
이전 편: 053. 계정 · 인증 보안 — /etc/shadow 해시 형식과 비밀번호 상태 판독
📚 시리즈 전체 보기: 시스템 보안 · 취약점