DaleSchool

파일 권한과 보안

입문25분

학습 목표

  • ls -la 출력의 권한 표시를 읽을 수 있다
  • rwx 권한 시스템을 이해할 수 있다
  • chmod로 파일 권한을 변경할 수 있다
  • sudo의 역할을 이해하고 적절히 사용할 수 있다

동작하는 코드

예제 1: 파일 권한 읽기

ls -la

출력 예시:

drwxr-xr-x  5 dale staff  160 Jan 15 10:30 Documents
-rw-r--r--  1 dale staff  1.2K Jan 14 09:00 README.md
-rwxr-xr-x  1 dale staff  245 Jan 13 08:00 script.sh
lrwxr-xr-x  1 dale staff   35 Jan 12 09:00 link -> /path/to/target

첫 번째 컬럼이 권한 정보입니다. 10글자로 구성됩니다:

d rwx r-x r-x
↑  ↑   ↑   ↑
│  │   │   └── others (기타 사용자) 권한
│  │   └────── group (그룹) 권한
│  └────────── user/owner (소유자) 권한
└────────────── 파일 타입 (d=디렉토리, -=파일, l=링크)

예제 2: 권한 문자 이해하기

각 3글자는 rwx로 구성됩니다:

| 문자 | 의미 | 파일 | 디렉토리 | | ---- | -------------- | -------------- | ---------------- | | r | read (읽기) | 내용 읽기 | 파일 목록 보기 | | w | write (쓰기) | 내용 수정 | 파일 생성/삭제 | | x | execute (실행) | 실행 가능 | cd로 진입 가능 | | - | 없음 | 해당 권한 없음 | 해당 권한 없음 |

예제 3: 실제 권한 해석

-rw-r--r--
  • 파일(-)
  • 소유자: rw- (읽기 O, 쓰기 O, 실행 X)
  • 그룹: r-- (읽기 O, 쓰기 X, 실행 X)
  • 기타: r-- (읽기 O, 쓰기 X, 실행 X)
-rwxr-xr-x
  • 파일(-)
  • 소유자: rwx (모든 권한)
  • 그룹: r-x (읽기 + 실행)
  • 기타: r-x (읽기 + 실행)

직접 수정하기

chmod: 권한 변경 (기호 표기)

# 소유자에게 실행 권한 추가
chmod u+x script.sh

# 그룹과 기타 사용자의 쓰기 권한 제거
chmod go-w secret.txt

# 모든 사용자에게 읽기 권한 추가
chmod a+r document.txt

# 여러 권한 동시 설정
chmod u+rwx,go-w config.sh

기호 표기법:

  • u — user (소유자)
  • g — group (그룹)
  • o — others (기타)
  • a — all (모두)
  • + — 권한 추가
  • - — 권한 제거
  • = — 권한 지정 (나머지는 제거)

chmod: 숫자 표기

각 권한을 숫자로 표현합니다:

| 권한 | 이진수 | 10진수 | | ----- | ------ | ------ | | --- | 000 | 0 | | --x | 001 | 1 | | -w- | 010 | 2 | | -wx | 011 | 3 | | r-- | 100 | 4 | | r-x | 101 | 5 | | rw- | 110 | 6 | | rwx | 111 | 7 |

자주 쓰는 숫자 조합:

chmod 755 script.sh   # rwxr-xr-x (실행 파일)
chmod 644 file.txt    # rw-r--r-- (일반 텍스트)
chmod 600 secret.txt  # rw------- (비밀 파일)
chmod 700 private/    # rwx------ (비공개 디렉토리)
# 확인
ls -la script.sh
# -rwxr-xr-x  1 dale staff ...

sudo: 관리자 권한으로 실행

# 시스템 파일 편집 (관리자 권한 필요)
sudo nano /etc/hosts

# 시스템 패키지 설치
sudo apt install package-name

# 현재 사용자로 전환하지 않고 관리자 셸 실행
sudo -s

sudo는 명령어 앞에 붙여 관리자(root) 권한으로 실행합니다. 비밀번호를 입력해야 합니다.

sudo를 쓸 때 주의사항:

# 위험: sudo로 rm -rf는 시스템 파일도 삭제
sudo rm -rf /

# 안전하게: sudo 전에 일반 권한으로 먼저 테스트
rm testfile   # 일반 권한으로 먼저 확인
sudo rm systemfile  # 필요한 경우에만 sudo

