Настройка web сервера в CentOS 7
Мне часто приходится работать с проектами различных сайтов, обладая знаниями и опытом администрирования ОС Linux, было решено поднять собственный веб сервер на базе CentOS 7, для тестирования и отладки проектов. В данной статье помимо минимального набора команд для установки LAMP на CentOS 7, я расскажу о повышении безопасности Вашего сервера. Мы не будем отключать SELinux, вместо этого настроим его для использования на веб сервере, вдобавок выполним установку и базовую настройку Firewalld.
Подробно рассмотрим установку и настройку FTP сервера в CentOS 7 на базе ProFTPD. Как всегда для удобства восприятия материал разбит на смысловые блоки. В этой статье Вы найдете решения следующих задач:
- Установка LAMP в CentOS 7
- Настройка SELinux
- Установка и настройка phpMyAdmin в CentOS 7
- Создание и настройка виртуальных хостов
- Создание баз данных для сайтов
- Установка Joomla 3.6 в CentOS 7
- Установка и настройка FTP сервера
- Установка и настройка Firewalld
Для установки потребуется подготовленный сервер, посмотрите, как установить и настроить CentOS 7, а также, как настроить сеть в CentOS.
- Подготовка системы
-
Подключение EPEL репозитория:
sudo yum -y install epel-release
Обновим систему:
sudo yum -y update
Установим файловый менеджер. Я привык работать с использованием Midnight Commander, меня вполне устраивает как удобство навигации по фаловой системе, так и встроенный редактор mcedit. Выполните в терминале:
sudo yum -y install mc
- Настройка SELinux
-
SELinux - система принудительного контроля доступа, призванная повысить уровень безопасности Вашего сервера. В некоторых случаях использование SELinux может вызвать проблемы во время установки и настройки компонентов системы. Есть два решения данной ситуации: правильно настроить SELinux или просто отключить его. В любом случае, необходимо взвесить риски. Если Вы поднимаете тестовый сервер в локальной сети для личных задач, то можно просто отключить SELinux, но вслучае боевого использования сервера в сети интернет - рекомендую Вам максимально использовать все доступные средства защиты. Каким путем пойти - остается Вашим решением. Я не отключаю SELinux.
Настройка разрешений в SELinux
Для работы с контекстом SELinux нам необходима утилита semanage входящая в состав пакета policycoreutils-python, давайте установим ее:
sudo yum -y install policycoreutils-python
Возможно установить как временные разрешения (будут работать до перезагрузки системы):
sudo chcon -R -t httpd_sys_content_t /path/to/www sudo chcon -R -t httpd_sys_rw_content_t /path/to/www
Так и постоянные разрешения:
sudo semanage fcontext -a -t httpd_sys_content_t "/path/to/www(/.*)?" sudo semanage fcontext -a -t httpd_sys_rw_content_t "/path/to/www(/.*)?" sudo restorecon -R /path/to/www
Данные разрешения необходимо указать после создания домашнего каталога для Вашего сайта (подробно рассмотрено ниже).
Где /path/to/www путь до корневого каталога Вашего сайта
httpd_sys_content_t – разрешаем доступ на чтение
httpd_sys_rw_content_t – разрешаем доступ на запись.
Отключение SELinux
Для отключения выполните в терминале:
sudo sed -i 's/\(^SELINUX=\).*/\SELINUX=disabled/' /etc/sysconfig/selinux sudo sed -i 's/\(^SELINUX=\).*/\SELINUX=disabled/' /etc/selinux/config
Для применения настроек необходимо перезагрузить систему:
sudo systemctl reboot
После перезагрузки проверьте статус командой:
sestatus
Вы должны увидеть следующую информацию:
SELinux status: disabled
- Установка и настройка MariaDB
-
Выполните для установки:
sudo yum -y install mariadb-server mariadb
Запустим сервис:
sudo systemctl start mariadb.service
Добавим в автозагрузку:
sudo systemctl enable mariadb.service
Выполните базовую настройку:
sudo mysql_secure_installation
Рассмотрим подробно параметры настройки:
Enter current password for root (enter for none) оставляем поле пустым нажимаем Enter Set root password Y New password: Задаем пароль Re-enter new password: Подтверждаем Remove anonymous users Y Disallow root login remotely Y Remove test database and access to it Y Reload privilege tables now? Y All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB!
- Установка и настройка Apache
-
Для установки Apache выполните в терминале:
sudo yum -y install httpd
Настройка Apache осуществляется путем редактирования конфигурационного файла:
sudo mcedit /etc/httpd/conf/httpd.conf
Необходимо внести следующие изменения:
# Проверим, раскомментированна ли строчка в конце файла: IncludeOptional conf.d/*.conf # Также добавьте ниже следующую строку: ServerName 127.0.0.1
Запускаем Apache:
sudo systemctl start httpd.service
Добавим сервис в автозагрузку:
sudo systemctl enable httpd.service
Перейдя по адресу:
http://xxx.xxx.xxx.xxx
(где xxx.xxx.xxx.xxx Ip адрес Вашего сервера), Вы должны увидеть тестовую страницу Apache:
* Если у Вас не открывается тестовая страница Apache, отключите на время Firewalld, подробная настройка файрвола будет рассмотрена ниже:
sudo systemctl stop firewalld
Скроем информацию о версии Apache, модулях и операционной системе (по умолчанию эта информация доступна всем желающим из внешнего мира):
sudo mcedit /etc/httpd/conf/httpd.conf
Добавьте в конец файла:
ServerSignature Off ServerTokens Prod
Перезапустите сервис:
sudo systemctl restart httpd.service
- Установка и настройка PHP
-
Выполните установку PHP:
sudo yum -y install php php-mysql php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap curl curl-devel php-mcrypt php-pecl-apc
Отредактируйте конфигурационнный файл php:
sudo mcedit /etc/php.ini # раскомментируйте и внесите изменения realpath_cache_size = 1024k
Перезагрузите Apache:
sudo systemctl restart httpd.service
- Установка phpMyAdmin, ограничение доступа
-
Установка:
sudo yum -y install phpmyadmin
Отредактируйте конфигурационный файл:
sudo mcedit /etc/httpd/conf.d/phpMyAdmin.conf
Внесите следующие изменения, разрешив соединения от удаленных хостов::
# Страница авторизации phpMyAdmin
<Directory /usr/share/phpMyAdmin/>
AddDefaultCharset UTF-8
<IfModule mod_authz_core.c>
# Apache 2.4
<RequireAny>
# Require ip 127.0.0.1
# Require ip ::1
# Разрешаем удаленное подключение с определенного IP
Require ip xxx.xxx.xxx.xxx (IP адрес клиентской машины)
# Разрешаем все удаленные подключения
Require all granted
</RequireAny>
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
Deny from All
Allow from 127.0.0.1
Allow from ::1
</IfModule>
</Directory>
# Страница настройки phpMyAdmin
<Directory /usr/share/phpMyAdmin/setup/>
<IfModule mod_authz_core.c>
# Apache 2.4
<RequireAny>
# Require ip 127.0.0.1
# Require ip ::1
# Разрешаем удаленное подключение с определенного IP
Require ip xxx.xxx.xxx.xxx (IP адрес клиентской машины)
# Разрешаем все удаленные подключения
Require all granted
</RequireAny>
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
Deny from All
Allow from 127.0.0.1
Allow from ::1
</IfModule>
</Directory>Внимание! С целью повышения безопасности сервера, я не рекомендую Вам использовать разрешения для всех удаленных хостов (т.е. Require all granted), в данной статье эти настройки приведены для ознакомления.
Ограничьте доступ к директории /usr/share/phpMyAdmin/ до конкретного IP адреса Require ip xxx.xxx.xxx.xxx (где xxx.xxx.xxx.xxx IP адрес клиентской машины), а также в случае необходимости тонкой настройки, ограничьте доступ к директории /usr/share/phpMyAdmin/setup/ до Require ip 127.0.0.1 по окончанию всех настроек.
Я не приветствую использование phpMyAdmin на боевых серверах. Однако новичку или для тестового сервера эта веб панель предоставляет определенный уровень удобства.
Перезагрузите Apache:
sudo systemctl restart httpd.service
Для доступа к веб интерфейсу phpMyAdmin наберите в адресной строке:
http://ip-адрес сервера/phpmyadmin
Пользователь: root
Пароль: Вы установили его на стадии настройки MariaDB
Для доступа к странице настроек phpMyAdmin наберите в адресной строке:
http://ip-адрес сервера/phpmyadmin/setup
Не забудьте ограничить доступ к странице настроек, по завершению всех установок.
- Создание базы данных для сайта
-
Создание базы данных в консоле
Подключаемся к MySQL серверу:
mysql -u root -p
Вводим пароль пользователя root (мы устанавливали его в начале статьи) нажимаем Enter.
Создание базы данных:
CREATE DATABASE `site` CHARACTER SET utf8 COLLATE utf8_general_ci;
Желательно сразу выбрать базу данных mysql, т.к. все дальнешие настройки будут вноситься в нее.
use mysql;
Создаем пользователя site с паролем Zaq12wsx для базы данных site:
Внимание! используйте сложные пароли.
GRANT ALL PRIVILEGES ON site.* TO 'site'@'localhost' IDENTIFIED BY 'Zaq12wsx' WITH GRANT OPTION;
Отключаемся от MySQL сервера:
quit;
Создание базы данных с помощью phpMyAdmin
Откройте в браузере
http://ip-адрес сервера/phpmyadmin
Перейдите в раздел "Базы данных"
Укажите имя базы данных, котировку и нажмите "Создать"
Перейдите в раздел "Пользователи", кликните "Добавить пользователя"
Укажите имя пользователя, ограничьте локальным доступом, задайте пароль и подтверждение. Отметьте чекбокс "Предоставить все привелегии на базу данных "base name" (в нашем случае site)". Нажмите "Вперед" для продолжения.
Внимание! Используйте сложные пароли.
Нажмите на значок "Выход" для завершения работы с phpMyAdmin.
Вы успешно создали базу данных и привелегированного пользователя для Вашего сайта.
- Создание домашнего каталога, установка разрешений, подготовка Joomla
-
Создаем домашний каталог для сайта:
sudo mkdir /var/www/html/site.ru
Создаем каталог для хранения логов:
sudo mkdir /var/www/html/site.ru/logs
Переходим в домашний каталог сайта:
cd /var/www/html/site.ru
Для установки Joomla 3.6 понадобится wget и unzip, выполните в терминале:
sudo yum -y install wget unzip
Скачаем с официального сайта последнюю версию Joomla, на момент написания статьи это версия 3.6.2:
sudo wget https://github.com/joomla/joomla-cms/releases/download/3.6.2/Joomla_3.6.2-Stable-Full_Package.zip
Распакуем:
sudo unzip Joomla_3.6.2-Stable-Full_Package.zip
Установим права на файлы:
sudo find . -type f -exec chmod 0644 {} \;
Установим права на каталоги:
sudo find . -type d -exec chmod 0755 {} \;
Изменим владельца на пользователя Apache:
sudo chown apache:apache -R /var/www/html/site.ru
Внимание! Если Вы не выключили SELinux, необходимо разрешить чтение и запись для Apache:
sudo yum -y install policycoreutils-python sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html/site.ru(/.*)?" sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/site.ru(/.*)?" sudo restorecon -R /var/www/html/site.ru
- Создание, настройка и проверка виртуальных хостов
-
Создаем виртуальный хост site.ru:
sudo mcedit /etc/httpd/conf.d/site.ru.conf
Укажите настройки виртуального хоста:
<VirtualHost *:80> ServerAdmin admin@site.ru ServerName site.ru ServerAlias www.site.ru DocumentRoot /var/www/html/site.ru <Directory /var/www/html/site.ru> Options FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog /var/www/html/site.ru/logs/error.log CustomLog /var/www/html/site.ru/logs/access.log common </VirtualHost>
Перезапустите Apache:
sudo systemctl restart httpd.service
Создание других виртуальных хостов выполняется аналогично, не забудьте о создании домашних каталогов для новых сайтов.
Для проверки правильности настройки виртуального хоста необходимо отредактировать файл hosts на клиентской машине.
Для Windows:
# Открываем текстовым редактором C:\Windows\System32\drivers\etc\hosts # Вносим следующие изменения xxx.xxx.xxx.xxx site.ru xxx.xxx.xxx.xxx www.site.ru
Для Linux:
# Открываем текстовым редактором sudo mcedit /etc/hosts # Вносим следующие изменения xxx.xxx.xxx.xxx www.site.ru site.ru
*Где xxx.xxx.xxx.xxx ip адрес Вашего сервера
Сохраните и перезагрузите Ваш браузер.
- Установка Joomla и запуск сайта
-
Откройте в браузере:
http://site.ru
или
http://www.site.ru
Вас встречает мастер установки Joomla:
Вам необходимо выбрать язык установки Joomla 3.6.2. укажите название сайта, Email администратора, логин, пароль адмнистратора и подтверждение пароля. Нажмите "Далее" для продолжения.
Конфигурация базы данных. Укажите тип базы данных, имя сервера оставьте по умолчанию "localhost". Укажите имя пользователя (в моем случае site), пароль (Zaq12wsx) и имя базы данных (site). Также можно указать вручную или автоматически "Префикс таблиц". Префикс можно использовать в случае хранения данных от нескольких сайтов в одной базе, в таком случае для каждого сайта необходимо указывать свой отличный от других префикс. Нажмите "Далее" для продолжения установки Joomla.
Завершение установки. На этой странице Вы можете увидеть сводку всех настроек сайта, а также произвести установку демо-данных. Нажмите на кнопку "Установка".
Ожидаем завершения процесса установки Joomla 3.6.2 на веб сервер CentOS 7.
Предлагаю Вам сразу русифицировать Joomla 3.6.2. Нажмите "Установка языковых пакетов".
Выберите требуемый язык из списка.
Нажмите "Далее".
На данный момент мы не будем использовать мультиязычность на нашем сайте. Укажите язык панели управления, а также язык сайта и нажмите "Далее".
Нажмите "Удалить директорию "installation"".
Установка Joomla 3.6.2 на Ваш собственный веб сервер CentOS 7 успешно завершена.
- Установка и настройка ProFTPD
-
Для установки ProFTPD выполните:
sudo yum -y install proftpd proftpd-utils
Запустите службу:
sudo systemctl start proftpd
Включаем proftpd в автозагрузку:
sudo systemctl enable proftpd
Отредактируйте файл конфигурации сервера:
sudo mcedit /etc/proftpd.conf
Приведите параметр "DefaultRoot" к следующему виду:
DefaultRoot ~
Закоментируйте дефолтный параметр "AuthOrder":
#AuthOrder mod_auth_pam.c* mod_auth_unix.c
Добавьте в конец файла следующие параметры:
AuthUserFile /etc/ftpd.passwd RequireValidShell off AuthPAM off RootLogin off PassivePorts 30000 35000 ListOptions -a LoadModule mod_auth_file.c AuthOrder mod_auth_file.c
Просмотрим список пользователей:
sudo cat /etc/passwd
Вывод комманды:
*** sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
В моем случае Apache имеет следующие идентификаторы пользователя и группы: UserId=48, GroupId=48.
Создаем виртуального ftp-пользователя с логином site, идентификатором пользователя 48, группы 48 и домашним каталогом /var/www/html/site.ru:
sudo ftpasswd --passwd --file=/etc/ftpd.passwd --name=site --uid=48 --gid=48 --home=/var/www/html/site.ru --shell=/bin/false
После выполнения команды система попросит ввести дважды пароль для создаваемого пользователя (настоятельно рекоммендую использовать сложные пароли). В результате выполнения комманды будет создан файл /etc/ftp.passwd с записью о пользователе.
Изменить пароль пользователя можно следующей командой:
sudo ftpasswd --file /etc/ftpd.passwd --passwd --name=site --change-password
Отредактируйте права доступа на файл с пользователями:
sudo chgrp nobody /etc/ftpd.passwd sudo chmod 640 /etc/ftpd.passwd
SELinux. Разрешите полный доступ к файлам для proftpd:
sudo setsebool -P allow_ftpd_full_access=1
Перезапустите службу proftpd:
sudo systemctl restart proftpd
- Firewalld - повышение уровня безопасности сервера
-
Firewalld - новый брандмауэр входящий в состав CentOS 7. Для установки Firewalld выполните:
sudo yum -y install firewalld
Запускаем:
sudo systemctl start firewalld
Включаем в автозагрузку:
sudo systemctl enable firewalld
Проверим:
sudo systemctl status firewalld
Если сейчас перейти на сайт, то у Вас ничего не откроется. Firewalld блокирует сетевые соединения. Посмотрим что разрешено по умолчанию:
sudo firewall-cmd --permanent --list-all
Вывод команды:
public (default) interfaces: sources: services: ssh dhcpv6-client masquerade: no forward-ports: icmp-blocks: rich rules:
На постоянной основе разрешен ssh, а также клиент dhcp v6. Я не использую на сервере ip v6, поэтому уберу соответствующее правило:
sudo firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
Для работы веб сервера необходимо разрешить сервис http (80 порт):
sudo firewall-cmd --permanent --zone=public --add-service=http
Если Вы планируете использовать https на Вашем сайте, необходимо разрешить https сервис (443 порт):
sudo firewall-cmd --permanent --zone=public --add-service=https
Для работы FTP сервера необходимо открыть 21 порт, а также порты 30000-35000 для использования пассивного режима в FTP клиентах:
sudo firewall-cmd --permanent --zone=public --add-port=21/tcp sudo firewall-cmd --permanent --zone=public --add-port=30000-35000/tcp
Перезагрузим правила:
sudo firewall-cmd --reload
На данном этапе настройки Firewalld Ваш сайт снова доступен. Но мне хочется предложить Вам выполнить еще несколько шагов по повышению уровня безопасности Вашего сервера. Есть довольно подробно написанный мануал по повышению уровня безопасности при использовании ssh. Одним из этапов настройки является изменение стандартного порта, рассмотрим более подробно настройки Firewalld при смене порта ssh.
Разрешим на постоянной основе (чтобы после перезагрузки не потерлось) соединение на порт 2220/tcp (на него повесим sshd):
sudo firewall-cmd --permanent --zone=public --add-port=2220/tcp
Перезагрузим правила:
sudo firewall-cmd --reload
Проверим:
sudo firewall-cmd --zone=public --list-ports
Вывод команды:
2220/tcp
Порт открыт. Редактируем конфиг sshd:
sudo mcedit /etc/ssh/sshd_config
Вносим изменения:
*** # If you want to change the port on a SELinux system, you have to tell # SELinux about this change. # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER # В файле необходимо только указать порт Port 2220 #AddressFamily any #ListenAddress 0.0.0.0 #ListenAddress :: ***
Перезапустим ssh:
sudo systemctl restart sshd.service
Также в случае использования SELinux (надеюсь, Вы его не отключили) необходимо выполнить дополнительные настройки. Это связано с тем, что SELinux не даст подключиться к ssh на нестандартном порте (2220):
sudo semanage port -a -t ssh_port_t -p tcp 2220
После проверки подключения к ssh на новом порте, закройте доступ к порту 22:
sudo firewall-cmd --permanent --zone=public --remove-service=ssh
Перезагрузите правила:
sudo firewall-cmd --reload
Проверим настройки Firewalld:
sudo firewall-cmd --list-all
Вывод команды:
public (default) interfaces: sources: services: http https ports: 2220/tcp 21/tcp 30000-35000/tcp masquerade: no forward-ports: icmp-blocks: rich rules:
Мы открыли доступ к серверу по протоколу http, https, ftp, а также порт 2220 на котором теперь работает ssh сервис.
Спасибо, очень пригодилось/тся
Рад, что смог Вам помочь.
Потрясающая статья, все подробно и понятно, Спасибо!!!
Спасибо!)
Супер! Добавил в закладки, очень удобно при добавлении нового сайта :)
Настройки почты не хватает)))
Добрый день.
Статья о настройке и запуске почтового сервера обязательно появится. В настоящий момент совершенно нет свободного времени.
Четко, без воды. То что нужно начинающему. Спасибо.
Пожалуйста, пользуйтесь.
Статья супер, только не получилось настроить ProFTPD. Сделал все как написано в статье, а при подключении к ftp через TotalCommander пишет, что пароль не верный. Хотя пароль правильный указываю
Добрый вечер.
Скорее всего Вы где-то допустили ошибку.
Здравствуйте, подскажите пожалуйста в чем может быть дело, подключаюсь по фтп к серверу, скачать файлы могу, а закачать на сервер не могу! В чем может быть проблема?
Добрый день. Предположу, что не достаточно прав, проверьте права на каталог ftp. Гадать можно до бесконечночти, какая ошибка у Вас возникает, может в логах что регестрируется? Вы не даете ни какой информации по Вашей проблеме, как-же помочь?
Отлично! Спасибо Вам огромное, очень помогли.
Очень крутая статья!!! Есть только у меня одна проблема: как изменить максимальный размер загружаемого файла на Joomla?
Добрый день. Рад, что смог Вам помочь.
У Вас есть два пути:
1. Указать параметры для всего сервера, делается это в php.ini
2. Уазать данные параметры для конкретного хоста, делается это в файле .htaccess Вашего сайта.
*При использовании первого варианта необходимо перезапустить Apache
Не совсем понял как cms без ftp мигрировала
CMS была установлена в разделе
"Создание домашнего каталога, установка разрешений, подготовка Joomla"