Я работаю над сайтом регистрации VPN, который написан на PHP и работает на том же сервере Ubuntu, на котором работает VPN-сервер. Он позволяет пользователям подписываться на услуги VPN, но в настоящее время он просто отправляет сотрудникам службы поддержки свою информацию и вручную редактирует файлы конфигурации на сервере. Я использую PPP для проверки подлинности, поэтому у меня есть файл, содержащий информацию, как показано ниже:
# user server password ip
test l2tpd testpassword *
Чтобы новый пользователь был добавлен в службу VPN, их данные должны быть добавлены к приведенной выше таблице, а команда
sudo /etc/init.d/xl2tpd restart
чтобы применить новые изменения. То, что я ищу, - автоматизировать процесс. Из того, что я могу сказать, есть два варианта. Один из них - создать сценарий оболочки, а затем использовать shell_exec('./adduser test testpassword');
, Другой - сделать это прямо в PHP, открыв файл, изменив его и снова сохранив.
С точки зрения безопасности и скорости, какой подход лучше, или есть еще один, о котором я не думал?
sudo
может быть настроен для выполнения только определенной команды для конкретного пользователя, поэтому изменение файла sudoers
может означать, что вы можете использовать sudo более безопасным способом для выполнения определенных команд.
Вы могли бы объединить это с сценарием оболочки, чтобы php выполнял только локализованный скрипт с ограниченными правами.
Таким образом, ваш скрипт-оболочка, пусть называет его "restart_auth.sh", может содержать:
#!/bin/sh
sudo /etc/init.d/xl2tpd restart
Вы должны были бы shell_exec('restart_auth.sh')
из php для запуска этого скрипта.
Вы должны отредактировать файл sudoers
чтобы пользователь мог запустить сценарий как (ваш пользователь php) для запуска /etc/init.d/xl2tpd
. поэтому, если ваш пользователь php является www_data
отредактируйте sudoers (используя visudo
), чтобы содержать:
user host = (www_data) NOPASSWD: /etc/init.d/xl2tpd
Если никакие испорченные данные - это неутвержденная информация, которая может содержать символы запуска оболочки, - передаются команде оболочки exec, тогда она защищена.
Поскольку кто-то еще предложил, может быть лучше записать данные в ожидающий список, а затем прочитать из этого, а не передавать его по shell_exec()
. Однако это все равно может привести к возникновению неуверенности, поэтому убедитесь, что значения, которые вы пишете в файле, являются незанятыми, это самое главное.
Также никогда не запускайте этот полный скрипт как root даже в качестве задания cron, но вместо этого используйте тот же подход с sudoers, чтобы разрешить исполняемому скрипту выполнять определенные команды как root. Например, вы можете разрешить sudo "cat changes.txt >> auth_file"
sudo
не требует пароль?