日期--不允许用户 www-data 设置

日期--不允许用户 www-data 设置

我在 Debian GNU/Linux 7.5 (wheezy) 上运行 lighttpd 服务器,并想使用 php 网页来更改系统时间(我知道我可以只更改页面的时间,但这不是这个项目所需要的)。现在我使用命令exec()直接发出命令并运行 shell 脚本。因此,要么:

exec('date --set [HH:MM:SS]')

或者

exec("sh /full/file/path/updateTime.sh") //contains command 'date --set [HH:MM:SS]'

如果我在命令行上将用户切换到 www-data 并尝试运行 date 命令,我会收到响应“date:无法设置日期:操作不允许”。

如果我以 root 身份运行 shell 脚本,该脚本将成功运行。

如果我提供第二个参数来exec()保存响应,它包含我尝试设置的日期/时间信息。

我也尝试编辑 sudoers 来添加

www-data        ALL=(ALL:ALL) ALL

user privilege specificationincludedir /etc/sudoers.d没有任何变化。我还尝试创建 Cmnd 别名规范/bin/date并将其添加到 www-data 用户,没有任何变化。

我对所涉及的所有事情都很不熟悉,因此如果能提供任何帮助我都会很感激。

该网站不会上线,但我知道接受用户的 shell 命令会带来危险。我检查了文件php.ini以确保该exec()命令未被禁用。我尝试将 shell 脚本的所有权交给/var/www/www-data,没有任何变化。权限目前设置为 777。

答案1

如果 www-data 在 sudoers 文件中,您会声明该sudo命令不需要密码,因为 www-data 无法输入密码。

sudoers 条目应该是www-data ALL=(ALL:ALL) NOPASSWD: ALL

那么您需要运行sudo date --set [HH:MM:SS]而不是仅仅运行date --set [HH:MM:SS]

www-data 永远不应该拥有sudo权限,除非你只是在测试服务器上使用它进行个人开发。这是一个很大的安全漏洞。

编辑:看一下这个问题,它类似php exec() 中的 sudo

答案2

这是另一种方法:

  • 在合理安全的位置创建一个 FIFO(命名管道) — — 任何不可被世界写入的地方都应该是可以的。 
  • 使其归 拥有www-data,模式 600。或者 200 应该可以工作。
  • 每次 PHP 应用程序想要更改系统时间时,都会将新时间写入 FIFO。
  • 让守护进程以 root 身份运行,从 FIFO 读取数据。当它读取正确格式的时间时,让它设置系统时钟。

无需打扰sudo。如果有人闯入您的系统,最糟糕的情况www-data 是他可以将时间更改写入 FIFO 并导致守护进程更改时间。攻击者能够提升其权限似乎几乎是不可能的root (除非您在守护进程中创建漏洞)。

相关内容