密码更改时运行脚本

密码更改时运行脚本

有没有办法在passwd执行时运行自定义命令?我正在创建一个服务器 GUI,我想将应用程序用户与系统用户绑定在一起,而且,我不想只使用普通的 PAM Auth。所以我想运行一个脚本来接收用户和密码,并将其发送到 Mysql 服务器。实际上,现在我把它写出来,这似乎是一个安全问题。无论如何,这可能吗?

答案1

您可以检测是否有人passwd使用运行inotifywait,但据我所知,您无法通过这种方式控制其行为。

但是,在您自己的服务器上,您可以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
}

重命名passwd为后passwd.real,您可以将此脚本放入/usr/bin/passwd并赋予其正常运行权限 (0755)。Suid 位不是必需的(并且会是另一个安全问题),因为此脚本只是实际passwd程序的前端。

该脚本适用于 Debian Jessie (8.4),在其他系统上,您可能需要调整匹配的关键字(current.*password、new.*password 等)。此外,您还需要注释掉最后一行 send_user,并取消注释您实际传播密码的系统调用。

再次强调:在执行此操作之前,请尝试考虑所有安全隐患!此外,您的用户可能应该知道,您可能能够解密他们的密码。如果您将此脚本保存为例如mypasswd(然后它会生成passwd),并要求您的用户使用更改密码,也许会更好mypasswd。这将清楚地表明他们没有使用原始的passwd

相关内容