シェルスクリプトでワンタイムパスワードを実装

| | Comments (0) | TrackBacks (0)
 セキュリティ関係の話題が多い昨今、パスワードの管理で頭を悩ませている方もいるのではないでしょうか?

 今回は、特別な機器を用いずに、シェルスクリプトとメールでサーバのワンタイムパスワードを実装してみたので、それを紹介します。
 一時的に外部の人へアカウントを貸与する場合が多い場合などに、役に立つことと思います。

 仕組みとしては、
 ①常時ログを監視
 ②ログにログインメッセージが出力されたときに、そのユーザのパスワードを変更する。
 ③パスワードが書かれたファイルを固定パスワードつきzip圧縮して、メールに添付して管理者に送信する。
 といった、簡単なものです。
 確認した環境は、CentOS5.0です。
 外部にメールを送信できる環境が必要です。
 また、expectがあると便利です。(#yum install expect などで入手できます。)
  expectは、ランダムパスワードを生成するために使っているだけなので、なくても他のツールで代用可能です。


 まず、パスワードを生成してメールを送信するスクリプトのソースを記載します。
 
 引数:
 $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とします。

これを以前紹介したログ監視スクリプトに組み込みます。
http://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 &
 

0 TrackBacks

Listed below are links to blogs that reference this entry: シェルスクリプトでワンタイムパスワードを実装.

TrackBack URL for this entry: http://lab.hde.co.jp/blog/mt-tb.cgi/50

Leave a comment

About this Entry

This page contains a single entry by shiota published on July 22, 2008 3:00 PM.

開発合宿を行いました was the previous entry in this blog.

日経225のSPF対応状況(2008年7月) is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.