我正在使用VPN注册站点,该站点是用PHP编写的,并运行在运行VPN服务器的同一个Ubuntu服务器上。它允许用户注册VPN服务,但目前只是通过电子邮件向支持人员发送信息,他们手动编辑服务器上的配置文件。我使用PPP来处理身份验证,因此我有一个包含以下信息的文件:
# user server password ip
test l2tpd testpassword *
为了将新用户添加到VPN服务,他们的详细信息必须附加到上表和命令
sudo /etc/init.d/xl2tpd restart
运行以应用新更改。我要做的是自动化该过程。据我所知,有两种选择。一种是创建一个shell脚本,然后使用shell_exec('./adduser test testpassword');
。另一种是直接在PHP中执行,打开文件,修改文件并再次保存。
从安全和速度的角度来看,哪种方法更好,还是有另一种我没有想到的方法?
答案 0 :(得分:2)
sudo
可以配置为仅针对特定用户执行特定命令,因此修改sudoers
文件意味着您可以以更安全的方式使用sudo来执行特定命令。
您可以将其与包装脚本结合使用,以便php仅执行具有有限权限的本地化脚本。
所以你的包装脚本,我们称之为'restart_auth.sh`可能包含:
#!/bin/sh
sudo /etc/init.d/xl2tpd restart
然后您将从php shell_exec('restart_auth.sh')
运行该脚本。
您可以编辑sudoers
文件,以允许脚本运行的用户(您的php用户)运行/etc/init.d/xl2tpd
。所以如果你的php用户是www_data
编辑sudoers(使用visudo
)来包含:
user host = (www_data) NOPASSWD: /etc/init.d/xl2tpd
如果没有受污染的数据(可能包含shell转义字符的未经验证的信息)被传递给shell exec命令,那么它是安全的。
正如其他人所建议的那样,将数据写入待处理列表可能会更好,然后从中读取,而不是将其传递到shell_exec()
行。然而,这仍然会带来不安全感,因此确保您写入文件的值不受污染是最重要的。
也永远不会以root身份运行完整脚本,即使是作为cron作业,而是使用与sudoers相同的方法,只允许运行脚本以root身份执行特定命令。例如,您可以允许sudo "cat changes.txt >> auth_file"