セキュリティ関係の話題が多い昨今、パスワードの管理で頭を悩ませている方もいるのではないでしょうか?
今回は、特別な機器を用いずに、シェルスクリプトとメールでサーバのワンタイムパスワードを実装してみたので、それを紹介します。
一時的に外部の人へアカウントを貸与する場合が多い場合などに、役に立つことと思います。
仕組みとしては、
①常時ログを監視
②ログにログインメッセージが出力されたときに、そのユーザのパスワードを変更する。
③パスワードが書かれたファイルを固定パスワードつきzip圧縮して、メールに添付して管理者に送信する。
といった、簡単なものです。
確認した環境は、CentOS5.0です。
外部にメールを送信できる環境が必要です。
また、expectがあると便利です。(#yum install expect などで入手できます。)
expectは、ランダムパスワードを生成するために使っているだけなので、なくても他のツールで代用可能です。
今回は、特別な機器を用いずに、シェルスクリプトとメールでサーバのワンタイムパスワードを実装してみたので、それを紹介します。
一時的に外部の人へアカウントを貸与する場合が多い場合などに、役に立つことと思います。
仕組みとしては、
①常時ログを監視
②ログにログインメッセージが出力されたときに、そのユーザのパスワードを変更する。
③パスワードが書かれたファイルを固定パスワードつきzip圧縮して、メールに添付して管理者に送信する。
といった、簡単なものです。
確認した環境は、CentOS5.0です。
外部にメールを送信できる環境が必要です。
また、expectがあると便利です。(#yum install expect などで入手できます。)
expectは、ランダムパスワードを生成するために使っているだけなので、なくても他のツールで代用可能です。
まず、パスワードを生成してメールを送信するスクリプトのソースを記載します。
引数:
$1:変更対象ユーザ名
$2:変更後パスワードメール送信先
$3:zipファイルパスワード
このスクリプト名を仮にonetime_passwd.shとします。
これを以前紹介したログ監視スクリプトに組み込みます。
https://lab.hde.co.jp/2008/04/tail.html#more
以下の例は、sshログインをチェックしてパスワードを変更するスクリプトです。
rootでスクリプトを起動するとsshログインがあった際に、自動でパスワードを変更し、root@example.comに変更後のパスワードを送信してくれるようになります。
# ssh_login_check.sh /var/log/secure root@example.com &
引数:
$1:変更対象ユーザ名
$2:変更後パスワードメール送信先
$3:zipファイルパスワード
#!/bin/bash
#引数のチェック
if [ $# -ne 3 ];then
echo "PASSWD CHENGE FAILED" >>/var/log/pass_change.log
exit
fi
#変更ユーザ名
user_name=$1
#メール送信先
mail_to=$2
#zipパスワード
pass=$3
#プロセスナンバーの取得
proc_num=$$
#ランダムパスワード(10文字)作成
#mkpasswd(expect)がなければ、
#password=`openssl passwd -1 ${RANDOM}|cut -b25- `
#などでも、ある程度の強度があるパスワード(10文字)が作成できます。
password=`/usr/bin/mkpasswd -l 10`
#作成したパスワードをmd5でエンコードする。
basepass=`/usr/bin/openssl passwd -1 ${password}`
#エンコードしたパスワードを変更対象のユーザのパスワードとしてセットする。
/usr/sbin/usermod -p $basepass $user_name
#作成したパスワードをファイルに書き込む
echo -n $password > ${proc_num}.txt
#パスワードを格納したファイルを$3で指定されたパスワード付きでzip圧縮する。
zip -P $pass ${proc_num}.zip ${proc_num}.txt > /dev/null 2>&1
#ヘッダ部分の書き込み
echo "From: PASSWDDAEMON
To:${mail_to}
Subject:${user_name}'s newpasswd
Content-Type:application/octet-stream
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename=\"${user_name}password.zip\"
"> ${proc_num}.body
#zipファイルを添付ファイルとして書き込み
cat ${proc_num}.zip | /usr/bin/openssl enc -e -base64 >> ${proc_num}.body
#作成したメールを$2で指定されたメールアドレスへ送信する。
cat ${proc_num}.body | /usr/sbin/sendmail -- $mail_to
#作成したファイルを削除する。
rm -f ${proc_num}.*
exit 0
このスクリプト名を仮にonetime_passwd.shとします。
これを以前紹介したログ監視スクリプトに組み込みます。
https://lab.hde.co.jp/2008/04/tail.html#more
以下の例は、sshログインをチェックしてパスワードを変更するスクリプトです。
【サンプル:ssh_login_check】
#!/bin/sh
mail_alert() {
while read i
do
#ログインチェック(※)
echo $i |grep -i -ve Invalid -ve failure -ev error | grep -q "Accepted password for"
if [ $? = "0" ];then
#ユーザ名取得
user_name=`echo $i |awk '{print $9}'`
#user_nameがuser_listに書いてあるパターンにマッチしたとき、onetime_passwd.shを起動
( echo $user_name | grep -f user.list ) && onetime_passwd.sh $user_name $2 password
fi
done
}
tail -n 0 --follow=name --retry $1 | mail_alert
rootでスクリプトを起動するとsshログインがあった際に、自動でパスワードを変更し、root@example.comに変更後のパスワードを送信してくれるようになります。
# ssh_login_check.sh /var/log/secure root@example.com &
Leave a comment