Linuxでscpの利用開始時やログイン/ログアウト時などに任意のスクリプトやプログラムを実行する

ALL
スポンサーリンク

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

参考

PAM-script プロジェクト日本語トップページ

コメント