我正在开发一个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中执行此操作,方法是打开文件,修改文件并再次保存。
从安全性和速度的角度来看,哪种方法更好,还是还有另一种我没有想到的方法?
>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"