본문 바로가기
서버 인프라 실무

리눅스 파일 권한 이해: chmod/chown/umask 한 번에 끝내기(실무 예제·함정·점검 루틴)

by yamoojin83 2025. 10. 21.

리눅스 파일 권한 이해: 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의 합으로 표현합니다.

표현의미
644u:rw-, g:r--, o:r-- (일반 파일 기본)
600u:rw-, g:---, o:--- (키/비밀설정)
755u:rwx, g:rx, o:rx (실행/디렉터리 기본)
750u: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파일 기본디렉터리 기본설명
022644755기본적으로 널리 사용(others 읽기)
027640750others 차단, 팀 협업에 적합
077600700극단적 보안(개인 키/비밀)

서비스 단위 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로 느슨한 퍼미션 스캔 → 즉시 수정

권한은 “문제 나기 전”에 표준을 정해두는 것이 가장 중요합니다. 위의 기본값과 점검 루틴을 팀 표준으로 삼고, 예외는 명시적으로 문서화해 운영 리스크를 낮추세요.