파일 · 권한 · 사용자 관리 29 / 50 · Part 3. Linux 파일 권한
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정analyst)
기초편 연계: 「리눅스 시스템 기초」 16. chmod와 권한 관리
SGID(Set Group ID)는 SUID(28편)의 그룹 버전이다. 하지만 파일에 붙었을 때와 디렉터리에 붙었을 때 동작이 전혀 다르다. 이 차이를 구분하지 못하면 그룹 협업 디렉터리를 제대로 구성할 수 없다.
실무에서 훨씬 자주 쓰이는 것은 디렉터리 SGID 다. 팀 공유 디렉터리의 표준 설정이기 때문이다. 이번 글에서 두 동작을 실습으로 구분한다.
| 대상 | SGID 효과 |
|---|---|
| 실행 파일 | 실행 시 euid가 아니라 egid 가 파일 그룹으로 바뀜 |
| 디렉터리 | 안에서 만든 새 항목이 만든 사람의 기본 그룹이 아니라 디렉터리의 그룹 을 상속. mkdir로 만든 하위 디렉터리에는 SGID도 전파 |
| 표시 | 의미 |
|---|---|
drwxrwsr-x | 디렉터리 SGID (그룹 x 자리 s) |
-rwxr-sr-x | 파일 SGID |
...r-S... | SGID인데 그룹 실행 권한 없음 (대문자 S) |
chmod 2775 | 앞자리 2 = SGID |
chmod g+s | 기호 방식 |
SGID가 없는 공유 디렉터리에서는, 각 사용자가 만든 파일이 각자의 기본 그룹 을 갖는다. alice가 만든 파일은 alice 그룹, bob이 만든 파일은 bob 그룹이 되어, 서로 그룹 권한으로 접근할 수 없다. SGID 디렉터리는 모든 새 파일에 공통 그룹 을 붙여 이 문제를 해결한다.

새 파일의 그룹은 기본적으로 만든 프로세스의 기본 그룹(egid) 이 된다. 그런데 상위 디렉터리에 SGID가 설정되어 있으면, 커널은 새 파일의 그룹을 디렉터리의 그룹 으로 정한다. 하위 디렉터리를 mkdir로 만들면 그 디렉터리에도 SGID가 자동으로 붙어 상속이 계속 이어진다.
이 규칙 덕분에 팀 공유 디렉터리는 다음과 같이 구성한다.
groupadd team
chgrp team /shared
chmod 2775 /shared # SGID + rwxrwxr-x
이제 team 구성원이 /shared에 만드는 모든 파일은 자동으로 team 그룹을 갖는다. umask를 002(또는 007)로 맞추면 그룹 쓰기까지 보장되어 완전한 공유가 된다.
analyst는team그룹 구성원이다.shared는 SGID(2775),normal은 일반(0775) 디렉터리다.
cd /data/lab29
# 1) 두 디렉터리 비교
ls -ld shared normal # shared 에만 s
# 2) 일반 디렉터리 — 새 파일은 기본 그룹
touch normal/a && ls -l normal/a # 그룹 analyst
# 3) SGID 디렉터리 — 새 파일은 디렉터리 그룹 상속
touch shared/b && ls -l shared/b # 그룹 team
# 4) 하위 디렉터리에도 SGID 전파
mkdir shared/sub && ls -ld shared/sub # team + s
# 5) SGID 파일 (참고)
ls -l sgidtool # -rwxr-sr-x

