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

pligin

Команда форума
Администратор
Сообщения
3.610
Реакции
1.267
PSC
96.946,66
Telegram
pligin
Прежде всего, данный материал ориентирован на новичков и тех, кто держит на одном VPS сразу несколько сайтов, при этом хочет иметь как безопасный, так и шустрый веб-сервер.
В качестве веб-сервера у нас будет выступать связка:

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

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

Начнем.

Для начала нужно выбрать VPS для себя. Хостинг провайдеров очень много и трудно выбрать.

Я остановился на DigitalOcean - шустрый VPS на SSD дисках можно взять всего за $5. Если регистрироваться, перейдя по реферальной ссылке, на баланс зачислят бонусные $10, за которые можно два месяца держать VPS. (ссылки в тексте реферальные).

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

Нажмите Create Droplet, выберите тариф, выберите операционную систему (статья на писана для 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/ 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
&nbsp;
Код:
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
&nbsp;
Код:
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 &amp; ~ E_NOTICE
Остальные настройки PHP делайте по вашему желанию, на эту тему в сети имеется куча мануалов.
Настройку SSH я рассматривать не буду, а остановлюсь на фаерволе, т.к. в Debian по умолчанию разрешены все подключения.
Создаем файл my.iptables.rules
Код:
nano /etc/my.iptables.rules
&nbsp;
Код:
*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.

Материал взят с habrahabr.ru
 
Последнее редактирование модератором:
Сверху