파일 · 권한 · 사용자 관리 25 / 50 · Part 3. Linux 파일 권한
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정analyst)
기초편 연계: 「리눅스 시스템 기초」 15. Linux 파일 권한 이해
touch로 파일을 만들면 권한이 644, mkdir로 디렉터리를 만들면 755가 된다(Rocky 기준). 이 기본 권한은 누가 정할까? umask 다.
umask는 07편에서 잠깐 언급했다. 이번 글에서 정식으로 다룬다. 특히 두 가지 질문에 답한다.
644, Ubuntu에서는 664가 되는 이유는?새 파일·디렉터리의 권한은 다음처럼 계산된다.
최종 권한 = 시작값 AND (NOT umask)
666 (rw-rw-rw-)777 (rwx-rwx-rwx)파일 시작값이 777이 아니라 666인 것이 핵심이다. 그래서 새 일반 파일에는 애초에 x가 없다. 실행 권한은 파일을 만든 뒤 명시적으로 줘야 한다(chmod +x).
대부분의 경우 뺄셈처럼 보이지만 정확히는 비트 연산이다.
666 & ~022 = 644 (뺄셈 결과와 같음)x 비트가 있어도 파일 시작값에 x가 없으면 뺄 것이 없다umask 111이어도 파일은 666에서 시작하므로 결과는 여전히 666이다. 뺄셈이라면 555가 되겠지만 실제로는 그렇지 않다. 그래서 AND NOT 으로 이해하는 것이 정확하다.
| umask가 하는 것 | umask가 못 하는 것 |
|---|---|
| 기본 권한에서 비트 제거 | 없는 권한을 추가 |
| 셸·프로세스 세션에 적용 | mkdir -m, install -m처럼 명시 지정 무시 |
| 상속(자식 프로세스로) | 이미 존재하는 파일 권한 변경 |

파일을 만드는 시스템 콜(open(O_CREAT), mkdir)은 프로그램이 요청한 mode와 프로세스의 umask를 결합한다. touch는 666을, mkdir은 777을 요청하고, 커널이 umask 비트를 지운 값으로 inode를 만든다.
umask는 프로세스 속성이라 자식 프로세스로 상속 된다. 로그인 시 /etc/profile, /etc/bashrc, PAM(pam_umask), ~/.bashrc 등에서 설정되고, 이후 그 셸에서 실행하는 모든 프로그램이 물려받는다.
Rocky와 Ubuntu의 차이는 07편에서 본 대로다. Rocky는 022, Ubuntu는 사용자 전용 그룹(UPG) 정책과 pam_umask로 002를 쓴다. 002는 그룹 쓰기를 남기지만, 그룹이 본인 전용이라 실질적으로 위험이 낮다. 문제는 공유 그룹이 기본 그룹일 때다.
Rocky와 Ubuntu에서 같은 명령 을 실행했다.
# 1) 현재 umask 확인
umask
umask -S # 기호로 표시
# 2) 기본 umask 로 파일·디렉터리 생성
touch a.file && mkdir a.dir && ls -ld a.file a.dir
# 3) umask 077 (본인만)
umask 077
touch b.file && mkdir b.dir && ls -ld b.file b.dir
# 4) umask 027 (그룹까지, 기타 차단)
umask 027
touch c.file && mkdir c.dir && ls -ld c.file c.dir
# 5) umask 002 로 파일 확인
umask 002; touch d.file; ls -l d.file
Rocky Linux 9.8 (기본 umask 022)

Ubuntu 24.04.5 (기본 umask 002)