"왜?" — 권한 시스템이 중요한 이유

Unix 권한 모델은 멀티유저 환경의 보안 기초입니다.

실무 시나리오:

# 웹 서버가 읽어야 하는 파일 (world-readable)
chmod 644 /var/www/html/index.html

# 개인 SSH 키 (본인만 읽어야 함)
chmod 600 ~/.ssh/id_rsa
# 이 권한이 없으면 SSH가 키 사용을 거부합니다!

# 실행 가능한 스크립트
chmod 755 deploy.sh

# 설정 파일 (API 키 포함, 본인만)
chmod 600 .env

쉘 스크립트를 실행할 때 권한이 필요한 이유:

./script.sh
# zsh: permission denied: ./script.sh

ls -la script.sh
# -rw-r--r--  (실행 권한 없음)

chmod +x script.sh
./script.sh   # 이제 실행 가능

흔한 실수

실수 1: 너무 넓은 권한 설정

# 나쁜 습관: 모든 권한 허용
chmod 777 myfile.sh   # 누구나 수정 가능

# 좋은 습관: 필요한 최소 권한만
chmod 755 myfile.sh   # 소유자만 수정, 나머지는 읽기+실행

실수 2: SSH 키 권한 실수

# SSH 키 권한이 너무 넓으면 SSH가 거부
ls -la ~/.ssh/
# -rw-r--r-- id_rsa  (너무 넓음!)

# SSH 경고:
# WARNING: UNPROTECTED PRIVATE KEY FILE!

# 수정
chmod 600 ~/.ssh/id_rsa

실수 3: 디렉토리에 x 권한 빠뜨리기

# 읽기만 있고 실행 없으면 cd 불가
chmod 644 mydir/

cd mydir/
# zsh: permission denied: mydir

# 올바름
chmod 755 mydir/

디렉토리의 x 권한은 "그 디렉토리로 진입할 수 있음"을 의미합니다.

실수 4: sudo 무분별하게 사용

# 불필요한 sudo (자신의 홈 디렉토리)
sudo mkdir ~/projects   # 잘못됨, 소유권이 root가 됨
mkdir ~/projects        # 올바름

# 필요한 sudo (시스템 디렉토리)
sudo mkdir /opt/myapp   # 올바름

심화 학습

chown: 소유자 변경
# 파일 소유자 변경
sudo chown newuser file.txt

# 소유자와 그룹 동시 변경
sudo chown newuser:newgroup file.txt

# 디렉토리 전체 재귀 변경
sudo chown -R newuser:newgroup directory/

chown은 관리자 권한이 필요합니다.

umask: 기본 권한 설정

새 파일/디렉토리를 만들 때 기본 권한을 제어합니다:

# 현재 umask 확인
umask
# 0022

# 새 파일은 644 (666 - 022)
# 새 디렉토리는 755 (777 - 022)

# 더 제한적인 기본값
umask 077   # 파일: 600, 디렉토리: 700

보안이 중요한 서버에서는 umask를 027 이상으로 설정합니다.

특수 권한: setuid, setgid, sticky bit
# setuid: 실행 시 소유자 권한으로 실행
chmod u+s program
ls -la program
# -rwsr-xr-x  (s가 setuid)

# sticky bit: 디렉토리에서 자신의 파일만 삭제 가능
chmod +t /tmp
ls -la /
# drwxrwxrwt  (t가 sticky bit)

/tmp에 sticky bit가 있는 이유: 모든 사용자가 쓸 수 있지만 자신이 만든 파일만 삭제 가능합니다.

  1. 파일을 하나 만들고 ls -la로 기본 권한을 확인하세요.
  2. chmod 755 파일명으로 권한을 변경하고 다시 확인하세요.
  3. chmod u-w 파일명으로 소유자의 쓰기 권한을 제거하고, 해당 파일을 수정하려 하면 어떻게 되는지 확인하세요.
  4. chmod a+x 파일명chmod 755 파일명이 같은 결과를 내는지 비교해보세요.
  5. ~/.ssh/ 디렉토리가 있다면 ls -la ~/.ssh/로 SSH 키의 권한을 확인하세요.

Q1. -rw-r--r-- 권한에서 그룹 사용자가 할 수 있는 것은?

  • A) 읽기, 쓰기, 실행
  • B) 읽기, 쓰기
  • C) 읽기만
  • D) 아무것도 할 수 없음