2026年6月20日
2026年6月20日
Linuxのumaskでデフォルトパーミッションを設定する方法(シェル・systemd・PHP-FPM・SFTP別)
umask は「新しく作られるファイルやディレクトリから、どの権限を外すか」を決める値です。この記事では、umask の計算の仕方と確認方法を押さえたうえで、ログインシェル、systemd のサービス(PHP-FPM など)、SFTP、cron のそれぞれで umask を設定する手順を説明します。読み終えると、WordPress サーバーでアップロードやデプロイのたびに権限がばらつく問題を、どこで直せばよいか判断できるようになります。
umask の仕組みと計算方法
プログラムがファイルを作るとき、多くの場合はファイルに 666(rw-rw-rw-)、ディレクトリに 777(rwxrwxrwx)を要求します。umask はそこから「外すビット」を指定する値で、実際の権限は「要求した権限 AND (NOT umask)」で決まります。
| umask | 新規ファイル | 新規ディレクトリ | 主な用途 |
|---|---|---|---|
| 022 | 644 | 755 | 多くのディストリビューションの標準 |
| 002 | 664 | 775 | 同じグループのメンバーで共同編集する場合 |
| 027 | 640 | 750 | その他のユーザーから読ませたくない場合 |
| 077 | 600 | 700 | 本人以外に一切見せない場合 |
よくある誤解が「666 から umask を引き算する」という考え方です。たとえば umask 033 のとき、引き算では 633 になりそうですが、実際はビット演算なので 644 になります。ファイルは最初から実行ビットを要求しないため、umask の実行ビットは影響しません。
また、umask は権限を「外す」だけで「足す」ことはできません。プログラム側が 600 で作ると指定していれば、umask を 000 にしても 600 のままです。umask を変えても期待どおりにならないときは、プログラムが作成時にどの権限を要求しているかも確認します。
現在の umask を確認する
シェルの umask は次のコマンドで確認できます。
umask # 例: 0022
umask -S # 例: u=rwx,g=rx,o=rx(記号表記)
動いているプロセスの umask は、/proc の status から読めます(比較的新しいカーネルで表示されます)。サービスの問題を調べるときはシェルではなくこちらを見ます。
# PHP-FPM のプロセスの umask を確認する例
pgrep -f php-fpm | head -n 1 | xargs -I{} grep Umask /proc/{}/status
シェルで umask が 0022 でも、PHP-FPM や Web サーバーは systemd から起動されているため、別の値で動いていることがあります。「ターミナルで作ったファイルと WordPress が作ったファイルの権限が違う」という相談の多くは、この違いが原因です。
ログインシェルの umask を設定する
自分のユーザーだけ変える
一時的に変えるなら、その場で umask 027 を実行します。ログアウトすると元に戻ります。永続化するには ~/.bashrc(bash の場合)や ~/.profile の末尾に書きます。
# ~/.bashrc の末尾に追記
umask 027
書いたあとは新しいターミナルを開いて umask を実行し、反映されたか確認します。ログインシェルと非ログインシェルで読み込まれるファイルが違うため、片方だけに書くと「SSH では効くが別の方法では効かない」ことがあります。
システム全体の既定値を変える
全ユーザーの既定値は、ディストリビューションによって設定場所が異なります。
- Debian / Ubuntu:/etc/login.defs の
UMASKを pam_umask が読み込む構成が一般的です。 - RHEL 系:/etc/login.defs に加えて、/etc/profile や /etc/bashrc 内で umask を設定している版があります。
どのファイルが実際に効いているかは版によって変わるため、変更前に grep -rn umask /etc/profile /etc/bashrc /etc/login.defs /etc/pam.d/ 2>/dev/null で現在の設定箇所を洗い出してください。主要なディストリビューションの間でも設定方法には差があります(2026年10月現在)。システム全体の変更は全ユーザーに影響するので、編集前にファイルをバックアップしておきます。
systemd のサービスに umask を設定する
PHP-FPM、Nginx、Apache などのサービスは、ログインシェルの設定を読みません。systemd のユニットに UMask= を指定します。ユニットファイルを直接書き換えるとパッケージ更新で上書きされるため、ドロップインで追加します。
# サービス名は環境に合わせる(例: php8.3-fpm、php-fpm)
sudo systemctl edit php8.3-fpm
エディタが開いたら、次の内容を書いて保存します。
[Service]
UMask=0027
sudo systemctl daemon-reload
sudo systemctl restart php8.3-fpm
systemctl show php8.3-fpm -p UMask # 設定値の確認
再起動後、前の節のように /proc から実際のプロセスの値も確認します。PHP-FPM のプール設定に umask の項目はないため、サービス全体の umask は systemd 側で決めるのが一般的です。
WordPress が作るファイルの権限との関係
WordPress の場合、umask だけで権限が決まるわけではありません。知っておくと混乱を避けられる点が2つあります。
1つ目は、プラグインやテーマの更新など WP_Filesystem を通した書き込みでは、wp-config.php の定数 FS_CHMOD_FILE と FS_CHMOD_DIR が使われることです。未定義の場合は、WordPress のインストール先の権限をもとに既定値が決まります。
// wp-config.php(必要な場合のみ。値は環境に合わせる)
define( 'FS_CHMOD_DIR', ( 0755 & ~ umask() ) );
define( 'FS_CHMOD_FILE', ( 0644 & ~ umask() ) );
2つ目は、メディアのアップロードでは、保存先ディレクトリの権限をもとにファイルの権限を設定し直す処理があることです。そのため uploads ディレクトリ自体の権限が想定と違うと、umask を変えてもアップロードファイルの権限は揃いません。先にディレクトリ側を整えます。
デプロイ用ユーザーと Web サーバーのユーザーが同じグループで共同作業する構成では umask 002 が選ばれることがありますが、グループ書き込みを許すと PHP からテーマやプラグインのファイルを書き換えられる範囲も広がります。書き込みが必要なのは基本的に uploads やキャッシュだけなので、umask を緩める前に「どのディレクトリに書き込みが必要か」を絞り込むほうが安全です。
SFTP と cron の umask
SFTP でアップロードしたファイル
SFTP でアップロードしたファイルの権限が揃わないときは、sshd_config の sftp サブシステムに umask を指定できます。
# /etc/ssh/sshd_config(既存の Subsystem 行を置き換える)
Subsystem sftp internal-sftp -u 0022
変更後は sudo sshd -t で構文を確認してから sshd を再読み込みします。SSH の設定を誤ると接続できなくなるため、作業中のセッションを閉じずに別のターミナルで接続を確かめます。なお、SFTP クライアントが元ファイルの権限を保持する設定になっていると、そちらが優先されることがあります。
cron のジョブ
cron から起動したスクリプトは、cron デーモンの umask を引き継ぎます。バックアップなど、作成するファイルの権限が重要なジョブは、スクリプトの先頭で明示します。
#!/bin/bash
umask 077 # バックアップファイルを本人以外に読ませない
mysqldump example_db > /var/backups/example_db.sql
umask が効かないときの確認ポイント
設定したのに期待どおりにならない場合は、次の順に確認します。
- プロセスの実際の値:/proc/<PID>/status の Umask を見る。シェルの値ではなく、ファイルを作ったプロセスの値が対象です。
- プログラムの要求値:アプリケーションが作成時に 600 などを指定していないか。umask は外すだけで足せません。
- デフォルト ACL:親ディレクトリに
setfacl -dでデフォルト ACL が設定されていると、umask ではなく ACL の設定が使われます。getfacl ディレクトリ名で確認できます。 - 作成後の chmod:WordPress のアップロード処理のように、作成後に権限を設定し直す処理がないか。
- ファイルシステムのマウントオプション:一部のファイルシステムでは、マウント時の指定(umask=、fmask= など)が優先されます。
まとめ
- umask は新規ファイル・ディレクトリから外す権限で、計算は引き算ではなくビット演算
- 022 なら 644 / 755、027 なら 640 / 750 になる
- シェルは ~/.bashrc や /etc/login.defs、サービスは systemd の
UMask=をドロップインで設定する - 効いているかは
umaskではなく /proc/<PID>/status の Umask で確認する - WordPress は FS_CHMOD_FILE / FS_CHMOD_DIR とアップロード時の処理でも権限が決まる
- SFTP は sftp サブシステムの
-u、cron はスクリプト内のumaskで個別に指定する