Задача: разобрать пошаговый план по настройке SSL подключения к собственноручно развернутому 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, а только https
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
На заметку: Когда я буду впредь настраивать новый сервис то обязательно нужно удалять все не относящееся к работе, в том числе выше приведенную ссылку на дефолтную загрузку тестовой страницы.
Но это еще не все, я советую на каждой системе будь-то в локальной сети, домашней сети, глобальной сети устанавливать и использовать брандмауэр, к примеру хорошо зарекомендовавший именуемый, как ufw (надстройка над правилами утилиты iptables).
Подведу итог: данной заметкой я набросал практические шаги которыми я пользуюсь при настройке Web-сервера Apache2 на системах Ubuntu релиза Trusty так и системах осуществляющих предоставление информации во всемирной паутине. Как уже не однократно говорил и буду говорить все нужно делать самим, учиться и еще раз учиться. На этом я прощаюсь, лучше я буду делиться своим опытом и наработкам в каждой новой заметке чем все сразу да и в одной. С уважением автор блога ekzorchik aka Олло Александр.