Linux で PAM を構成して使用する方法
Linux-PAM (Unix-PAM アーキテクチャから進化した Pluggable Authentication Modules の略) は、アプリケーション (またはサービス) に対してユーザーを動的に認証するために使用される強力な共有ライブラリのスイートです。 ) Linux システムでは。
複数の下位認証モジュールを高レベル API に統合し、アプリケーションに動的な認証サポートを提供します。これにより、開発者は、基盤となる認証システムとは独立して、認証を必要とするアプリケーションを作成できるようになります。
最新の Linux ディストリビューションの多くは、Linux-PAM (以下「PAM 」と呼びます) をデフォルトでサポートしています。この記事では、Ubuntu およびCentOS システムで高度なPAM を構成する方法について説明します。
先に進む前に、次の点に注意してください。
- システム管理者として最も重要なことは、アプリケーション (サービス) と実際の認証タスクを実行するプラグ可能認証モジュール (PAM) との間の接続を PAM 構成ファイルで定義する方法を習得することです。必ずしも PAM の内部動作を理解する必要はありません。
- PAM は、Linux システムのセキュリティを大きく変える可能性があります。構成を誤ると、システムへのアクセスが部分的または完全に無効になる可能性があります。たとえば、/etc/pam.d/* や /etc/pam.conf の下にある設定ファイルを誤って削除すると、ユーザーはアクセスできなくなる可能性があります。独自のシステム!
プログラムが PAM 対応であることを確認する方法
PAM を採用するには、アプリケーション/プログラムが「PAM 対応」である必要があります。 PAM を使用するために特別に記述およびコンパイルされている必要があります。プログラムが「PAM 対応」かどうかを確認するには、ldd コマンドを使用して PAM ライブラリでコンパイルされているかどうかを確認します。
たとえば、sshd:
sudo ldd /usr/sbin/sshd | grep libpam.so
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007effddbe2000)
Linux で PAM を構成する方法
PAM の主な設定ファイルは /etc/pam.conf で、/etc/pam.d/ ディレクトリには次の PAM 設定ファイルが含まれています。各 PAM 対応アプリケーション/サービス。ディレクトリが存在する場合、PAM はファイルを無視します。
主な設定ファイルの構文は次のとおりです。このファイルは 1 行で記述されたルールのリストで構成され (“\ ”
エスケープ文字を使用してルールを拡張できます)、コメントの前には “# ”
が付けられます。マークを付けて次の行末まで延長します。
各ルールの形式は、スペースで区切られたトークンのコレクションです (最初の 3 つは大文字と小文字が区別されません)。これらのトークンについては後続のセクションで説明します。
service type control-flag module module-arguments
どこ :
- サービス: 実際のアプリケーション名。
- タイプ: モジュールのタイプ/コンテキスト/インターフェイス。
- 制御フラグ: モジュールが認証タスクに失敗した場合の PAM-API の動作を示します。
- モジュール: PAM の絶対ファイル名または相対パス名。
- モジュール引数: モジュールの動作を制御するためのトークンのスペース区切りのリスト。
/etc/pam.d/ 内の各ファイルの構文はメイン ファイルの構文と似ており、次の形式の行で構成されます。
type control-flag module module-arguments
これは、/etc/pam.d/sshd ファイルにあるルール定義 (モジュール引数なし) の例です。これは、/etc/nologin の場合に root 以外のログインを禁止します。strong> が存在します:
account required pam_nologin.so
PAM 管理グループと制御フラグについて
PAM 認証タスクは 4 つの独立した管理グループに分かれています。これらのグループは、制限されたサービスに対する一般的なユーザーのリクエストのさまざまな側面を管理します。
モジュールは、次のいずれかの管理グループ タイプに関連付けられます。
- アカウント: アカウント検証のためのサービスを提供します: ユーザーのパスワードの有効期限が切れていますか?;このユーザーは、要求されたサービスへのアクセスを許可されていますか?
- 認証: ユーザーを認証し、ユーザー資格情報を設定します。
- パスワード: ユーザー パスワードの更新を担当し、認証モジュールと連携します。
- セッション: セッションの開始時と終了時に実行されるアクションを管理します。
PAM ロード可能なオブジェクト ファイル (モジュール) は、ディレクトリに応じて /lib/security/ または /lib64/security に配置されます。建築学、建築物、建築様式。
サポートされている制御フラグは次のとおりです。
- 必須: 障害が発生すると、即座に制御がアプリケーションに戻り、最初のモジュール障害の性質が示されます。
- 必須: libpam がアプリケーションに成功を返すには、これらすべてのモジュールが成功する必要があります。
- 十分: 先行するすべてのモジュールが成功したとすると、このモジュールが成功すると、アプリケーションへの即時正常な復帰が行われます (このモジュールの失敗は無視されます)。
- オプション: 通常、このモジュールの成功または失敗は記録されません。
上記のキーワードに加えて、他に 2 つの有効な制御フラグがあります。
- インクルードとサブスタック: このコントロールへの引数として指定された構成ファイルからの指定されたタイプのすべての行を含めます。
PAM 経由で SSH サービスへの root アクセスを制限する方法
例として、PAM を使用して、SSH およびログイン プログラムを介したシステムへの root ユーザー アクセスを無効にする方法を構成します。ここでは、ログイン サービスと sshd サービスへのアクセスを制限することで、システムへの root ユーザー アクセスを無効にします。
/lib/security/pam_listfile.so モジュールを使用すると、特定のアカウントの権限を非常に柔軟に制限できます。図に示すように、/etc/pam.d/ ディレクトリにあるターゲット サービスのファイルを開いて編集します。
sudo vim /etc/pam.d/sshd
OR
sudo vim /etc/pam.d/login
このルールを両方のファイルに追加します。
auth required pam_listfile.so \
onerr=succeed item=user sense=deny file=/etc/ssh/deniedusers
上記のルールのトークンについて説明すると、次のようになります。
- auth: はモジュールのタイプ (またはコンテキスト) です。
- 必須: モジュールが使用されている場合、他のモジュールのステータスに関係なく、モジュールが合格する必要があり、そうでない場合は全体的な結果が失敗することを意味する制御フラグです。
- pam_listfile.so: は、任意のファイルに基づいてサービスを拒否または許可する方法を提供するモジュールです。
- onerr=succeed: モジュール引数。
- item=user: ファイルにリストされているものとチェックする必要があるものを指定するモジュール引数。
- sense=deny: ファイル内で見つかった場合に実行するアクションを指定するモジュール引数。項目がファイル内に見つからない場合は、逆のアクションが要求されます。
- file=/etc/ssh/deniedusers: 1 行に 1 つの項目を含むファイルを指定するモジュール引数。
次に、ファイル /etc/ssh/deniedusers を作成し、その中に root という名前を追加する必要があります。
sudo vim /etc/ssh/deniedusers
変更を保存してファイルを閉じ、必要な権限をファイルに設定します。
sudo chmod 600 /etc/ssh/deniedusers
今後、上記のルールは、/etc/ssh/deniedusers ファイルを参照し、リストされているユーザーの SSH およびログイン サービスへのアクセスを拒否するように PAM に指示します。
Linux で高度な PAM を構成する方法
より複雑な PAM ルールを記述するには、次の形式で有効な制御フラグを使用できます。
type [value1=action1 value2=action2 …] module module-arguments
ここで、valueN は、その行が定義されているモジュールで呼び出された関数からの戻りコードに対応します。サポートされている値は、オンラインの PAM 管理者ガイドで確認できます。特別な値はデフォルトであり、明示的に言及されていないすべての valueN を意味します。
actionN は次のいずれかの形式を取ることができます。
- 無視: このアクションがモジュールのスタックで使用される場合、モジュールの戻りステータスはアプリケーションが取得する戻りコードに影響しません。
- 悪い: 戻りコードがモジュールの失敗を示していると考えられることを示します。このモジュールがスタック内で最初に失敗した場合、そのステータス値がスタック全体のステータス値として使用されます。
- ダイ: 不良と同等ですが、モジュール スタックを終了し、PAM がすぐにアプリケーションに戻る可能性があります。
- ok: これは、システム管理者がこのリターン コードがモジュールのフル スタックのリターン コードに直接寄与すると考えていることを PAM に指示します。
- 完了: ok と同等ですが、モジュール スタックを終了し、PAM がすぐにアプリケーションに戻る可能性があります。
- N (符号なし整数): ok と同等ですが、スタック内の次の N モジュールを飛び越える可能性があります。
- リセット: このアクションは、モジュール スタックの状態に関するすべてのメモリをクリアし、次にスタックされたモジュールから再開します。
4 つのキーワードのそれぞれ: 必須。必須;十分な;オプションで、[...]
構文に関して同等の式を使用すると、より複雑なルールを作成できます。次のとおりです。
- 必須: [success=ok new_authtok_reqd=okignore=無視 デフォルト=bad]
- 必須: [success=ok new_authtok_reqd=okignore=ignoredefault=die]
- 十分: [success=done new_authtok_reqd=done default=ignore]
- オプション: [success=ok new_authtok_reqd=ok default=ignore]
以下は、 最新のCentOS 7 システムの例です。 /etc/pam.d/postlogin PAM ファイルから次のルールを検討してみましょう。
#%PAM-1.0
This file is auto-generated.
User changes will be destroyed the next time authconfig is run.
session [success=1 default=ignore] pam_succeed_if.so service !~ gdm* service !~ su* quiet
session [default=1] pam_lastlog.so nowtmp showfailed
session optional pam_lastlog.so silent noupdate showfailed
/etc/pam.d/smartcard-auth PAM ファイルの別の設定例を次に示します。
#%PAM-1.0
This file is auto-generated.
User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth [success=done ignore=ignore default=die] pam_pkcs11.so nodebug wait_for_card
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
password required pam_pkcs11.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
詳細については、pam.d のマニュアル ページを参照してください。
man pam.d
最後に、構成ファイルの構文とすべての PAM モジュールの包括的な説明は、Linux-PAM のドキュメントに記載されています。
まとめ
PAM は、認証に依存するプログラムが Linux システム内のアプリケーションに対してユーザーを認証できるようにする強力な高レベル API です。強力ですが、理解して使用するのは非常に困難です。
この記事では、Ubuntu と CentOS で PAM の高度な機能を構成する方法を説明しました。ご質問やコメントがございましたら、以下のフィードバック フォームをご利用ください。