리눅스 시스템 기초 · 입문편 — 본문의 "N편"은 입문 과정 번호다. 번호별 글과 전체 250편 구성은 통합 로드맵에서 확인할 수 있다.

리눅스 시스템 기초 15 / 50 · Part 2. 파일·명령어·권한
실습 환경: Rocky Linux 9 (10.0.0.200) · 비교: Ubuntu 22.04
이전 글: 14. inode와 파일 시스템

🔗 심화 시리즈 — 「파일 · 권한 · 사용자 관리」
이 주제를 더 깊게 다룬 실무형 보안 시리즈: 21. Linux 파일 권한의 기본 구조 · 22. 파일과 디렉터리의 권한 차이

1. 들어가며

5편에서 커널이 VFS 단계에서 권한을 검사한다고 했고, 14편에서 권한이 inode에 저장된다는 것을 봤다. 이번 글은 그 권한 자체, 즉 rwxr-x---가 정확히 무엇을 허용하는지 를 다룬다.

권한은 Linux 보안의 가장 기본 방어선이다. 침해사고의 상당수는 권한 설정 실수에서 시작된다.

  • 누구나 쓸 수 있는 스크립트를 root cron이 실행 → 권한 상승
  • 웹 서버 계정이 쓸 수 있는 웹 루트 → 웹셸 업로드
  • 다른 사용자가 읽을 수 있는 설정 파일의 비밀번호 → 계정 탈취

이번 글에서는 권한의 의미와 검사 순서를 정리하고, 다음 16·17편에서 chmod, chown으로 실제 권한을 관리한다.


2. 핵심 개념

2-1. 권한 표기

-rwxr-x---  1  roror  dev  2048  Sep 23 11:20  report.sh
│└┬┘└┬┘└┬┘     └─┬─┘  └┬┘
│ │  │  │        │     └ 그룹
│ │  │  │        └ 소유자
│ │  │  └ 기타(other) 권한
│ │  └ 그룹(group) 권한
│ └ 소유자(user) 권한
└ 파일 종류 (13편)
기호숫자의미
r4읽기
w2쓰기
x1실행 / 통과
-0권한 없음

세 칸을 숫자로 더하면 8진수 표기가 된다. rwxr-x--- = 7·5·0 = 750.

2-2. 파일과 디렉터리에서 다른 의미

권한파일디렉터리
r내용 읽기안의 이름 목록 조회 (ls)
w내용 수정안에서 파일 생성·삭제·이름 변경
x프로그램으로 실행디렉터리 안으로 진입·경로 통과

자주 헷갈리는 사례:

상황결과
디렉터리 r만 있고 x 없음이름 목록은 보이지만 파일을 열 수 없음
디렉터리 x만 있고 r 없음목록은 못 보지만, 이름을 정확히 알면 파일에 접근 가능
파일은 r--(읽기 전용)인데 디렉터리가 w파일 내용 수정은 불가, 하지만 삭제는 가능

마지막 경우가 보안상 중요하다. 파일 삭제·교체 권한은 파일이 아니라 상위 디렉터리의 w 에서 나온다.

2-3. 주요 파일의 기본 권한

파일Rocky Linux 9Ubuntu 22.04의미
/etc/passwd644 root:root644 root:root누구나 읽기 (계정 목록)
/etc/shadow000 root:root640 root:shadow해시 — root(또는 shadow 그룹)만
/etc/sudoers440 root:root440 root:root수정은 visudo로만
/tmp17771777모두 쓰기 + Sticky Bit
~/.ssh/700700소유자만
~/.ssh/authorized_keys600600권한이 넓으면 sshd가 거부할 수 있음

Rocky의 /etc/shadow가 000인데도 root가 읽을 수 있는 이유는 다음 절의 root 예외 때문이다.


3. 동작 원리

Linux 파일 권한 — rwx의 의미와 검사 순서

3-1. 검사 순서: 처음 일치하는 한 칸만

커널은 프로세스의 UID·GID와 파일의 소유자·그룹을 비교해 처음 일치하는 칸 하나만 적용한다.

  1. 프로세스가 root(UID 0)면 읽기·쓰기 검사를 대부분 통과한다 (CAP_DAC_OVERRIDE). 단, 실행은 x가 최소 하나 있어야 한다.
  2. 프로세스 UID = 파일 소유자 → 소유자 칸만 적용
  3. 프로세스의 그룹(보조 그룹 포함) = 파일 그룹 → 그룹 칸만 적용
  4. 나머지 → 기타 칸 적용

그래서 ---rwx--- 파일은 그룹 사용자는 접근할 수 있지만 소유자 본인은 접근할 수 없다. 권한이 합쳐지지 않는다는 점을 보여주는 예다.

3-2. umask — 새 파일의 기본 권한

새로 만드는 파일의 권한은 umask로 결정된다. 파일은 666, 디렉터리는 777에서 umask만큼 권한을 뺀다.

umask새 파일새 디렉터리쓰임
0022644755일반적 기본값 (root 등)
0002664775사용자별 그룹을 쓰는 배포판의 일반 사용자
0077600700보안 강화 (본인만)

4. 실습

mkdir -p ~/lab15 && cd ~/lab15

# 1) 권한 확인 방법 3가지
ls -l /etc/passwd /etc/shadow /etc/sudoers
stat -c '%A %a %U:%G %n' /etc/passwd /etc/shadow /tmp
namei -l /home/roror/.ssh/authorized_keys    # 경로 전체의 권한

