리눅스 파일 권한과 SetUID·SetGID·스티키 비트

정보보안기사 2026-08-30 16:25:29 정보보안기사시스템보안리눅스권한

글 목록 →

정의 — 세 주체, 세 권한

리눅스의 모든 파일과 디렉터리는 소유자(user)·그룹(group)·그 외(other) 세 주체에 대해 읽기(r)·쓰기(w)·실행(x) 권한을 따로 갖는다. ls -l이 앞머리에 찍어주는 -rwxr-xr--가 그 표현이다. 맨 앞 한 자리는 파일 유형(- 일반 파일, d 디렉터리, l 심볼릭 링크)이고, 나머지 아홉 자리를 셋씩 끊어 읽는다.

각 권한에는 8진수 값이 붙는다. r=4, w=2, x=1이고, 한 주체의 권한은 이 값을 더한 한 자리 숫자가 된다.

표기계산8진수
rwx4+2+17
r-x4+0+15
r—4+0+04

그래서 -rwxr-xr--는 754이고, chmod 754 file로 같은 상태를 만들 수 있다.

디렉터리에서는 뜻이 달라진다

같은 rwx라도 디렉터리에 붙으면 의미가 바뀐다. 이 차이를 놓치면 뒤의 스티키 비트가 이해되지 않는다.

  • r: 디렉터리 안의 목록을 읽는다(ls).
  • w: 디렉터리 안에 파일을 만들거나 지운다.
  • x: 그 디렉터리로 들어가거나 내부 경로에 접근한다(cd).

핵심은 파일 삭제 권한이 파일 자신이 아니라 그 파일이 놓인 디렉터리의 w 권한에서 나온다는 점이다. 남이 만든 읽기 전용 파일이라도, 내가 그 디렉터리에 쓰기 권한을 가지고 있으면 지울 수 있다.

특수 권한 세 가지

일반 권한 세 자리 앞에 한 자리가 더 붙는다. 이것이 특수 권한이다.

SetUID(4000) — 실행 파일에 걸면, 실행하는 동안 프로세스의 실효 사용자 ID(EUID)가 실행자가 아니라 파일 소유자가 된다. 대표 예가 /usr/bin/passwd다. 비밀번호는 root만 쓸 수 있는 /etc/shadow에 저장되는데, 일반 사용자가 자기 비밀번호를 바꿀 수 있는 이유가 이 프로그램에 SetUID가 걸려 소유자인 root 권한으로 돌기 때문이다. 표기는 소유자의 x 자리에 s가 온다(-rwsr-xr-x).

SetGID(2000) — 실행 파일에 걸면 실효 그룹 ID(EGID)가 파일의 그룹이 된다. 더 자주 쓰이는 쪽은 디렉터리에 거는 경우인데, 그 디렉터리 안에 새로 만들어지는 파일이 만든 사람의 기본 그룹 대신 부모 디렉터리의 그룹을 물려받는다. 팀 공유 디렉터리를 만들 때 쓴다.

스티키 비트(1000) — 디렉터리에 걸면, 그 안의 파일은 디렉터리에 쓰기 권한이 있더라도 파일 소유자와 root만 지우거나 이름을 바꿀 수 있다. 누구나 쓸 수 있는 /tmp가 대표적이며(drwxrwxrwt), 앞 절에서 본 “디렉터리 w 권한이 곧 삭제 권한”이라는 위험을 막는 장치다. 표기는 other의 x 자리에 t가 온다.

설정은 8진수 네 자리 또는 기호로 한다.

chmod 4755 program   # SetUID + rwxr-xr-x
chmod u+s program    # 같은 결과
chmod 1777 /shared   # 스티키 비트 + rwxrwxrwx

s와 t가 대문자로 보이면(S, T) 원래 있어야 할 실행 권한(x)이 없다는 뜻이다. 특수 비트만 걸리고 실행은 안 되는 상태라, 사실상 무의미하거나 설정 실수인 경우가 많다.

왜 보안 점검 항목인가

SetUID는 정상적으로 쓰이면 편리하지만, 공격자 입장에서는 권한 상승(privilege escalation)의 통로다. root 소유의 SetUID 프로그램에 버퍼 오버플로우 같은 결함이 있으면 그 결함을 통해 root 셸을 얻을 수 있다. 그래서 서버 점검에서는 불필요한 SetUID/SetGID 파일을 찾아 정리하는 것이 기본 항목이다.

find / -perm -4000 -type f 2>/dev/null   # SetUID 파일
find / -perm -2000 -type f 2>/dev/null   # SetGID 파일

-perm -4000의 앞 -는 “해당 비트를 포함하는” 조건을 뜻한다. 나머지 권한이 무엇이든 SetUID 비트가 켜진 파일을 모두 찾는다.

시험에 자주 나오는 포인트

  • 8진수 계산: chmod 755, chmod 4755가 각각 어떤 권한 문자열인지 양방향으로 변환할 수 있어야 한다.
  • s/S, t/T 구분: 대문자는 실행 권한이 없는 상태.
  • 스티키 비트는 디렉터리에 거는 것이며 목적은 삭제 제한. /tmp가 단골 보기다.
  • SetGID를 디렉터리에 걸면 그룹 상속이 일어난다.
  • umask: 기본값 022이면 파일은 666-022=644, 디렉터리는 777-022=755로 생성된다. 파일의 기본값이 777이 아니라 666(실행 권한 제외)이라는 점이 함정으로 나온다.
  • 취약점 점검 명령은 find / -perm -4000이 그대로 지문에 나온다.

댓글

이 글에 대한 의견은 아래 댓글로 남겨주세요 (GitHub 계정 필요). 로그인 없이 남기고 싶다면