|||||||||||||||||||||

なんぶ電子

- 更新: 

DebianのPAM認証

PAM setting file

DebianにおいてPAM認証はユーザー管理の一元化には便利なものですがその構造に慣れるまでが難しいです。また使わなくなると忘れがちです、そこでここに覚書を残しておきます。合わせて、独自のPAM認証をしたいときに利用できるPAM-SCRIPTについても使用例を掲載しています。

PAMの書式

PAMのリストの書式は次のようになります。

[PAMモジュールインターフェース] [コントロールフラグ] [PAMモジュール名] [引数]

PAMモジュールインターフェース

「PAMモジュールインターフェース」には次のものがあります。

  • auth

    指定されたモジュールで認証します。

  • account

    アカウントの期限切れなどをチェックします。authとセットで用います。

  • password

    パスワード変更時などに用いられます。

  • session

    認証前後のセッションのopen、close時に用いられます。

コントロールフラグ

複数のモジュールを指定できるPAMでは、モジュール名とともにコントロールフラグも付与します。これらの機構により、たとえば、失敗したら次の認証方法を試すといったことが実現可能です。

  • required

    これで指定された認証項目のうち一つでも失敗すると、指定された認証は失敗します。ただし、認証が失敗に終わっても、以降の処理を続けます。

  • requistite

    requiredとほぼ同じですが、失敗すると一連の処理を終了します。

  • sufficient

    これ以前の認証が成功していて、ここで指定される認証も成功すると以降の認証はされずに成功となります。失敗時は次で説明するoptionalでエラーとなった際と同じ取り扱いになります。

  • optional

    他に認証が指定されていない場合はこの値が認証結果となり、認証が他に存在する場合はこの結果は無視されます。

  • [success=n default=ignore]

    nには数値が入ります。成功した時の読み飛ばし行数を指定できます。これにより、どちらかが成立した際にどちらかの認証をしないといった運用が可能になります。defaultはデフォルトの挙動です。先に指定した条件にあてはまらなかった場合(ここではsuccessでなかった場合)の処理を記載します。ignoreにしておくと結果を無視します。この設定では、結果がsuccessなら次のn行の処理を読み飛ばし、失敗なら(successでない場合なら)、「結果を無視」し、次の行に進みます。

    他=に設定できる値として、成功として終了する「done」や、失敗として終了する「die」などがあります。

  • include

    引数で指定されたファイルにしたがった処理をします。ファイル内の書式は上記の内容となります。

  • substack

    includeとほぼ同じですが、こちらを使うとファイル内で処理が完結となります。つまりファイル内での結果が認証の結果となります。

ここで書かれている処理の継続や終了は、PAMインターフェース毎の話です。

requiredがすぐに結果を返さない理由

requiredでチェックが行われたとき直列化されているどれか一つがエラーになれば認証は失敗となるのになぜ処理を継続するかという理由ですが、この一つにセキュリティの問題があります。不正アクセスの手法に、複数のモジュールを利用する認証のレスポンスまでにかかる時間から認証状況を判断するというものがあります。そのため認証ではエラーの際はどこでエラーになっても同様のレスポンスをすることが理想とされています。その為認証失敗の際でも他の処理を実行しレスポンスタイムの均一化をさせます。

PAMの種類

Debianにおいては、/usr/lib/[アーキテクチャ]/securityディレクトリの中にPAMのライブラリがあります。これらのファイルはpam_から始まり.soで終わります。

インストールされていないものを探す際は、apt search libpamとすると、libpamから始まるPAMのライブラリが検索できます。

その中にはlibpam-mysqlや、libpam-ldapといったライブラリがあると思います。

使用例

ここではpam_unixとpam_listfile使った認証を設定したいと思います。どちらも初期状態でDebianに存在するライブラリだと思います。pam_unixはOSのユーザー認証、pam_listfileはファイルによる認証です。

dovecotというPOPサーバーがインストールしてあり、そのメールアカウントを持っているユーザのみを認証させるケースを設定します。

