umask
| 対応: | 全Linux | |
|---|---|---|
| macOS(2001 Cheetah) | ||
| Bash 1.0(1989) |
umask(ユーマスク)はファイルやディレクトリを新規作成するときのデフォルトパーミッションを制御する仕組みです。umask の値は「許可したくないビット」を表しており、ベースのパーミッション(ファイルは 666、ディレクトリは 777)から umask の値を AND NOT(ビット除去)で除いたものが実際のパーミッションになります。
よく使う値(022 / 077 / 002)
| umask | ファイル | ディレクトリ | 用途・説明 |
|---|---|---|---|
| 022 | 644 (rw-r--r--) | 755 (rwxr-xr-x) | デフォルト。所有者は読み書き可、グループ・その他は読み取りのみ。一般的なサーバー設定。 |
| 077 | 600 (rw-------) | 700 (rwx------) | 所有者のみアクセス可。秘密鍵や機密ファイルを扱う環境に適する。 |
| 002 | 664 (rw-rw-r--) | 775 (rwxrwxr-x) | グループの書き込みを許可。複数人で同一グループとして作業する開発環境向け。 |
| 000 | 666 (rw-rw-rw-) | 777 (rwxrwxrwx) | 全員に読み書き(実行)を許可。セキュリティリスクが高く、通常は使わない。 |
umask の仕組み(ビットマスク)
umask は「引き算」ではなくビットマスク(AND NOT)で動作します。ベースのパーミッションと umask の各ビットを比較し、umask にビットが立っている位置のパーミッションを除去します。
実際のパーミッション = ベースパーミッション AND NOT umask
ファイルのベースは 666(rw-rw-rw-)、ディレクトリのベースは 777(rwxrwxrwx)です。よく使われる umask 022 の場合、計算は次のようになります。
# ファイルの場合 666 (rw-rw-rw-) - 022 (----w--w-) ← umask(引き算ではなくビット除去) ----- 644 (rw-r--r--) ← 実際のパーミッション # ディレクトリの場合 777 (rwxrwxrwx) - 022 (----w--w-) ----- 755 (rwxr-xr-x)
ファイルのベースが 777 ではなく 666 なのは、新規ファイルに最初から実行ビット(x)を付けないようにするためです。テキストファイルや設定ファイルに誤って実行権が付くのを防ぎます。スクリプトに実行権を与えたい場合は作成後に chmod +x で明示的に付けます。
umask コマンド(表示 / 設定)
引数なしで実行すると現在の umask 値を表示します。
umask 0022
数値を引数に渡すとその値に変更します。変更はカレントシェルのセッション中のみ有効です。
umask 077
変更後に確認します。
umask 0077
umask -S(シンボリック表示)
umask -S を使うと、許可する権限をシンボリック形式(rwx 形式)で表示します。数値の見方に慣れていない場合に直感的に確認できます。
umask 022 umask -S u=rwx,g=rx,o=rx
umask 077 の場合はグループ・その他の全権限を除去するため次のようになります。
umask 077 umask -S u=rwx,g=,o=
シンボリック形式を直接 umask に渡すこともできます。
umask u=rwx,g=rx,o=rx
サンプルコード
現在の umask を確認し、ファイルとディレクトリを作成してパーミッションを確認する例です。
umask 0022 touch cursed_objects.txt mkdir mission_briefing ls -l -rw-r--r-- 1 gojo staff 0 Apr 9 21:00 cursed_objects.txt drwxr-xr-x 2 gojo staff 64 Apr 9 21:00 mission_briefing
umask を 077 に変更してから作成すると、所有者のみアクセス可になります。
umask 077 umask 0077 touch technique_archive.dat mkdir barrier_config ls -l -rw------- 1 gojo staff 0 Apr 9 21:01 technique_archive.dat drwx------ 2 gojo staff 64 Apr 9 21:01 barrier_config
.bashrc での umask 設定と、設定後の動作確認を行うスクリプト例です。
barrier_config.sh
#!/bin/bash # umask の設定と確認スクリプト # 秘密情報用: 所有者のみアクセス可 umask 077 echo "現在の umask: $(umask)" echo "シンボリック表示: $(umask -S)" # ファイルとディレクトリを作成して確認 touch technique_archive.dat mkdir -p barrier_config/restricted echo "--- 作成後のパーミッション ---" ls -ld technique_archive.dat barrier_config/restricted
実行するコマンドは次の通りです。
bash barrier_config.sh 現在の umask: 0077 シンボリック表示: u=rwx,g=,o= --- 作成後のパーミッション --- -rw------- 1 gojo staff 0 Apr 9 21:02 technique_archive.dat drwx------ 2 gojo staff 64 Apr 9 21:02 barrier_config/restricted
概要
umask はシェルプロセスに紐づいた設定です。変更はカレントシェルのセッション中のみ有効で、新たに起動したシェルや別ターミナルには引き継がれません。永続的に設定したい場合は ~/.bashrc や ~/.profile に記述します。
~/.bashrc
# ~/.bashrc または ~/.profile に追記 umask 022
ログインシェルには ~/.profile または ~/.bash_profile、インタラクティブシェルには ~/.bashrc が読み込まれます。両方に適用したい場合は ~/.bashrc に書き、~/.bash_profile から ~/.bashrc を読み込む構成がよく使われます。
システム全体のデフォルト umask は /etc/profile や /etc/login.defs(UMASK 変数)で設定されています。一般ユーザー向けは 022、機密情報を扱うサービスアカウントには 077 が採用されることが多いです。
よくあるミス
よくあるミス1: umask は「引き算」ではなくビットマスク(AND NOT)
「666 から 022 を引くと 644」という理解は多くの場合たまたま正しい結果になりますが、厳密には間違いです。umask はビット単位の AND NOT 演算です。引き算で計算できないケースの例を示します。
umask 033 を例に確認します。引き算なら 666 − 033 = 633 になるはずですが、実際は 644 です。
umask 033 touch cursed_objects.txt ls -l cursed_objects.txt -rw-r--r-- 1 gojo staff 0 Apr 9 21:03 cursed_objects.txt
8進数を2進数に展開して確認してみます。
110 110 110 (666 を2進数で表現) AND NOT 000 011 011 (033 を2進数で表現) = 110 100 100 = 644
引き算で計算すると 633 になりますが、実際は 644 です。umask とベースのパーミッションにビット重複がない場合(例: 022)は引き算と同じ結果になるため、誤解が生まれやすい箇所です。
よくあるミス2: umask 000 によるセキュリティリスク
umask 000 を設定すると、作成されるファイルのパーミッションは 666(rw-rw-rw-)、ディレクトリは 777(rwxrwxrwx)になります。全ユーザーが読み書き(ディレクトリは実行)できる状態です。
umask 000 umask 0000 touch mission_briefing.txt mkdir cursed_archive ls -l -rw-rw-rw- 1 gojo staff 0 Apr 9 21:04 mission_briefing.txt drwxrwxrwx 2 gojo staff 64 Apr 9 21:04 cursed_archive
umask 000 の状態では、同じサーバー上の別ユーザーがファイルを上書きしたり、ディレクトリ内のファイルを削除したりできます。スクリプト内で一時的に umask を変更する場合は、処理終了後に元の値に戻すことが重要です。
#!/bin/bash
# 元の umask を保存してから変更し、処理後に復元する
OLD_UMASK=$(umask)
umask 000
# 全員が読み書きできる共有ファイルを作成
touch /tmp/shared_mission_briefing.txt
# 元の umask に戻す
umask "$OLD_UMASK"
echo "umask を ${OLD_UMASK} に戻しました"
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。