파일 · 권한 · 사용자 관리 25 / 50 · Part 3. Linux 파일 권한
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정 analyst)
기초편 연계: 「리눅스 시스템 기초」 15. Linux 파일 권한 이해

1. 들어가며

touch로 파일을 만들면 권한이 644, mkdir로 디렉터리를 만들면 755가 된다(Rocky 기준). 이 기본 권한은 누가 정할까? umask 다.

umask는 07편에서 잠깐 언급했다. 이번 글에서 정식으로 다룬다. 특히 두 가지 질문에 답한다.

  • 왜 새로 만든 일반 파일에는 실행 권한(x)이 없을까?
  • 같은 명령이 Rocky에서는 644, Ubuntu에서는 664가 되는 이유는?

2. 핵심 개념

2-1. umask는 "빼는 마스크"

새 파일·디렉터리의 권한은 다음처럼 계산된다.

최종 권한 = 시작값 AND (NOT umask)
  • 파일 시작값: 666 (rw-rw-rw-)
  • 디렉터리 시작값: 777 (rwx-rwx-rwx)
  • umask에 켜진 비트는 최종 권한에서 제거 된다.

파일 시작값이 777이 아니라 666인 것이 핵심이다. 그래서 새 일반 파일에는 애초에 x가 없다. 실행 권한은 파일을 만든 뒤 명시적으로 줘야 한다(chmod +x).

2-2. 왜 뺄셈이 아니라 AND NOT인가

대부분의 경우 뺄셈처럼 보이지만 정확히는 비트 연산이다.

  • 파일 666 & ~022 = 644 (뺄셈 결과와 같음)
  • 하지만 umask에 x 비트가 있어도 파일 시작값에 x가 없으면 뺄 것이 없다

umask 111이어도 파일은 666에서 시작하므로 결과는 여전히 666이다. 뺄셈이라면 555가 되겠지만 실제로는 그렇지 않다. 그래서 AND NOT 으로 이해하는 것이 정확하다.

2-3. umask의 한계

umask가 하는 것umask가 못 하는 것
기본 권한에서 비트 제거없는 권한을 추가
셸·프로세스 세션에 적용mkdir -m, install -m처럼 명시 지정 무시
상속(자식 프로세스로)이미 존재하는 파일 권한 변경

3. 동작 원리

umask — 새 파일의 기본 권한을 빼는 마스크

파일을 만드는 시스템 콜(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는 그룹 쓰기를 남기지만, 그룹이 본인 전용이라 실질적으로 위험이 낮다. 문제는 공유 그룹이 기본 그룹일 때다.


4. 명령어 실습

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

5. 실행 결과

Rocky Linux 9.8 (기본 umask 022)

실제 실행 결과 — Rocky Linux 9.8 · analyst@rocky9-lab — umask 계산

Ubuntu 24.04.5 (기본 umask 002)

실제 실행 결과 — Ubuntu 24.04.5 · analyst@ubuntu-lab — umask 계산

텍스트 원본(실제 출력) — 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

6. 결과 해석

출력해석
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를 아무리 바꿔도 파일에 실행 권한이 자동으로 붙는 일은 없다. 실행이 필요하면 항상 명시적으로 준다.


7. 보안 관점

umask보안 수준적용 상황
022보통일반 서버 기본. 새 파일이 모두에게 읽힘
027강화그룹까지만 접근, 기타 완전 차단. 다중 사용자 서버 권장
077강력본인만. 민감 데이터 처리 계정
002낮음그룹 쓰기 허용. 공유 그룹 환경에서는 위험

주의할 점:

  • umask는 새로 만드는 파일에만 적용된다. 기존 파일은 영향받지 않는다.
  • 서비스(데몬)의 umask는 로그인 셸과 다를 수 있다. systemd 서비스는 UMask= 지시자로 설정한다.
  • 공유 그룹이 기본 그룹인 환경에서 002는 그룹 구성원 누구나 파일을 수정 할 수 있게 만든다.

보안 강화 서버에서는 /etc/profile 또는 /etc/login.defs의 UMASK를 027로 설정하는 것이 일반적이다.


8. 보안관제 관점

관점내용
점검/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= 설정

9. 실무에서 자주 발생하는 실수

실수결과예방
umask로 실행 권한이 붙을 거라 기대파일에 x 없음실행은 chmod +x
umask 변경 후 기존 파일도 바뀔 거라 기대기존 파일 그대로umask는 새 파일에만
서비스 umask를 셸과 같다고 가정데몬이 넓은 권한 파일 생성UMask= 명시
공유 그룹에서 002 사용그룹 전체 쓰기027 이상
mkdir -m 700 후 umask 적용 걱정명시 지정은 umask 무시-m은 정확히 적용됨

10. 실습 체크리스트

[ ] umask 값을 확인하고 새 파일·디렉터리 권한을 계산했다
[ ] 파일 시작값 666, 디렉터리 777 을 이해했다
[ ] 새 파일에 x 가 붙지 않는 이유를 설명할 수 있다
[ ] Rocky(022)와 Ubuntu(002)의 결과 차이를 확인했다
[ ] umask 027 과 077 의 결과를 확인했다
[ ] umask 가 명시 지정(mkdir -m)에는 적용되지 않음을 안다

11. 핵심 정리

  • 새 권한 = 시작값(파일 666, 디렉터리 777) AND NOT umask.
  • 파일 시작값이 666이라 새 일반 파일에는 x가 붙지 않는다.
  • umask는 "빼기"만 한다. 없는 권한을 더하지 못한다.
  • Rocky 기본 022(→ 644/755), Ubuntu 기본 002(→ 664/775).
  • 보안 강화 서버는 027 이상을 권장한다.
  • umask는 새 파일에만, 셸·프로세스 세션에 적용되며 서비스는 UMask=로 따로 설정한다.

12. 다음 편 예고

다음 글 「26. chown으로 파일 소유자 변경」 에서는 소유자를 바꾸는 chown을 다룬다. 왜 일반 사용자는 자기 파일의 소유자를 남에게 넘길 수 없는지, 그리고 소유권 변경이 SUID를 어떻게 제거하는지 확인한다.


참고 자료


시리즈 이동

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글