# nano /etc/pam.d/dovecot
auth requistite pam_unix.so
auth require pam_listfile.so item=user sense=allow file=/etc/.../dovecotusers onerr=succeed
...

pam_unix.soはOSのユーザー認証です。今回はユーザーの管理はOSで一元管理したいと思っているので、まずOSでの認証を必須とします。

次にユーザーリストによる判断をします。OSにはメールボックスを保持していないユーザー、例えばFTP専用のアカウントなども登録されていますので、それを除外するためにユーザーのリストによる制限をします。ユーザーリストによる制限はpam_listfileが使えます。

pam_listfileの引数ですが、まずitemによって後で示されるリストと何を照合するか指定します。ここではユーザー名なのでuserとします。senseではリストが許可リスト(allow)なのか拒否リスト(deny)なのかを指定します。fileにはリストへのパスを指定します。onerrではファイルがオープンできないとき失敗(fail)にするか成功(succeed)にするか設定します。セキュリティと使い勝手のどちらを優先するかという運用に値は左右されると思いますがここではsucceedを指定しました。

あとはfileに指定しするファイルには次のようにユーザー名を一行ずつ記載しておきます。

user01
user02
...

PAMでオリジナルの認証をしたい場合

pam-scriptというPAMライブラリがあります。このライブラリはPAMからスクリプトを呼び出すことができます。呼び出した独自のスクリプトから0が返ると成功とし、1が返ると失敗となります。

またこの機能を応用して、認証とは直接関係のないスクリプトを動かすこともできます。

この機能を利用する場合はPAMライブラリを追加します。

# apt install libpam-script
...

インストールしたら、/usr/share/libpam-script/pam-script.d/ディレクトリに、名前がわかるようにサブディレクトリを作成し、その中にpam_script_authという実行権限のあるファイルを作成し、スクリプトを記述します。

このファイル名はあらかじめ決められていてauthの時に実行するスクリプトならpam_script_auth、account時ならpam_script_acctという名前になります。詳しくはDebian:PAM-SCRIPT(7)をご確認ください。

作成したスクリプトを呼び出すためのPAMファイルの記述例は次のようになります。ファイル名はPAMインターフェースによって決まるのでディレクトリ名だけで指定します。

ファイルが存在しなかったり、オープンできなかった場合の結果をonerrに設定します。

auth required pam_script.so onerr=success dir=/usr/share/libpam-script/pam-script.d/dirname
...

公式のページにも記述はどこにも見つからなかったので他の設定の影響かもしれませんが、筆者の環境では、ここで設定するpam_script_authスクリプトファイルの所有権はroot、権限は711か755にしないと稼働しませんでした。777では不可でした。ver:1.1.9-4で確認しました。

pam_scriptをインストールすると/pam.d/内のcommon-の接頭がついたファイルにpam_scriptでの認証を加えてしまうようです。不要ならコメントアウトしましょう。そうしないとセッションのオープンやクローズ、rootをとったりする際にもpam_scriptが動いてしまいます。

筆者紹介


自分の写真
がーふぁ、とか、ふぃんてっく、とか世の中すっかりハイテクになってしまいました。プログラムのコーディングに触れることもある筆者ですが、自分の作業は硯と筆で文字をかいているみたいな古臭いものだと思っています。 今やこんな風にブログを書くことすらAIにとって代わられそうなほど技術は進んでいます。 生活やビジネスでPCを活用しようとするとき、そんな第一線の技術と比べてしまうとやる気が失せてしまいがちですが、おいしいお惣菜をネットで注文できる時代でも、手作りの味はすたれていません。 提示されたもの(アプリ)に自分を合わせるのでなく、自分の活動にあったアプリを作る。それがPC活用の基本なんじゃなかと思います。 そんな意見に同調していただける方向けにLinuxのDebianOSをはじめとした基本無料のアプリの使い方を紹介できたらなと考えています。

広告