텍스트 원본(실제 출력) — Rocky:
[analyst@rocky9-lab ~]$ umask
0022
[analyst@rocky9-lab ~]$ umask -S
u=rwx,g=rx,o=rx
[analyst@rocky9-lab ~]$ touch a.file && mkdir a.dir && ls -ld a.file a.dir
drwxr-xr-x 2 analyst analyst 4096 Sep 24 10:50 a.dir
-rw-r--r-- 1 analyst analyst 0 Sep 24 10:50 a.file
[analyst@rocky9-lab ~]$ umask 077
[analyst@rocky9-lab ~]$ touch b.file && mkdir b.dir && ls -ld b.file b.dir
drwx------ 2 analyst analyst 4096 Sep 24 10:50 b.dir
-rw------- 1 analyst analyst 0 Sep 24 10:50 b.file
[analyst@rocky9-lab ~]$ umask 027
[analyst@rocky9-lab ~]$ touch c.file && mkdir c.dir && ls -ld c.file c.dir
drwxr-x--- 2 analyst analyst 4096 Sep 24 10:50 c.dir
-rw-r----- 1 analyst analyst 0 Sep 24 10:50 c.file
[analyst@rocky9-lab ~]$ umask 0022
[analyst@rocky9-lab ~]$ echo "파일: 666 &~umask, 디렉터리: 777 &~umask"
파일: 666 &~umask, 디렉터리: 777 &~umask
[analyst@rocky9-lab ~]$ umask 002; touch d.file; ls -l d.file
-rw-rw-r-- 1 analyst analyst 0 Sep 24 10:50 d.file
텍스트 원본(실제 출력) — Ubuntu:
analyst@ubuntu-lab:~$ umask
0002
analyst@ubuntu-lab:~$ umask -S
u=rwx,g=rwx,o=rx
analyst@ubuntu-lab:~$ touch a.file && mkdir a.dir && ls -ld a.file a.dir
drwxrwxr-x 2 analyst analyst 4096 Sep 24 10:50 a.dir
-rw-rw-r-- 1 analyst analyst 0 Sep 24 10:50 a.file
analyst@ubuntu-lab:~$ umask 077
analyst@ubuntu-lab:~$ touch b.file && mkdir b.dir && ls -ld b.file b.dir
drwx------ 2 analyst analyst 4096 Sep 24 10:50 b.dir
-rw------- 1 analyst analyst 0 Sep 24 10:50 b.file
analyst@ubuntu-lab:~$ umask 027
analyst@ubuntu-lab:~$ touch c.file && mkdir c.dir && ls -ld c.file c.dir
drwxr-x--- 2 analyst analyst 4096 Sep 24 10:50 c.dir
-rw-r----- 1 analyst analyst 0 Sep 24 10:50 c.file
analyst@ubuntu-lab:~$ umask 0022
analyst@ubuntu-lab:~$ echo "파일: 666 &~umask, 디렉터리: 777 &~umask"
파일: 666 &~umask, 디렉터리: 777 &~umask
analyst@ubuntu-lab:~$ umask 002; touch d.file; ls -l d.file
-rw-rw-r-- 1 analyst analyst 0 Sep 24 10:50 d.file
| 출력 | 해석 |
|---|---|
Rocky umask → 0022 | 기본값. 그룹·기타의 w 제거 |
Rocky a.file → 644, a.dir → 755 | 파일 666-022, 디렉터리 777-022 |
Ubuntu umask → 0002 | 기본값. 기타의 w만 제거 |
Ubuntu umask -S → u=rwx,g=rwx,o=rx | 남는 권한을 기호로 표시 |
Ubuntu a.file → 664, a.dir → 775 | 그룹 쓰기가 남음 (UPG라 실질 위험 낮음) |
umask 077 → b.file 600, b.dir 700 | 본인만 |
umask 027 → c.file 640, c.dir 750 | 그룹 읽기까지, 기타 완전 차단 |
모든 새 파일에 x 없음 | 파일 시작값이 666이라 실행 권한이 붙지 않음 |
새 파일 어디에도 x가 없는 것을 주목하자. umask를 아무리 바꿔도 파일에 실행 권한이 자동으로 붙는 일은 없다. 실행이 필요하면 항상 명시적으로 준다.
| umask | 보안 수준 | 적용 상황 |
|---|---|---|
022 | 보통 | 일반 서버 기본. 새 파일이 모두에게 읽힘 |
027 | 강화 | 그룹까지만 접근, 기타 완전 차단. 다중 사용자 서버 권장 |
077 | 강력 | 본인만. 민감 데이터 처리 계정 |
002 | 낮음 | 그룹 쓰기 허용. 공유 그룹 환경에서는 위험 |
주의할 점:
UMask= 지시자로 설정한다.002는 그룹 구성원 누구나 파일을 수정 할 수 있게 만든다.보안 강화 서버에서는 /etc/profile 또는 /etc/login.defs의 UMASK를 027로 설정하는 것이 일반적이다.
| 관점 | 내용 |
|---|---|
| 점검 | /etc/login.defs의 UMASK, /etc/profile·pam_umask 설정이 정책(예: 027)에 맞는지 |
| 서비스 umask | 로그·설정 파일을 만드는 데몬의 umask 확인. 너무 느슨하면 민감 파일이 넓은 권한으로 생성됨 |
| CIS 기준 | CIS 벤치마크는 기본 umask를 027 이상으로 권고 |
| Investigation | 침해 후 생성된 파일의 권한이 넓다면, 공격 프로세스의 umask(대개 022 또는 000)를 추정할 수 있다 |
[점검] grep -E '^UMASK' /etc/login.defs
grep -rE 'umask' /etc/profile /etc/profile.d/ /etc/bashrc
systemctl show <svc> -p UMask
↓
[판단] 정책(027)보다 느슨하면 새 파일이 과도하게 노출됨
↓
[강화] login.defs UMASK 027, 서비스 UMask= 설정
| 실수 | 결과 | 예방 |
|---|---|---|
| umask로 실행 권한이 붙을 거라 기대 | 파일에 x 없음 | 실행은 chmod +x |
| umask 변경 후 기존 파일도 바뀔 거라 기대 | 기존 파일 그대로 | umask는 새 파일에만 |
| 서비스 umask를 셸과 같다고 가정 | 데몬이 넓은 권한 파일 생성 | UMask= 명시 |
공유 그룹에서 002 사용 | 그룹 전체 쓰기 | 027 이상 |
mkdir -m 700 후 umask 적용 걱정 | 명시 지정은 umask 무시 | -m은 정확히 적용됨 |
[ ] umask 값을 확인하고 새 파일·디렉터리 권한을 계산했다
[ ] 파일 시작값 666, 디렉터리 777 을 이해했다
[ ] 새 파일에 x 가 붙지 않는 이유를 설명할 수 있다
[ ] Rocky(022)와 Ubuntu(002)의 결과 차이를 확인했다
[ ] umask 027 과 077 의 결과를 확인했다
[ ] umask 가 명시 지정(mkdir -m)에는 적용되지 않음을 안다
666이라 새 일반 파일에는 x가 붙지 않는다.022(→ 644/755), Ubuntu 기본 002(→ 664/775).027 이상을 권장한다.UMask=로 따로 설정한다.다음 글 「26. chown으로 파일 소유자 변경」 에서는 소유자를 바꾸는 chown을 다룬다. 왜 일반 사용자는 자기 파일의 소유자를 남에게 넘길 수 없는지, 그리고 소유권 변경이 SUID를 어떻게 제거하는지 확인한다.