Linuxでscpやsshの利用開始時やログイン/ログアウト時、その他認証時などに任意のスクリプトやプログラムを実行する方法です。
PAMのスクリプトモジュール PAM-scriptを使用します。
PAMモジュールなので、認証時に限らず、パスワード変更時などでもスクリプトやプログラムを実行できます。
インストール
必要パッケージをインストールしておきます。
CentOSの場合 yum install pam-devel Ubuntuの場合 apt-get install libpam0g-dev
ソースを以下からダウンロードします。
http://sourceforge.jp/projects/sfnet_pam-script/downloads/pam-script-1.1.6.tar.gz/
makeし、インストールします。
なお、下記 /opt/scripts はsshでのログイン時など、認証時に実行するスクリプトやプログラムの置き場所です。
任意のディレクトリで構いませんので、必要に合わせて変更して下さい。
tar zxvf pam-script-1.1.6.tar.gz cd pam-script-1.1.6 ./configure --sysconfdir=/opt/scripts make mkdir -p /opt/scripts cp .libs/pam_script.so /lib64/security/ (/lib64 が無い場合は cp .libs/pam_script.so /lib/security/)
使い方(サンプル:ssh接続/切断時に実行するスクリプトやプログラムを実行する)
PAM-script はPAMモジュールなので、使用にはPAMの知識が必要です。
ここでは、とりあえずサンプルとして、ssh接続/切断時にスクリプトやプログラムを実行する方法を説明します。
接続/切断時には、インストール時に –sysconfdirオプションで指定したディレクトリ下の pam_script_ses_open , pam_script_ses_close が実行されます。
そこで、pam_script_ses_open , pam_script_ses_close を用意します。
また、pam_script_ses_open , pam_script_ses_close には実行権限を付けておいてください。
/opt/scripts/pam_script_ses_open
#! /bin/bash -p echo SESSION-OPEN,$PAM_SERVICE,$PAM_TYPE,$PAM_USER,$PAM_RHOST,$PAM_TTY >> /tmp/pam.log exit 0
/opt/scripts/pam_script_ses_close
#! /bin/bash -p echo SESSION-CLOSE,$PAM_SERVICE,$PAM_TYPE,$PAM_USER,$PAM_RHOST,$PAM_TTY >> /tmp/pam.log exit 0
実行権限設定
chmod +x /opt/scripts/*
任意のスクリプト/プログラムを実行する場合は、それらに対してシンボリックリンクを張り、リンク名を pam_script_ses_open , pam_script_ses_close として下さい。
ln -s 任意のスクリプトやプログラム /opt/scripts/pam_script_ses_open ln -s 任意のスクリプトやプログラム /opt/scripts/pam_script_ses_close
次に、/etc/pam.d/sshd の末尾に以下を追加します。
/etc/pam.d/sshd
session required pam_script.so onerr=success
onerr=success の記述は重要です。
pam_script_ses_open , pam_script_ses_close に記述ミスをしていた場合でも、ssh接続/切断処理を継続します。
これが無いと、記述ミスがあった場合、接続が出来なくなってしまいます。
これで、sshで接続時に pam_script_ses_open が実行、切断時には pam_script_ses_close が実行されます。
上記サンプルでは、接続・切断時に /tmp/pam.log に記録されますので、確認してみて下さい。
なお、pam_script_ses_open , pam_script_ses_close が呼ばれた際には、PAM-scriptで環境変数に下記を設定していますので、スクリプトやプログラムからユーザ名などが取得できます。
PAM_SERVICE | サービス名。ssh経由だと、sshd となります。 |
PAM_TYPE | auth/account/passwd/sessionいずれかになります。本サンプルではsessionになります。 |
PAM_USER | ユーザ名 |
PAM_RHOST | リモートホスト名 |
PAM_TTY | TTY名 |
注意
CentOSでSELinuxが有効になっていると、pam_script_ses_open等の実行が失敗することがあります。
とりあえず動作を確認する場合は、SELinuxを一時的に無効にして試してください。
一時的に無効にするには、
setenforce 0
を実行してください。
使い方(詳細)
上記で説明を一部省略しましたので、残りを説明します。
PAM設定ファイルに記述するモジュールタイプは4つありますが、タイプ毎に PAM-scriptから呼び出されるファイルが異なります。
呼び出されるファイルは次のものになります。
なお、ファイルは、インストール時に –sysconfdirオプションで指定したディレクトリ下のものが実行されます。
モジュールタイプ | 呼び出されるファイル |
---|---|
auth | pam_script_auth |
account | pam_script_acct |
password | pam_script_passwd |
session | pam_script_ses_open , pam_script_ses_close |
ファイルが呼び出された際、PAM-scriptでは下記環境変数を設定しており、スクリプトやプログラムから取得できます。
但し、サービスやモジュールタイプにより、設定されない環境変数名もあります。
環境変数名 | 説明 |
---|---|
PAM_SERVICE | サービス名。ssh経由だと、sshd となります。 |
PAM_TYPE | モジュールタイプ。auth/account/passwd/sessionいずれかになります。 |
PAM_USER | ユーザ名 |
PAM_RUSER | リモートユーザ名 |
PAM_RHOST | リモートホスト名 |
PAM_TTY | TTY名 |
PAM_AUTHTOK | パスワード変更時の変更後パスワード |
PAM_OLDAUTHTOK | パスワード変更時の変更前パスワード |
以下は、パスワード変更時にスクリプトを実行するサンプルです。
/etc/pam.d/passwd
password required pam_script.so onerr=success
/opt/scripts/pam_script_passwd
#! /bin/bash -p echo $PAM_SERVICE $PAM_TYPE $PAM_USER $PAM_TTY $PAM_AUTHTOK $PAM_OLDAUTHTOK >> /tmp/pam.log exit 0
この状態で、ユーザ user001 でパスワードを old_password から new_password に変更すると、/tmp/pam.log には次の1行が追加されます。
passwd password user001 pts/2 new_password old_password
コメント