【基礎】PAMによるLinuxユーザ認証・管理 | 若手エンジニアのブログ

若手エンジニアのブログ

文系出身の若手女子エンジニアによる技術ブログ。
日々の経験や学びをアウトプットするためにブログを書いています。
バックエンド(Java+SpringFramework)を経てインフラエンジニアになりました。
今は育休中につき、本で勉強したことを中心にアウトプットしています。

今日は、Linuxのユーザ認証で使われているPAMについて、ちょっとだけ触ってみます。

ちなみに、PAMで調べると、RedHatの公式ドキュメント以外は、2000年代前半くらいの記事がヒットします。古くからある技術のようです。

 

もくじ

1.PAMとは

2.PAMを使ったユーザログインの流れ

3.PAM関連のファイルを見てみる

4.PAMファイル設定の注意点

 

1.PAMとは

PAM(Pluggable Authentication Modules)とは、Linuxやアプリケーションでユーザ認証を行うためのAPI。

PAMは個々のアプリケーションから独立して、ライブラリや各種モジュールを備え、

LinuxOSやアプリケーションは、PAMを利用することでユーザ認証を行うことができる。

特によく使うプログラムでいうと、Linuxのユーザログイン(login)や、ユーザ切替(su)でも、PAMの仕組みが利用されている。

 

2.PAMを使ったユーザログインの流れ

ここでは、PAMを利用した、ユーザログインの流れを詳しく見ていきたい。

 

①ログイン要求が、利用者から送られる

利用者から、「rootユーザとしてログインしたい」や、「testuserに切り替えたい」といった要求が送られてくる。
 
②ユーザ認証に関するアクションとして、PAMモジュールが実行される
 PAMには、利用者からの要求に応じた複数の処理タイプと、実行モジュールが用意されている。
 今回はログイン要求に関する処理タイプの、モジュールが動き、ユーザのログインを許可しても問題ないかを検証する。
 
③PAMモジュールの処理結果を踏まえて、次の処理を決める
 ②で実行されたPAMのモジュールは、処理結果(成功or失敗)を返すようになっている。結果によって、次に行う処理が決められる。次に行う処理とは、例えば、さらに検証を行うために他のPAMモジュールを呼び出す、利用者のログインを許可/拒否する、といったことである。
 
場合によって②と③が繰り返され、最終的に、ユーザのログインが許可または拒否される。

 

 

3.PAM関連のファイルを見てみる

2.PAMを使ったユーザログインの流れ」で説明したようなログインの流れや、その他各種ユーザ認証・管理において、

どのPAMモジュールを利用するかや、モジュール実行後の処理決定方式を設定するため、

設定ファイルが用意されている。

 

設定ファイルおよびディレクトリの配置場所は以下である。

ディレクトリ:  /etc/pam.d

ファイル:    /etc/pam.conf 

 

基本は/etc/pam.confに設定するが、/etc/pam.dディレクトリが存在するときは、その配下にある設定ファイルが優先される。

なお、CentOS8では、デフォルトで/etc/pam.d配下に多数のファイルが配置されており、

/etc/pam.confファイルは中身の記述はあるもののすべてコメントアウトされていた。

そのため基本的には、/etc/pam.d配下を気にしておけば良さそうである。

 

ここで、PAM設定ファイルの中でもよく使うと思われる、/etc/pam.d/loginファイルの中身を確認してみる。

/etc/pam.d/loginは、ユーザ認証・管理の中でも、特にログインに関する設定を行うためのファイルである。

#%PAM-1.0
auth       substack     system-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    include      postlogin
-session   optional     pam_ck_connector.so

 

PAMのファイルの中身は、上記/etc/pam.d/loginファイルのように、1行あたり3つまたはそれ以上のパラメータが書かれているような構造となっている。

 

第一パラメータ(auth、accountなど)部分には、モジュールタイプ、またはPAMインタフェースと呼ばれる、認証アクションの種別名が渡される。

モジュールタイプには以下の4つがある。

モジュールタイプ 説明
auth ユーザ認証(パスワードの検証)
account アクセスが許可されたかを確認
password  ユーザのパスワード変更
session  ユーザセッションの設定・管理

 

2で挙げたログイン認証の場合、モジュールタイプはauthとなる。

各モジュールタイプによって、実行できるPAMモジュールが決まっている。

 

実際に実行するPAMモジュールは、第三パラメータで渡されている。

なお、第四パラメータ以降も指定されている場合は、第三パラメータのPAMモジュールに対して渡される引数が定義されているということである。

 

ややこしいのが、モジュールタイプ(第一パラメータ)と実行モジュール(第三パラメータ)の関係は、

1:多ではなく、多:多であること。

例えば、モジュールタイプがauthで実行モジュールがsystem-authであり、

モジュールタイプがaccountで、実行モジュールは同じくsystem-authであるなど。

同じモジュールを実行していても、タイプによって実際の挙動が変わってくることになる。

 


話を設定ファイルに戻すと、

各行の第二パラメータ(substack, includeなど)部分には、処理制御フラグが渡される。

処理制御フラグは、第三パラメータの実行モジュールの処理結果を踏まえて、次のアクションを決めるための役割を担っている。フラグの種類は以下の通り6種類ある。

 

処理制御フラグ 説明
required 認証を継続するには、モジュール結果が成功している必要がある。
ただし失敗しても、後続に実行予定のモジュール処理が全て終わるまでは、
利用者に結果が通知されない。
requisite 認証を継続するには、モジュール結果が成功する必要がある。
失敗した場合、ユーザーに直ちに通知される。
通知メッセージには、失敗したモジュール処理に関する情報も記載されるため、
正規利用者や開発者にとって分かりやすい一方、
攻撃者へも、どのようなモジュールで認証をしているかを知らせることになる。
sufficient モジュール結果は失敗しても無視される。
ただし結果が成功しており、
かつrequired フラグが付いたモジュールがそれまでに失敗していなければ、
さらに他のモジュール処理があってもユーザ認証される。
optional モジュール結果は無視される。
他のモジュール処理がないような処理のときに、認証成功のために
便宜的に必要となるフラグ。
include モジュール結果の処理には関係しないフラグ。
第三パラメータで指定されたPAMモジュール内のパラメータのうち、
第一パラメータで指定されたモジュールタイプと合致するもの全てを、
パラメータに追加する。

例: /etc/pam.d/login に以下が記載されていた場合
    session    include      system-auth
→system-authというPAMモジュールファイルに記載のある各行のうち、
モジュールタイプがsessionの行すべてを、
/etc/pam.d/loginにも適用するという意味になる。
substack includeとほぼ同じだが、
includeでは第三パラメータで指定したPAMモジュールの記載内容を
そのまま持ってくるだけなのに対し、
substackでは指定したPAMモジュール内で処理を実行し、
結果だけを持ってくるという違いがある。


設定ファイルの構造自体はかなりシンプルだが、

その裏で動いているPAMモジュールはかなり複雑そうである…。

 

4.PAMファイル設定の注意点

設定ファイルは、少なくともRedHatでの直接編集は非推奨となっており、
authconfigコマンドを利用することが推奨されている。
また、設定を間違えると、rootユーザでさえもログインできなくなる場合もあるので、設定の際にはご注意を。
 

 

今回は以上!