Я разработал и управляю специальной платформой электронной коммерции для различных клиентов. Я хочу автоматизировать некоторые задачи установки, такие как создание 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, способны генерировать все виды системных файлов и папок - какие методы они используют?
Буду благодарен за любые указатели.
С уважением
Джеймс