最佳实践:从PHP站点管理系统程序
我正在开发一个VPN注册站点,它是用PHP编写的,运行在VPN服务器运行的同一台Ubuntu服务器上。它允许用户注册VPN服务,但目前它只是通过电子邮件向支持人员发送他们的信息,他们可以手动编辑服务器上的配置文件。我使用PPP来处理身份验证,因此我有一个包含如下信息的文件:最佳实践:从PHP站点管理系统程序,php,ubuntu,Php,Ubuntu,我正在开发一个VPN注册站点,它是用PHP编写的,运行在VPN服务器运行的同一台Ubuntu服务器上。它允许用户注册VPN服务,但目前它只是通过电子邮件向支持人员发送他们的信息,他们可以手动编辑服务器上的配置文件。我使用PPP来处理身份验证,因此我有一个包含如下信息的文件: # user server password ip test l2tpd testpassword * 为了将新用户添加到VPN服务中,必须
# user server password ip
test l2tpd testpassword *
为了将新用户添加到VPN服务中,必须将其详细信息附加到上表中,并且命令
sudo /etc/init.d/xl2tpd restart
运行以应用新更改。我想做的是使这个过程自动化。据我所知,有两种选择。一种是创建一个shell脚本,然后使用shell_exec('./adduser testpassword')代码>。另一种方法是直接在PHP中完成,方法是打开文件,修改文件,然后再次保存
从安全性和速度的角度来看,哪种方法更好,还是有另一种我没有想到的方法?sudo
可以配置为仅为特定用户执行特定命令,因此修改sudoers
文件意味着您可以以更安全的方式使用sudo来执行特定命令
您可以将其与包装器脚本相结合,以便php只执行具有有限权限的本地化脚本
因此,我们称之为“restart_auth.sh”的包装器脚本可能包含:
#!/bin/sh
sudo /etc/init.d/xl2tpd restart
然后从php中shell\u exec('restart\u 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\u exec()
行上传递数据。但是,这仍然会引入不安全性,因此确保写入文件的值未被篡改是最重要的
此外,即使作为cron作业,也不要将完整脚本作为root运行,而是使用与sudoers相同的方法,只允许运行的脚本作为root执行特定命令。例如,您可以允许sudo“cat changes.txt>>auth_file”
我将它们全部添加到一个“挂起”数据库表中,然后每小时执行一次cron脚本以拉出挂起的,附加到现有配置文件的末尾,保存,重新启动守护进程。以root用户身份运行cron,使其与web前端隔离,并让您的客户知道他们的vpn将在一小时内准备就绪,他们将收到确认完成的电子邮件。在注册和更改vpn用户之间确实需要一堵墙。您是否需要对新用户进行任何身份验证或背景检查?sudo
不需要密码吗?@RichardChambers通常不需要。一旦用户注册并验证了他们的电子邮件,我们会将他们带到一个计划选择页面,在收到我们的支付提供商的支付确认回调后,我们通常会手动创建他们的帐户,这是我们希望避免的步骤。这看起来是一个不错的选择。