파일 · 권한 · 사용자 관리 38 / 50 · Part 4. 사용자와 그룹 관리
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정 analyst)
기초편 연계: 「리눅스 시스템 기초」 18. Linux 사용자와 그룹

1. 들어가며

27편·34편에서 그룹의 개념과 구조를 봤다. 이번 글에서는 그룹을 생성·변경·삭제 하는 명령 체계를 정리한다.

목적명령
생성groupadd
이름·GID 변경groupmod
구성원 관리gpasswd
삭제groupdel

특히 두 가지를 실습으로 확인한다. 첫째, 구성원 추가는 usermod -aG보다 gpasswd -a가 안전 하다(다른 보조 그룹에 영향 없음). 둘째, 사용자의 기본 그룹은 삭제할 수 없다.


2. 핵심 개념

2-1. 명령 요약

명령역할
groupadd project그룹 생성 (GID 자동)
groupadd -r appsvc시스템 그룹 (GID < 1000)
groupadd -g 5000 gGID 지정 생성
groupmod -n new old그룹명 변경
groupmod -g N gGID 변경
gpasswd -a user g구성원 추가
gpasswd -d user g구성원 제거
groupdel g그룹 삭제

2-2. gpasswd vs usermod

구성원 관리에서 둘의 차이가 중요하다.

  • usermod -aG g user: user의 보조 그룹 목록을 다룬다. -a를 빠뜨리면 위험(36편).
  • gpasswd -a user g: 그룹 g의 구성원 목록 에 user를 추가한다. user의 다른 보조 그룹에는 영향이 없다.

그래서 "특정 그룹에 한 명 추가"는 gpasswd -a가 더 안전하고 직관적이다.

2-3. 기본 그룹 삭제 제약

어떤 사용자의 기본 그룹 인 그룹은 삭제할 수 없다. 기본 그룹이 사라지면 그 사용자의 GID가 유효하지 않게 되기 때문이다.


3. 동작 원리

그룹 생성·변경·삭제 명령 체계

이 명령들은 모두 /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로 기본 그룹을 다른 것으로 바꾼 뒤에야 삭제할 수 있다.


4. 명령어 실습

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 "→ 사용자의 기본 그룹이라 삭제 거부"

5. 실행 결과

실제 실행 결과 — Rocky Linux 9.8 · root@rocky9-lab — 그룹 관리 명령

텍스트 원본(실제 출력):

[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'
→ 사용자의 기본 그룹이라 삭제 거부

6. 결과 해석

출력해석
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:carolcarol 추가
gpasswd -d carol → renamed:x:1001:carol 제거
groupdel fixed-gid → 삭제됨구성원 없는 그룹 삭제 성공
groupdel grptest → cannot remove the primary group of user 'grptest'기본 그룹 삭제 거부

마지막 줄이 핵심 제약이다. grptest 그룹은 grptest 사용자의 기본 그룹(UPG)이라 삭제되지 않는다.


7. 보안 관점

주제내용
최소 그룹필요한 그룹만 만들고, 넓은 권한 그룹(docker 등)은 신중히
GID 변경 주의기존 파일 그룹 소유는 수동 갱신 필요
구성원 관리gpasswd로 그룹 단위 관리 → 실수 감소
시스템 그룹서비스 전용 그룹은 -r로 시스템 GID
그룹 정리미사용 그룹·orphan GID 파일 점검

공격자 관점: 공격자가 groupadd로 새 그룹을 만들고 파일 권한을 그 그룹으로 여는 경우는 드물지만, 기존 특권 그룹(wheel·docker)에 구성원을 추가 하는 것(gpasswd -a)은 흔하다. 그룹 구성원 변경(34편)을 감시한다.


8. 보안관제 관점

[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편)
관점내용
IOCGID 0(root 그룹) 추가, 특권 그룹 구성원 증가
Detection그룹 관리 명령을 auditd로 감시
orphanfind -nogroup으로 그룹 orphan 파일 점검(37편과 함께)

9. 실무에서 자주 발생하는 실수

실수결과예방
groupmod -g 후 파일 방치그룹 orphan 파일find -gid로 갱신
기본 그룹 삭제 시도거부사용자 먼저 처리 또는 usermod -g
usermod -G로 그룹 구성원 관리다른 보조 그룹 삭제gpasswd -a
GID 중복 지정그룹 구분 모호미사용 GID 확인
미사용 그룹 방치관리 복잡·오탐정기 정리

10. 실습 체크리스트

[ ] groupadd 로 일반·시스템(-r)·지정(-g) 그룹을 만들었다
[ ] groupmod -n 으로 이름을 변경했다
[ ] gpasswd 로 구성원을 추가·제거했다
[ ] groupdel 로 빈 그룹을 삭제했다
[ ] 기본 그룹은 삭제할 수 없음을 확인했다
[ ] gpasswd 가 usermod -G 보다 안전한 이유를 안다

11. 핵심 정리

  • 그룹 관리는 groupadd(생성)·groupmod(이름·GID)·gpasswd(구성원)·groupdel(삭제)로 나뉜다.
  • 구성원 추가는 gpasswd -a가 안전하다. 다른 보조 그룹에 영향이 없다.
  • -r은 시스템 그룹(GID < 1000)을 만든다.
  • groupmod -g(GID 변경) 후 기존 파일 그룹은 find -gid로 갱신한다.
  • 사용자의 기본 그룹은 삭제할 수 없다.
  • 특권 그룹 구성원 변경과 그룹 orphan 파일을 점검한다.

12. 다음 편 예고

다음 글 「39. 기본 그룹과 보조 그룹」 에서는 로그인 세션에서 기본 그룹과 보조 그룹이 실제로 어떻게 작동하는지, 새 파일이 어느 그룹을 갖는지, 그리고 newgrp로 유효 그룹을 전환하는 방법을 실습한다.


참고 자료


시리즈 이동

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

0개의 댓글