파일 · 권한 · 사용자 관리 38 / 50 · Part 4. 사용자와 그룹 관리
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정analyst)
기초편 연계: 「리눅스 시스템 기초」 18. Linux 사용자와 그룹
27편·34편에서 그룹의 개념과 구조를 봤다. 이번 글에서는 그룹을 생성·변경·삭제 하는 명령 체계를 정리한다.
| 목적 | 명령 |
|---|---|
| 생성 | groupadd |
| 이름·GID 변경 | groupmod |
| 구성원 관리 | gpasswd |
| 삭제 | groupdel |
특히 두 가지를 실습으로 확인한다. 첫째, 구성원 추가는 usermod -aG보다 gpasswd -a가 안전 하다(다른 보조 그룹에 영향 없음). 둘째, 사용자의 기본 그룹은 삭제할 수 없다.
| 명령 | 역할 |
|---|---|
groupadd project | 그룹 생성 (GID 자동) |
groupadd -r appsvc | 시스템 그룹 (GID < 1000) |
groupadd -g 5000 g | GID 지정 생성 |
groupmod -n new old | 그룹명 변경 |
groupmod -g N g | GID 변경 |
gpasswd -a user g | 구성원 추가 |
gpasswd -d user g | 구성원 제거 |
groupdel g | 그룹 삭제 |
구성원 관리에서 둘의 차이가 중요하다.
usermod -aG g user: user의 보조 그룹 목록을 다룬다. -a를 빠뜨리면 위험(36편).gpasswd -a user g: 그룹 g의 구성원 목록 에 user를 추가한다. user의 다른 보조 그룹에는 영향이 없다.그래서 "특정 그룹에 한 명 추가"는 gpasswd -a가 더 안전하고 직관적이다.
어떤 사용자의 기본 그룹 인 그룹은 삭제할 수 없다. 기본 그룹이 사라지면 그 사용자의 GID가 유효하지 않게 되기 때문이다.

이 명령들은 모두 /etc/group(과 /etc/gshadow)을 수정한다. groupadd는 GID_MIN~GID_MAX 범위에서 다음 GID를 할당하고, -r은 시스템 GID 범위를 사용한다.
groupmod -g(GID 변경)에는 함정이 있다. GID를 바꿔도 기존 파일의 그룹 소유는 옛 GID로 남는다. 그 파일들은 그룹 소유가 orphan이 되므로 find -gid 옛GID로 찾아 갱신해야 한다. UID 변경(36편)과 같은 원리다.
기본 그룹 삭제가 막히는 것은 무결성 보호다. useradd가 UPG로 만든 그룹(사용자와 같은 이름)은 그 사용자의 기본 그룹이므로, 사용자를 먼저 삭제하거나 usermod -g로 기본 그룹을 다른 것으로 바꾼 뒤에야 삭제할 수 있다.
root 권한 실습이다.
# 1) 그룹 생성
groupadd project
groupadd -r appsvc # 시스템 그룹
getent group project appsvc
# 2) GID 지정 생성
groupadd -g 5000 fixed-gid && getent group fixed-gid
# 3) 이름 변경
groupmod -n renamed project && getent group renamed
# 4) 구성원 관리 (gpasswd)
useradd -M -N carol
gpasswd -a carol renamed && getent group renamed
gpasswd -d carol renamed && getent group renamed
# 5) 그룹 삭제
groupdel fixed-gid && getent group fixed-gid || echo "fixed-gid 삭제됨"
# 6) 기본 그룹은 삭제 불가
useradd -m grptest
groupdel grptest 2>&1 || echo "→ 사용자의 기본 그룹이라 삭제 거부"