텍스트 원본(실제 출력):
[analyst@rocky9-lab ~]$ cd /data/lab29
[analyst@rocky9-lab lab29]$ ls -ld shared normal
drwxrwxr-x 2 root team 4096 Sep 24 10:57 normal
drwxrwsr-x 2 root team 4096 Sep 24 10:57 shared
[analyst@rocky9-lab lab29]$ touch normal/a && ls -l normal/a
-rw-r--r-- 1 analyst analyst 0 Sep 24 10:57 normal/a
[analyst@rocky9-lab lab29]$ touch shared/b && ls -l shared/b
-rw-r--r-- 1 analyst team 0 Sep 24 10:57 shared/b
[analyst@rocky9-lab lab29]$ mkdir shared/sub && ls -ld shared/sub
drwxr-sr-x 2 analyst team 4096 Sep 24 10:57 shared/sub
[analyst@rocky9-lab lab29]$ ls -l sgidtool
-rwxr-sr-x 1 root team 27936 Sep 24 10:57 sgidtool
| 출력 | 해석 |
|---|---|
drwxrwxr-x ... normal | 일반 디렉터리 (SGID 없음) |
drwxrwsr-x ... shared | 그룹 x 자리 s = SGID |
normal/a → analyst analyst | 만든 사람의 기본 그룹 |
shared/b → analyst team | 소유자는 analyst, 그룹은 team으로 상속 |
shared/sub → drwxr-sr-x ... team | 하위 디렉터리도 그룹 team + SGID 전파 |
sgidtool → -rwxr-sr-x root team | SGID 파일. 실행 시 egid = team |
shared/b의 그룹이 team인 것이 SGID 디렉터리의 효과다. normal/a(그룹 analyst)와 비교하면 차이가 분명하다.
| 주제 | 내용 |
|---|---|
| 디렉터리 SGID | 대부분 정상·유용한 협업 설정. 그 자체로 위험하지 않음 |
| 파일 SGID | SUID처럼 권한 위임. 그룹이 민감하면(예: shadow, disk) 위험 |
| SGID 셸/도구 | egid가 특권 그룹으로 바뀌는 SGID 바이너리는 권한 상승 경로 |
| 점검 범위 | SUID와 SGID를 함께 점검한다 (47편) |
주의: 디렉터리 SGID는 흔하고 정상이므로, find -perm -2000으로 나온 항목을 모두 의심하면 오탐이 많다. 파일 SGID 와 민감 그룹의 SGID 에 집중한다. 예를 들어 -rwxr-sr-x root shadow 형태의 비표준 바이너리는 shadow 그룹 권한(해시 읽기)을 주는 위험한 파일일 수 있다.
[Baseline] SUID + SGID 파일 목록 (디렉터리 제외)
find / -xdev -type f \( -perm -4000 -o -perm -2000 \) 2>/dev/null | sort > baseline.txt
↓
[정기 점검] 현재 목록과 비교, 신규 항목 확인
↓
[초점] 파일 SGID + 민감 그룹(shadow/disk/wheel) 조합
↓
[Evidence] 신규 항목: stat, sha256sum, 패키지 소속 확인
↓
[Response] 비인가 SGID 제거(chmod g-s), 경위 조사
| 관점 | 내용 |
|---|---|
| 오탐 관리 | 디렉터리 SGID는 정상이 많다. 파일에 집중 |
| 위험 조합 | SGID 파일 + shadow/disk/kmem 등 특권 그룹 |
| 탐지 | chmod g+s (특히 파일 대상)를 auditd로 감시 |
| 실수 | 결과 | 예방 |
|---|---|---|
| 공유 디렉터리에 SGID 미설정 | 파일 그룹이 제각각, 협업 실패 | chmod 2775 |
| SGID만 하고 umask 방치 | 그룹 쓰기 안 됨 | umask 002/007 |
| 디렉터리 SGID를 위험으로 오판 | 오탐 | 파일 SGID에 집중 |
| 파일에 불필요한 SGID | 권한 위임 위험 | 필요한 프로그램만 |
| SUID만 점검, SGID 누락 | 탐지 공백 | 둘 다 점검 |
[ ] 파일 SGID 와 디렉터리 SGID 의 동작 차이를 설명할 수 있다
[ ] SGID 디렉터리에서 새 파일이 그룹을 상속하는 것을 확인했다
[ ] 하위 디렉터리로 SGID 가 전파되는 것을 확인했다
[ ] 일반 디렉터리와 SGID 디렉터리의 결과를 비교했다
[ ] chmod 2775 로 공유 디렉터리를 구성할 수 있다
[ ] SGID 점검 시 파일과 민감 그룹에 집중하는 이유를 안다
...r-s...(그룹 자리 s), 설정은 chmod 2775 또는 g+s.chmod 2775 + umask 002/007로 완성한다.Part 3의 마지막 글 「30. Sticky Bit」 에서는 /tmp처럼 누구나 쓸 수 있는 공용 디렉터리에서 남의 파일 삭제를 막는 Sticky Bit를 다룬다. Sticky Bit가 없을 때 실제로 남의 파일이 삭제되는 것을 재현한다.