[Linux] umask を使用した、新規ファイルのデフォルト権限の設定

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/s2-setting-default-permissions-for-new-files-using-umask

4.3.5. umask を使用した、新規ファイルのデフォルト権限の設定

プロセスがファイルを作成すると、そのファイルにはデフォルト権限 (-rw-rw-r– など) が設定されます。こうした初期権限は、ファイルモード作成マスク (ファイル権限マスク または umask とも呼ばれる) で部分的に定義されます。たとえば、bash の umask は、デフォルトで 0022 となるなど、すべてのプロセスにそれぞれの umask が設定されています。プロセスの umask は変更できます。
umask を構成するもの

umask は、標準のファイル権限に対応するビットで構成されています。たとえば、umask 0137 の場合、その数字は次のような意味になります。

0 = 意味なし。必ず 0 になります (umask は特別なビットに影響しません)。
1 = オーナーの権限。実行ビットが設定されます。
3 = グループの権限。実行ビットおよび書き込みビットが設定されます。
7 = その他のユーザーの権限。実行ビット、書き込みビット、読み取りビットが設定されます。

umask では 2 進法、8 進法、またはシンボリック表示が使用できます。たとえば、8 進法の 0137 はシンボリック表示では u=rw-,g=r–,o=— となります。シンボリック表示は 8 進法表示とは異なり、禁止権限ではなく、許可された権限を示します。
umask の仕組み

umask は、ファイルに パーミッションを付与するのを禁止する ようにします。

umask に設定しているビットは、ファイルには設定されません。
umask に設定していないビットは、他の要素にもよりますが、ファイルに設定されます。

以下の図は、umask 0137 が新しいファイルの作成にどのように影響するかを示しています。

図4.3 ファイルの作成時に umask を適用
ユーザーグループ umask の例
重要

セキュリティー上の理由から、レギュラーファイルにはデフォルトで実行権限が設定されていません。したがって、umask がいかなる権限も禁止しない 0000 であっても、新しいレギュラーファイルは実行権限を持ちません。ただし、ディレクトリーは実行権限を持つ状態で作成できます。

[john@server tmp]$ umask 0000
[john@server tmp]$ touch file
[john@server tmp]$ mkdir directory
[john@server tmp]$ ls -lh .
total 0
drwxrwxrwx. 2 john john 40 Nov 2 13:17 directory
-rw-rw-rw-. 1 john john 0 Nov 2 13:17 file

4.3.5.1. シェルで umask の管理

bash、ksh、zsh、tcsh などのよく使用されるシェルでは、umask は、umask シェルの builtin を使用して管理されます。シェルから起動したプロセスは、その umask を継承します。
現在のマスクの表示

現在の umask を 8 進法で表示するには、以下のコマンドを実行します。

~]$ umask
0022

現在の umask をシンボリック表示で表示するには、以下のコマンドを実行します。

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

umask を使用したシェルにおけるマスクの設定

8 進法を使用して、現行シェルセッションに umask を設定するには、以下のコマンドを実行します。

~]$ umask octal_mask

octal_mask を、0 から 7 の 4 桁以下の数値に置き換えます。3 桁以下の数値を指定すると、頭に 0 が付いた 4 桁の数値として権限が設定されます。たとえば、入力したコマンドが umask 7 であれば、そのコマンドの数値は 0007 として解釈されます。

例4.1 8 進法を使用した umask の設定

新しいファイルで、オーナーとグループに書き込み権限と実行権限を持たせず、その他のユーザーにはいかなる権限も持たせないようにするには、以下を実行します。

~]$ umask 0337

もしくは、簡潔に次のコマンドを実行します。

~]$ umask 337

シンボリック表記法を使用して、現行シェルセッションの umask を設定するには、以下のコマンドを実行します。

~]$ umask -S symbolic_mask

例4.2 シンボリック表示を使用した umask の設定

シンボリック表記法を使用して umask 0337 を設定するには、次のコマンドを実行します。

~]$ umask -S u=r,g=r,o=

デフォルトシェルの umask での作業

シェルには、通常、デフォルトの umask が設定されている構成ファイルがあります。bash の場合は /etc/bashrc です。デフォルトの bash の umask を表示するには、以下のコマンドを実行します。

~]$ grep -i -B 1 umask /etc/bashrc

出力では、umask の設定が、umask コマンドまたは UMASK 変数のいずれかを使用して行われていることが示されます。以下の例では、umask コマンドを使用して、umask が 022 に設定されています。

~]$ grep -i -B 1 umask /etc/bashrc
# By default, we want umask to get set. This sets it for non-login shell.

if [ $UID -gt 199 ] && [ 「id -gn」 = 「id -un」 ]; then
umask 002
else
umask 022

bash のデフォルト umask を変更するには、/etc/bashrc で umask コマンドの呼び出し、または UMASK 変数の割り当てを変更します。この例では、デフォルトの umask を 0227 に変更します。

if [ $UID -gt 199 ] && [ 「id -gn」 = 「id -un」 ]; then
umask 002
else
umask 227

特定ユーザーのデフォルトシェルの umask での作業

デフォルトでは、新規ユーザーのデフォルトの bash の umask は、/etc/bashrc に定義したものに設定されます。

特定ユーザーの bash umask を変更するには、そのユーザーの $HOME/.bashrc ファイルで、umask コマンドの呼び出しを追加します。たとえば、ユーザー john の bash の umask を 0227 に変更するには、次のコマンドを実行します。

john@server ~]$ echo ‘umask 227’ >> /home/john/.bashrc

新しく作成されたホームディレクトリーのデフォルト権限設定

作成したユーザーホームディレクトリーの権限を変更するには、/etc/login.defs ファイルで UMASK 変数を変更します。

# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK 077

Linux、Netatalk、Samba、NFSを使用したファイルサーバーについて研究・運用しています。

fsをフォローする
参考リンク

コメント