Подключаем SSL к Apache 2 на системе Ubuntu Trusty

Posted by

Задача: разобрать пошаговый план по настройке подключения к собственноручно развернутому Web-сервиса на базе Apache 2 и настройка защиты. В будущем я эту заметку буду использовать, как направо так и налево. Да и наработка правильных действий никому не помешает.

План? А что план главное в голове или на бумаге составить список всего того что по Вашему мнению и по Вашему опыту может пригодиться дабы обезопасить Ваш сервис. Я не спорю, что в эту заметку нужно добавить такие шаги, как

  • Настройка Fail2ban
  • Настройка ufw
  • Настройка SSH

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

Начинаю, забыл отметить, что все ниже указанные действия проводились над системе Ubuntu Trusty Server amd64

Поехали…

Шаг №1: Обновляю систему

ekzorchik@srv-trusty:~$ sudo rm -Rf /var/lib/apt/lists

ekzorchik@srv-trusty:~$ sudo apt-get update && sudo apt-get upgrade -y

ekzorchik@srv-trusty:~$ sudo apt-get install linux-generic-lts-xenial
linux-image-generic-lts-xenial -y

ekzorchik@srv-trusty:~$ sudo vi /etc/hosts

#::1 localhost ip6-localhost ip6-loopback

#ff02::1 ip6-allnodes

#ff02::2 ip6-allrouters

ekzorchik@srv-trusty:~$ sudo reboot

Шаг №2: Устанавливаю пакет LAMP

ekzorchik@srv-trusty:~$ sudo tasksel install lamp-server

New password for the MySQL "root" user:

Repeat password for the MySQL "root" user:

ekzorchik@srv-trusty:~$ sudo vi /etc/apache2/apache2.conf

ServerName srv-trusty

ekzorchik@srv-trusty:~$ sudo mysql_secure_installation

Шаг №3: Настраиваю минимальную защиту Webсервиса

Добавляем/изменяем параметры дефолтной защиты Web-сервиса Apache2

ekzorchik@srv-trusty:~$ sudo vi /etc/apache2/conf-enabled/security.conf

ServerTokens Prod

ServerSignature Off

TraceEnable Off

Ввожу ограничения на подключение к серверу и сервису:

ekzorchik@ekzorchik:~$ sudo vi /etc/sysctl.conf

net.ipv6.conf.all.disable_ipv6=1

net.ipv6.conf.default.disable_ipv6=1

net.ipv6.conf.lo.disable_ipv6=1

# Ignore ICMP broadcast requests

net.ipv4.icmp_echo_ignore_broadcasts = 1

# Disable source packet routing

net.ipv4.conf.all.accept_source_route = 0

net.ipv6.conf.all.accept_source_route = 0

net.ipv4.conf.default.accept_source_route = 0

net.ipv6.conf.default.accept_source_route = 0

# Ignore send redirects

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.default.send_redirects = 0

# Block SYN attacks

net.ipv4.tcp_max_syn_backlog = 2048

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 5

# Ignore ICMP redirects

net.ipv4.conf.all.accept_redirects = 0

net.ipv6.conf.all.accept_redirects = 0

net.ipv4.conf.default.accept_redirects = 0

net.ipv6.conf.default.accept_redirects = 0

# Ignore Directed pings (ресурс нельзя будет пропинговать, удобно)

net.ipv4.icmp_echo_ignore_all = 1

Затем подгружаю внесенные правила выше в работу:

ekzorchik@srv-trusty:~$ sudo sysctl -p

Шаг №4: Изменяю доступ к Webсервису не через http, а только

ekzorchik@srv-trusty:~$ sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/hosts.conf

ekzorchik@srv-trusty:~$ sudo unlink /etc/apache2/sites-available/000-default.conf

ekzorchik@srv-trusty:~$ sudo unlink /etc/apache2/sites-available/default-ssl.conf

ekzorchik@srv-trusty:~$ sudo unlink /etc/apache2/sites-enabled/000-default.conf

ekzorchik@srv-trusty:~$ openssl req -new -x509 -days 3650 -keyout srv-trusty.key -out srv-trusty.pem

Generating a 2048 bit RSA private key

writing new private key to 'srv-trusty.key'

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:

