Безопасный и шустрый веб-сервер на Debian 7

Статья, находится в процессе написания, но я готов выслушать дельные советы и комментарии, а затем доплнить или поправить материал.
Прежде всего, данный материал ориентирован на новичков и тех, кто держит на одном VPS сразу несколько сайтов, при этом хочет иметь как безопасный, так и шустрый веб-сервер.
В качестве веб-сервера у нас будет выступать связка:

Apache 2.2 + PHP 5.4.4 + MySQL 5.5 + NGINX 1.2.1 + eAccelerator + memcached + vsftpd 3.0.2 + exim.

Все это чудо будет крутиться на Debian 7.

Начнем.


Итак, прежде всего после установки ОС, выполняем:

apt-get update
apt-get dist-upgrade


Затем одной командой ставим весь необходимый софт:
apt-get install htop atop vsftpd exim4-base exim4-daemon-light mailutils rcconf apache2 apache2-mpm-itk nginx mysql-server-5.5 mysql-client-5.5 php5 php5-dev memcached libmysqlclient-dev apache2-utils libexpat1 ssl-cert libapache2-mod-php5 libapache2-mod-ruby php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-common php5-ming php5-mysql php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl make automake checkinstall gcc gzip libreadline-dev libssl-dev libncurses5-dev zlib1g-dev


В процессе установки система попросит вас придумать и ввести пароль для пользователя root БД MySQL, вводим.
После полной установки софта, приступаем к настройке. Все сайты у нас будут лежать в директории /home/директория_пользователя/директория_сайта, но вы можете разместить их в любой удобной для вас директории. В директории сайта у нас будут 3 поддиректории: tmp (для временных файлов и файлов сессий), logs (логи сайта), public_html (директория сайта).

Создаем пользователя dapf с одноименной группой, домашним каталогом и запретом на использование консоли:
useradd dapf -b /home -m -U -s /bin/false


Устанавливаем пароль пользователя dapf:
passwd dapf 


Создаем каталоги пользователя с выставлением прав и группы:
mkdir -p -m 755 /home/dapf/dapf.ru/public_html
mkdir -p -m 777 /home/dapf/dapf.ru/logs
mkdir -p -m 777 /home/dapf/dapf.ru/tmp
chmod 755 /home
chmod 755 /home/dapf
chmod +t /home/dapf/dapf.ru/logs
chmod +t /home/dapf/dapf.ru/tmp
chown -R dapf:dapf /home/dapf


Запретим консоль пользователю www-data:
usermod -s /bin/false www-data


Теперь приступим к настройке Apache.
Включаем необходимые нам модули:
a2enmod ssl
a2enmod rewrite
a2enmod suexec
a2enmod include


Правим конфиг портов в файле /etc/apache2/ports.conf:
nano /etc/apache2/ports.conf


Необходимо заменить 80 порт на 81 (т.к. на 80м у нас будет nginx):
NameVirtualHost *:81
Listen 81


Поскольку у нас VPS слабенький (256 мб ОЗУ), то нам необходимо настроить /etc/apache2/apache2.conf
nano /etc/apache2/apache2.conf


Устанавливаем следующие значения:
KeepAlive Off
StartServers 1
MinSpareServers 3
MaxSpareServers 6
ServerLimit 24
MaxClients 24
MaxRequestsPerChild 3000


Теперь создадим новый VirtualHost (сайт):
nano /etc/apache2/sites-available/dapf.ru

<VirtualHost *:81>
ServerName www.dapf.ru
ServerAlias dapf.ru
ServerAdmin support@dapf.ru
DocumentRoot "/home/dapf/dapf.ru/public_html"
  <Directory />
  Options FollowSymLinks
  AllowOverride None
  </Directory>
  <Directory /home/dapf/dapf.ru/public_html/>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
  </Directory>
  ErrorLog /home/dapf/dapf.ru/logs/errors.log
  LogLevel warn
  CustomLog /home/dapf/dapf.ru/logs/access.log combined
  AssignUserId www-data dapf
  php_admin_value open_basedir "/home/dapf/:."
  php_admin_value upload_tmp_dir "/home/dapf/dapf.ru/tmp"
  php_admin_value session.save_path "/home/dapf/dapf.ru/tmp"
</VirtualHost>


Благодаря apache2-mpm-itk мы имеем возможность использовать в конфигах виртуалхоста директиву AssignUserId www-data dapf, которая позволяет запретить web-шеллу, править файлы нашего проекта, кроме тех, на которых стоят права o+w. Т.е. apache сможет спокойно прочитать php-файл, выполнить его и отдать в браузер, но не сможет внести изменения в его содержимое, что создаст определенные проблемы для хэкеров. Если хотите разрешить апачу править файлы, то используйте вместо www-data dapf, значение dapf dapf. Директивы open_basedir, upload_tmp_dir, session.save_path исключают получение сессий с соседнего сайта и переходы выше пользовательской директории.

