umask の仕組み - 新規ファイルの権限を制御する

umask の仕組み - 新規ファイルの権限を制御する

umask とは何か?

umask は新規ファイルやディレクトリ作成時のデフォルト権限を決める「引き算マスク」だ。ファイル作成時の最大権限(ファイル: 666、ディレクトリ: 777)から umask の値をビット演算で除いた結果が実際の権限になる。

結論

  • ファイルのデフォルト最大権限: 666rw-rw-rw-
  • ディレクトリのデフォルト最大権限: 777rwxrwxrwx
  • umask 022 の場合: ファイルは 644rw-r--r--)、ディレクトリは 755rwxr-xr-x

umask の値はどう計算するのか?

umask は「許可しないビットを指定する」マスクだ。デフォルト最大権限の各ビットのうち、umask のビットが立っているものは除去される。

計算式

実際の権限 = デフォルト最大権限 AND NOT(umask)

umask 022 でファイルを作成した場合:

  666  = 110 110 110  (owner: rw-, group: rw-, other: rw-)
  022  = 000 010 010  (マスク: group/other の w を除去)
─────────────────────────────────────────────────────────
= 644  = 110 100 100  (owner: rw-, group: r--, other: r--)

引き算ではなくビット演算

「最大権限から umask を引く」と説明されることもあるが、厳密には AND NOT 演算だ。例として umask 023 の場合、単純な引き算では 666 - 023 = 643 になるが、実際の結果は 644 になる。otherw(2)と x(1)はそれぞれ独立したビットで処理されるためだ。

現在の umask を確認するには?

umask コマンドを引数なしで実行すると現在の値を 8 進数で表示する。

$ umask
0022

シンボリック形式で確認する場合:

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

先頭の 0 は特殊ビット(setuid / setgid / sticky)の桁だ。通常は 0022 のように先頭が 0 になる。

umask を設定するには?

umask コマンドに値を渡すと設定できる。この設定は現在のシェルセッションのみ有効で、新しいターミナルを開くとデフォルト値に戻る。

一時的な設定

$ umask 022    # よく使われる標準的な設定
$ umask 027    # グループに書き込み禁止、他人に全権限禁止
$ umask 077    # 所有者のみアクセス可(最もセキュア)
$ umask 002    # グループ書き込みを許可(共同作業環境)

設定後に新規ファイルを作成して確認:

$ umask 022
$ touch testfile.txt
$ ls -la testfile.txt
-rw-r--r-- 1 user user 0 Jun  1 10:00 testfile.txt

$ umask 077
$ touch private.txt
$ ls -la private.txt
-rw------- 1 user user 0 Jun  1 10:00 private.txt

umask を永続化するには?

シェルの設定ファイルに umask コマンドを追記することで永続化できる。

ユーザー単位での設定

# ~/.bashrc(bash のインタラクティブシェル)
echo 'umask 022' >> ~/.bashrc
source ~/.bashrc

# ~/.profile または ~/.bash_profile(ログインシェル)
echo 'umask 022' >> ~/.profile

システム全体への適用

# /etc/profile(全ユーザーのログインシェル)を root 権限で編集
sudo nano /etc/profile
# → 末尾に umask 022 を追加

多くの Linux ディストリビューションでは /etc/profile/etc/login.defs(PAM 経由)でシステムデフォルトの umask が設定されている。現在のシステム設定を確認する場合は /etc/profile/etc/login.defs を参照せよ。

よく使われる umask の値

umask ファイル権限 ディレクトリ権限 用途
022 644 (rw-r--r--) 755 (rwxr-xr-x) 一般的なデスクトップ / サーバ環境
027 640 (rw-r-----) 750 (rwxr-x---) グループ書き込み禁止・他人ブロック
077 600 (rw-------) 700 (rwx------) 機密ファイルや個人環境
002 664 (rw-rw-r--) 775 (rwxrwxr-x) グループ作業環境(共有書き込みを許可)

セキュリティの注意

umask 000 は全権限を残すため使用しないこと。rw-rw-rw- のファイルが量産され、他ユーザーが書き込める状態になる。

umask とファイルの実行権限について

umask がどう設定されていても、touch やテキストエディタで作成したファイルには実行権限は付与されない。ファイルのデフォルト最大権限が 666 であるため、umask 000 でも rw-rw-rw- が上限だ。実行ビットは決して残らない。

$ umask 000    # 何も引かない設定
$ touch script.sh
$ ls -la script.sh
-rw-rw-rw- 1 user user 0 Jun  1 10:00 script.sh   # x が付かない

実行可能なスクリプトを作成する場合は chmod で明示的に付与する:

$ chmod +x script.sh
$ ls -la script.sh
-rwxrwxrwx 1 user user 0 Jun  1 10:00 script.sh

setgid ディレクトリと umask の組み合わせ

ディレクトリに setgid(SGID)ビットが設定されている場合、そのディレクトリ内で作成されたファイルはディレクトリのグループを継承する。umask 002 と組み合わせると、グループメンバー全員が書き込める共有ディレクトリを構築できる。

# SGID が設定されたディレクトリを確認
$ ls -ld /var/shared/
drwxrwsr-x 2 root devteam 4096 Jun  1 10:00 /var/shared/

# umask 002 で作業するとグループに書き込み権限が残る
$ umask 002
$ touch /var/shared/project.conf
$ ls -la /var/shared/project.conf
-rw-rw-r-- 1 user devteam 0 Jun  1 10:00 /var/shared/project.conf

まとめ

umask チートシート

umask           # 現在値を表示(数値)
umask -S        # 現在値を表示(シンボリック)
umask 022       # 標準(ファイル: 644、ディレクトリ: 755)
umask 077       # 最もセキュア(所有者のみ)
umask 002       # グループ共同作業環境向け

やってはいけないこと

  • umask 000 でファイルを全公開
  • ログインシェルと非ログインシェルで設定が食い違うことを無視
  • 一時設定が永続化されていると思い込む(セッションを閉じるとリセット)

次に読む