Лучшие практики: Управление системными программами с сайта PHP

1

Я работаю над сайтом регистрации 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, открыв файл, изменив его и снова сохранив.

С точки зрения безопасности и скорости, какой подход лучше, или есть еще один, о котором я не думал?

  • 0
    Я бы добавил их все в «ожидающую» таблицу базы данных, затем раз в час выполнял скрипт cron, чтобы вытащить ожидающий, добавить в конец существующего файла конфигурации, сохранить, перезапустить демон. Запустите cron как root таким образом, чтобы он был изолирован от веб-интерфейса, и пусть ваши клиенты будут знать, что их vpn будет готов через час, и они получат электронное письмо, подтверждающее завершение.
  • 0
    Там действительно должна быть стена между регистрацией и изменением пользователя VPN. Нужно ли проводить какие-либо проверки подлинности или проверку новых пользователей? Разве sudo не требует пароль?
Показать ещё 1 комментарий
Теги:

1 ответ

2

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"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню