Инструменты пользователя

Инструменты сайта


Боковая панель

Связь

website_hosting

Содержание

Website Hosting

Website Hosting (веб хостинг) корпоративный хостинг на основе LAMP.

Задача. Нередко, вместо использования поставщиков хостинга, нужно настроить веб-сервер с несколькими доменами на собственном оборудовании и выставить в интернет. И разрешить над ними действия, для n- ого количества людей, такие как: FTP доступ, MySQL + phpMyAdmin.

Такой надписью (:!: security) будут обозначены важные места в безопасности нашего хостинга.

  • Начнем. В силу разных причин используется 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 (:!: security) иначе он превратиться в открытый почтовый релей(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(:!: security). Проверяем, чтобы наш сервер MySQL был доступен только с localhost (:!: security).
    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 для управления нашим сервер MySQL.

    aptitude install phpmyadmin

    После чего он станет доступен по адресу http://1-test.gaga.lan/phpmyadmin/ . phpMyAdmin не предоставляет собственных методов обеспечения безопасности MySQL- сервера. (:!: security) 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 для удобства администрирования. Он будет доступен: https://1-test.gaga.lan:10000/
  • Инсталлируем Pure-FTPd. Изменим параметр (:!: security) 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
  • Всё! Настройка корпоративный хостинга закончена.
Всё это прекрасно работает если доступ к ресурсам (на изменение) имеете только вы или же доверенные люди. В этой же конфигурации любой пользователь имеющий доступ FTP, может установить web shell и получить доступ с правами пользователя от которого запущен Apache (чаще всего это www-data:www-data). То есть ему для чтения будут доступны все системные файлы (тот же /etc/passwd или /etc/mysql/debian.cnf) и для записи все директории в которые разрешено писать группе www-data.

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). В случае взлома одного из сайтов это не позволит злоумышленнику (или легитимному Web программисту) иметь доступ к системе или другим сайтам, стоящим рядом.

Использование open_basedir обязательно иначе используя скрипты одного сайта можно получить доступ к файлам операционной системы. Работа с директивами PHP.ini в httpd.conf. Лучше всего для PHP включить safe_mode и настроить safe_mode_exec_dir и другие.
  • У вас уже должен быть установлен и настроен сервер Apache. Для теста изменений создайте PHP файл phpinfo (http://joo.gaga.lan/phpinfo.php). Он выведет информацию о пользователе от которого запущен Apache или более простой
    uid.php
    <?php echo exec('id'); ?>
    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 через пробел.

Для безопасной настройки, нужно 2 пользователя и 1 группа для каждого виртуального хоста. Например, пользователь и группа wwwsite1:wwwsite1 для запуска виртуального хоста (параметр AssignUserID) и пользователь ftpsite1, которому принадлежат файлы нашего сайта, так же для него открывается доступ по ftp (и sftp). Права директорий 750 и 640 для файлов.
Проследите чтобы имя пользователь от которого запускается Apache (обычно www-data) не совпадало не с одним из созданных под сайты.
  • Создадим пользователей, директории и настроим для них права. Пользователь и группа 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, в дальнейшем для пользователей этой группы будет открыт SFTP доступ. Права для 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)

    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
Отключите KeepAlive, так как nginx и Apache находятся на одном сервере и удерживать соединения не имеет смысла. Nginx возьмет обработку Keep-Alive на себя. В более сложных конфигурациях, например балансировщиках Keep-Alive в Apache может быть включен (модуль ngx_http_upstream_keepalive).
  • Для увеличения безпасности (:!: security) можно уменьшить информацию отдаваемую Apache пользователю.
    ServerTokens Prod
    ServerSignature Off



website_hosting.txt · Последние изменения: 2016/02/25 09:25 (внешнее изменение)