Devin.KR
로그인

리눅스 umask 사용법 - 새로 만드는 파일의 기본 권한 설정

개발자 조회 2

이 명령어를 언제 쓰는가

애플리케이션이 만드는 로그 파일이 매번 644라 같은 그룹의 동료가 못 고치거나, 스크립트가 생성한 임시 파일이 다른 계정에 읽혀서는 안 되는 상황에서 쓴다. 이미 만들어진 파일은 chmod로 고치면 되지만, 앞으로 만들어질 파일의 기본 권한을 정하는 것이 umask다.

배치 스크립트나 데몬을 돌릴 때 "왜 매번 chmod를 다시 해야 하지"라는 상황이 반복되면 umask를 봐야 한다.

기본 형식

umask [-S] [마스크]
  • 인자 없이 실행하면 현재 값을 8진수로 출력한다.
  • 마스크를 주면 현재 셸과 그 셸이 띄우는 자식 프로세스에 적용된다.
  • umask는 셸 내장 명령이라 /usr/bin에 실행 파일이 없다. 자식 프로세스에서 바꿔도 부모 셸에는 영향이 없다.

계산 방식은 빼기가 아니라 비트 제거다. 기본 권한(파일 666, 디렉터리 777)에서 마스크에 켜진 비트를 지운다.

$ umask
0022
$ umask -S
u=rwx,g=rx,o=rx

자주 쓰는 값

마스크의미결과(파일 / 디렉터리)
022대부분 배포판의 기본값. 남들은 읽기만644 / 755
002같은 그룹이 함께 쓰는 서버. 그룹 쓰기 허용664 / 775
027보안 기준이 있는 서버. 기타 사용자 완전 차단640 / 750
077키·인증서·개인 데이터용. 소유자만 접근600 / 700
-S8진수 대신 u=rwx,g=rx,o=rx 형식으로 출력umask -S

실전 예제

1. 현재 값을 확인하고 결과를 눈으로 검증한다.

$ umask
0022
$ touch a.txt && mkdir a.dir && ls -ld a.txt a.dir
drwxr-xr-x 2 deploy deploy 4096 Aug 25 11:03 a.dir
-rw-r--r-- 1 deploy deploy    0 Aug 25 11:03 a.txt

2. 개인키·인증서를 만들기 직전에 임시로 조인다. 만들어진 뒤 chmod하는 것보다 안전하다. 파일이 잠깐이라도 열린 상태로 디스크에 존재하지 않기 때문이다.

( umask 077; openssl genrsa -out server.key 2048 )
ls -l server.key

괄호로 감싸면 서브셸에서만 적용되어 원래 셸의 umask는 그대로 남는다.

3. 팀 공유 디렉터리에 쓰는 배치 스크립트 맨 앞에 넣는다. 그룹 쓰기 권한이 붙은 채로 파일이 생긴다.

#!/bin/bash
umask 002
/usr/local/bin/report-export > /srv/share/report-$(date +%F).csv

4. systemd 서비스가 만드는 파일의 권한을 지정한다. 셸을 거치지 않으므로 .bashrc의 umask는 적용되지 않는다. 유닛 파일에 직접 넣어야 한다.

[Service]
UMask=0027
ExecStart=/usr/local/bin/myapp

5. 로그인 셸의 기본값을 바꾼다. 개인 계정은 ~/.bashrc(또는 ~/.profile), 시스템 전체는 /etc/profile이나 /etc/login.defsUMASK 항목을 쓴다.

echo 'umask 027' >> ~/.bashrc

함정과 주의점

  • umask로는 실행 권한이 절대 붙지 않는다. 기본값이 파일 666에서 시작하므로 umask 000을 줘도 새 파일은 666이지 777이 아니다. 스크립트에 실행 권한이 필요하면 chmod +x를 따로 해야 한다.
  • 빼기 계산으로 착각하기 쉽다. umask 023666 - 023 = 643이 아니다. 비트 제거이므로 644가 나온다(쓰기 비트가 이미 없는 자리에서 3을 빼도 더 내려가지 않는다). 예측이 애매하면 touch로 확인하는 편이 빠르다.
  • cron과 systemd는 로그인 셸을 거치지 않는다. ~/.bashrc에 umask를 넣어두고 cron 작업 파일 권한이 왜 다르냐고 헤매는 경우가 많다. cron은 작업 명령 앞에 umask 027;를 직접 붙이고, systemd는 UMask=를 쓴다.
  • 이미 존재하는 파일에는 소급되지 않는다. umask를 바꿔도 기존 파일 권한은 그대로다. 기존 것은 find ... -exec chmod로 따로 정리한다.

함께 보면 좋은 명령어

  • chmod — 이미 만들어진 파일의 권한을 고친다.
  • setfacl -d — 디렉터리에 기본 ACL을 걸어 umask보다 강하게 상속시킨다.
  • install -m — 파일을 복사하면서 권한을 한 번에 지정한다.