텍스트 원본(실제 출력):
[root@rocky9-lab ~]# echo "=== groupadd ==="
=== groupadd ===
[root@rocky9-lab ~]# groupadd project
[root@rocky9-lab ~]# groupadd -r appsvc # 시스템 그룹
[root@rocky9-lab ~]# getent group project appsvc
project:x:1001:
appsvc:x:998:
[root@rocky9-lab ~]# echo "=== GID 지정 생성 ==="
=== GID 지정 생성 ===
[root@rocky9-lab ~]# groupadd -g 5000 fixed-gid && getent group fixed-gid
fixed-gid:x:5000:
[root@rocky9-lab ~]# echo "=== groupmod: 이름·GID 변경 ==="
=== groupmod: 이름·GID 변경 ===
[root@rocky9-lab ~]# groupmod -n renamed project && getent group renamed
renamed:x:1001:
[root@rocky9-lab ~]# echo "=== gpasswd 로 구성원 관리 ==="
=== gpasswd 로 구성원 관리 ===
[root@rocky9-lab ~]# useradd -M -N carol 2>/dev/null
[root@rocky9-lab ~]# gpasswd -a carol renamed && getent group renamed
Adding user carol to group renamed
renamed:x:1001:carol
[root@rocky9-lab ~]# gpasswd -d carol renamed && getent group renamed
Removing user carol from group renamed
renamed:x:1001:
[root@rocky9-lab ~]# echo "=== groupdel ==="
=== groupdel ===
[root@rocky9-lab ~]# groupdel fixed-gid && getent group fixed-gid || echo "fixed-gid 삭제됨"
fixed-gid 삭제됨
[root@rocky9-lab ~]# echo "=== 기본 그룹은 삭제 불가 ==="
=== 기본 그룹은 삭제 불가 ===
[root@rocky9-lab ~]# useradd -m grptest 2>/dev/null
[root@rocky9-lab ~]# groupdel grptest 2>&1 || echo "→ 사용자의 기본 그룹이라 삭제 거부"
groupdel: cannot remove the primary group of user 'grptest'
→ 사용자의 기본 그룹이라 삭제 거부
| 출력 | 해석 |
|---|---|
project:x:1001: | 일반 그룹, GID 1001 자동 할당 |
appsvc:x:998: | -r로 시스템 GID(1000 미만) |
fixed-gid:x:5000: | -g 5000으로 지정 GID |
groupmod -n renamed project → renamed:x:1001: | 이름만 바뀌고 GID 유지 |
gpasswd -a carol → renamed:x:1001:carol | carol 추가 |
gpasswd -d carol → renamed:x:1001: | carol 제거 |
groupdel fixed-gid → 삭제됨 | 구성원 없는 그룹 삭제 성공 |
groupdel grptest → cannot remove the primary group of user 'grptest' | 기본 그룹 삭제 거부 |
마지막 줄이 핵심 제약이다. grptest 그룹은 grptest 사용자의 기본 그룹(UPG)이라 삭제되지 않는다.
| 주제 | 내용 |
|---|---|
| 최소 그룹 | 필요한 그룹만 만들고, 넓은 권한 그룹(docker 등)은 신중히 |
| GID 변경 주의 | 기존 파일 그룹 소유는 수동 갱신 필요 |
| 구성원 관리 | gpasswd로 그룹 단위 관리 → 실수 감소 |
| 시스템 그룹 | 서비스 전용 그룹은 -r로 시스템 GID |
| 그룹 정리 | 미사용 그룹·orphan GID 파일 점검 |
공격자 관점: 공격자가 groupadd로 새 그룹을 만들고 파일 권한을 그 그룹으로 여는 경우는 드물지만, 기존 특권 그룹(wheel·docker)에 구성원을 추가 하는 것(gpasswd -a)은 흔하다. 그룹 구성원 변경(34편)을 감시한다.
[Detection] auditd/로그: groupadd·groupmod·gpasswd·groupdel 실행
grep -E 'group(add|mod|del)|gpasswd' /var/log/secure # Rocky
↓
[이상 신호] 특권 그룹 구성원 추가 / 예상 밖 GID 0 그룹 / 시스템 그룹 변경
↓
[Evidence] /etc/group·gshadow ctime, 변경 주체(sudo 로그)
↓
[점검] find / -xdev -nogroup 2>/dev/null # orphan 그룹 소유
↓
[Response] 무단 그룹·멤버십 원복, 경위 조사(49편)
| 관점 | 내용 |
|---|---|
| IOC | GID 0(root 그룹) 추가, 특권 그룹 구성원 증가 |
| Detection | 그룹 관리 명령을 auditd로 감시 |
| orphan | find -nogroup으로 그룹 orphan 파일 점검(37편과 함께) |
| 실수 | 결과 | 예방 |
|---|---|---|
groupmod -g 후 파일 방치 | 그룹 orphan 파일 | find -gid로 갱신 |
| 기본 그룹 삭제 시도 | 거부 | 사용자 먼저 처리 또는 usermod -g |
usermod -G로 그룹 구성원 관리 | 다른 보조 그룹 삭제 | gpasswd -a |
| GID 중복 지정 | 그룹 구분 모호 | 미사용 GID 확인 |
| 미사용 그룹 방치 | 관리 복잡·오탐 | 정기 정리 |
[ ] groupadd 로 일반·시스템(-r)·지정(-g) 그룹을 만들었다
[ ] groupmod -n 으로 이름을 변경했다
[ ] gpasswd 로 구성원을 추가·제거했다
[ ] groupdel 로 빈 그룹을 삭제했다
[ ] 기본 그룹은 삭제할 수 없음을 확인했다
[ ] gpasswd 가 usermod -G 보다 안전한 이유를 안다
groupadd(생성)·groupmod(이름·GID)·gpasswd(구성원)·groupdel(삭제)로 나뉜다.gpasswd -a가 안전하다. 다른 보조 그룹에 영향이 없다.-r은 시스템 그룹(GID < 1000)을 만든다.groupmod -g(GID 변경) 후 기존 파일 그룹은 find -gid로 갱신한다.다음 글 「39. 기본 그룹과 보조 그룹」 에서는 로그인 세션에서 기본 그룹과 보조 그룹이 실제로 어떻게 작동하는지, 새 파일이 어느 그룹을 갖는지, 그리고 newgrp로 유효 그룹을 전환하는 방법을 실습한다.