Common Name (e.g. server FQDN or YOUR name) []:10.7.9.130

  • req → запрос на создание сертификата
  • x509 → создание самоподписанного сертификата
  • days → срок в течении которого будет действовать сертификат
  • keyout → имя файла для генерируемого ключа
  • out → задаю файл для созданного сертификата
  • Common Name → если у сервера есть DNS имя указываем его, если нет, то IP адрес. Должен быть статическим, т. е. Закрепленным за данной системой.

ekzorchik@srv-trusty:~$ cp srv-trusty.key{,.orig}

ekzorchik@srv-trusty:~$ openssl rsa -in srv-trusty.key.orig -out srv-trusty.key

Enter pass phrase for srv-trusty.key.orig:

writing RSA key

ekzorchik@srv-trusty:~$ rm srv-trusty.key.orig

ekzorchik@srv-trusty:~$ sudo mv srv-trusty.pem /etc/ssl/certs/

ekzorchik@srv-trusty:~$ sudo mv srv-trusty.key /etc/ssl/private/

ekzorchik@srv-trusty:~$ sudo chmod 0600 /etc/ssl/private/srv-trusty.key

ekzorchik@srv-trusty:~$ sudo a2enmod ssl

Создаю сайт для сервиса используя дефолтный шаблон:

ekzorchik@srv-trusty:~$ sudo vi /etc/apache2/sites-available/hosts.conf

<IfModule mod_ssl.c>

<VirtualHost _default_:443>

ServerAdmin webmaster@localhost

DocumentRoot /var/www/html

ErrorLog ${APACHE_LOG_DIR}/error.log

CustomLog ${APACHE_LOG_DIR}/access.log combined

SSLEngine on

SSLProtocol all -SSLv2

SSLCertificateFile /etc/ssl/certs/srv-trusty.pem

SSLCertificateKeyFile /etc/ssl/private/srv-trusty.key

<FilesMatch "\.(cgi|shtml|phtml|php)$">

SSLOptions +StdEnvVars

</FilesMatch>

<Directory /usr/lib/cgi-bin>

SSLOptions +StdEnvVars

</Directory>

</VirtualHost>

</IfModule>

ekzorchik@srv-trusty:~$ sudo a2ensite hosts.conf

Отключаю использование 80 TCP порта, буду использовать только 443:

ekzorchik@srv-trusty:~$ sudo vi /etc/apache2/ports.conf

#Listen 80

ekzorchik@srv-trusty:~$ sudo apache2ctl configtest

ekzorchik@srv-trusty:~$ sudo service apache2 restart

ekzorchik@srv-trusty:~$ sudo netstat -tulpn | grep apache2

tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 1188/apache2

На заметку: После настроек Apache просканировав свой ресурс с другого хоста сетевой сканер nmap не смог определить что за ось на нем и другую полезную информацию.

Теперь проверяю, как отрабатывают все настройки выше если зайти через браузер на URL ссылку вида: https://IP&DNS, https://10.7.9.130/ , будет отображено вот такое сообщение:

Ваше подключение не защищено

Злоумышленники могут пытаться похитить ваши данные с сайта 10.7.9.130

Нажимаю «Дополнительные» — «Перейти на сайт 10.7.9.130 (небезопасно)» и отображается дефолтная страница: /var/www/html/index.html

Дефолтная страница при доступ через https

На заметку: Когда я буду впредь настраивать новый сервис то обязательно нужно удалять все не относящееся к работе, в том числе выше приведенную ссылку на дефолтную загрузку тестовой страницы.

Но это еще не все, я советую на каждой системе будь-то в локальной сети, домашней сети, глобальной сети устанавливать и использовать брандмауэр, к примеру хорошо зарекомендовавший именуемый, как ufw (надстройка над правилами утилиты iptables).

Подведу итог: данной заметкой я набросал практические шаги которыми я пользуюсь при настройке Web-сервера Apache2 на системах Ubuntu релиза Trusty так и системах осуществляющих предоставление информации во всемирной паутине. Как уже не однократно говорил и буду говорить все нужно делать самим, учиться и еще раз учиться. На этом я прощаюсь, лучше я буду делиться своим опытом и наработкам в каждой новой заметке чем все сразу да и в одной. С уважением автор блога ekzorchik aka Олло Александр.