Защита публичной DokuWiki от посягательств из вне

Posted by

Цель: Защитить свою DokuWiki & Mercurial (Https Web Access) от посягательств из вне, если используется следующая схема:

Собственное железо + DokuWikiMikrotik (Cloud DNS)Hosting DNS EditCNAME 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

Сервисы поднимались на основе ранее опубликованных заметок:

Защита своего проекта у меня сводится к следующим шагам.

Шаг №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.