Цель: Защитить свою DokuWiki & Mercurial (Https Web Access) от посягательств из вне, если используется следующая схема:
Собственное железо + DokuWiki → Mikrotik (Cloud DNS) → Hosting DNS Edit → CNAME Record → Через проброс порта я получаю из вне на свою DokuWiki + Mercurial Web (хранилище автоматизирующих скриптов которые я не публикую для широкой общественности и заметки тонкой настройки).
Данный проект будет развернут на собственном железе HP MicroServer Gen8 (RAID 1) системы Ubuntu 18.04 Server amd64, задействованные сервисы — это DokuWiki и Mercurial (Https Web Access).
Т.е. моя личная более расширенная база знаний и система репозитарий скриптов с различной версионностью.
Текущие характеристики системы:
- RAM = 2 Gb
- HDD = 100Gb (RAID 1)
- CPU = 1Ghz
- OS: Ubuntu 18.04 Server amd64
Сервисы поднимались на основе ранее опубликованных заметок:
- Как развернуть DokuWiki on Ubuntu 18.04 Server
- Web–доступ к Mercurial на Ubuntu 18.04
Защита своего проекта у меня сводится к следующим шагам.
Шаг №1: Выставляем права доступа на каталоги сервиса DokuWiki:
ekzorchik@srv-bionic:~$ find /var/www/html/wiki/data -type f -exec sudo chmod 0644 {} \;
ekzorchik@srv-bionic:~$ find /var/www/html/wiki/conf -type f -exec sudo chmod 0644 {} \;
ekzorchik@srv-bionic:~$ find /var/www/html/wiki/data -type d -exec sudo chmod 0755 {} \;
ekzorchik@srv-bionic:~$ find /var/www/html/wiki/conf -type d -exec sudo chmod 0755 {} \;
Далее нужно переименовать папку data в отличное от дефолтного именования:
ekzorchik@srv-bionic:~$ sudo mv /var/www/html/wiki/data/ /var/www/html/wiki/backupdata
ekzorchik@srv-bionic:~$ sudo nano /var/www/html/wiki/conf/local.php
$conf['savedir'] = '/backupdata';
http://IP&DNS — user&pass — Управление — Настройки вики
- Права для создаваемых директорий: 0755
- Права для создаваемых файлов: 0644
- Включить отладку: убрать флажок
- Разрешить HTML: отмечаю галочкой
- Разрешить PHP: отмечаю галочкой
- Проверять наличие обновлений и предупреждений о безопасности?: убрать флажок
- Транслитерация в именах страниц: полная транслитерация
- Удобочитаемые адреса (URL): средствами «ДокуВики»
Настроить дату сервера в соответствии с timezone:
ekzorchik@srv-bionic:~$ sudo nano /etc/php/7.2/apache2/php.ini
date.timezone = Europe/Moscow
Добавить определение новых типов файлов: (mpp,vsd,rar,djvu):
ekzorchik@srv-bionic:~$ sudo nano /var/www/html/wiki/conf/mime.conf
mpp application/vnd.ms-project
vsd application/vnd.visio
rar application/x-rar-compressed
djvu application/x.djvu
djv application/x.djvu
Скопировать файлы иконок: mpp,vsd и т.д в директорию lib/images/fileicons → файлы должны быть в расширении png и размер:
ekzorchik@srv-bionic:~$ sudo apt-get install imagemagick -y
ekzorchik@srv-bionic:~$ identify /var/www/html/wiki/lib/images/fileicons/zip.png
/var/www/html/wiki/lib/images/fileicons/zip.png PNG 16x16 16x16+0+0 8-bit sRGB 377B 0.000u 0:00.000
Использовать текущую стандартную тему, которая изначально включает функционал бокового меню, а можно и bootstrap
Ставлю плагины: Note,odtdw,Move Plugin,Login/Logoff Logging Plugin,Authpdo,Dw2pdf,Bookcreator.
Шаг №2: Настроить обращение только через самоподписанный сертификат к проекту:
ekzorchik@srv-bionic:~$ openssl req -new -x509 -days 3650 -keyout srv-bionic.key -out srv-bionic.pem
Enter PEM pass phrase: 712mbddr@
Verifying - Enter PEM pass phrase: 712mbddr@
Common Name (e.g. server FQDN or YOUR name) []:172.33.33.25
ekzorchik@srv-bionic:~$ cp srv-bionic.key{,.orig}
ekzorchik@srv-bionic:~$ openssl rsa -in srv-bionic.key.orig -out srv-bionic.key
Enter pass phrase for srv-bionic.key.orig: 712mbddr@
writing RSA key
ekzorchik@srv-bionic:~$ rm srv-bionic.key.orig
ekzorchik@srv-bionic:~$ sudo mv srv-bionic.pem /etc/ssl/certs
ekzorchik@srv-bionic:~$ sudo mv srv-bionic.key /etc/ssl/private
ekzorchik@srv-bionic:~$ sudo chmod 0600 /etc/ssl/private/srv-bionic.key
ekzorchik@srv-bionic:~$ sudo a2enmod ssl
ekzorchik@srv-bionic:~$ sudo nano /etc/apache2/sites-available/project.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-bionic.pem
SSLCertificateKeyFile /etc/ssl/private/srv-bionic.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
ekzorchik@srv-bionic:~$ sudo a2ensite project.conf
ekzorchik@srv-bionic:~$ sudo unlink /etc/apache2/sites-available/000-default.conf
ekzorchik@srv-bionic:~$ sudo rm -f /var/www/html/index.html
ekzorchik@srv-bionic:~$ sudo nano /etc/apache2/ports.conf
#Listen 80
ekzorchik@srv-bionic:~$ sudo apache2ctl configtest
Syntax OK
ekzorchik@srv-bionic:~$ sudo systemctl restart apache2
ekzorchik@srv-bionic:~$ sudo netstat -tulpn | grep apache2
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 16950/apache2
Шаг №3:
Настроить фаерволл ufw
ekzorchik@srv-bionic:~$ sudo apt-get install ufw -y
ekzorchik@srv-bionic:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)?
y
Firewall is active and enabled on system startup
ekzorchik@srv-bionic:~$sudo nano /etc/default/ufw
IPV6=no
ekzorchik@srv-bionic:~$ sudo ufw default deny incoming
ekzorchik@srv-bionic:~$ sudo ufw default allow outgoing
На своем сервер нужно добавить два правила разрешающие удаленное подключение по SSH, это из локальной сети 33.0/24 & и сети L2TP (Mikrotik).
ekzorchik@srv-bionic:~$ sudo ufw allow to 172.33.33.25 port 22 from <L2TP_VPN_Mikrotik_Network> proto tcp
ekzorchik@srv-bionic:~$ sudo ufw allow to 172.33.33.25 port 22 from 172.33.33.7 proto tcp
ekzorchik@srv-bionic:~$ sudo ufw allow to 172.33.33.25 port 443 from <L2TP_VPN_Mikrotik_Network> proto tcp
ekzorchik@srv-bionic:~$ sudo ufw allow to 172.33.33.25 port 443 from 172.33.33.7 proto tcp
ekzorchik@srv-bionic:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
172.33.33.25 22/tcp ALLOW IN <L2TP_VPN_Mikrotik_Network>
172.33.33.25 22/tcp ALLOW IN 172.33.33.7
172.33.33.25 443/tcp ALLOW IN <L2TP_VPN_Mikrotik_Network>
172.33.33.25 443/tcp ALLOW IN 172.33.33.7
ekzorchik@srv-bionic:~$ sudo ufw status
Status: active
To Action From
-- ------ ----
172.33.33.25 22/tcp ALLOW <L2TP_VPN_Mikrotik_Network>
172.33.33.25 22/tcp ALLOW 172.33.33.7
443 ALLOW Anywhere
Включаю логирование ufw:
ekzorchik@srv-bionic:~$ sudo ufw logging on
ekzorchik@srv-bionic:~$ sudo ufw reload
Шаг №4: Защитить Apache авторизацией доступ на саму систему имеющий на борту сервисы: DokuWiki & Mercurial (Https Web Access)
ekzorchik@srv-bionic:~$ sudo apt-get install apache2-utils -y
ekzorchik@srv-bionic:~$ sudo htpasswd -c /var/www/html/.htpasswd ekzorchik
New password:
712mbddr@Re-type new password:
712mbddr@
Adding password for user ekzorchik
Чтобы добавить еще одного пользователя для авторизации:
ekzorchik@srv-bionic:~$ sudo htpasswd /var/www/html/.htpasswd test
New password:
Re-type new password:
Adding password for user test
ekzorchik@srv-bionic:~$ sudo htpasswd -D /var/www/html/.htpasswd test
Deleting password for user test
ekzorchik@srv-bionic:~$ sudo chown root:root /var/www/html/.htpasswd
ekzorchik@srv-bionic:~$ sudo nano /etc/apache2/sites-available/project.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-bionic.pem
SSLCertificateKeyFile /etc/ssl/private/srv-bionic.key
<Directory /var/www/html>
AuthType Basic
AuthName "Private zone Project"
AuthUserFile /var/www/html/.htpasswd
Require valid-user
</Directory>
ScriptAlias /hg "/var/www/html/hg/hgwebdir.cgi"
# можно не использовать в едином конфиге
<Directory /var/www/html/hg>
# можно не использовать в едином конфиге
Options +ExecCGI
# можно не использовать в едином конфиге
</Directory>
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
На заметку: вот теперь отрабатывает полный доступ, сперва нужно совершить Basic авторизацию а уже потом либо hg либо mercurial доступ в зависимости от того что нужно.
Что еще всплыло, это нужно изменить описание сайта для доступа к Web–панели Mercurial:
ekzorchik@srv-bionic:~$ sudo nano /etc/apache2/sites-available/hg.conf
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
ScriptAlias /hg "/var/www/html/hg/hgwebdir.cgi"
<Directory /var/www/html/hg>
Options +ExecCGI
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLProtocol all -SSLv2
SSLCertificateFile /etc/ssl/certs/srv-bionic.pem
SSLCertificateKeyFile /etc/ssl/private/srv-bionic.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
Вот теперь все в порядке.
ekzorchik@srv-bionic:~$ sudo apache2ctl configtest
ekzorchik@srv-bionic:~$ sudo systemctl restart apache2
Шаг №5: Скрыть болтливость Web–сервера Apache2
ekzorchik@srv-bionic:~$ sudo nano /etc/apache2/conf-enabled/security.conf
ServerTokens Prod
ServerSignature Off
TraceEnable Off
ekzorchik@srv-bionic:~$ sudo nano /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
net.ipv4.icmp_echo_ignore_broadcasts = 1
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
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
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
net.ipv4.icmp_echo_ignore_all = 1
ekzorchik@srv-bionic:~$ sudo sysctl -p
Шаг №6: Ограничить выполнение скриптов через строку браузера при обращении к своему проекту:
Т.е если обратиться https://IP&DNS/wiki/doku.php?do=check
не имея авторизации в сервисе можно получить диагностическую информацию: Кол-во RAM,какие модули, версия php, уровень отладки и многое другое чего не должно быть ни у кого. Т.к у меня вики закрытая, то параметр запрещающий регистрацию уже присутствует, добавляю, что нельзя выводить диагностическую информацию
ekzorchik@srv-bionic:~$ sudo nano /var/www/html/wiki/conf/local.php
$conf['disableactions'] = 'register,check';
ekzorchik@srv-bionic:~$ sudo systemctl reload apache2
После при обращении, как выше с URL адресом и командой участник вики будет получать уведомление, что данная команда заблокирована:
Action disabled: check
Данная настройка специально сделана, если DokuWiki будет пользоваться более чем 1 человек.
Ниже все команды которые используются в DokuWiki, опираясь на указанные их можно использовать в блокировке/ограничении:
$conf['disableactions'] = 'backlink,index,recent,revisions,search,register,resendpwd,profile,edit,check,subscribe,unsubscribe,source,export_raw,subscribens,
unsubscribens,admin,backlink,export_xhtml,login,show,list,showtag';
Шаг №7: Нужно доработать связку Apache2 + Fail2Ban
tips_ubuntu_18_04_apache2_fail2ban_v1.odt
Нет, нужно переделать заметку выше на связку: apache2 + fail2ban + ufw, а не iptables. Тогда будет данная заметка будет полной.
tips_ubuntu_18_04_fail2ban_ufw_v1.odt
Самое главное: Это лишь один и маленьких примеров защиты своих проектов смотрящих в интернет поднятых на собственном железе. Не стоит его расценивать как универсальность, главное понять от чего отталкиваться и куда стремиться.
Пока на этом у меня всё, с уважением автор блога Олло Александр aka ekzorchik.