2026年6月27日
2026年6月27日
Linuxのumaskでデフォルトのファイル権限を制御する方法:計算・確認・設定の手順
Linux で新しく作ったファイルやディレクトリの権限は、umask という値で決まります。umask を理解していないと、「作ったファイルが他のユーザーから読める」「共同作業用のディレクトリで他の人が編集できない」といった問題の原因がつかめません。この記事では umask の計算方法と確認方法、ユーザー単位・システム全体での設定方法、つまずきやすい点を説明します。
umask とは:新規作成時に「外す」権限
ファイルを作るプログラムは、作成時に権限を要求します。多くのプログラムはファイルに 666(rw-rw-rw-)、ディレクトリに 777(rwxrwxrwx)を要求し、そこから umask に含まれるビットが外されます。
実際の権限は「要求した権限 AND (NOT umask)」というビット演算で決まります。よく使う値は次のとおりです。
| umask | 新規ファイル | 新規ディレクトリ | 意味 |
|---|---|---|---|
| 022 | 644(rw-r--r--) | 755(rwxr-xr-x) | グループとその他は読むだけ |
| 002 | 664(rw-rw-r--) | 775(rwxrwxr-x) | 同じグループは書き込みもできる |
| 027 | 640(rw-r-----) | 750(rwxr-x---) | その他のユーザーは一切アクセスできない |
| 077 | 600(rw-------) | 700(rwx------) | 本人だけ |
umask の各桁は「所有者・グループ・その他」の順で、4 が読み取り、2 が書き込み、1 が実行を外す指定です。027 なら、グループから書き込みを外し、その他からすべてを外します。
「666 から引き算する」と覚えると間違えます。たとえば umask 033 は引き算では 633 になりそうですが、実際は 644 です。ファイルはもともと実行ビットを要求しないので、umask の実行ビット(1)はファイルには影響しません。
また、umask は権限を外すだけで、足すことはできません。プログラムが 600 で作ると指定していれば、umask を 000 にしても 600 のままです(SSH の秘密鍵などがこの例です)。
現在の umask を確認する
umask # 8進数で表示(例: 0022)
umask -S # 記号で表示(例: u=rwx,g=rx,o=rx)
先頭の 0 は特殊な権限ビット(setuid など)の桁で、通常は 0 です。
実際に効いているかは、ファイルとディレクトリを作って確かめるのが確実です。
cd "$(mktemp -d)"
touch file.txt
mkdir dir
ls -ld file.txt dir
umask が 0022 なら、file.txt は -rw-r--r--、dir は drwxr-xr-x と表示されます。
一般ユーザーで確認すると 0002 と表示されるディストリビューションもあります。Ubuntu などでは、ユーザーごとに同名の個人用グループを作る構成(ユーザープライベートグループ)を前提に、一般ユーザーのグループ権限を所有者と同じにする設定が既定で有効になっているためです。
一時的に変える
umask コマンドに値を渡すと、そのシェルと、そこから起動したプログラムにだけ適用されます。ログアウトすると元に戻ります。
umask 027
umask # 0027 になったことを確認
touch secret.txt
ls -l secret.txt # -rw-r----- になる
記号でも指定できます。次は umask 027 と同じ意味です(残す権限を書く点に注意)。
umask u=rwx,g=rx,o=
自分のユーザーで常に使う値を設定する
bash を使っている場合は、~/.bashrc の末尾に追記します。SSH でログインしたときのログインシェルだけに効かせたい場合は ~/.profile(~/.bash_profile があればそちら)に書きます。
# ~/.bashrc の末尾に追記する内容
umask 027
ファイルを編集したら、新しいターミナルを開くか SSH で接続し直して umask を実行し、値が変わったことを確認します。シェルの設定ファイルは、ログインシェルかどうか、対話的かどうかで読み込まれるものが変わります。片方にだけ書くと「SSH では効くのに別の方法で入ったときは効かない」ということが起きるため、どちらで使うかを考えて書く場所を選びます。
システム全体の既定値を変える
全ユーザーの既定値は、/etc/login.defs の UMASK で設定するのが一般的です。
# 現在どこで umask が設定されているかを洗い出す
grep -rn -i umask /etc/login.defs /etc/profile /etc/profile.d/ /etc/bash.bashrc /etc/bashrc /etc/pam.d/ 2>/dev/null
- Debian / Ubuntu:ログイン時に pam_umask が /etc/login.defs の
UMASKを読み込みます。USERGROUPS_ENAB yesの場合は、ユーザー名とグループ名が同じ一般ユーザーについてグループの桁が所有者と同じに変わります(022 なら 002 になります)。 - RHEL 系(AlmaLinux、Rocky Linux など):/etc/login.defs のほか、版によっては /etc/profile や /etc/bashrc の中で umask を設定しています。
設定箇所が複数あると、後から読み込まれたものが勝ちます。上の grep で見つかったものをすべて確認してから、どこを変えるか決めてください。システム全体の設定は全ユーザーに影響するので、編集前にファイルのバックアップを取ります。
sudo cp -p /etc/login.defs /etc/login.defs.bak
sudoedit /etc/login.defs # UMASK 行を変更する
変更は次のログインから反映されます。ログインし直して umask で確認してください。
つまずきやすい点
sudo で作ったファイルの権限
sudo は、実行するコマンドの umask を「ユーザーの umask と sudoers の umask 設定(既定は 0022)を合わせたもの」にします。ユーザーの umask を 002 にしていても、sudo 経由では 022 が適用され、グループ書き込みが付きません。sudo で作ったファイルの権限が想定と違うときは、この動作が理由です。
サービスはシェルの設定を読まない
Web サーバー、PHP-FPM、データベースなど systemd から起動されるサービスは、~/.bashrc や /etc/login.defs の umask を使いません。サービスの umask は systemd のユニットの UMask= で設定します。WordPress が作るファイルの権限を揃えたい場合はこちらを確認してください。詳しい手順は Linuxのumaskでデフォルトパーミッションを設定する方法 で説明しています。
cron から起動するスクリプトも、ログインシェルの設定を読みません。作るファイルの権限が重要なスクリプトでは、先頭で umask 077 のように明示します。
既存のファイルは変わらない
umask は新しく作るファイルにだけ効きます。すでにあるファイルの権限は chmod で直します。
# 例: ディレクトリ以下のファイルを 640、ディレクトリを 750 にそろえる
find /path/to/dir -type f -exec chmod 640 {} +
find /path/to/dir -type d -exec chmod 750 {} +
共同作業のディレクトリは umask だけに頼らない
複数のユーザーで同じディレクトリを編集する場合、全員の umask を 002 にすると、そのユーザーが作るすべてのファイルにグループ書き込みが付きます。対象のディレクトリだけに効かせたいなら、ディレクトリに setgid ビットを付けて新規ファイルのグループを揃え、デフォルト ACL でグループ書き込みを与える方法があります。
sudo chgrp -R webteam /srv/shared
sudo chmod 2775 /srv/shared # setgid: 新規ファイルのグループを webteam にする
sudo setfacl -d -m g:webteam:rwx /srv/shared # デフォルト ACL: 新規ファイルにグループ書き込みを付ける
getfacl /srv/shared
デフォルト ACL が設定されたディレクトリでは、その中に作るファイルの権限に umask ではなく ACL の設定が使われます。
まとめ
- umask は新規ファイル・ディレクトリから外す権限で、計算はビット演算(引き算ではない)
- 022 なら 644 / 755、027 なら 640 / 750、077 なら 600 / 700
- 確認は
umaskとumask -S、実際にファイルを作ってls -lで見るのが確実 - 自分だけなら ~/.bashrc や ~/.profile、全体なら /etc/login.defs(版により /etc/profile なども)
- sudo、systemd のサービス、cron はシェルの設定とは別の umask で動く
- 共同作業のディレクトリは setgid とデフォルト ACL で個別に設定する