朝から昼寝

ITや家計、身近なことの整理

[お知らせ]
当サイトは、2024年1月1日に
新URL(happynap.net)に引っ越しました





このページの内容は、最新ではない場合がありますので、新URLをご確認ください。






当サイトには広告を含みます。"オススメ"として紹介している商品やサービスは、個人的にそう思えたものだけです。
共感、興味をもっていただけるものがあればご利用ください (広告掲載ポリシー)。

umaskを徹底的に統一(ssh,sftp,scp,sudo,su)

概要

サーバ上で作業する際のumask設定を統一したいことがあります。
ssh、sftp、scp、sudo、su等、多様なログインやユーザ切り替えを想定すると、たくさんの設定箇所を考慮する必要性があります。
本記事では、umask値を統一する方法についてまとめます。

本記事の目的

  • umask設定を統一する際のポイントを把握する


目次

基本

前提

対象OSはRHEL8系(CentOS、AlmaLinux、RockyLinux等)、シェルは主にbashです。

他のOS、ディストリビューション、シェルでは関連するStartup Files(profileやbashrc等)の構成が違えば、結果的に異なる動作になりますが、原理は同様です。

(本記事の内容は、なるべく確認した上で記載していますが、パターンが膨大なので全てが正確ではないかもしれません)

umaskの各設定箇所

Linux上のログインやシェル切り替えの際に適用される設定のうち、umaskに関するものを記載します。

/etc/login.defsUMASK

他の設定箇所より先に適用されるumask設定です(詳細は後述)。
先に適用されると言っても、その後、他の設定箇所によりumask設定を上書きされるケースがほとんどです。

よって、この/etc/login.defsUMASKの変更は、特定の意図が無い限りは意味が無いでしょう。

デフォルトでは以下のようになっています。

UMASK           022

/etc/pam.d/sshdpam_umask

sshd経由のログイン時に適用されるumask設定です(pam_umaskの詳細は後述)。

以下のように、/etc/pam.d/sshdpam_umask.soの行を追記することで設定されます(最終行への追加でOK)。

session optional pam_umask.so umask=0077

umaskの指定方法はいくつかありますが、上記のように行末にumask=オプションを指定するのがシンプルでしょう。

デフォルトでは、/etc/pam.d/sshdpam_umask.soは含まれていません。

/etc/ssh/sshd_configSubsystem sftp-u

sftp経由のログイン時に適用されるumask設定です。

以下のように、sftp設定の行末に-uオプションを指定します。

Subsystem       sftp    /usr/libexec/openssh/sftp-server -u 007

/etc/sudoersumask_override

sudoで指定したコマンド実行時に適用されるumask設定です。
(設定方法により動作が異なるので、詳細は後述します)

以下のように、Defaults umaskDefaults umask_overrideの行を追記します(最終行への追加でOK)。
※これはumask =で指定したumask設定で"上書き"する設定です。
※直接/etc/sudoersを編集せず、visudoを使用する方が良いです。

Defaults umask = 0077
Defaults umask_override

この設定は、sudo susudo su -実行時に起動されるシェルのumaskには影響しません。

/etc/profile

ログインシェル起動時(少なくともbashの場合)に適用されるumask設定です。

以下のように、uidが200以上の場合に適用される箇所を書き換えます。
※この手順は、内容をきちんと理解した上で実施する必要性があります。/etc/profileの直接編集自体は分かりやすいのですが、良いやり方ではないとされています(詳細は後述)。

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    #umask 002 ←コメントアウト
    umask 077 ←追記
else
    umask 022
fi
…

(補足)rootのみに適用されるumask設定を追加したい場合は、上記のif文の後に以下を追記します。

if [ $UID -eq 0 ]; then
    umask 077
fi

ログインシェル、インタラクティブシェル等のシェル種別に応じた条件分岐(if文)については後述します。

/etc/bashrc

bashかつ非ログインシェル起動時に適用されるumask設定です。

umaskの設定に関しては上記の/etc/profileと同様なので省略します。

~/配下

本記事ではシステム全体(System wide)の設定について記載するので、ユーザごとの設定については省略します。

~/.profile~/.bashrcといったファイルのことです。

基本的には、システム全体の設定ファイルが読み込まれた後に、これらのファイルが読み込まれます。

アクセス方法ごとのumask設定まとめ

前述の各設定箇所が、アクセス方法ごとに適用されるかどうかを表にまとめます。

一般的なssh関連アクセス

下表は、一般的なssh,sftp,scpによるアクセス時に適用される設定です。
設定ファイル自体が読み込まれるかどうかではなく、umask設定に影響するかどうかの観点でまとめたものです。

適用順は、左が先、右に向かって後です(先→後)。

/etc/login.defs /etc/pam.d/sshd sshd_config /etc/profile /etc/bashrc
ssh
sftp
scp

●:適用される

"一般的なssh,sftp,scp"と記載したのは、OpenSSHのクライアント機能や、sshについてはWindows上のターミナルソフト(PuTTYTeraterm)を想定したものです。
一方で、WinSCPのsftp、scpによるアクセスは少し異なるため、後述します。

