디렉터리, 파일에서의 권한 관리
실습 환경
● Rocky Linux 9.7
1. 허가권(Permission)이란
디렉터리나 파일을 ls -l로 보면 맨 앞에 -rw-r--r-- 같은 문자열이 보이는데, 이게 바로 허가권(permission)이다. 누가 이 파일을 읽고/쓰고/실행할 수 있는가를 정해놓은 표식이라고 보면 된다.
이 10자리는 크게 4개로 나눌 수 있다.
- rw- r-- r--
│ │ │ │
│ │ │ └─ 제3자(other) 허가권
│ │ └────────── 그룹(group) 허가권
│ └─────────────────── 소유자(owner) 허가권
└─────────────────────────── 파일의 종류
1) 첫 글자 — 파일의 종류
| 기호 | 의미 |
| - | 일반 파일 |
| d | 디렉터리 |
| l | 심볼릭 링크 |
| b | 블록 디바이스 |
| c | 문자 디바이스 |
2) 나머지 9자리
3자리씩 끊어서 각각 소유자, 그룹, 제3자의 권한을 나타낸다. 각 자리에 들어가는 권한의 종류는 이렇다.
기호 의미 숫자값
| r | read (읽기) | 4 |
| w | write (쓰기) | 2 |
| x | execute (실행) | 1 |
| - | 권한 없음 | 0 |
숫자값은 2의 거듭제곱이라 더해도 겹치지 않는다. 그래서 rwx = 4+2+1 = 7, rw- = 4+2 = 6, r-x = 4+1 = 5 처럼 세 자리를 한 숫자로 표현할 수 있다.
rw- r-- r--
6 4 4 → 644
3) 심볼릭 표기에 쓰이는 문자
chmod를 심볼릭(문자) 방식으로 쓸 때 등장하는 기호들이다.
대상 기호 동작 기호
| 대상 | 기호 | 동작 | 기호 | |
| 소유자 | u | 부여 | + | |
| 그룹 | g | 제거 | - | |
| 제3자 | o | 설정 | = | |
| 전체 | a |
2. 초기 허가권
리눅스에는 umask라는 게 있다. 파일이나 디렉터리를 새로 만들 때 기본 허가권에서 특정 권한을 제한하는 값이다.
대부분의 배포판에서 기본값은 0022다. (맨 앞 0은 특수 권한 자리라 일반적인 상황에선 신경 안 써도 된다.)
베이스 권한
새로 생성될 때의 출발점이 되는 기본 권한이 디렉터리와 파일에서 다르다.
디렉터리 베이스 권한 = 777 (drwxrwxrwx)
파일 베이스 권한 = 666 (-rw-rw-rw-)
여기서 umask 022를 적용하면.
디렉터리 : 777 - 022 = 755 (drwxr-xr-x)
파일 : 666 - 022 = 644 (-rw-r--r--)
글에서는 빼기로 적었지만 원리는 비트 끄기다.
umask를 "기본값 - umask"로 계산하면 022 같은 값에서는 결과가 맞아떨어진다. 하지만 실제 동작은 umask에 켜진 비트를 기본 권한에서 꺼버리는 것(bitwise) 이다.
그래서 umask에 7이 들어가면 단순 빼기로는 음수가 나와버려서 말이 안 된다. 예를 들어 파일 베이스 666에 umask 333을 적용하면 단순 빼기로는 333이지만, 실제 결과는 444다. 3은 이진수로 011이라 write·execute 비트를 꺼버리기 때문이다.
파일은 왜 베이스가 666인가 (실행 권한이 없다)
디렉터리는 베이스가 777인데 파일은 666이다. 파일은 보안상 생성 시점에 실행 권한(x)을 아예 주지 않기 때문이다. 그래서 umask를 000으로 풀어버려도 새 파일은 최대 666까지밖에 안 나온다.
다만 이건 생성 시 기본값 얘기일 뿐, chmod로 나중에 777로 만들 수 있다.
3. 허가권 부여
pse1이라는 파일이 있다고 할 때, 권한을 바꾸는 방법은 여러 가지다.
1) 숫자(8진수)로 부여
chmod 777 pse1 # rwxrwxrwx
chmod 644 pse1 # rw-r--r--
chmod 1755 pse1 # 맨 앞 1 = 특수 권한(Sticky Bit) + 755
맨 앞에 한 자리를 더 붙이면 특수 권한까지 한 번에 지정된다.
2) 심볼(문자)로 부여
chmod a+x pse1 # 모든 사용자에게 실행 권한 추가
chmod o-w pse1 # 제3자의 쓰기 권한 제거
chmod ug+rw pse1 # 소유자와 그룹에게 읽기·쓰기 추가
chmod o+t pse1 # 제3자 자리에 Sticky Bit 부여
3) 소유자 · 그룹 변경
파일에는 소유자(owner)와 그룹(group)이 붙어 있는데, 이것도 바꿀 수 있다.
chown root pse1 # 소유자를 root로 변경
chgrp korea1 pse1 # pse1의 그룹을 korea1로 변경
chown root:korea1 pse1 # 소유자와 그룹을 한 번에 변경
chgrp의 문법은 chgrp 그룹명 대상파일이다. 즉 chgrp korea1 pse1은 "pse1의 그룹을 korea1로 바꾼다"는 뜻이다. 대상 파일명을 헷갈리지 않게 적어야 한다.
4. 권한의 실제 의미
같은 r·w·x라도 디렉터리에 붙느냐 파일에 붙느냐에 따라 의미가 다르다.
| 권한 | 파일 | 디렉터리 |
| r | 파일 내용 읽기 | 디렉터리 안의 파일·디렉터리 목록 보기 |
| w | 파일 내용 수정·삭제 | 디렉터리 안에서 파일·디렉터리 생성/삭제 |
| x | 파일 실행 | 디렉터리 안으로 진입(cd) |
디렉터리에서 x(진입)가 없으면 r(목록)이 있어도 안을 제대로 못 들어간다. 그래서 디렉터리는 보통 r과 x를 같이 준다(r-x = 5). umask 결과로 디렉터리가 755가 되는 것도 이 때문이다.
5. 특수 허가권 (Special Permission)
일반 rwx 외에 각 영역의 실행 권한 자리에 얹히는 세 가지 특수 권한이 있다. 8진수에서는 맨 앞 한 자리로 표현된다.
| 특수권한 | 숫자 | 표시 위치 | 부여 방법 |
| SetUID | 4 | 소유자 x 자리 | u+s |
| SetGID | 2 | 그룹 x 자리 | g+s |
| Sticky Bit | 1 | 제3자 x 자리 | o+t |
표시 문자
세 권한 모두 원래 실행 권한(x) 자리에 겹쳐서 표시된다. 그래서 그 자리에 실행 권한이 있었는지에 따라 글자가 대/소문자로 갈린다.
소문자 (s, t) → 그 자리에 실행 권한(x)이 원래 있음 → 특수 권한이 정상 동작
대문자 (S, T) → 그 자리에 실행 권한(x)이 원래 없음 → 보통 설정 실수
대문자 S/T가 보이면 "특수 권한은 켜놨는데 실행 비트가 빠졌다"는 신호다. SetUID·SetGID는 실행 비트가 없으면 효과 자체가 없다.
1) SetUID (4)
해당 파일의 소유자 권한으로 실행된다.
실행한 사용자가 아니라 파일 소유자의 권한으로 프로그램이 돌아간다. 소유자가 root인 파일이라면, 일반 사용자가 실행해도 그 순간만큼은 root 권한으로 동작하게 된다.
이래서 SetUID는 권한 상승(Privilege Escalation)의 위협이 되어 보안에 취약하다.
대표 예시 — /usr/bin/passwd
ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root ... /usr/bin/passwd
▲
소유자 실행 자리에 s → SetUID
passwd는 사용자가 자기 비밀번호를 바꾸는 명령인데, 비밀번호 해시는 **root만 읽고 쓸 수 있는 /etc/shadow**에 저장된다. 일반 사용자가 자기 비밀번호를 바꾸려면 shadow에 접근해야 하는데, 그게 불가능하니까 passwd에 SetUID를 걸어서 실행 순간만 root 권한으로 shadow를 수정하게 만들어둔 것이다.
직접 확인해볼 수도 있다.
chmod u-s /usr/bin/passwd # SetUID 제거
# pse1 계정으로 로그인 후 passwd 시도 → shadow 접근 불가로 에러 발생
2) SetGID (2)
SetGID는 대상이 파일이냐 디렉터리냐에 따라 동작이 갈린다. 글에서 흔히 디렉터리 케이스만 외우는데, 둘 다 알아둬야 한다.
● 파일에 걸 때 — SetUID의 그룹 버전이다. 실행한 사용자의 그룹이 아니라 파일이 속한 그룹의 권한으로 실행된다.
● 디렉터리에 걸 때 — 그 디렉터리 안에서 새로 만들어진 파일의 그룹이, 만든 사람의 그룹이 아니라 부모 디렉터리의 그룹을 상속한다. 팀 공유 디렉터리에서 그룹을 일정하게 유지할 때 쓴다.
3) Sticky Bit (1)
디렉터리에 거는 권한으로, 모두에게 쓰기 권한이 열려 있어도 삭제는 파일 소유자·디렉터리 소유자·root만 가능하게 만든다.
여기서 두 가지를 정확히 해야 한다. 첫째, Sticky Bit는 디렉터리에 거는 것이다(현대 리눅스에서 일반 파일엔 효과가 없다).
둘째, 삭제 가능한 주체는 파일 소유자 혼자가 아니라 파일 소유자 + 디렉터리 소유자 + root 셋이다.
대표 예시가 /tmp다. 누구나 쓸 수 있지만 남의 파일은 지우지 못한다.
ls -ld /tmp
drwxrwxrwt. ... /tmp
▲
제3자 실행 자리에 t → Sticky Bit
부여 방법 정리
SetUID와 SetGID는 표시 문자가 둘 다 s라서 헷갈리는데, 거는 자리가 다르다.
chmod u+s 파일 # SetUID → 소유자 자리
chmod g+s 파일 # SetGID → 그룹 자리
chmod o+t 디렉터리 # Sticky → 제3자 자리
# 8진수로도 가능 (맨 앞자리)
chmod 4755 파일 # SetUID + 755
chmod 2755 파일 # SetGID + 755
chmod 1777 디렉터리 # Sticky + 777
6. find 명령어로 파일 찾기
1) 허가권으로 검색
find /home/korea/dir1 -perm 6755
-perm 6755는 권한이 정확히 6755인 파일만 찾는다. SetUID·SetGID가 걸린 파일을 전부 찾고 싶었던 거라면 의도와 다르게 동작한다.
-perm 6755 # 권한이 정확히 6755인 것만
-perm -6000 # 6000 비트를 "모두 포함"하는 것 (SetUID + SetGID 둘 다 걸린 것)
-perm /6000 # 6000 비트 중 "하나라도" 걸린 것
실무에서 SetUID 파일을 감사할 때 자주 쓰는 명령이 find / -perm -4000 -type f다. -4000은 "SetUID 비트를 포함하는 모든 파일"을 의미한다. SetUID-root 바이너리를 점검하는 기본 패턴이다.
2) 이름으로 검색
find /home/korea/dir1 -name "f*" # f로 시작하는 모든 파일/디렉터리
3) 종류(type) 지정해서 검색
find /home/korea/dir1 -perm 6755 -type f # 파일만
-type d # 디렉터리만
-type l # 심볼릭 링크만
4) 시간으로 검색
파일에는 세 종류의 시간 로그가 남는다. stat으로 확인할 수 있다.
stat file1
| 옵션 | 의미 | 갱신 시점 |
| atime | 접근(access) 시간 | 파일을 읽을 때 (cat, grep 등) |
| mtime | 수정(modify) 시간 | 파일 내용이 바뀔 때 |
| ctime | 변경(change) 시간 | 내용 변경 또는 메타데이터 변경 (chmod 등) |
헷갈리기 쉬운 게 mtime과 ctime이다. mtime은 내용이 바뀔 때, ctime은 내용뿐 아니라 권한·소유자 같은 메타데이터(inode 정보)가 바뀔 때도 갱신된다. 그래서 chmod만 해도 ctime은 바뀌지만 mtime은 그대로다.
find에서는 일(day) 단위는 -atime/-mtime/-ctime, 분(minute) 단위는 -amin/-mmin/-cmin을 쓴다. 숫자 앞의 부호가 핵심이다.
find /home/korea -mtime -1 # 최근 24시간(1일) 이내에 수정된 것
find /home/korea -mtime +1 # 1일보다 더 전에 수정된 것
find /home/korea -mtime 1 # 딱 1일 전(24~48시간 사이)에 수정된 것
find /home/korea -mmin -1 # 최근 1분 이내에 수정된 것
find /home/korea -mmin +1 # 1분보다 더 전에 수정된 것
부호 규칙이 헷갈리는데. -n은 "n보다 적게(이내)", +n은 "n보다 많게(이전)" 다. 부호 없는 n은 "정확히 n"이다.
7. 정리
| 허가권 읽기 | [종류][소유자][그룹][제3자], rwx = 4·2·1 |
| umask | 디렉터리 777, 파일 666에서 비트를 깎음 (기본 022 → 755 / 644) |
| chmod | 숫자(644) 또는 심볼(u+s, o-w)로 부여 |
| chown/chgrp | 소유자·그룹 변경 |
| SetUID(4) | 소유자 권한으로 실행 → privilege escalation 위협 |
| SetGID(2) | 파일=그룹 권한 실행 / 디렉터리=그룹 상속 |
| Sticky(1) | 디렉터리에서 삭제를 소유자·디렉터리 소유자·root로 제한 (/tmp) |
| find | -perm(권한), -name(이름), -type(종류), 시간 옵션 |
'시스템보안' 카테고리의 다른 글
| Metasploit을 사용한 EternalBlue 공격 실습에 대하여 (0) | 2026.07.03 |
|---|---|
| Metasploit을 사용한 Scan, Brute Force Attack에 대하여 (0) | 2026.07.02 |
| Xinetd에서의 Access Control에 대하여 (0) | 2026.06.26 |
| FTP에서의 Access Control에 대하여 (0) | 2026.06.25 |
| 시스템 내부에서의 Ping 차단에 대하여 (0) | 2026.06.25 |