关于从php访问shadow密码文件的安全问题

时间:2011-10-30 10:46:29

标签: php linux user-accounts

我在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数据是否会对内部网络上的专用服务器造成很大的安全风险? (我意识到在共享托管服务器上它可能让黑客有机会使用salt值来破解其他用户的密码)

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

  3. 有什么建议让它更可靠吗?

1 个答案:

答案 0 :(得分:1)

我对影子组的工作方式并不十分熟悉,但让PHP访问它听起来非常危险 - 一个带有include调用失败的PHP脚本可能会使攻击者获得/etc/shadow的内容。虽然这不等于获得root访问权限,但当然加密密码仍然是令人讨厌的。

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

  

我尝试的另一种方式 - 也可以使用su来创建一个使用su以用户身份登录的shell脚本,并返回退出代码0以获得成功。然后可以从php文件中调用它。

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