Website Hosting
Website Hosting (веб хостинг) корпоративный хостинг на основе LAMP.
Задача. Нередко, вместо использования поставщиков хостинга, нужно настроить веб-сервер с несколькими доменами на собственном оборудовании и выставить в интернет. И разрешить над ними действия, для n- ого количества людей, такие как: FTP доступ, MySQL + phpMyAdmin.
Такой надписью <wrap em>( security)</wrap> будут обозначены важные места в безопасности нашего хостинга.
- Начнем. В силу разных причин используется FAQ Debian 6.0.10 Squeeze (под OpenVZ с ядром 2.6.32-042stab094.7). Имя сервера (hostname): 1-test.gaga.lan
- Инсталлируем вспомогательные утилиты, я предпочитаю Установка и использование Aptitude, так как он лучше работает с зависимостями пакетов
aptitude install mc sudo lynx htop
- Инсталлируем Настройка почтового сервера Postfix в режиме Satellite system (cистема-спутник), указав SMTP relay host (релей для исходящей почты - сервер через который вы хотите пересылать исходящую почту, например сервер провайдера или ваш почтовый шлюз). Проверяем, чтобы запускался только на localhost <wrap em>(
security)</wrap> иначе он превратиться в открытый почтовый релей(open mail relay), что очень порадует спамеров. Пробуем отослать тестовое письмо.
aptitude install postfix lsof -i:25 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME master 2766 root 12u IPv4 8401 0t0 TCP localhost:smtp (LISTEN) echo "hello from `uptime` `who -q`" | mail -s "`hostname`" root && tail -F /var/log/mail.log
- Инсталлируем Apache и PHP. Включаем Модули Apache, которые нам потребуются в дальнейшем: mod_rewrite, mod_ssl
aptitude install apache2-mpm-prefork libapache2-mod-php5 a2enmod rewrite ssl
- Инсталлируем MySQL. Задаем пароль сложный пароль(10-12 знаков) для root<wrap em>(
security)</wrap>. Проверяем, чтобы наш сервер MySQL был доступен только с localhost <wrap em>(
security)</wrap>.
aptitude install mysql-server lsof -i:3306 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 2027 mysql 11u IPv4 5778 0t0 TCP localhost:mysql (LISTEN)
Инсталлируем phpMyAdmin установка Ubuntu Debian для управления нашим сервер MySQL.
aptitude install phpmyadmin
После чего он станет доступен по адресу http://1-test.gaga.lan/phpmyadmin/ . phpMyAdmin не предоставляет собственных методов обеспечения безопасности MySQL- сервера. <wrap em>(
security)</wrap> phpMyAdmin написан слишком неаккуратно, чтобы быть безопасным. Если нет возможности открыть только для доверенных IPs, желательно его вынести отдельно от проектов и настроить Методы и структура протокола HTTP- авторизацию. Можно использовать SSL redirect, но проще для phpMyAdmin создать выделенный домен на порту 443 (HTTPS). В итоге получим домен, и phpMyAdmin доступный по адресу https://phpmy.gaga.lan/phpmyadmin
- phpmy.gaga.lan.conf
<VirtualHost *:443> ServerName phpmy.gaga.lan ServerAdmin webmaster@gaga.lan Include /etc/phpmyadmin/apache.conf ErrorLog ${APACHE_LOG_DIR}/phpmy.gaga.lan-error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/phpmy.gaga.lan-access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key </VirtualHost>
Для включения HTTP- авторизации, нужно в файле config.inc.php значение cookies заменить на http
/* Authentication type */ $cfg['Servers'][$i]['auth_type'] = 'http';
Теперь при желании, для блокировки доступа к phpMyAdmin, мы можем просто выключить наш домен в Apache.
a2dissite phpmy.gaga.lan.conf /etc/init.d/apache2 reload
- Инсталлируем Webmin администрирование Linux для удобства администрирования. Он будет доступен: https://1-test.gaga.lan:10000/
- Инсталлируем Pure-FTPd быстрая установка и настройка в любом Linux. Изменим параметр <wrap em>(
security)</wrap> umask.
echo '177 077' > /etc/pure-ftpd/conf/Umask # default 133:022 # echo '137 027' > /etc/pure-ftpd/conf/Umask
Директории и файлы будут создавать с правами 750:640 соответственно.
ls -l joo/ drwxr-x--- 2 ftpuser www-data 4096 Sep 17 14:39 3test1 -rw-r----- 1 ftpuser www-data 0 Sep 17 14:39 3test2
- Всё! Настройка корпоративный хостинга закончена.
Apache 2 ITK MPM
Homepage: The Apache 2 ITK MPM
Apache 2 ITK MPM это патч к традиционной модели Prefork (PHP в виде модуля), позволяющий задать для каждого виртуального хоста отдельного пользователя и группу. В традиционной модели, все скрипты выполняются с правами пользователя www-data (для Debian) или пользователя apache (в большинстве случаев), что не позволяет 100% изолировать наши виртуальные хосты. Взломав один сайт, можно легко получить доступ к другому сайту так как весь код (например mod_php) выполняется с правами пользователя от которого запущен демон Apache.
Задача. Запускать виртуальные хосты Apache из под разных пользователей, для того чтобы изолировать сайты друг от друга (Chroot системный вызов и утилита в Linux). В случае взлома одного из сайтов это не позволит злоумышленнику (или легитимному Web программисту) иметь доступ к системе или другим сайтам, стоящим рядом.
- У вас уже должен быть установлен и настроен сервер Apache. Для теста изменений создайте PHP файл phpinfo (http://joo.gaga.lan/phpinfo.php). Он выведет информацию о пользователе от которого запущен Apache или более простой
uid=33(www-data) gid=33(www-data) groups=33(www-data)
- Инсталлируем патч ITK, в Debian (бинарник apache с itk присутствует в официальном репозитории). apache2-mpm-prefork будет удален.
aptitude install apache2-mpm-itk
ITK добавляет новую директиву: AssignUserID принимает 2 параметра, uid и gid через пробел.
- Создадим пользователей, директории и настроим для них права. Пользователь и группа webjoo для запуска нашего виртуального хоста(параметр AssignUserID).
useradd -d /var/www/joo -s /bin/false webjoo id webjoo uid=1003(webjoo) gid=1003(webjoo) groups=1003(webjoo)
Пользователя ftpjoo который будет владельцем наших файлов, создадим его сразу с группой webjoo. И добавим ftpjoo в группу sftpusers, в дальнейшем для пользователей этой группы будет открыт SSH File Transfer Protocol (SFTP) настройка под хостинг Apache доступ. Права для SFTP:
addgroup --system sftpusers chmod 755 /var/www/joo chown root:sftpusers /var/www/joo
useradd -d /var/www/joo -s /bin/false -g webjoo ftpjoo usermod -aG sftpusers ftpjoo id ftpjoo uid=1004(ftpjoo) gid=1003(webjoo) groups=1003(webjoo),104(sftpusers)
Дерево директорий нашего сайта с правильными правами (750 и 640). Записывать в корневую директорию /var/www/joo/ нельзя, для записи существуют вложенный директории: public_www непосредственно сам сайт
ls -ld /var/www/* drwxr-xr-x 5 root sftpusers 4096 Sep 22 09:45 /var/www/joo ls -ld /var/www/joo/* drwxr-x--- 3 ftpjoo webjoo 4096 Sep 22 09:37 /var/www/joo/backup drwxr-x--- 2 ftpjoo webjoo 4096 Sep 22 10:01 /var/www/joo/other drwxr-x--- 26 ftpjoo webjoo 4096 Sep 22 10:02 /var/www/joo/public_www
Ниже все правила для установки прав. Безусловно какие-то директории вам придется открыть для записи группе (770 и 660), но это уже индивидуально (см. требования к вашей CMS что это? Назначение популярных CMS)
find /var/www/joo -type f -exec chmod 640 {} \; find /var/www/joo -type d -exec chmod 750 {} \; chown -R ftpjoo:webjoo /var/www/joo; chmod 755 /var/www/joo; chown root:sftpusers /var/www/joo;
- Apache будет запускать наш сайт (joo.gaga.lan) от нового пользователя, указанного в директиве AssignUserID.
<VirtualHost *:443> ServerName joo.gaga.lan ServerAdmin webmaster@joo.gaga.lan <IfModule mpm_itk_module> AssignUserID webjoo webjoo </IfModule> #php_admin_value open_basedir "/var/www/webjoo/public_www:/tmp" php_admin_value open_basedir "/var/www/webjoo/public_www" RewriteEngine On RewriteCond %{HTTP_HOST} ^www.joo.gaga.lan$ [NC] RewriteRule ^(.*)$ https://joo.gaga.lan$1 [R=301,L] DocumentRoot /var/www/joo/public_www <Directory /var/www/joo/public_www/> Options -FollowSymLinks MultiViews -Indexes AllowOverride FileInfo Limit Order allow,deny allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/joo-error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel notice CustomLog ${APACHE_LOG_DIR}/joo-access.log combined SSLEngine on SSLCertificateFile /etc/ssl/joo.com.crt SSLCertificateKeyFile /etc/ssl/joo.key SSLCertificateChainFile /etc/ssl/sf_bundle.crt </VirtualHost>
- Всё! Инсталляция завершена. HTTP сервер стал более защищен.
Nginx
Для настройки более высокопроизводительного Методы и структура протокола HTTP сервера, нужно к выше настроенной связки добавить в качестве front-end (фронтенд) Nginx оптимизация и использование, а выше инсталлированный Apache ITK будет выполнять роль back-end (бекенд).
Задача. Все запросы приходят на сервер Nginx -он отдает статические данные (изображения (jpg, png, html и т.п.), далее он передает запрос на обработку скриптов HTTP серверу Apache ITK (PHP,cgi,pl и т.п.), скрипты выполняют запросы к MySQL и получив оттуда данные, возвращают их Nginx, тот, в свою очередь, отдает готовую страницу пользователям.
- Инсталляция связки: Nginx оптимизация и использование + Apache + mod_rpaf(или для Apache 2.4 и выше remoteip_module, формат логов Apache может понадобиться изменить).
- Далее указаны некоторые изменения именно для этого руководства.
- Меняем порты Apache и указываем слушать только localhost
nano /etc/apache2/ports.conf Listen 127.0.0.1:8080 nano /etc/apache2/sites-enabled/000-default.conf <VirtualHost 127.0.0.1:8080>
- Nginx работает от пользователя www-data, поэтому он не сможет получить доступ к содержимому домашней директории пользователя webjoo, но при создании была создана одноименная группа, в нее нам необходимо добавить пользователя www-data.
usermod -a -G webjoo www-data
Таким образом, в будущем при создании нового виртуального хоста нам необходимо добавить пользователя www-data в группу с именем нового пользователя. Если не добавить пользователя www-data в группу от которой работает вириальный хост под Apache, то после того, как любая CMS будет залита на сервер, сайт будет отображаться без графики (т.е. графические файлы выдаваться не будут, потому что не достаточно прав доступа).
- Конфигурация Аpache за Nginx.
Timeout 100 KeepAlive Off
- Для увеличения безпасности <wrap em>(
security)</wrap> можно уменьшить информацию отдаваемую Apache пользователю.
ServerTokens Prod ServerSignature Off
