Linux 파일 권한과 chmod 명령어 — 완벽 가이드
Linux 파일 권한과 chmod 명령어 — 완벽 가이드
Linux 파일 권한을 완벽하게 마스터하세요. 8진수 표기법, 심볼릭 모드, 자주 쓰는 권한 패턴을 예제와 함께 설명합니다.
Linux 파일 권한 이해하기
Linux는 다중 사용자 운영 체제입니다. 여러 사용자가 동시에 하나의 시스템에 접근할 수 있으며, 서버 환경에서는 수백 개의 프로세스가 다양한 사용자 계정으로 실행됩니다. 이런 환경에서 파일 보안의 핵심이 바로 파일 권한 시스템입니다.
모든 파일과 디렉토리에는 세 가지 기본 권한이 존재합니다.
읽기(Read, r): 파일의 내용을 읽을 수 있는 권한입니다. 디렉토리의 경우 해당 디렉토리 안의 파일 목록을 조회할 수 있습니다.
쓰기(Write, w): 파일의 내용을 수정하거나 삭제할 수 있는 권한입니다. 디렉토리의 경우 해당 디렉토리 안에 파일을 생성하거나 삭제할 수 있습니다.
실행(Execute, x): 파일을 프로그램으로 실행할 수 있는 권한입니다. 디렉토리의 경우 해당 디렉토리에 진입(cd)할 수 있습니다.
이 세 가지 권한은 세 가지 사용자 범주에 각각 독립적으로 적용됩니다.
- 소유자(Owner, u): 파일을 생성한 사용자
- 그룹(Group, g): 파일 소유 그룹에 속한 사용자들
- 기타(Others, o): 시스템의 나머지 모든 사용자
이 구조 덕분에 "소유자는 읽기/쓰기 가능, 그룹은 읽기만 가능, 기타 사용자는 접근 불가"와 같은 세밀한 접근 제어가 가능합니다.
권한 문자열 읽는 방법
터미널에서 ls -l 명령어를 실행하면 다음과 같은 출력을 볼 수 있습니다.
ls -l
-rwxr-xr-- 1 user group 4096 Mar 22 10:00 script.sh
drwxr-x--- 2 user group 4096 Mar 22 10:00 project/
첫 번째 열의 10자리 문자열이 권한 정보를 나타냅니다. 이 문자열을 분해해 보겠습니다.
| 위치 | 의미 | 예시 |
|---|---|---|
| 1번째 | 파일 유형 | -(일반 파일), d(디렉토리), l(심볼릭 링크) |
| 2-4번째 | 소유자 권한 | rwx = 읽기+쓰기+실행 |
| 5-7번째 | 그룹 권한 | r-x = 읽기+실행 |
| 8-10번째 | 기타 권한 | r-- = 읽기만 |
위 예시에서 -rwxr-xr--를 해석하면 다음과 같습니다.
-: 일반 파일rwx: 소유자는 읽기, 쓰기, 실행 모두 가능r-x: 그룹은 읽기와 실행만 가능r--: 기타 사용자는 읽기만 가능
drwxr-x---의 경우는 다음과 같습니다.
d: 디렉토리rwx: 소유자는 모든 권한 보유r-x: 그룹은 읽기와 진입 가능---: 기타 사용자는 접근 불가
8진수 표기법 설명
8진수(Octal) 표기법은 세 자리 숫자로 권한을 표현하는 방식입니다. 각 자릿수는 0부터 7까지의 값을 가지며, 각 권한에 할당된 숫자 값의 합으로 계산됩니다.
| 권한 | 숫자 값 |
|---|---|
| 읽기(r) | 4 |
| 쓰기(w) | 2 |
| 실행(x) | 1 |
| 없음(-) | 0 |
세 자리 숫자는 순서대로 소유자, 그룹, 기타 사용자의 권한을 나타냅니다.
계산 예시:
rwx = 4 + 2 + 1 = 7
r-x = 4 + 0 + 1 = 5
r-- = 4 + 0 + 0 = 4
rw- = 4 + 2 + 0 = 6
--- = 0 + 0 + 0 = 0
따라서 rwxr-xr--는 8진수로 754가 됩니다.
| 8진수 값 | 권한 | 의미 |
|---|---|---|
| 0 | --- | 권한 없음 |
| 1 | --x | 실행만 |
| 2 | -w- | 쓰기만 |
| 3 | -wx | 쓰기+실행 |
| 4 | r-- | 읽기만 |
| 5 | r-x | 읽기+실행 |
| 6 | rw- | 읽기+쓰기 |
| 7 | rwx | 모든 권한 |
심볼릭 표기법 설명
심볼릭(Symbolic) 표기법은 문자를 사용하여 권한을 변경하는 방식입니다. 8진수 표기법이 권한을 절대적으로 설정하는 반면, 심볼릭 표기법은 기존 권한을 기준으로 추가하거나 제거할 수 있어 더 유연합니다.
심볼릭 표기법의 구성 요소는 다음과 같습니다.
대상 지정:
u: 소유자(user)g: 그룹(group)o: 기타(others)a: 전체(all) — u, g, o 모두
연산자:
+: 권한 추가-: 권한 제거=: 권한을 정확히 지정 (기존 권한 덮어쓰기)
권한 문자:
r: 읽기w: 쓰기x: 실행
사용 예시:
# 소유자에게 실행 권한 추가
chmod u+x script.sh
# 그룹의 쓰기 권한 제거
chmod g-w config.yml
# 기타 사용자에게 읽기 권한만 설정
chmod o=r document.txt
# 소유자에게 읽기+쓰기, 그룹에게 읽기만 설정
chmod u=rw,g=r file.txt
# 모든 사용자에게 실행 권한 추가
chmod a+x deploy.sh
# 그룹과 기타 사용자의 쓰기 권한 제거
chmod go-w sensitive.conf
심볼릭 표기법은 특정 권한만 변경하고 나머지는 그대로 유지하고 싶을 때 특히 유용합니다. 예를 들어 chmod u+x script.sh는 소유자의 실행 권한만 추가하고 다른 모든 권한은 변경하지 않습니다.
자주 쓰는 chmod 패턴
실무에서 반복적으로 사용되는 권한 패턴들이 있습니다. 각 패턴의 용도와 적용 대상을 정리하면 다음과 같습니다.
644 — 일반 파일의 기본 권한
chmod 644 index.html
- 소유자: 읽기+쓰기 (
rw-) - 그룹: 읽기 (
r--) - 기타: 읽기 (
r--)
HTML, CSS, 이미지 등 웹 서버에서 제공하는 정적 파일에 적합합니다. 소유자만 수정할 수 있고, 다른 사용자는 읽기만 가능합니다.
755 — 실행 파일과 디렉토리
chmod 755 /var/www/html
chmod 755 deploy.sh
- 소유자: 읽기+쓰기+실행 (
rwx) - 그룹: 읽기+실행 (
r-x) - 기타: 읽기+실행 (
r-x)
디렉토리의 표준 권한이자, 실행 가능한 스크립트의 기본 권한입니다. 소유자만 내용을 변경할 수 있고, 다른 사용자는 실행하거나 디렉토리를 탐색할 수 있습니다.
777 — 모든 권한 개방
chmod 777 temp_file
- 소유자: 읽기+쓰기+실행 (
rwx) - 그룹: 읽기+쓰기+실행 (
rwx) - 기타: 읽기+쓰기+실행 (
rwx)
모든 사용자에게 모든 권한을 부여합니다. 보안상 위험하므로 프로덕션 환경에서는 사용을 피해야 합니다. 임시 디버깅 용도로만 제한적으로 사용하고, 작업이 끝나면 즉시 적절한 권한으로 복원해야 합니다.
600 — 민감한 파일 보호
chmod 600 ~/.ssh/id_rsa
chmod 600 .env
- 소유자: 읽기+쓰기 (
rw-) - 그룹: 없음 (
---) - 기타: 없음 (
---)
SSH 개인 키, 환경 변수 파일, 데이터베이스 인증 정보 등 민감한 데이터를 포함하는 파일에 적합합니다. 소유자만 접근할 수 있습니다.
700 — 개인 디렉토리
chmod 700 ~/.ssh
chmod 700 ~/private
- 소유자: 읽기+쓰기+실행 (
rwx) - 그룹: 없음 (
---) - 기타: 없음 (
---)
SSH 디렉토리나 개인 설정 디렉토리처럼 소유자만 접근해야 하는 디렉토리에 사용합니다.
기타 유용한 패턴
| 8진수 | 권한 문자열 | 용도 |
|---|---|---|
| 444 | r--r--r-- | 읽기 전용 파일 (모든 사용자) |
| 555 | r-xr-xr-x | 읽기+실행 전용 (수정 불가) |
| 750 | rwxr-x--- | 그룹은 읽기+실행, 기타 접근 불가 |
| 640 | rw-r----- | 그룹은 읽기만, 기타 접근 불가 |
chmod 명령어 구문과 예제
chmod 명령어의 기본 구문은 다음과 같습니다.
chmod [옵션] 모드 파일명
8진수 모드 사용
# 파일에 644 권한 설정
chmod 644 readme.txt
# 스크립트에 실행 권한 부여
chmod 755 backup.sh
# 설정 파일 보호
chmod 600 database.yml
심볼릭 모드 사용
# 소유자에게 실행 권한 추가
chmod u+x script.sh
# 기타 사용자의 모든 권한 제거
chmod o-rwx private.key
# 그룹에게 읽기+실행 권한 설정
chmod g=rx application
재귀적 권한 변경 (-R)
디렉토리와 그 안의 모든 내용에 권한을 적용하려면 -R 플래그를 사용합니다.
# 디렉토리 전체에 755 적용
chmod -R 755 /var/www/html
# 모든 하위 항목에서 기타 사용자 쓰기 권한 제거
chmod -R o-w /home/user/project
주의할 점은 -R 옵션이 파일과 디렉토리를 구분하지 않는다는 것입니다. 디렉토리에는 실행 권한(x)이 필요하지만 일반 파일에는 불필요한 경우가 많습니다. 이런 경우 find 명령어와 조합하여 사용합니다.
# 디렉토리에만 755 적용
find /var/www -type d -exec chmod 755 {} \;
# 파일에만 644 적용
find /var/www -type f -exec chmod 644 {} \;
유용한 옵션
# -v: 변경된 내용 출력
chmod -v 644 file.txt
# -c: 실제로 변경된 경우만 출력
chmod -c 755 *.sh
# --reference: 다른 파일의 권한을 복사
chmod --reference=template.conf new.conf
특수 권한
기본 읽기/쓰기/실행 권한 외에도 Linux에는 세 가지 특수 권한이 존재합니다. 이 권한들은 4자리 8진수의 첫 번째 자릿수로 표현됩니다.
setuid (Set User ID) — 4000
setuid가 설정된 실행 파일은 실행하는 사용자의 권한이 아닌, 파일 소유자의 권한으로 실행됩니다.
chmod 4755 program
chmod u+s program
권한 문자열에서 소유자의 실행 위치에 s가 표시됩니다.
-rwsr-xr-x
대표적인 예가 passwd 명령어입니다. 일반 사용자가 실행하지만, root 소유의 /etc/shadow 파일을 수정해야 하므로 setuid가 설정되어 있습니다.
setgid (Set Group ID) — 2000
setgid가 설정된 실행 파일은 파일 소유 그룹의 권한으로 실행됩니다. 디렉토리에 설정하면 해당 디렉토리 안에 생성되는 새 파일이 부모 디렉토리의 그룹을 자동으로 상속합니다.
chmod 2755 shared_directory
chmod g+s shared_directory
권한 문자열에서 그룹의 실행 위치에 s가 표시됩니다.
drwxr-sr-x
팀 공유 디렉토리에서 모든 파일이 동일한 그룹 소유권을 유지하도록 할 때 유용합니다.
Sticky Bit — 1000
Sticky bit가 설정된 디렉토리에서는 파일 소유자(또는 root)만 해당 파일을 삭제하거나 이름을 변경할 수 있습니다. 디렉토리에 쓰기 권한이 있더라도 다른 사용자의 파일을 삭제할 수 없습니다.
chmod 1777 /tmp
chmod +t shared_folder
권한 문자열에서 기타 사용자의 실행 위치에 t가 표시됩니다.
drwxrwxrwt
/tmp 디렉토리가 대표적인 예입니다. 모든 사용자가 파일을 생성할 수 있지만, 자신이 만든 파일만 삭제할 수 있습니다.
특수 권한 요약
| 권한 | 8진수 | 심볼릭 | 효과 |
|---|---|---|---|
| setuid | 4000 | u+s | 파일 소유자 권한으로 실행 |
| setgid | 2000 | g+s | 파일 소유 그룹 권한으로 실행 / 그룹 상속 |
| sticky | 1000 | +t | 소유자만 파일 삭제 가능 |
보안 모범 사례
파일 권한을 올바르게 설정하는 것은 시스템 보안의 기본입니다. 다음은 실무에서 반드시 지켜야 할 보안 원칙들입니다.
최소 권한 원칙 적용
필요한 최소한의 권한만 부여하는 것이 기본 원칙입니다. 권한 문제가 발생했을 때 chmod 777로 해결하는 것은 보안을 완전히 포기하는 행위입니다. 문제의 원인을 파악하고 정확한 권한을 설정해야 합니다.
# 나쁜 예
chmod 777 /var/www/html
# 좋은 예
chmod 755 /var/www/html
find /var/www/html -type f -exec chmod 644 {} \;
SSH 키 권한 관리
SSH는 키 파일의 권한이 적절하지 않으면 연결을 거부합니다.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/known_hosts
웹 서버 파일 권한
웹 서버 환경에서는 다음 권한 설정을 권장합니다.
# 웹 루트 디렉토리
chmod 755 /var/www/html
# 정적 파일 (HTML, CSS, JS, 이미지)
find /var/www/html -type f -exec chmod 644 {} \;
# CGI/실행 스크립트
chmod 755 /var/www/cgi-bin/*.cgi
# 설정 파일 (데이터베이스 비밀번호 포함)
chmod 600 /var/www/html/.env
chmod 640 /etc/nginx/conf.d/*.conf
실행 파일 관리
스크립트에 실행 권한을 부여하기 전에 내용을 반드시 확인하세요. 출처를 알 수 없는 스크립트에 무분별하게 실행 권한을 부여하는 것은 위험합니다.
# 스크립트 내용 확인 후 실행 권한 부여
cat script.sh
chmod 755 script.sh
정기적인 권한 감사
시스템의 권한 상태를 정기적으로 점검하는 습관이 필요합니다.
# 월드 라이터블 파일 찾기
find / -type f -perm -002 -ls 2>/dev/null
# setuid가 설정된 파일 찾기
find / -type f -perm -4000 -ls 2>/dev/null
# 소유자 없는 파일 찾기
find / -nouser -o -nogroup 2>/dev/null
핵심 보안 지침 요약
- 777 권한은 절대 프로덕션에서 사용하지 않기: 디버깅 후에는 반드시 적절한 권한으로 복원합니다.
- 민감한 파일은 600 또는 640 사용: 환경 변수, 인증 정보, 개인 키 등은 최소 권한으로 보호합니다.
- 디렉토리는 755, 파일은 644 기본 적용: 웹 서버 환경의 표준 권한입니다.
- setuid/setgid는 신중하게 사용: 특수 권한은 보안 취약점이 될 수 있으므로 필요한 경우에만 설정합니다.
- 정기적으로 권한 감사 실행: 비정상적인 권한 설정을 주기적으로 점검합니다.
chmod 계산기 도구
권한의 8진수 값을 매번 계산하는 것은 번거로울 수 있습니다. 특히 특수 권한까지 포함하면 계산이 복잡해집니다. 이런 경우 chmod 계산기 도구를 활용하면 시각적으로 권한을 선택하고, 대응하는 8진수 값과 명령어를 즉시 확인할 수 있습니다.
체크박스를 선택하는 것만으로 원하는 권한 조합의 8진수 값과 심볼릭 표기를 확인할 수 있어, 실무에서 빠르게 올바른 chmod 명령어를 구성하는 데 도움이 됩니다.
결론
Linux 파일 권한은 시스템 보안의 가장 기본적이면서도 중요한 요소입니다. 8진수 표기법과 심볼릭 표기법을 모두 이해하고, 상황에 맞는 적절한 권한 패턴을 적용하는 능력은 모든 Linux 관리자와 개발자에게 필수적입니다.
핵심은 항상 최소 권한 원칙을 따르는 것입니다. 필요한 권한만 부여하고, 정기적으로 시스템의 권한 상태를 점검하며, 특수 권한 사용은 최소화해야 합니다. 이 가이드에서 다룬 패턴과 모범 사례를 실무에 적용하면 더 안전하고 관리하기 쉬운 시스템을 구축할 수 있을 것입니다.