파일 · 권한 · 사용자 관리 23 / 50 · Part 3. Linux 파일 권한
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정analyst)
기초편 연계: 「리눅스 시스템 기초」 16. chmod와 권한 관리
권한을 바꾸는 명령이 chmod(change mode)다. chmod에는 두 가지 표기법이 있다.
chmod u+x file — 누구에게(u) 무엇을(x) 어떻게(+)chmod 755 file — 세 칸을 8진수로 (24편)이번 글은 기호 방식을 다룬다. 기호 방식의 장점은 기존 권한을 유지한 채 일부 비트만 조정 할 수 있다는 것이다. 그리고 재귀 적용 시 반드시 알아야 하는 대문자 X 옵션 — 디렉터리에는 진입 권한을 주면서 데이터 파일은 실행 불가로 두는 — 을 실습으로 확인한다.
chmod [대상][연산][권한] 파일 형식이다.
| 대상 | 연산 | 권한 |
|---|---|---|
u 소유자 | + 추가 | r 읽기 |
g 그룹 | - 제거 | w 쓰기 |
o 기타 | = 정확히 지정 | x 실행 |
a 전체(= ugo) | X 조건부 실행 | |
(생략 시 a) | s t 특수 권한 |
여러 규칙은 쉼표로 연결한다: chmod u=rwx,g=rx,o= file.
| 연산 | 동작 |
|---|---|
+ | 지정한 비트를 추가 (나머지 유지) |
- | 지정한 비트를 제거 (나머지 유지) |
= | 지정한 비트로 정확히 설정 (나머지 제거) |
=은 덮어쓰기다. chmod g=r file은 그룹 권한을 정확히 r--로 만든다(기존 그룹 w·x 제거).
X는 조건부 실행 권한 이다. 다음 경우에만 x를 부여한다.
x가 있을 때일반 데이터 파일(아무도 실행 권한이 없는)에는 x를 주지 않는다. 재귀 권한 부여에서 핵심적으로 쓰인다.

기호 방식은 현재 mode 비트에서 지정한 부분만 연산한다. 그래서 "그룹의 쓰기만 빼고 나머지는 그대로" 같은 조정에 적합하다. 숫자 방식은 항상 9비트 전체를 덮어쓰므로, 일부만 바꾸려면 현재 값을 먼저 알아야 한다.
X가 중요한 이유는 재귀(-R) 적용 때문이다. chmod -R g+x dir를 실행하면 디렉터리뿐 아니라 안의 모든 데이터 파일 에 실행 권한이 붙는다. 이미지·설정·문서까지 실행 가능해지는 것은 불필요하고 위험하다. chmod -R g+X dir는 디렉터리와 원래 실행 파일에만 x를 주고 데이터 파일은 그대로 둔다. "그룹이 하위 디렉터리를 드나들 수 있게" 하려는 의도를 정확히 표현한다.
cd /data && mkdir lab23 && cd lab23
# 1) 000 에서 시작해 비트 하나씩
touch f.sh && chmod 000 f.sh && ls -l f.sh
chmod u+rwx f.sh && ls -l f.sh # 소유자 rwx 추가
chmod g+r,o+r f.sh && ls -l f.sh # 그룹·기타 읽기
chmod u-x,g+w f.sh && ls -l f.sh # 소유자 x 제거, 그룹 w 추가
# 2) = 은 덮어쓰기
chmod a+r f.sh && ls -l f.sh
chmod a-rwx,u+rw f.sh && ls -l f.sh # 전체 초기화 후 소유자 rw
# 3) 대문자 X — 디렉터리만 x
mkdir d && touch d/inside
chmod -R g+rX d && ls -ld d && ls -l d/inside # d 는 x, inside 는 x 없음
# 4) = 로 한 번에 정확히 지정
chmod u=rwx,g=rx,o= f.sh && ls -l f.sh