Включаем сайт:
a2ensite dapf.ru


И перезагружаем апач:
service apache2 restart


С апачем закончили, теперь настроим nginx.
Для начала настроим gzip сжатие, назначим пользователя www-data и установим 1 ядро процессора.
nano /etc/nginx/nginx.conf

user www-data;
worker_processes 1;
pid /var/run/nginx.pid;
error_log /var/log/nginx/error.log;
events {
  worker_connections 768;
  # multi_accept on;
}
http {
  ##
  # Basic Settings
  ##
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;
  # server_tokens off;
  # server_names_hash_bucket_size 64;
  # server_name_in_redirect off;
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  ##
  # Logging Settings
  ##
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;
  ##
  # Gzip Settings
  ##
  gzip on;
  gzip_disable "msie6";
  # gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 7; #Level Compress
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_types text/plain text/css application/json application/x-javascri$
  ##
  # Virtual Host Configs
  ##
  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
}


После создадим новый конфиг нашего виртуалхоста:

nano /etc/nginx/sites-enabled/dapf.ru

server {
listen 80;
server_name dapf.ru www.dapf.ru;
access_log /var/log/nginx.access_log;
location ~* .(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|flv|html|htm|mp3|docx|xlsx)$ {
root /home/dapf/dapf.ru/public_html/;
error_page 404 = @fallback;
index index.html index.php;
access_log off;
expires 30d;
}
location ~ /.ht { deny all; }
location / {
proxy_pass http://127.0.0.1:81/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Host $host;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
}
location @fallback {
  proxy_pass http://127.0.0.1:81;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header X-Real-IP $remote_addr;
  }
}  


Теперь за всю динамику отвечает апач, а за статику nginx, при появлении ошибки 404, которая может возникнуть при использования mod_rewrite(ЧПУ), будет вызываться функция @fallback, которая перенаправит запрос на апач для проверки.

Перезагружаем nginx: service nginx restart

Для настройки FTP правим файл конфига vsftpd
nano /etc/vsftpd.conf


Удаляем всё и вставляем следующие настройки:
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
pasv_min_port=50000
pasv_max_port=60000
dirmessage_enable=YES
xferlog_enable=YES
file_open_mode=0644
local_umask=022
connect_from_port_20=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ftpd_banner=Welcome to our FTP service.
chroot_local_user=YES
allow_writeable_chroot=YES
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/vsftpd.pem


Это позволит запретить вход анонимным пользователям, разрешить использование старых FTP клиентов, а также ограничить перемещение пользователей только их домашним каталогом.

Затем необходимо поправить файл /etc/pam.d/vsftpd, чтобы включить возможность авторизации FTP пользователям, не имеющим доступ к консоли.
nano /etc/pam.d/vsftpd


Находим и комментируем строку: auth required pam_shells.so
#auth  required  pam_shells.so


Перезагружаем vsftpd и пробуем войти:
service vsftpd restart


Если у вас возникла ошибка: 500 OOPS: vsftpd: refusing to run with writable root inside chroot(), не расстраиваемся — это баг vsftpd, и решается он простым обновлением, для этого выполняем:
echo "deb http://ftp.us.debian.org/debian jessie main contrib non-free" >> /etc/apt/sources.list
aptitude update
aptitude upgrade vsftpd
echo "allow_writeable_chroot=YES" >> /etc/vsftpd.conf
service vsftpd restart


Возможно, вам придется заново поправить конфиги vsftpd, но после перезапуска сервиса всё будет работать нормально.

Настраиваем MySQL.
nano /etc/mysql/my.cnf


Устанавливаем следующие значения директив:
key_buffer = 16K
max_allowed_packet = 1M
thread_stack = 64K
table_cache = 4
sort_buffer = 64K
net_buffer_length = 2K


Если вы не используете таблицы InnoDB, можно добавить директиву skip-innodb

Далее создадим пользователя и его БД, выполнив команду:
echo "CREATE USER 'база_данных'@'localhost' IDENTIFIED BY 'пароль_пользователя'; GRANT USAGE ON * . * TO 'база_данных'@'localhost' IDENTIFIED BY 'пароль_пользователя' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0; CREATE DATABASE IF NOT EXISTS база_данных DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; ; GRANT ALL PRIVILEGES ON база_данных . * TO 'база_данных'@'localhost';" | mysql --user=root --password=пароль_рута_мускула mysql


Значения база_данных, пароль_пользователя, пароль_рута_мускула указываем свои.

Основную часть работы мы закончили, теперь необходимо настроить PHP+ eAccelerator+ exim.

Начнем с настройки exim, выполняем:
dpkg-reconfigure exim4-config


