有关从php访问影子密码文件的安全问题

我在php写这个函数来检查用户/通过在Linux服务器上的帐户。 它工作正常,但我担心一点关于安全。

/* Need to add www-data to group shadow (and restart apache) $ sudo adduser www-data shadow $ sudo /etc/init.d/apache2 restart Needs whois to be installed to run mkpasswd $ sudo apt-get install whois Assumes that sha-512 is used in shadow file */ function authenticate($user, $pass){ // run shell command to output shadow file, and extract line for $user // then split the shadow line by $ or : to get component parts // store in $shad as array $shad = preg_split("/[$:]/",`cat /etc/shadow | grep "^$user\:"`); // use mkpasswd command to generate shadow line passing $pass and $shad[3] (salt) // split the result into component parts and store in array $mkps $mkps = preg_split("/[$:]/",trim(`mkpasswd -m sha-512 $pass $shad[3]`)); // compare the shadow file hashed password with generated hashed password and return return ($shad[4] == $mkps[3]); } // usage... if(authenticate('myUsername','myPassword')){ // logged in } else { // not valid user } 
  1. 添加www-data到组影将在内部networking的专用服务器上有很大的安全风险吗? (我意识到,在共享主机服务器上,它可以让黑客使用salt值破解其他用户的密码)

  2. 我正在使用的方法是否还有其他安全问题?

  3. 任何build议,使其更可靠?

我并不十分熟悉影子团队的工作方式,但是让PHP访问它听起来真的很危险 – 一个include打电话的PHP脚本可能会让攻击者得到/etc/shadow的内容。 虽然这不等于获得root访问权限,但是将加密的密码公开仍然是讨厌的。

如果没有本地Unix / Linux命令可以验证可以选择性运行的用户,我想你的想法

我尝试的另一种方法 – 也是这样做的,就是制作一个使用su作为用户登录的shell脚本,并且返回一个0的退出码以获得成功。 这可以在PHP文件中调用。

听起来好多了,因为它不需要开放任何更高级别的资源。 您可能需要设置某种限速,因此攻击者无法通过对其进行数千次失败的登录尝试来禁用本地用户帐户。