Week 05 — 리눅스 파일 시스템과 권한 관리
상세 기술 보고서 (PDF) 는 GitHub에서 확인할 수 있습니다. hojjang98 / skshielders-rookies-28 — projects/week_05
개요
Week 5 는 리눅스와 네트워크 기초를 중점적으로 학습한 주간이었다. 코드보다 개념의 깊이가 중요한 주제였기 때문에, 이번 주의 산출물은 기술 보고서 형태로 구성하였다.
리눅스 파일 시스템과 권한 관리는 보안 실무에서 아주 기초적이고도 핵심적인 영역이다. 권한 하나가 잘못 설정되면 권한 상승 취약점으로 이어지고, 파일 시스템 구조를 모르면 침해 발생 시 어디에서 무엇이 바뀌었는지 판단하기조차 어렵다.
학습 배경
“서버를 아무리 잘 구축해도, 파일 하나의 권한이 잘못되면 그 서버는 뚫린다.”
리눅스 파일 시스템과 권한 체계는 피상적인 구현보다 체계적인 문서화를 통한 이해가 더 효과적인 영역이다. 잘 정리된 기술 보고서는 이후 프로젝트나 사고 대응 시 즉시 참고할 수 있는 실무 레퍼런스가 된다.
1. 리눅스 파일 시스템 계층 구조
리눅스는 “모든 것은 파일이다(Everything is a File)” 는 철학을 기반으로 한다. 디렉토리, 장치, 소켓, 파이프까지 모두 파일 인터페이스로 다룬다.
전체 구조는 루트 디렉토리 ( / ) 를 최상위로 하는 트리 형태의 단일 계층 구조다. 물리적 디스크나 원격 파일시스템은 이 트리의 특정 경로에 마운트(Mount) 하여 편입된다.
주요 디렉토리와 역할:
/
├── bin -- 모든 사용자가 사용하는 핵심 실행 파일 (ls, cp, mv 등)
├── sbin -- 시스템 관리자용 실행 파일 (fdisk, ifconfig 등)
├── etc -- 시스템 전체 설정 파일 저장소 (passwd, shadow, hosts 등)
├── home -- 일반 사용자 홈 디렉토리 (/home/username)
├── root -- root 계정의 홈 디렉토리
├── var -- 가변 데이터 (로그 파일, 스풀, 캐시)
├── tmp -- 임시 파일 (재부팅 시 삭제)
├── dev -- 장치 파일 (디스크, 터미널, USB 등)
├── proc -- 커널 및 프로세스 정보 (가상 파일시스템)
├── sys -- 커널 서브시스템 정보 (가상 파일시스템)
├── usr -- 사용자 프로그램 및 라이브러리
└── lib -- 공유 라이브러리 (.so 파일)
보안 관점 핵심:
- /etc/passwd 와 /etc/shadow — 계정 정보와 해시된 패스워드가 분리 저장
- /var/log — 모든 시스템 이벤트 로그의 집결지. 침해 분석 시 최우선 확인 위치
- /tmp — Sticky Bit 가 적용된 공유 임시 공간. 악성코드가 자주 활용하는 경로
2. 파일 타입과 inode 구조
리눅스의 7가지 파일 타입
타입 기호 설명 예시
- 일반 파일 텍스트, 바이너리, 스크립트
d 디렉토리 /home, /etc
l 심볼릭 링크 /usr/bin/python -> python3
b 블록 장치 파일 /dev/sda (하드 디스크)
c 문자 장치 파일 /dev/tty (터미널)
p 파이프(FIFO) 프로세스 간 통신
s 소켓 네트워크 / IPC 통신
inode — 파일의 진짜 신분증
파일 이름은 단지 inode 번호를 가리키는 포인터일 뿐이다. 실제 파일 정보(메타데이터)는 모두 inode 에 저장된다.
inode 에 저장되는 정보:
- 파일 타입 및 권한 (mode)
- 소유자 UID / 그룹 GID
- 파일 크기
- 생성 / 수정 / 접근 시각 (ctime / mtime / atime)
- 데이터 블록 포인터
- 하드 링크 카운트
하드 링크 vs 심볼릭 링크
- 하드 링크 => 같은 inode 를 가리키는 또 다른 이름. 원본 삭제 후에도 데이터 유지. 파일시스템 경계를 넘을 수 없고, 디렉토리에 사용 불가.
- 심볼릭 링크 => inode 가 아닌 경로 문자열을 저장하는 별도 파일. 원본 삭제 시 링크가 끊어짐 (dangling link). 파일시스템 경계 초월 가능.
보안 관점: 심볼릭 링크를 악용한 링크 추적 공격(Symlink Attack) 에 주의. 예를 들어, /tmp 에 심볼릭 링크를 생성해 SetUID 프로그램이 의도치 않은 파일을 수정하게 유도하는 패턴이 있다.
3. 권한 관리 시스템
권한 표기 읽는 법
ls -l 명령으로 표시되는 권한 문자열 구조:
drwxr-xr--
│└─┘└─┘└─┘
│ │ │ └── 기타 사용자 (Others) : r-- = 읽기만 가능 (4)
│ │ └───── 그룹 (Group) : r-x = 읽기 + 실행 (5)
│ └──────── 소유자 (Owner) : rwx = 모든 권한 (7)
└─────────── 파일 타입 : d = 디렉토리
각 권한의 의미:
| 권한 | 파일에 적용 시 | 디렉토리에 적용 시 |
|---|---|---|
| r (읽기, 4) | 파일 내용 읽기 가능 | 디렉토리 목록 조회 가능 |
| w (쓰기, 2) | 파일 내용 수정 가능 | 파일 생성 / 삭제 가능 |
| x (실행, 1) | 파일 실행 가능 | 디렉토리 진입 가능 |
권한 변경 명령어
chmod 755 file.sh -- 숫자 모드: 소유자 rwx(7), 그룹 r-x(5), 기타 r-x(5)
chmod u+x file.sh -- 심볼릭 모드: 소유자(u)에게 실행(x) 권한 추가
chmod go-w file.sh -- 그룹(g)과 기타(o)에서 쓰기(w) 권한 제거
chown user:group file -- 소유자와 그룹 동시 변경
chown -R user dir/ -- 디렉토리 하위 전체 재귀 적용
4. 특수 권한 — 보안의 양날의 검
SetUID (4xxx)
실행 파일에 설정 시, 실행하는 사용자가 아닌 파일 소유자 권한으로 실행된다.
-rwsr-xr-x root /usr/bin/passwd
위처럼 passwd 명령은 일반 사용자가 실행해도 root 권한으로 /etc/shadow 를 수정할 수 있다. 이 메커니즘이 없으면 일반 사용자는 자신의 비밀번호조차 바꿀 수 없다.
보안 위협: SetUID 가 걸린 쉘이나 임의 실행 파일이 존재하면 즉각적인 권한 상승(Privilege Escalation) 경로가 된다.
# SetUID 파일 전체 탐색 (보안 점검 필수)
find / -perm -4000 -type f 2>/dev/null
SetGID (2xxx)
- 파일에 적용 시: 파일 소유 그룹 권한으로 실행
- 디렉토리에 적용 시: 해당 디렉토리 내 새로 생성되는 파일이 부모 디렉토리 그룹을 자동 상속
공동 작업 디렉토리에서 그룹 권한 일관성 유지에 유용하다.
Sticky Bit (1xxx)
디렉토리에 적용 시, 파일 소유자 또는 root 만 해당 파일을 삭제할 수 있다. 쓰기 권한이 있어도 다른 사람의 파일은 삭제 불가.
drwxrwxrwt root /tmp
/tmp 디렉토리가 대표적인 예. Sticky Bit 없이 777 이라면 누구든 타인의 임시 파일을 삭제할 수 있어 서비스 방해가 가능하다.
5. 보안 관점 — 최소 권한 원칙
Principle of Least Privilege (PoLP)
모든 계정과 프로세스는 정상 작동에 필요한 최소한의 권한만 가져야 한다.
실무 적용 체크리스트:
- 웹 서버 프로세스는 절대 root 로 실행하지 않는다 (www-data, nginx 전용 계정 사용)
- 설정 파일 (/etc 하위) 은 불필요한 읽기 권한도 제거한다
- 로그 파일은 쓰기 전용 계정으로만 접근 가능하게 분리한다
- SSH 키 파일은 반드시 600, .ssh 디렉토리는 700 으로 설정한다
- 데이터베이스 계정은 SELECT / INSERT 만 허용하고 DROP / ALTER 를 차단한다
권한 감사 — 실무 점검 명령어
# SetUID / SetGID 파일 전체 탐색
find / -perm /6000 -type f 2>/dev/null
# world-writable 파일 탐색 (누구나 쓸 수 있는 위험 파일)
find / -perm -o+w -type f 2>/dev/null
# 소유자 없는 고아 파일 탐색 (계정 삭제 후 남은 파일)
find / -nouser -o -nogroup 2>/dev/null
# 특정 경로 권한 일괄 점검
stat -c "%a %n" /etc/passwd /etc/shadow /etc/sudoers
6. 실무 연계 — 보안 감사 관점
침해 사고 대응 시 파일시스템 활용
| 확인 항목 | 위치 | 의미 |
|---|---|---|
| 최근 수정된 파일 | find / -mtime -1 | 1일 이내 변경 파일 추적 |
| 비정상 SetUID | find / -perm -4000 | 권한 상승 경로 탐지 |
| 로그인 기록 | /var/log/auth.log | SSH 접속 기록, 실패 기록 |
| 크론 잡 확인 | /etc/cron* , /var/spool/cron | 지속성 유지 백도어 탐지 |
| 숨김 파일 | find / -name “.*” | 점(.) 으로 시작하는 숨김 파일 탐지 |
컨테이너 / 클라우드 환경과의 연결
리눅스 권한 개념은 현대 인프라 전반에 그대로 적용된다.
- Docker — 컨테이너 내부 프로세스 UID, 볼륨 마운트 권한 설정
- Kubernetes — SecurityContext 를 통한 Pod 수준 권한 제어
- 클라우드 IAM — AWS IAM Role 은 리눅스 그룹 / 권한 개념의 클라우드 버전
- CI/CD — 빌드 에이전트의 파일 시스템 권한이 파이프라인 보안과 직결
학습 성과 정리
| 영역 | 학습 내용 |
|---|---|
| 시스템 아키텍처 | 리눅스 파일시스템 계층 구조 (FHS) 및 마운트 메커니즘 이해 |
| 파일 시스템 | inode 구조, 하드 링크 vs 심볼릭 링크, 7가지 파일 타입 |
| 권한 관리 | rwx 3비트 모델, 숫자 / 심볼릭 모드, chmod / chown 활용 |
| 특수 권한 | SetUID / SetGID / Sticky Bit 의 동작 원리와 보안 위협 |
| 보안 점검 | find 기반 권한 감사, 침해 사고 대응 시 파일시스템 활용법 |
향후 학습 방향
- ACL (Access Control List) — 기본 3계층(소유자 / 그룹 / 기타) 을 넘어선 세밀한 권한 제어
- SELinux / AppArmor — MAC(Mandatory Access Control) 기반 강제적 보안 정책
- 파일시스템 종류 — ext4, XFS, Btrfs 의 특성 비교와 선택 기준
- Linux Capabilities — root 권한을 세분화한 현대적 권한 관리 방식
- Namespace / Cgroup — 컨테이너 격리의 핵심 리눅스 커널 기능