WinSCPによるsftp、scpアクセス

下表は、WinSCPによるsftp、scpアクセス時に適用される設定です。
設定ファイル自体が読み込まれるかどうかではなく、umask設定に影響するかどうかの観点でまとめたものです。

適用順は、左が先、右に向かって後です(先→後)。

/etc/login.defs /etc/pam.d/sshd sshd_config /etc/profile /etc/bashrc 暗黙値
sftp
●(※2)
scp
●(※1)
●(※2)

●:適用される
(※1)WinSCPのscp時のシェル設定が"デフォルト"の場合、ログインシェルが起動するようです(詳細は別記事のssh,sftp,scp時のログインシェル、インタラクティブシェルにまとめてあります)。
(※2)おそらくWinSCP固有の仕様で、sftp経由のファイルアップロードの際には暗黙的な0111(実行権クリア)とのビット和のumaskになるようです。scp経由のファイルアップロードの際には0133(0022+実行権クリア)とのビット和のumaskになるようです。ディレクトリのアップロードの際にはこのような暗黙的な設定は無さそうです(詳細は別記事のWinSCPでsftp,scp時に暗黙のumaskにまとめてあります)。

susudoの実行時

下表は、susudo実行時に適用される設定です。
設定ファイル自体が読み込まれるかどうかではなく、umask設定に影響するかどうかの観点でまとめたものです。

主にrootのシェルへの切り替え(-u無し)を想定しています。

適用順は、左が先、右に向かって後です(先→後)。

/etc/login.defs /etc/sudoers /etc/profile /etc/bashrc
su
su -
sudo -s
●(※2)
sudo -i
sudo (コマンド)(※1)
sudo su
(※3)
sudo su -
(※3)
sudo bash

●:適用される
(※1)シェル起動やsu以外のコマンドのことです。
(※2)起動されるシェルはsudo実行時のSHELL環境変数によります。
(※3)/etc/sudoersのumask設定は、sudo susudo su -は、新たに起動されるシェルには反映されません。

上記仕様をスッキリ理解するには、前提としてsusudo実行時のログインシェル、インタラクティブシェルについて把握する必要性があります。以下に補足します。

(別のまとめ方)シェル種別ごとの適用される設定

以下は前提となる関連記事です。

アクセス方法でなく、ログインシェル、インタラクティブシェルの観点でまとめた場合は以下のようになります。
設定ファイル自体が読み込まれるかどうかではなく、umask設定に影響するかどうかの観点でまとめたものです。

/etc/profile /etc/bashrc
ログインシェルかつ
インタラクティブシェル
ログインシェルかつ
インタラクティブシェル
非ログインシェル
インタラクティブシェル
非ログインシェル
&非インタラクティブシェル
シェル起動無し

●:適用される

/etc/bashrcには、if ! shopt -q login_shell ; thenというif文があり、非ログインシェルの場合にのみ以降のumask設定を含む処理が実行されるようになっています。

ちなみに、本記事ではbashについて記載していますが、zshでは/etc/zprofileから/etc/profileがsourceされるようです。

umaskの統一の仕方

上記にて、umaskの各設定箇所と、アクセス方法ごとに適用されるumask設定についてまとめました。

これらを参考に、想定されるアクセス方法に応じて設定すれば、umaskを統一できることになります。

例えば、sshログインとsudo -iしか行わないのであれば、/etc/pam.d/sshd/etc/sudoersの設定くらいで済みます(もしくは/etc/profileの設定のみ)。

詳細

/etc/login.defsUMASKとpam_umask

ざっくり言うと、PAM経由の認証時には/etc/login.defsUMASKが適用されているようです。

ただ、PAMの後の処理で他の設定箇所によりumask設定が上書きされるケースがほとんどです。

/etc/login.defsは、shadow-utils(shadowパスワード機能)によって使用されるファイルのようです。

現在は、shadowパスワード機能によって提供されていた機能の大部分はPAMによって処理されていますが、PAM経由で/etc/login.defsが使用されるケースがあります。

/etc/login.defsUMASKは以下のように記載されています。

# Default initial "umask" value used by login(1) on non-PAM enabled systems.
# Default "umask" value for pam_umask(8) on PAM enabled systems.
# UMASK is also used by useradd(8) and newusers(8) to set the mode for new
# home directories if HOME_MODE is not set.
# 022 is the default value, but 027, or even 077, could be considered
# for increased privacy. There is no One True Answer here: each sysadmin
# must make up their mind.
UMASK           022

PAMにおいて、pam_umaskはこのUMASKの値をもとにumask設定を行います。

具体的には、/etc/pam.d/postloginpam_umaskが定義されています。

# grep -i umask /etc/pam.d/*
/etc/pam.d/postlogin:session     optional                   pam_umask.so silent

PAMのpostlogin設定は、man postloginによると、system-authの後など、広範に適用されるようです。

