Запуск команд и сценариев оболочки от PHP - есть ли правильный и безопасный способ? - PullRequest
0 голосов
/ 10 февраля 2020

Я разработал и управляю специальной платформой электронной коммерции для различных клиентов. Я хочу автоматизировать некоторые задачи установки, такие как создание apache файлов конфигурации сайта и установка сертификатов SSL.

Я написал несколько командных файлов, которые хорошо справляются с обоими этими задачами, и я хочу их выполнить как часть PHP процесса создания сайта.

Мне удалось запустить один из этих сценариев с помощью команды shell_exe c в PHP, но я не совсем понимаю разрешения и беспокоюсь о безопасности , Между прочим, все это размещено на веб-сервере Centos Linux и Apache.

Мой пакетный скрипт (create_site_config. sh) эффективно генерирует файл конфигурации Apache для данного сайта и копирует это в /etc/httpd/conf.d/ с именем 'domain.com.conf'.

Проблема в том, что PHP создает этот файл под владельцем apache: apache, тогда как все остальные файлы в этой папке принадлежат root: root.

В моем пакетном скрипте, если я использую SUDO перед своими командами, ничего не происходит. Принимая во внимание, что если я опускаю SUDO, сценарии запускаются и создают файл для меня, но под неправильным владением. Я также не могу сменить владельца.

Так что мой PHP выглядит примерно так:

shell_exec('./create_site_config.sh);

А мой командный файл выглядит примерно так:

DOMAIN=$1
SYSNAME=$2

if [ -z "$1" ]
  then
    echo "You must pass a fully qualified domain as the first argument, ie. acme.dev.domain.com"
    exit 1
fi

if [ -z "$2" ]
  then
    echo "You must pass a sysname as the second argument, ie acme"
    exit 1
fi

#THESE COMMANDS CLEARLY RUN AS APACHE:APACHE. IF I PUT
#SUDO IN FRONT OF THEM, THEY DON't WORK AT ALL - WHAT GIVES?
rm -f ${DOMAIN}.conf
touch ${DOMAIN}.conf
chmod 777 ${DOMAIN}.conf

#START OF FILE CONTENT
cat >> ${DOMAIN}.conf <<EOL

<VirtualHost *:443>
    DocumentRoot /var/www/html/siteroot
    ServerName ${DOMAIN}

    SSLEngine on
    SSLProtocol All -SSLv2 -SSLv3

    ErrorLog logs/ssl_error_log
    TransferLog logs/ssl_access_log
    LogLevel warn

    <Directory "/var/www/html/portals.dev">
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    SSLCertificateFile /home/centos/.ssh/live_keys/${SYSNAME}_cert.pem
    SSLCertificateKeyFile /home/centos/.ssh/live_keys/${SYSNAME}_key.pem
    SSLCertificateChainFile /home/centos/.ssh/live_keys/${SYSNAME}_fullchain.pem
</VirtualHost>


<VirtualHost *:80>
    ServerName ${DOMAIN}
    Redirect 301 / https://${DOMAIN}
</VirtualHost>

EOL
#END OF FILE CONTENT

#CLEAN UP
cp ${DOMAIN}.conf /etc/httpd/conf.d/sites/${DOMAIN}.conf

#THIS COMMAND BELOW DOESN'T WORK...
sudo chmod 644 /etc/httpd/conf.d/sites/${DOMAIN}.conf 
#NEITHER DOES THIS ONE...
chown root:root /etc/httpd/conf.d/sites/${DOMAIN}.conf

rm -f ${DOMAIN}.conf
sudo systemctl reload httpd.service

echo "success"

Как правильно сделать это на выезде, чтобы убедиться, что файлы созданы и я могу установить их разрешения.

Несмотря на вышеприведенную работу, я чувствую, что так делать небезопасно. Я не понимаю, почему SUDO не работает в пакетном скрипте?

Очевидно, что системы, такие как Plesk и Cpanel, способны генерировать все виды системных файлов и папок - какие методы они используют?

Буду благодарен за любые указатели.

С уважением

Джеймс

...