# 2) umask 확인과 효과
umask
touch f1; mkdir d1; ls -ld f1 d1
(umask 077; touch f2; mkdir d2); ls -ld f2 d2

# 3) 디렉터리 w의 의미 — 읽기 전용 파일도 삭제 가능
echo data > ro.txt; chmod 444 ro.txt
echo more >> ro.txt           # Permission denied
rm -f ro.txt && echo "삭제됨"  # 디렉터리에 w가 있으므로 삭제 가능

# 4) 디렉터리 x만 있을 때
mkdir box && echo secret > box/known.txt
chmod 311 box                 # 소유자 -wx
ls box                        # Permission denied (r 없음)
cat box/known.txt             # 이름을 알면 읽힘 (x 있음)
chmod 755 box

# 5) 소유자 칸만 적용되는 예
echo test > own.txt; chmod 070 own.txt
cat own.txt                   # 소유자 본인도 Permission denied
chmod 644 own.txt

5. 결과 분석

아래 출력은 형식 설명용 예시다.

① namei -l

f: /home/roror/.ssh/authorized_keys
dr-xr-xr-x root  root  /
drwxr-xr-x root  root  home
drwx------ roror roror roror
drwx------ roror roror .ssh
-rw------- roror roror authorized_keys

파일 하나의 권한만 보면 안 되고 경로 전체 를 봐야 한다. 상위 디렉터리 중 하나라도 다른 사용자에게 w가 있으면 파일을 통째로 바꿔치기할 수 있다.

② 위험 권한 판단표

발견위험
/etc/shadow가 644모든 사용자가 해시를 읽고 오프라인 크래킹 가능
root cron이 실행하는 스크립트가 777누구나 내용을 바꿔 root 권한으로 실행
웹 루트가 apache 소유 + w웹 취약점 한 번에 웹셸 저장 가능
~/.ssh가 777다른 사용자가 authorized_keys 교체 가능
홈 디렉터리 755 + 설정 파일 644비밀번호가 든 설정 파일 노출

6. 보안 관점

공격이용하는 권한 설정대응
스크립트 변조 권한 상승root가 실행하는 파일·디렉터리에 일반 사용자 w실행 경로 전체를 root 소유 755 이하로
해시 탈취해시 파일 읽기 권한 과다shadow 권한 점검
웹셸 업로드웹 계정이 쓸 수 있는 실행 경로업로드 폴더 분리, 실행 금지
정보 노출설정·백업 파일 644민감 파일 600
파일 바꿔치기상위 디렉터리 wnamei -l로 경로 점검

7. SOC / 보안관제 활용

7-1. 권한 점검 명령

# 누구나 쓸 수 있는 파일 (가상 FS·임시 경로 제외)
sudo find / -xdev -type f -perm -0002 ! -path '/proc/*' ! -path '/tmp/*' ! -path '/var/tmp/*' 2>/dev/null

# Sticky Bit 없이 누구나 쓸 수 있는 디렉터리
sudo find / -xdev -type d -perm -0002 ! -perm -1000 2>/dev/null

# 주요 파일 권한 한 번에
stat -c '%a %U:%G %n' /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/sudoers /etc/ssh/sshd_config

# root cron이 실행하는 파일의 권한
sudo grep -hv '^#' /etc/crontab /etc/cron.d/* 2>/dev/null | grep -oE '/[^ ]+\.(sh|py|pl)' | sort -u | xargs -r ls -l

7-2. 권한 변경 감사

# /etc/audit/rules.d/perm.rules — 권한·소유자 변경 System Call
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F auid>=1000 -F auid!=unset -k perm_mod
-a always,exit -F arch=b64 -S chown,fchown,fchownat,lchown -F auid>=1000 -F auid!=unset -k perm_mod

7-3. 분석 흐름

[Event]   auditd perm_mod: /opt/backup/backup.sh 권한 755 → 777 (auid=devuser)
   ↓
[맥락]    이 스크립트는 root crontab 에서 매일 02:00 실행
   ↓
[IOC]     스크립트 mtime/ctime, 추가된 줄, devuser 로그인 IP
   ↓
[Root Cause] 일반 사용자가 root 실행 스크립트를 수정 가능하게 만듦 → 권한 상승 준비
   ↓
[Response] 스크립트 원복·권한 700 root:root, 추가된 명령 분석, devuser 계정 조사

8. 핵심 정리

  • 권한은 소유자·그룹·기타 × r(4)·w(2)·x(1) 로 표기하고 8진수로 합산한다.
  • 디렉터리의 r은 목록, w는 생성·삭제, x는 통과다. 파일 삭제 권한은 디렉터리 w 에서 나온다.
  • 커널은 소유자 → 그룹 → 기타 중 처음 일치하는 한 칸만 적용한다.
  • root는 읽기·쓰기 검사를 우회한다 (CAP_DAC_OVERRIDE).
  • 새 파일 권한은 umask로 결정된다. 보안 강화 환경은 077.
  • 파일 하나가 아니라 경로 전체(namei -l) 의 권한을 점검한다.

9. 다음 글

다음 글 「16. chmod와 권한 관리」 에서는 chmod의 기호·숫자 표기, 그리고 기본 권한 9비트 앞에 붙는 특수 권한(SUID·SGID·Sticky Bit) 과 ACL 을 다룬다. 특히 SUID는 권한 상승 공격에서 가장 먼저 점검하는 항목이다.


참고 자료

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

0개의 댓글