umask 는 새로 만들어지는 파일과 디렉터리에서 제외할 권한 비트를 정한다. 파일은 666, 디렉터리는 777 에서 출발해 umask 에 켜진 비트를 지운 값이 실제 권한이 된다.
정확히는 뺄셈이 아니라 비트 연산이다. mode & ~umask 로 계산하므로, 예를 들어 umask 가 023 일 때 파일 권한은 666 - 023 = 643 이 아니라 644 다. 뺄셈으로 외워 두면 이런 자리에서 틀린다.
| umask | 파일 | 디렉터리 | 의미 |
|---|---|---|---|
| 022 | 644 | 755 | 소유자만 쓰기, 그 외 읽기 |
| 027 | 640 | 750 | 그룹은 읽기, 그 외 접근 불가 |
| 002 | 664 | 775 | 그룹 공유 디렉터리에서 쓴다 |
| 077 | 600 | 700 | 소유자 외 접근 불가 |
일반 파일에는 실행 비트가 처음부터 붙지 않는다. 스크립트를 만들었으면 umask 와 무관하게 chmod +x 가 필요하다.
umask
umask -S
umask 027
셸에 지정한 값은 그 셸과 자식 프로세스에만 적용되고 로그아웃하면 사라진다.
적용 지점이 여러 곳이라 기대대로 동작하지 않는 일이 잦다. 아래 순서로 정리한다.
로그인 셸 전체에 적용하려면 /etc/profile.d/ 에 파일을 하나 둔다. /etc/profile 을 직접 고치면 패키지 갱신 때 덮일 수 있다.
echo 'umask 027' > /etc/profile.d/umask.sh
chmod 644 /etc/profile.d/umask.sh
RHEL 계열은 /etc/login.defs 의 UMASK 값을 pam_umask 가 읽는다. 셸을 거치지 않는 로그인(예: cron, 일부 서비스)에는 이쪽이 작동한다.
# /etc/login.defs
UMASK 027
systemd 서비스는 셸 설정을 전혀 읽지 않는다. 서비스가 만드는 파일의 권한을 정하려면 유닛에 직접 적는다.
[Service]
UMask=0027
공유 디렉터리는 umask 만으로는 부족하다. 새 파일의 그룹이 생성자의 기본 그룹으로 붙기 때문이다. 디렉터리에 setgid 비트를 걸면 하위에 생기는 파일이 디렉터리의 그룹을 물려받는다.
chgrp devteam /data/share
chmod 2775 /data/share # 앞의 2 가 setgid
기본 ACL 을 쓰면 권한까지 강제할 수 있다.
setfacl -d -m g:devteam:rwx /data/share
getfacl /data/share