Настройка web сервера в CentOS 7

centos-7-lamp-web-server

Мне часто приходится работать с проектами различных сайтов, обладая знаниями и опытом администрирования ОС 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:

install httpd for centos 7

* Если у Вас не открывается тестовая страница 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

install phpmyadmin for centos 7

Пользователь: root

Пароль: Вы установили его на стадии настройки MariaDB

Для доступа к странице настроек phpMyAdmin наберите в адресной строке:

http://ip-адрес сервера/phpmyadmin/setup

Страница настроек phpMyAdmin

Не забудьте ограничить доступ к странице настроек, по завершению всех установок.

Создание базы данных для сайта

Создание базы данных в консоле

Подключаемся к 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

install phpmyadmin for centos 7

Перейдите в раздел "Базы данных"

Веб интерфейс phpMyAdmin

Укажите имя базы данных, котировку и нажмите "Создать"

Создание базы данных в phpMyAdmin

Перейдите в раздел "Пользователи", кликните "Добавить пользователя"

Добавление пользователя в 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 - конфигурация сайта

Вам необходимо выбрать язык установки Joomla 3.6.2. укажите название сайта, Email администратора, логин, пароль адмнистратора и подтверждение пароля. Нажмите "Далее" для продолжения.

Установка Joomla - конфигурация БД

Конфигурация базы данных. Укажите тип базы данных, имя сервера оставьте по умолчанию "localhost". Укажите имя пользователя (в моем случае site), пароль (Zaq12wsx) и имя базы данных (site). Также можно указать вручную или автоматически "Префикс таблиц". Префикс можно использовать в случае хранения данных от нескольких сайтов в одной базе, в таком случае для каждого сайта необходимо указывать свой отличный от других префикс. Нажмите "Далее" для продолжения установки Joomla.

Установка Joomla - обзор настроек

Завершение установки. На этой странице Вы можете увидеть сводку всех настроек сайта, а также произвести установку демо-данных. Нажмите на кнопку "Установка".

Установка Joomla

Ожидаем завершения процесса установки Joomla 3.6.2 на веб сервер CentOS 7.

Установка Joomla - локализация

Предлагаю Вам сразу русифицировать Joomla 3.6.2. Нажмите "Установка языковых пакетов".

Установка Joomla - выбор языка

Выберите требуемый язык из списка.

Установка Joomla - выбор русского языка

Нажмите "Далее".

Установка Joomla - настройка мультиязычности

На данный момент мы не будем использовать мультиязычность на нашем сайте. Укажите язык панели управления, а также язык сайта и нажмите "Далее".

Установка Joomla - удалите "installation"

Нажмите "Удалить директорию "installation"".

Установка Joomla успешно завершена

Установка Joomla 3.6.2  на Ваш собственный веб сервер CentOS 7 успешно завершена.

Сайт на Joomla с собственным веб сервером

Установка и настройка 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 сервис.

 

 
Раздел: Unix сервера
Top
17 комментариев
Добавить комментарий