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 が効かないときの確認ポイント

設定したのに期待どおりにならない場合は、次の順に確認します。

  1. プロセスの実際の値:/proc/<PID>/status の Umask を見る。シェルの値ではなく、ファイルを作ったプロセスの値が対象です。
  2. プログラムの要求値:アプリケーションが作成時に 600 などを指定していないか。umask は外すだけで足せません。
  3. デフォルト ACL:親ディレクトリに setfacl -d でデフォルト ACL が設定されていると、umask ではなく ACL の設定が使われます。getfacl ディレクトリ名 で確認できます。
  4. 作成後の chmod:WordPress のアップロード処理のように、作成後に権限を設定し直す処理がないか。
  5. ファイルシステムのマウントオプション:一部のファイルシステムでは、マウント時の指定(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 で個別に指定する

お気軽にご相談ください

お見積りへ お問い合わせへ
▲