Выбираем ОК, потом internet site; mail is sent and received directly using SMTP, указываете ваш System mail name (у меня это dapf.ru), IP-addresses to listen on for incoming SMTP connections можно оставить просто 127.0.0.1, далее по вкусу, пока не дойдете до Root and postmaster mail recipient, там указываем ваш email, на который будут возвращаться письма.

Выполняем для проверки:
echo "test" | mail -s Test ваш@email.com


Если письмо пришло, значит все отлично, если нет, то возвращаемся и перенастраиваем exim.
Теперь установим eAccelerator.

Качаем последнюю на данный момент версию и распаковываем:
wget https://codeload.github.com/eaccelerator/eaccelerator/legacy.tar.gz/master -O ea.tar.gz
tar xvfz ea.tar.gz


Переходим в директорию с исходниками eaccelerator(у меня это eaccelerator-eaccelerator-42067ac) и устанавливаем:
cd eaccelerator-eaccelerator-42067ac
phpize
./configure
make
make install


Создадим директорию для кеша eAccelerator
mkdir -p /var/cache/eaccelerator
chmod 0777 /var/cache/eaccelerator


Редактируем файл php.ini
nano /etc/php5/apache2/php.ini


Здесь нам необходимо добавить настройки eAccelerator, sendmail, в качестве которого у нас exim, настройки безопасности и т.д.
Добавляем перед [ PHP ] настройки для eAccelerator
; eAccelerator configuration
; Note that eAccelerator may also be installed as a PHP extension or as a zend_extension
; If you are using a thread safe build of PHP you must use
; zend_extension_ts instead of zend_extension
extension  = "eaccelerator.so"
eaccelerator.shm_size  = "16"
eaccelerator.cache_dir  = "/var/cache/eaccelerator"
eaccelerator.enable  = "1"
eaccelerator.optimizer  = "1"
eaccelerator.check_mtime  = "1"
eaccelerator.debug  = "0"
eaccelerator.filter  = ""
eaccelerator.shm_max  = "0"
eaccelerator.shm_ttl  = "0"
eaccelerator.shm_prune_period  = "0"
eaccelerator.shm_only  = "0"
eaccelerator.compress  = "1"
eaccelerator.compress_level  = "9"
eaccelerator.allowed_admin_path = "/var/www/eaccelerator"


Теперь раскомментируем sendmail_path и укажем путь до exim
sendmail_path = /usr/sbin/exim -t


Далее выставим следующие настройки:
;Отключаем вывод ошибок и включаем их запись в файл
display_errors =Off
log_errors=On
;Отключаем опасные функции
disable_functions = exec,ini_get,ini_get_all,parse_ini_file,passthru,php_uname,popen,proc_open,shell_exec,show_source,system,dl, show_source, readfile, popen, cwd,getcwd
;По вкусу можно отключить и функции: diskfreespace, disk_free_space, disk_total_space, eval, fileperms, fopen, opendir, phpinfo, phpversion, posix_getpwuid, posix_getgrgid, posix_uname, но не рекомендуется.
;Прочие настройки
error_reporting = E_ALL & ~ E_NOTICE


Остальные настройки PHP делайте по вашему желанию, на эту тему в сети имеется куча мануалов.

Настройку SSH я рассматривать не буду, а остановлюсь на фаерволе, т.к. в Debian по умолчанию разрешены все подключения.

Создаем файл my.iptables.rules
nano /etc/my.iptables.rules

*filter
-A INPUT -i lo -j ACCEPT
-AINPUT -d 127.0.0.0/8 -jREJECT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -p tcp --dport 20 -j ACCEPT
-A INPUT -p tcp --dport 21 -j ACCEPT
-A INPUT -p tcp --dport 50000 -j ACCEPT
-A INPUT -p tcp --dport 60000 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT


Активируем и сохраняем правила:
iptables-restore < /etc/my.iptables.rules
iptables-save > /etc/iptables.rules


Проверяем командой iptables –L

Прописываем загрузку в файле /etc/network/interfaces
nano /etc/network/interfaces


После iface lo inet loopback добавляем
pre-up iptables-restore < /etc/iptables.rules


Сохраняем и перезагружаем VPS.
Share post

