Является ли это возможным?
Я написал инструмент командной строки на PHP для создания новых сред для нашей компании. Помимо прочего, он создает системных пользователей, каталоги, базы данных, VHosts и перезапускает apache. Эти команды требуют sudo
привилегии. Я подумал, что было бы неплохо иметь для него веб-интерфейс, чтобы упростить его использование другим людям, не являющимся разработчиками. Веб-приложение будет за аутентификацией.
При запуске из командной строки я просто запускаю sudo tool.php
, очевидно, я не могу сделать это из веб-приложения.
Как я мог сделать это безопасно? Предоставление доступа sudo пользователю apache кажется глупым, поскольку это означает, что все сайты, размещенные на сервере (например, все наши среды), будут иметь доступ sudo. Можно ли запустить этот инструмент под другим пользователем? этот пользователь мог иметь права sudo только для нужных мне команд?
Как это делают такие вещи, как plesk и cPanel?
Есть предположения?
Хотя такой подход приводит к возникновению дурных чувств, если это неизбежное зло, я бы начал с того, что убедился, что сервер сегментирован от сети - либо доступен только для нескольких хостов в локальной сети, либо прослушивает только те хосты, которые прошли аутентификацию через VPN (или туннель SSH). Короче говоря, постарайтесь не позволить этому хозяину быть низко висящим фруктом.
Возможно иметь пользователя с ограниченным доступом к sudo, и я бы рекомендовал это сделать.
Для начала создайте sudoers
пользователь, который может только запускать tool.php
и на него можно переключиться через www-data
user (или как там у вашего пользователя веб-сервиса). Это ограничит объем действий sudo, которые могут быть выполнены на сервере (однако, если ваш tool.php можно использовать, это не поможет).
Вы можете сделать это, отредактировав sudoers, чтобы он содержал строку вроде:
online_tool_user ALL=(www-data) NOPASSWD: /var/danger/tool.php
Это позволит "online_tool_user" запустить команду /var/danger/tool.php
без ввода пароля. Если этот пользователь попытается запустить какие-либо другие команды (iptables, adduser и др.), Ему будет отказано.
Чтобы злоумышленник не мог эксплуатировать этого пользователя, попробуйте использовать ограниченные оболочки или «тюрьмы».
Наконец, если вы просто звоните exec
через PHP, бросить пользователя в вызов, например: exec("sudo -u online_tool_user -c 'php /var/danger/tool.php'")
.
Один из подходов - отделить веб-интерфейс от уровня выполнения, то есть использовать веб-интерфейс в качестве пользовательского интерфейса и запланировать действия. Затем запустите вторую работу с root
привилегии, которые опрашивают очередь, проверяют и выполняют запланированные задачи и сообщают о статусе выхода обратно.
Небольшая модификация заключается в том, что вместо того, чтобы опросчик запускался независимо, ваше веб-приложение может запускать этот опросчик по запросу с помощью sudo.
Другой, менее безопасный подход - запустить второй экземпляр apache для вашего безопасного приложения, которое работает как root
вместо того apache
. В последний раз (очень давно) я проверял, какой подход используют веб-панели управления.
Как насчет использования setuid, чтобы процесс можно было запускать от имени пользователя root?
chmod 4555 tool.php
chown root tool.php
Я думаю, что это должно быть правильно.