리눅스 umask 사용법 - 새로 만드는 파일의 기본 권한 설정
이 명령어를 언제 쓰는가
애플리케이션이 만드는 로그 파일이 매번 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 |
-S | 8진수 대신 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.defs의 UMASK 항목을 쓴다.
echo 'umask 027' >> ~/.bashrc
함정과 주의점
- umask로는 실행 권한이 절대 붙지 않는다. 기본값이 파일
666에서 시작하므로umask 000을 줘도 새 파일은666이지777이 아니다. 스크립트에 실행 권한이 필요하면chmod +x를 따로 해야 한다. - 빼기 계산으로 착각하기 쉽다.
umask 023은666 - 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— 파일을 복사하면서 권한을 한 번에 지정한다.