텍스트 원본(실제 출력):
[analyst@rocky9-lab ~]$ cd /data && mkdir lab23 && cd lab23
[analyst@rocky9-lab lab23]$ touch f.sh && chmod 000 f.sh && ls -l f.sh
---------- 1 analyst analyst 0 Sep 24 10:50 f.sh
[analyst@rocky9-lab lab23]$ chmod u+rwx f.sh && ls -l f.sh
-rwx------ 1 analyst analyst 0 Sep 24 10:50 f.sh
[analyst@rocky9-lab lab23]$ chmod g+r,o+r f.sh && ls -l f.sh
-rwxr--r-- 1 analyst analyst 0 Sep 24 10:50 f.sh
[analyst@rocky9-lab lab23]$ chmod u-x,g+w f.sh && ls -l f.sh
-rw-rw-r-- 1 analyst analyst 0 Sep 24 10:50 f.sh
[analyst@rocky9-lab lab23]$ chmod a+r f.sh && ls -l f.sh
-rw-rw-r-- 1 analyst analyst 0 Sep 24 10:50 f.sh
[analyst@rocky9-lab lab23]$ chmod a-rwx,u+rw f.sh && ls -l f.sh
-rw------- 1 analyst analyst 0 Sep 24 10:50 f.sh
[analyst@rocky9-lab lab23]$ mkdir d && touch d/inside
[analyst@rocky9-lab lab23]$ chmod -R g+rX d && ls -ld d && ls -l d/inside
drwxr-xr-x 2 analyst analyst 4096 Sep 24 10:50 d
-rw-r--r-- 1 analyst analyst 0 Sep 24 10:50 d/inside
[analyst@rocky9-lab lab23]$ chmod u=rwx,g=rx,o= f.sh && ls -l f.sh
-rwxr-x--- 1 analyst analyst 0 Sep 24 10:50 f.sh
| 명령 | 결과 | 해석 |
|---|---|---|
chmod u+rwx | -rwx------ | 소유자에만 rwx 추가 |
chmod g+r,o+r | -rwxr--r-- | 그룹·기타 읽기 추가 (쉼표로 두 규칙) |
chmod u-x,g+w | -rw-rw-r-- | 소유자 x 제거 + 그룹 w 추가 동시 |
chmod a+r | -rw-rw-r-- | 이미 모두 r이 있어 변화 없음 |
chmod a-rwx,u+rw | -rw------- | 전체 초기화 후 소유자만 rw. 초기화 관용구 |
chmod -R g+rX d → d는 drwxr-xr-x | 디렉터리에 x 부여 | |
chmod -R g+rX d → d/inside는 -rw-r--r-- | inside 는 x 없음. 대문자 X가 데이터 파일을 걸렀다 | |
chmod u=rwx,g=rx,o= | -rwxr-x--- | 각 칸을 정확히 지정 (= 750) |
d/inside에 x가 붙지 않은 것이 이번 실습의 핵심이다. 만약 소문자 x(chmod -R g+rx d)를 썼다면 inside도 실행 가능해졌을 것이다.
| 상황 | 권장 방식 | 이유 |
|---|---|---|
| 웹 디렉터리 재귀 권한 부여 | chmod -R o+rX가 아니라 파일·디렉터리 분리 | 소문자 x는 업로드된 데이터까지 실행 가능하게 만듦 |
| 그룹 협업 디렉터리 접근 | chmod -R g+rX dir | 디렉터리 진입만 열고 데이터는 실행 불가 |
| 권한 초기화 | chmod a-rwx,u+rw 또는 숫자 600 | 잔여 권한 제거 |
| 실행 권한 회수 | chmod a-x file | 스크립트 비활성화 |
| 특정 칸만 조정 | 기호 방식 | 나머지 유지 |
실무 원칙: 파일과 디렉터리는 권한이 다르므로 재귀 적용 시 나눠서 처리한다.
find /var/www/html -type d -exec chmod 755 {} +
find /var/www/html -type f -exec chmod 644 {} +
이 방식이 chmod -R보다 명확하고 안전하다.
| 관점 | 내용 |
|---|---|
| Detection | chmod 실행은 auditd -S chmod,fchmod,fchmodat 규칙으로 기록. 특히 +x, +s(SUID)가 붙는 변경은 주시 |
| 위험 패턴 | 업로드 디렉터리·데이터 파일에 +x 부여, chmod 777, chmod -R 777 |
| Investigation | 권한 변경은 파일의 ctime 을 갱신한다. 의심 파일의 ctime과 sudo/명령 로그를 대조 |
| Response | 잘못된 재귀 권한은 find로 파일·디렉터리를 나눠 원복 |
[Detection] auditd: chmod 4755 /tmp/.helper (uid=48 apache → 대상 root 파일)
↓
[판단] 웹 계정이 SUID 설정 시도 → 권한 상승 준비 (28·47편)
↓
[Evidence] 대상 파일 stat(ctime), sha256sum, 소유자
↓
[Response] 권한 원복(chmod u-s), 파일 격리, 웹 취약점 조사
| 실수 | 결과 | 예방 |
|---|---|---|
chmod -R 755로 데이터까지 실행 가능 | 불필요한 실행 권한 | 파일·디렉터리 분리 또는 대문자 X |
=을 +처럼 사용 | 기존 권한 제거 | =은 덮어쓰기임을 인지 |
chmod -R 대상 경로 오타 | 광범위 권한 변경 | 실행 전 find로 대상 확인 |
소문자 x로 재귀 | 모든 파일 실행 가능 | 대문자 X |
| 권한만 바꾸고 소유자 방치 | 접근 문제 지속 | chown도 함께 검토(26편) |
[ ] u/g/o/a 와 +/-/= 를 조합해 권한을 조정했다
[ ] = 이 지정한 비트로 덮어쓰는 것을 확인했다
[ ] 쉼표로 여러 규칙을 한 번에 적용했다
[ ] chmod -R g+rX 에서 디렉터리만 x 가 붙는 것을 확인했다
[ ] 대문자 X 와 소문자 x 의 차이를 설명할 수 있다
[ ] 재귀 권한을 find 로 파일·디렉터리 나눠 적용하는 방법을 안다
[ugoa][+-=][rwxX]로 필요한 비트만 조정한다.+·-는 나머지를 유지하고, =은 지정한 값으로 덮어쓴다.X는 디렉터리와 원래 실행 파일에만 x를 부여해 재귀 적용에서 데이터 파일을 보호한다.chmod -R보다 find -type d/-type f로 나눠 적용하는 것이 안전하다.+x·+s 변경을 주시한다.다음 글 「24. chmod 숫자 방식」 에서는 755, 644, 600, 700 같은 숫자 표기의 계산 원리와 상황별 표준값을 12가지 조합의 실제 출력으로 정리한다.