DESCRIPTION
       The  purpose  of this PAM configuration file is to provide a common place for all PAM modules which should be
       called after the stack configured in system-auth or the other common PAM configuration files.

       The postlogin configuration file is included from all individual service  configuration  files  that  provide
       login service with shell or file access.

NOTES
       The modules in the postlogin configuration file are executed regardless of the success or failure of the mod‐
       ules in the system-auth configuration file.

pam_umaskは、以下の優先順でumaskの値を取得します(man pam_umaskより)。

       The PAM module tries to get the umask value from the following places in the following order:
       ・   umask= entry in the user's GECOS field
       ・   umask= argument
       ・   UMASK entry from /etc/login.defs
       ・   UMASK= entry from /etc/default/login

/etc/profile/etc/bashrcの直接編集が良いやり方ではない理由

/etc/profileの冒頭に説明がある通りです(/etc/bashrcも同様)。

(RHEL8系の/etc/profileの冒頭より抜粋)
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

/etc/profileを直接編集する代わりに、/etc/profile.d/umask-cust.shのようなファイルを作成し、その中に目的のumask設定のみを記載する方が設定ファイルの構成としてはキレイです。
将来的に、アップデートにより/etc/profileが更新された際、マージが容易になります。何よりレベルダウンの発生を回避しやすくなります。

一方で、サーバ管理上は/etc/profile.d/umask-cust.shを作成したということをきちんと構成管理しなければならないという手間もあります。知らずに他の設定を近辺に加えていくと、逆に混乱を招いてしまうでしょう。

(諸説)結局/etc/profileを直接編集した方が分かりやすいのでは

実際に/etc/profileがアップデートにより上書きされた、という話を私は知らないので、/etc/profileを直接編集しても良いのではと思っています。

諸説あることの例として、RHELの公式説明ですら、バージョンごとにかなり違っているという点も含めて記載します。

まずRHEL6向けの古いKBです。
/etc/profileの直接編集を回避するよう書かれています。

まず、/etc ディレクトリーのファイルはすべてのユーザーに対するグローバルな設定ですが、それを変更するのはできるだけ回避する必要があります。グローバル設定を修正する必要がある場合は /etc/profile.d を使用することができます。これにより、パッケージをアップグレードした時に変更箇所が元に戻るのを回避できます。
RHEL におけるシェルプロファイル(RHEL6向けのKB)

次にRHEL8向けのマニュアルです。
なんと/etc/profileを直接編集する手順が紹介されています。

/etc/profile ファイルを変更して、root ユーザーのデフォルトの bash umask を変更できます。
26.6. ログインシェルのデフォルト umask の変更

次にRHEL9向けのマニュアルです。
なぜか/etc/login.defsを編集する手順に変わっています(これはこれで意図が不明)。

/etc/login.defs ファイルを変更して、root ユーザーのデフォルトの bash umask を変更できます。
25.6. ログインシェルのデフォルト umask の変更

/etc/sudoersにおけるumask設定

umask_overrideumaskの設定内容により、動作が異なります。

  • umask_overrideがオフの場合(デフォルト)

    • sudoを実行したユーザのumask設定と、/etc/sudoersにおけるumaskのビット和(union)が適用されます。
    • sudoを実行したユーザのumask設定をそのまま引き継ぎたい場合は、!umaskとするかumask = 0777を指定します。

  • umask_overrideがオンの場合
    sudoを実行したユーザのumask設定を無視して、/etc/sudoersにおけるumaskで上書きします。

/etc/sudoersにおけるumaskのデフォルトは022です。

本記事はumask設定を統一するという趣旨なので、その場合はumask_overrideをオンにします。

internal-sftpにおけるumask

sftpに関し、internal-sftpを使用する場合について触れませんでしたが、/usr/libexec/openssh/sftp-serverと同じオプションが使用できるので、同様に-uを使用できます。

umask設定をテストする際の設定例

本記事のようにumask設定を細かく試す際のやり方として、各設定ファイルのumask設定を無効化(無力化)してから、試したいumask設定のみを変えながらテストするという例を挙げておきます。

この例は、umask設定に限らず、Startup Files(profileやbashrc等)の確認を細かく行いたい場合にも使えます。

以下は、/etc/profileでumask設定を行わないようにする例です。/etc/bashrcの場合も同様です。
umask設定の箇所をコメントアウトし、代わりに何もしないコマンド(:)を置きます。

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
   #umask 002 ←コメントアウト
   : ←追加
else
   #umask 022 ←コメントアウト
   : ←追加
fi

以下は、/etc/login.defsを使用したumask設定が000になるようにする例です。
他の設定箇所より先に適用される設定なので、テストの際には000にしておくと分かりやすいです。
コメントアウトだけだと、デフォルトの022になってしまいます。

#UMASK          022 ←コメントアウト
UMASK           000 ←追加

以下は、/etc/sudoersでumask設定を行わないようにする例です(説明は前述の通り)。

Defaults umask = 0777

関連記事(シェル、umask等)