web-dev-qa-db-ja.com

パスワードを変更したときにスクリプトを実行します

passwdが実行されたときにカスタムコマンドを実行する方法はありますか?私はサーバーGUIを作成しています、そして私はアプリユーザーをシステムユーザーと結びつけ、そして私は単純なPAM認証を使いたくありません。だから私はユーザーとパスワードを受け取るスクリプトを実行し、それをMySQLサーバーに送信したいです。実際に私はそれを書いているので、それはいくつかのセキュリティ問題のようなものです。関係に関係なく、これは可能ですか?

2
dj_boy

誰かがpasswdを使ってinotifywaitを実行したかどうかを検出することができますが、私が知っている限りでは、このように動作を制御することはできません。

ただし、独自のサーバーでは、Real passwdプログラムをスクリプトに置き換えることができます。これは、実際のpasswdプログラムを呼び出します。これはいくつかのセキュリティリスクを暗示しているかもしれませんので、私はそうしないでしょう、そして私はすべてのリスクをリストしようとしないでしょう。それでもあなたがそのようなことをするような気がするなら、このようなexpectスクリプトは置き換えとして機能する可能性があります:

#!/usr/bin/expect

set timeout -1
set new_passwd ""

log_user 0
spawn /usr/bin/passwd.real
log_user 1

stty -echo
expect {
    -re "current.*password" {
        expect_user -re "(.*)\n"
        send "$expect_out(1,string)\n"
        exp_continue
    }
    -re "new.*password:" {
        expect_user -re "(.*)\n"
        set new_passwd $expect_out(1,string)
        send "$new_passwd\n"
        exp_continue
    }
    -re "passwd:.*unchanged" {
        set new_passwd ""
        interact
    }
    -re "passwd:.*updated successfully" {
        interact
    }
}
stty echo

if { $new_passwd != "" } {
    send_user "New password for user '$env(USER)'/'$env(LOGNAME)': $new_passwd\n"
    #system my_password_manipulation_script.sh $env(USER) $env(LOGNAME) $new_passwd
}

passwdpasswd.realを名前変更した後、このスクリプトを/usr/bin/passwdに配置し、通常の実行権限(0755)にします。このスクリプトは実数passwdプログラムのフロントエンドであるため、SUIDビットは必要ではありません(そして別のセキュリティ上の問題になる)。

このスクリプトはDebian Jessie(8.4)で動作します。他のシステムでは、マッチングキーワードを調整する必要がある場合があります(現在の*パスワード、新規。*パスワードなど)。また、最後のSend_User行をコメントアウトし、システムコールのコメントを外し、実際にパスワードを伝播します。

もう一度:これを行う前に、すべてのセキュリティの影響を検討してみてください。また、おそらくあなたのパスワードを暗号化しないようにすることができるかもしれないことがおそらく知っているべきです。あなたが例えばこのスクリプトを保存した場合、それはNicerになるでしょう。 mypasswd(そしてそれはpasswdを生成する)をmypasswdを使ってパスワードの変更をユーザーに依頼しました。これはそれを明確にするでしょう、それらはオリジナルpasswdを使用していないことです。

1
Zoltan Peller