Comments 82

    +12
    А вот объясните мне почему на слабеньком сервачке не обойтись одним nginx, без apache?
      0
      потому что запустить бложик на вордпрессе запустить через FastCGI будет сложнее чем поставить апач.
      Ну и не все знают что так можно, кмк.
        +3
        По моему куда проще взять на digital ocean мини инстанс за 5$ и выбрать образ с вордпресс, Все руководство будет две кнопки нажать и ввести код на два бесплатных месяца.
          +3
          Без инструкции — да, сложнее. Но уж если автор дает настолько подробную инструкцию… в чем разница-то?
            –2
            Чо сложного-то? Трабл может возникнуть (и, собственно, возникнет) только с ЧПУ, и тот решается плагином со стороны Вордпресса.
            В остальном же, натягивается точно так же.
              +4
              кто придумал эту аббревиатуру?
              у меня мозг ломается всякий раз от нее… типа при чем тут «программное управление?»
                –4
                А, это давняя калька с «человеко-понятный URI».
              +1
              Нет. php-fpm ставится так же легко как и просто php. Если у человека не хватает соображалки что бы прописать найденный на офф сайте конфиг — то ему нечего серваки настраивать.
                0
                Никаких проблем в настройки через FastCGI нет, но существует ли аналог типа mod_itk под nginx? Если да, то приведите пример, возьму его себе на вооружение.
                  0
                  Спешу вас порадовать, это задача php-fmp. То есть вы настраиваете пулы для хостов, которые будут запускать php под конкретным пользователем. А nginx… ему то что… он будет просто часть запросов (не на статику) проксировать туда. по сути php-fpm в вашем стеке полностью заменит apache+mod_php+mod_itk
                    –3
                    Меня больше интересует безопасность такого подхода (например вот я залил web-шелл, что я могу?), надо будет проверить ее на досуге, просто в описаном выше я вполне уверен и даже шеллы давал на проверку, а в этом нет.
              +2
              И почему не поставить PHP 5.5 и забыть о eAccelerator
                –2
                Пока нет необходимости в переходе на PHP 5.5, если необходимо именно 5.5 версия, то замените php5 на php55.
                Насчет eAccelerator, можете его не ставить, вам решать нужен он или нет.
                  +2
                  Почему нет? Более быстрая работа, меньшее потребление памяти, опкеш из коробки и новые фичи, которые, впрочем, использовать никто не застявляет это недостаточный аргумент?
                  Вы же не себе ставите, а людям рассказываете. В чём проблема ставить актуальную стабильную версию, а не устаревшую? Тут уже PHP 5.6 rc1 вышел, а вы 5.4 ставите…
                  К тому же если ваш код нормально работает с 5.4 при переходе на 5.5 ничего не сломается с вероятностью 99,999%.
                  В чём профит?
                    +1
                    А ещё не нужно будет ставить кучу dev пакетов и править конфиги, из которых состоит пол статьи.
                    Вообще настройка не безопасная (судя по тому что вы предлагаете пароль от рута прямо в команде в терминале вводить), а самая обычная.
                    И ftp нафиг не нужен, можно обойтись sftp, что, смею предположить, будет безопаснее, и даже быстрее.
                    В целом — ну и нагородили же вы…
                      –1
                      Напишите статью лучше с php5.6 опкешем и т.д.
                      То что описано здесь гарантированно защищает и работает, а главное это все проверено опытом, а то что вы говорите это всё мелочи, главное схема, не нравится php 5.4 (хотя они идет по умолчанию при вызове apt-get install php, думаю не зря так!), ставьте 5.6, не нравится eAccelerator не ставите его, а ставите опкеш или другой кеш, проблем никаких. Сразу скажу SFTP работать не будет т.к. у юзера нет консоли! (уже сколько раз писал это в комментах), поэтому только выбор у вас FTP или другой клиент который работает без консоли.
                        +1
                        1) Вы пишете статью по которой потом новички потом ещё 10 лет будут ставить всю эту муть, которая уже сегодня не нужна
                        2) Есть множество простых способов (намного проще ваших конфигов) которые позволяют открыть sftp и закрыть ssh, и для этого вообще ничего не нужно ставить

                        Сравнните сами:
                        Apache 2.2 + PHP 5.4.4 + MySQL 5.5 + NGINX 1.2.1 + eAccelerator + memcached + vsftpd 3.0.2 + exim.

                        PHP 5.5 + MySQL 5.6 + NGINX 1.4 + memcached + exim.

                        Это и ставить, и настраивать, и поддерживать проще. А чем меньше компонентов — тем надежнее всё работает.
                          –3
                          Не в компонентах дело, а в том, что безопасность для вас видимо ничего не значит. Ставьте свежий необкатанный софт, радуйтесь, что вы современный и в тренде, но только потом не удевляйтесь, почему вас сломали, а сосед Васька со старым софтом пулепробиваемый ;)
                            0
                            php 5.5 не настолько редко обновляемая и малоиспользуемая штука. То что пакет попал в стабильную ветку debian не означает ровным счетом ничего. 5.4 прекратят суппортить уже в марте следующего года, а без выхода обновлений, шансы что там найдут очередную дыру ничуть не уменьшаются.
                              +1
                              Ага, небось Васька и OpenSSL обновлять не собирается) Пуленепробиваемый…
                              Если в официальных репозиториях есть пакет — он по определению не менее безопасен чем другие.
                              К тому же, если есть старая версия с известными уязвимостями, и новая где они исправлены, но потенциально могут быть другие — я выбираю второе.

                              Вы правда верите, что PHP 5.5 менее безопасная версия чем 5.4? Либо что Nginx 1.4 менее безопасен чем 1.2? Или MySQL 5.6 уязвима, а 5.5 нет?
                              Или, в конце концов, наличие eAccelerator и vsftpd более безопасно чем отсутствие этих пакетов?
                                0
                                Решать вам, что уязвимо, а что нет, никто не уверен в версиях и в том, что в них появятся критические уязвимости.
                                А если и появятся, то тут уже никто не застрахован. Но я чисто из своего опыта не спешу обновляться, ибо следую правилу «работает — не трожь», а если вдруг появится какая уязвимость, то патч сделать не составит труда.
                            0
                            opcache — дефолтный опкод кешер. Он идет с версии 5,5 вместе с php и рекомендуем к использованию. Что до дебиана — 5.5 уже можно спокойно ставить не опасаясь что он будет «менее секьюрным» чем 5,4.

                            По поводу SFTP — есть же WinSCP и прочие гуевые клиенты.
                              0
                              Не работают они с отключеной консолью пользователя ни SFTP, ни SCP. Можете конечно придумать способ как их заставить работать (потом раскажете мне), но… Работает только FTP и то потому, что мы закоментили: #auth required pam_shells.so, так бы тоже не работал.
                                0
                                Простите, не заметил что вы еще и консоль отрубили… А зачем такой сервак тогда? Вообще впервые вижу такой брутальный подход к ограничению прав пользователей.
                    +1
                    а passenger?
                      0
                      Кстати вот я вижу настрийки FW, но не вижу в них разрешения ходить по SSH на сервер. Это бага или фича?
                        0
                        Поправил.
                        +1
                        Мне нравится, как к этому вопросу подошли в Ubuntu. Есть вариант установки группы пакетов:

                        $ sudo apt-get install lamp-server^

                        Ставит apache, php и MySql с зависимостями, а дальше уже по вкусу. Самое главное, что не нужно знать такого:

                        Затем одной командой ставим весь необходимый софт: apt-get install много букв

                        и для новичка процесс от «Мне нужно поднять сервер» до «Мой сайт работает» проходит очень быстро и безболезненно.
                          0
                          Эти многобукв можно и сократить, между прочим. К примеру, php5-common у автора два раза встречается. Также я уверен, половина пакетов сама через зависимости подтянется…
                            0
                            да, php5-common ставится автоматом при запросе пакетов php5/php5-fpm/php5-cli
                          0
                          Классная статья — с удовольствием посмотрел, как настраивается удобный веб-сервер на очень ограниченной конфигурации (совсем недавно нечто похожее настраивал, правда, только nginx php-fpm под WP). Кое что для себя взял. Особенно интересна конфигурация iptables (в этом вопросе мне было очень сложно — найти толковый короткий конфиг достаточно затруднительно)
                          Хотя 256М RAM сегодня это очень мало — $10 за 4Gb Ram у fastVPS или 512M за $5 в DigitalOcean это очень даже не плохо.
                            +3
                            Разве eAccelerator не устарел как чёрт знает что?
                              0
                              Да. PHP5.5+opсache (из коробки, просто включить). При том что opcache мэйнтейнится автором eAccelerator, думаю смысла ставить что-то другое нету.
                              0
                              Если для новичков, то неплохо бы еще и веб-панельку какую-нибудь, типа webmin.
                                0
                                Для данной конфигурации сервера (256 мб озу) webmin будет тяжелым, а так его можно поставить просто:
                                apt-get install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions python
                                wget http://prdownloads.sourceforge.net/webadmin/webmin_1.690_all.deb
                                dpkg --install webmin_1.690_all.deb
                                

                                и добавить правило в iptables
                                -A INPUT -p tcp --dport 10000 -j ACCEPT
                                

                                Вот и вся установка webmin.
                                  +1
                                  Если бы была связка из fastcgi + nginx, ресурсов бы для webmin хватило с лихвой.
                                +1
                                Отключаем опасные функции
                                disable_functions = exec,ini_get,ini_get_all,parse_ini_file

                                А чем не угодили ini_get и parse_ini_file? Последняя вообще не имеет отношения к php.ini и часто используется в CMS для парсинга config.ini и т.д…

                                Лучше настроить параметр в php.ini
                                open_basedir = /home/user/domains/name.ru/
                                А то загруженный через бложик wso даст дорогу ко всем папкам. Так же хорошо проверить файрвол, в wso в разделе Network включить любой порт и попробовать к нему присоединиться через netcat или puTTy (в режиме Raw) для получения командной строки для полного «разгуляя».

                                  –1
                                  В конгифах апача стоит php_admin_value open_basedir для каждого сайта свой.
                                  ini_get например используется в php для ini_get('allow_url_fopen') и других вызовов.
                                  А про $ini_array = parse_ini_file("/dir/dir/dir/file", true); думаю объяснять не нужно.
                                  0
                                  А насчет загруженного через бложик wso, в данной конфигурации сервера будет вот:
                                  image
                                  Думаю тут мало, что можно сделать хэкеру.
                                    0
                                    Дайте мне этот webshell, а я вам сервер сломаю. Идет?
                                    +4
                                    Автор, извините, конечно, но за 777 права на каталоги нужно отрывать руки =)

                                    Также Вы даете очень плохой совет — использовать mod_php, а не itk/FastCGI, ибо если поломают один сайт, поломают все ресурсы, а «новички на VPS» либо вообще не обновляют CMS, либо используют нуленные.

                                    Половину софта вроде exim, vsftpd можно выкинуть, в CMS использовать SMTP авторизацию, а для работы с файлами сайтов WinSCP либо FileZilla + pageant.

                                    Также у Вас присутствуют совершенно не нужные для новичка пакеты вроде gcc ( чтобы хакерам в 777 каталогах было проще собирать малварь? =) ) или apache ruby модулей.

                                    Извините, но безопасность настройки в Вашей статье близится к нулю.

                                    Если я хочу ездить на машине, я либо заказываю такси ( плачу профессионалу ), либо учусь на права ( учусь управлять автомобилем самостоятельно ), если хочу есть, либо иду в кафе ( плачу квалифицированным специалистам за еду ), либо учусь готовить сам, но почему-то, когда все хотят свой сервер, они не хотят платить за настройку ( платные/бесплатные панели управления вроде cpanel,webmin,ISP,FastPanel, либо сис админы ) и не хотят учиться сами, а читают вот такие маны и становятся еще одним зараженным хостом в каком-нибудь большом ботнете.
                                      –4
                                      В данном случае права 777 не играют роли, почему, думаю вам и так понятно.
                                      Прочитав и вникнув например сюда:
                                      Благодаря apache2-mpm-itk мы имеем возможность использовать в конфигах виртуалхоста директиву AssignUserId www-data dapf, которая позволяет запретить web-шеллу, править файлы нашего проекта, кроме тех, на которых стоят права o+w. Т.е. apache сможет спокойно прочитать php-файл, выполнить его и отдать в браузер, но не сможет внести изменения в его содержимое…

                                      Вам стало бы понятнее, но вы же не читали :)
                                        0
                                        Вы меня извините, но 3\4 вашего «топика» можно заменить вот этим вот мануалом с howtoforge, с поправкой разве что на версии софта.
                                          0
                                          Не совсем, в том мануале абсолютно другой подход и ни одного упоминания о связке apache+nginx, хотя на хабре такие статьи есть ;)
                                            0
                                            Связка Apache и nginx нужна только в том случае, когда без фич Апача, без того же mod_rewrite или еще чего не обойтись.
                                            98% юзеров, которые хотят поднять свою первую VPS, он нахрен не сдался. Тем более на 256 метрах памяти — при таких лимитах нужно выбирать что-то одно.
                                              0
                                              см. коммент от alpha6
                                                0
                                                А скажите, чем этот процесс отличается от процесса под Апачем? Ничем.
                                                Если не включать ЧПУ — работает из коробки, если включать — нужно доставить один мелкий плагин к самому Wordpress, «nginx Compatibility».

                                                И собственно, всё. Не аргумент.
                                                  0
                                                  Помимо WP, есть куча и других CMS, в которых не всем хочется переписывать ЧПУ (mod_rewrite) под nginx, а использовать апач под статику+динамику я считаю сильно большой нагрузкой, логичнее отвести ему только динамику, а статику оставить на nginx, можно и наоборот сделать, только апач будет кушать больше, чем nginx в такой связке.
                                                    0
                                                    nginx что так, что так раздаёт статику, один хрен.
                                                    А красивые ссылочки надо делать средствами скрипта, а не через веб-сервер, вот честное слово. Почему-то Mediawiki работает из коробки точно так же, тихо и молча, и к ней даже ничего докручивать не нужно.
                                                      –1
                                                      Ну можете нагрузить nginx еще и динамикой, никто не запрещает это дело вкуса. Сервис упадет, всё упадет. А так отвалится тот же апач, nginx будет из кеша тянуть статику и отдавать юзерам, пока апач не перезапустится (можно на эту тему кстать еще одну статью написать :) ).
                                                      Ну и Mediawiki это Mediawiki, продумали её разработкичи все эти ньансы.
                                                        0
                                                        Посмотрел ваши конфиги. При падении бекенда, nginx в данном конкретном случае будет возвращать 502, и раздавать только статику по прямым линкам.
                                                          0
                                                          Тут да, но я же выше написал, что это тема отдельной статьи, т.с. о выгоде связке apache+nginx по сравнению с просто nginx или apache. Причем плюсов этой связки можно много придумать.
                                                            +3
                                                            И зачем это на Хабре в десятый раз, вот честное слово?
                                                            Таких топиков, вам тут уже внизу приводили примеры, как грязи. Нахрена плодить сущности, вместо того, чтоб пользоваться поисковиком?
                                                              –3
                                                              На каждую статью найдется свой читатель, которому это будет интересно, даже если таких статей куча, а как и где искать статьи не мне вас учить. Да и думаю вы по своему опыту должны знать, что зачастую из статей берут только ту часть, которая вас интересует.
                                          0
                                          Честно читал конфиг виртхоста до написания поста три раза, и только после копипаста от вас увидел, что итк включен. Кстати меня смутило еще то, что у автора в установленных пакетах для установки и mod_itk и prefork стоят, такая команда вывалится в ошибку конфликта.
                                            –1
                                            nikolayvaganov, где можно почитать вашу статью о настройке VPS?
                                              0
                                              Статей про настройку VPS в интернете более, чем достаточно и для каждого сервера нужно знать, под что именно настраиваешь сервер. Например, под обычный сайт на php на известной CMS Вам на самом сервере хватит nginx + php-fpm + mysql ( почту настраиваем на любой из бесплатных сервисов, DNS нам на сервере не нужен, к CMS подключаем SMTP плагин, FTP не ставим, там как авторизация плейнтекст по сети, да и зачем он вообще нужен. В итоге получается вот такая картина:

                                              root@www:/var/run# netstat -plnt
                                              Active Internet connections (only servers)
                                              Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
                                              tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 2143/mysqld
                                              tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 14157/nginx.conf
                                              tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 19158/sshd
                                              tcp 0 0 XX.XX.XX.XX:443 0.0.0.0:* LISTEN 14157/nginx.conf

                                              root@www:/var/run# ps aux
                                              USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
                                              root 1 0.0 0.0 10600 176? Ss Апр25 0:13 init [2]
                                              root 2 0.0 0.0 0 0? S Май25 0:00 [kthreadd/9614]
                                              root 3 0.0 0.0 0 0? S Май25 0:00 [khelper/9614]
                                              root 1710 0.0 0.1 21084 592? Ss Апр25 0:02 /usr/sbin/cron
                                              mysql 2143 0.0 4.8 93180 19744? Sl Июн16 0:05 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plug
                                              root 14157 0.0 0.9 45584 3728? S Июн19 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
                                              www-data 14159 0.0 1.0 46676 4108? S Июн19 0:14 nginx: worker process
                                              root 14223 0.0 1.2 179124 5056? Ss Июн19 0:02 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
                                              root 16091 0.0 1.1 87016 4820? Ss 12:16 0:00 sshd: root@pts/0
                                              root 16093 0.0 0.5 20148 2216 pts/0 Ss 12:16 0:00 -bash
                                              tresnet 16579 0.0 10.3 194812 42384? S 15:09 0:02 php-fpm: pool XXX.ru
                                              tresnet 16580 0.0 8.1 189524 33452? S 15:09 0:02 php-fpm: pool XXX.ru
                                              root 16733 0.0 0.3 17512 1256 pts/0 R+ 17:01 0:00 ps aux
                                              root 19158 0.0 0.2 52204 876? Ss Июн10 0:01 /usr/sbin/sshd

                                              root@www:/var/run# free -m
                                              total used free shared buffers cached
                                              Mem: 400 213 186 0 0 132
                                              -/+ buffers/cache: 81 318
                                              Swap: 0 0 0

                                              Если у Вас что-то сложнее, чем сайт на php ( например CGI скрипты, ruby, svn ) то тогда nginx не самый лучший вариант, и нужно смотреть в сторону апача.
                                              0
                                              Поправил, prefork для тестов был.
                                          +2
                                          Это стало традицией?
                                          Не тормози! Напиши пост про установку LAMP/WAMP стекаполучи инвайт!
                                            –2
                                            Тут дело не столько в инвайте, а в том чтобы не потерялось, иногда бывает нужно найти кое-что, а тут все под рукой.
                                              +1
                                              «Чтобы не потерялось» мне больше нравится использовать вот этот сервис…
                                              А в песочнице точно потерялось бы, повезло вам.
                                                0
                                                Спасибо, о хабре я слышал, а про гист нет, попробую и его.
                                          +1
                                          Debian + make install = ад, так делать нельзя. К тому же, когда php-apc в репозитории.
                                            +1
                                            Не всегда, бывают случаи, когда необходимо под конкретную версию/систему/сборку и т.д. собрать плагин. В данном примере под PHP 5.4, а если будет другая версия, например бетка под которою нет репозитория? Тогда как?
                                              0
                                              Значит, надо собирать не на боевой тачке. Только безумец компилирует что-то на проде.
                                                0
                                                хм, всегда считал, что компилировать надо там, где собираешься запускать… Иначе имеешь риск обломиться с запуском.
                                                В чем конкретно риск для продакшна?
                                                И в чем принципиальное отличие make от apt[itude] install в этом плане?
                                                  +1
                                                  Ну, если компилируешь для дебиана под дебианом — никаких проблем не будет, как правило.
                                                  Сколько собирал для VPS под wheezy на своем десктопном sid — все работает збс.

                                                  А риска как такового нет, по крайней мере, фундаментального, просто засирать нет никакого желания.
                                                    0
                                                    Риск в том, что в случае взлома атакующий сможет скомпилировать что угодно: если совсем не повезет, то соберет какой-нибудь эксплоит, повысит привилегии и получит полный контроль над системой.

                                                    По поводу принципиального отличия, если это серьезный вопрос: использование make install засоряет систему бинарниками в лучшем стиле Windows DLL Hell. Чем больше софта устанавливается таким образом, тем сложнее поддерживать порядок. Причем затрудняется не только банальное управление установленным таким способом софта, но и есть ненулевая вероятность что-нибудь просто-напросто сломать, скажем, перезаписав нужную библиотеку, установленную ранее из репозитория, другой версией, или грохнув нужный Debian-way симлинк (например, Debian Alternatives), а потом долго думать и ходить вокруг да около с strace и ldd наперевес. Чем «системнее» пакет, тем хуже могут быть последствия от make install.

                                                    Если есть менеджер пакетов, нужно им пользоваться. Он обеспечивает разрешение всех зависимостей и минимизирует вероятность что-нибудь очень глупо сломать. Если пакет собран адекватным человеком, при его установке для всяческих инвазивных действий будут использоваться системные средства: скажем, если в системе стоит python2.6, можно рядом поставить python2.7, а потом еще и python3, и все три интерпретатора будут доступны, не будут друг с другом конфликтовать, и в любой момент можно запустить update-alternatives, чтобы изменить используемый по умолчанию интерпретатор. И все это через apt-get безо всякой беготни с тарболлами.

                                                    А для крайних случаев всегда есть checkinstall или сборка пакета руками.
                                                      0
                                                      Интересно как он это сможет сделать, если мы юзерам отключили консоль (в начале статьи). Такой сценарий возможен, только когда кто-то получит рута или консоль с экплоитом под систему.
                                                  0
                                                  Если нету репозитория, значит вам пока не нужно это ставить. Особенно бетку на прод. Нужна последняя версия под debian — всегда есть штуки типа dotdeb.
                                                    0
                                                    Конечно на эту тему можно спорить до бесконечности, но если есть возможность собирать софт из сорцов под конкретную сборку PHP, то почему бы этим не пользоваться?
                                                      0
                                                      Пользоваться нужно разумно, а не потому что можно. Если вам нравится собирать что-то, ставьте arch. Debian стабилен только потому что все держится на стабильных пакетах. Должна быть объективная причина для сборки. Тот же node.js можно собрать, а можно просто поставить бинарники, и второй способ проще.
                                                        0
                                                        Собирался только eAccelerator под PHP 5.4.4, так что всё в приделах разумного, хотя если говорить о размности, то у каждого она своя и как вы заметили заядлые Debian юзеры не будут собирать, а предпочтут поставить пакеты.
                                                0
                                                А где безопасность? Где настройка iptables?
                                                  0
                                                  А iptables в конце статьи, но подбно можете почитать, например тут.
                                                  Что касается защиты от ддос, то это отдельная тема и тут она не рассматривается.
                                                    0
                                                    что-то меня смущают ваши правила… У вас что, все UDP порты открыты? Или может 53-ий порт закрыт тоже?
                                                      0
                                                      Всё закрыто, разшерено, только то что разрешено, как вы заметили это TCP, UDP закрыты.
                                                        0
                                                        Простите, проглядел что закрыто для входящего трафика. Тогда ладно.
                                                  0
                                                  А еще можно нагуглить с десяток бесплатных панелек управления хостингом, которые сделают гораздо более правильные настройки для того чтобы сайты Пети не мешали сайтам Васи. Зря их чтоли годами пилят
                                                    +1
                                                    А почему в место кучи конфигов, не привести конфигурацию для chef-solo или ansible который развернет все это без всяких проблем и любое количество раз?
                                                      –1
                                                      >> Apache 2.2 + PHP 5.4.4 + MySQL 5.5 + NGINX 1.2.1 + eAccelerator + memcached + vsftpd 3.0.2 + exim.

                                                      Кроме того, что выше и так уже написали про Апач и актуальные версии php и nginx и прочее, еще добавлю, что хватит уже мучать этого старика MySQL, поставьте Percona что ли, или MariaDB.

                                                      >> apt-get dist-upgrade

                                                      отличный совет поломать систему

                                                      >> php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-common php5-ming php5-mysql php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl

                                                      А че так мало расширений. Давайте сразу все 150 поставим. www.php.net/manual/en/extensions.alphabetical.php

                                                      Only users with full accounts can post comments. Log in, please.