리눅스 파일 권한 이해: chmod/chown/umask 한 번에 끝내기(실무 예제·함정·점검 루틴)
서버 운영에서 파일 권한은 곧 보안과 장애입니다. 퍼미션이 과하면 데이터가 노출되고, 부족하면 애플리케이션이 동작하지 않습니다. 이 글은 rwx 기초 → 숫자/기호 모드 → chown 그룹 전략 → 디렉터리 퍼미션 규칙 → setuid/setgid/sticky → umask까지 현업에서 바로 쓰는 명령과 체크리스트로 정리했습니다.
1) 퍼미션 기초: rwx와 대상(u,g,o)
r(read),w(write),x(execute)- 대상:
u(owner),g(group),o(others)
ls -l /etc/hosts
# -rw-r--r-- 1 root root ... /etc/hosts
# ①타입(-/d), ②u권한(rw-), ③g권한(r--), ④o권한(r--)
2) chmod: 숫자 모드 vs 기호 모드
2-1) 숫자 모드(가장 빠름)
r=4, w=2, x=1의 합으로 표현합니다.
| 표현 | 의미 |
|---|---|
| 644 | u:rw-, g:r--, o:r-- (일반 파일 기본) |
| 600 | u:rw-, g:---, o:--- (키/비밀설정) |
| 755 | u:rwx, g:rx, o:rx (실행/디렉터리 기본) |
| 750 | u:rwx, g:rx, o:--- (팀 전용) |
chmod 600 ~/.ssh/id_ed25519
chmod 755 /usr/local/bin/mytool
2-2) 기호 모드(의미가 선명)
chmod u+x script.sh # 소유자에 실행 추가
chmod g-w,o-rwx file.txt # 그룹에서 쓰기 제거, others 전부 제거
chmod -R g+rx /var/www # 재귀 적용(주의!)
3) chown/chgrp: 소유자와 그룹 전략
서비스 계정과 그룹을 설계하면 권한 관리가 쉬워집니다.
# 소유자:그룹 변경
sudo chown appuser:appgroup /srv/app/config.yml
# 디렉터리 이하 일괄 변경(운영 시 신중)
sudo chown -R appuser:appgroup /srv/app
# 그룹만 변경
sudo chgrp -R appgroup /srv/shared
권장 패턴: 애플리케이션 파일은 appuser:appgroup, 로그/업로드는 appuser:appgroup + 그룹에 운영팀/배치계정을 포함.
4) 디렉터리 퍼미션의 핵심 규칙
- 디렉터리에서 x: “들어갈 수 있음”(search/enter).
r만 있어도 ls가 안 될 수 있음. - 디렉터리에서 w: 파일 생성/삭제 가능. w만 있고 x가 없으면 효과 없음 → 디렉터리는 보통 x를 동반.
# 팀 공유 디렉터리(읽기/진입/실행 허용, 외부 차단)
chmod 750 /srv/team
# 웹 루트: 모두 읽기/진입 가능, 쓰기는 소유자만
chmod 755 /var/www/html
5) 특수 비트: setuid, setgid, sticky
5-1) setuid(파일에 적용)
실행 시 소유자 권한으로 동작. 보안상 일반 파일에선 거의 쓰지 않습니다.
chmod u+s /path/bin # 숫자 모드에선 4xxx
# ls -l 에서 x 대신 s로 보임: -rwsr-xr-x
5-2) setgid(디렉터리/파일)
디렉터리 setgid는 하위 생성 파일의 그룹을 상속합니다(팀 협업에 유용).
sudo chgrp -R appgroup /srv/shared
sudo chmod g+s /srv/shared
# ls -ld /srv/shared -> drwxr-sr-x (g+s)
5-3) sticky bit(디렉터리)
누구나 쓰기가 가능한 디렉터리에서 자기 소유 파일만 삭제 가능하게 만듭니다. 예: /tmp.
chmod +t /var/www/uploads
# 권한 표시에 t: drwxrwxrwt
6) umask: 새로 만드는 파일/디렉터리의 기본 권한
umask는 허용하지 않을 비트를 지정합니다(마스킹). 일반적으로 프로세스 기본 생성 퍼미션은 파일 666, 디렉터리 777에서 umask를 뺀 값이 됩니다.
umask # 현재 값 확인(예: 002, 022)
umask 027 # 새 세션에 적용(파일: 640, 디렉터리: 750)
| umask | 파일 기본 | 디렉터리 기본 | 설명 |
|---|---|---|---|
| 022 | 644 | 755 | 기본적으로 널리 사용(others 읽기) |
| 027 | 640 | 750 | others 차단, 팀 협업에 적합 |
| 077 | 600 | 700 | 극단적 보안(개인 키/비밀) |
서비스 단위 umask 설정은 systemd 유닛에 UMask=027처럼 명시 가능합니다.
# /etc/systemd/system/myapp.service
[Service]
UMask=027
7) 실무 시나리오 세트
7-1) 웹 배포 디렉터리
# 소유자 www-data, 그룹 www-data, 외부는 읽기만
sudo chown -R www-data:www-data /var/www/html
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;
7-2) 팀 공유 업로드(그룹 상속 + 삭제 보호)
sudo mkdir -p /srv/uploads
sudo chgrp appgroup /srv/uploads
sudo chmod 2770 /srv/uploads # 2(setgid) + 770
sudo chmod +t /srv/uploads # sticky(자기 파일만 삭제)
7-3) SSH 키/비밀 설정
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.env.secrets
8) 점검·진단 명령 모음
# 1) 권한/소유자 일괄 보기
ls -lR /srv/app | less
# 2) setuid/setgid/sticky 검색
find / -perm -4000 -o -perm -2000 -o -perm -1000 2>/dev/null
# 3) 너무 느슨한 파일(others에 쓰기)
find /srv/app -type f -perm -o+w -print
# 4) 디렉터리 실행(x) 빠진 케이스
find /srv/app -type d ! -perm -u+x -print
# 5) ACL이 관여하는지 보기(있다면)
getfacl /srv/shared
9) 흔한 함정과 해결
- 디렉터리에 x가 없음 →
ls가 되더라도 진입/실행 불가. 디렉터리는 보통r-x쌍으로 맞추세요. - 재귀 chmod/chown로 소유권 전체가 바뀜 → 서비스 다운 위험. 대상 폴더를 좁혀 실행하고, 먼저
-type d/-type f로 분리 적용. - 컨테이너 볼륨 권한 → 호스트 UID/GID와 컨테이너 프로세스 UID/GID가 다르면 접근 불가.
chown또는--user로 정렬. - umask 미설정 → 새로 생성되는 로그/업로드가 모두 666/777 기준으로 시작해 보안 구멍. 서비스 단위로
UMask=027등 설정.
10) 최종 체크리스트
- 파일 기본: 644, 디렉터리 기본: 755(상황에 맞게 640/750 조정)
- 비밀·키: 600, 디렉터리(키 보관): 700
- 공유 디렉터리:
g+s로 그룹 상속, 필요 시+t로 삭제 보호 - 서비스 유닛:
UMask로 생성 권한 통제 find로 느슨한 퍼미션 스캔 → 즉시 수정
권한은 “문제 나기 전”에 표준을 정해두는 것이 가장 중요합니다. 위의 기본값과 점검 루틴을 팀 표준으로 삼고, 예외는 명시적으로 문서화해 운영 리스크를 낮추세요.
'서버 인프라 실무' 카테고리의 다른 글
| 시계가 틀리면 장애난다: chrony로 시간 동기화 정확히 잡기(Ubuntu 24.04, NTP 실무) (0) | 2025.10.22 |
|---|---|
| 사용자·그룹·sudoers 운영 표준: 최소 권한과 감사 로그(Ubuntu 24.04) (0) | 2025.10.22 |
| Docker 설치부터 Compose v2로 서비스 올리기(Nginx+PostgreSQL, Ubuntu 24.04) (0) | 2025.10.21 |
| 무료 SSL(HTTPS) 적용: Certbot 자동 갱신 + 자주 나는 오류 해결(Ubuntu 24.04, Nginx) (0) | 2025.10.20 |
| Nginx 서버 블록(server_name)로 도메인 연결: WWW/비WWW 선택과 301 리다이렉트, HTTP→HTTPS까지 (0) | 2025.10.20 |