我在 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 specification
,includedir /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
(除非您在守护进程中创建漏洞)。