Установка Nextcloud 18. Ubuntu 18.04. Apache

Nextcloud 15  (Актуально и для Nextcloud 16/17/18) Ubuntu 18.04 server + Apache. Яндекс коннект/домен/postfix/fail2ban/let's encrypt

  1.  Установка ОС.
  2. Настройка ОС и сети.
  3. Устанавливаем веб сервер Аpache, php, MariaDB
  4. Скачиваем Nextcloud, распаковываем.
  5. Регистрация домена, Яндекс коннект.
  6. Создаем виртуальный хост. Мастер установки Nextcloud.
  7. Настройка Nextcloud после установки.
  8. Устранение ошибок и предупреждений безопасности
  9. Настройка SSL (Включаем доступ по https://)
  10. Проверка сканерами безопасности
  11.  Установка Fail2ban.
  12. Настройка Postfix для отправки уведомлений о блокировке fail2ban.
  13. Двухфакторная аутентификация.

Инструкция для новых пользователей ОС linux или для тех, кто возможно не знаком c ОС, поэтому расписал подробно шаги установки и полной настройки (с возможными ошибками), но не останавливаясь на подробном описании используемых решений и программ.

Установка производится на физический сервер и для домашнего использования.

Скачиваем образ OC (ubuntu-18.04.1.0-live-server-amd64.iso) с официального сайта
Внимание! В этом образе используется новый установщик «subiquity» - он не видит разделы жесткого диска! Если установка на новый винчестер, то все в порядке, если уже диск размечен и установка на раздел, то скачиваем образ без «live» в названии - «ubuntu-18.04.1-server-amd64.iso» со старым установщиком.
Руководство по Ubuntu Server
Записываем на флешку
Утилитой multibootusb - http://multibootusb.org/page_download/ - в linux

Под windows многие советуют: rufus - https://rufus.ie/ru_RU.html (я использую UltraISO)
Загружаемся с флешки, выбираем язык, раскладку
Жмем установить.

Установка ОС, учебник

Настройки сети, по умолчанию выбран dhcp, pc должен быть подключен к сети в которой работает dhcp сервер, если нет прописываем рукам ip адрес и шлюз.

Жмем готово
Proxy address не заполняем, mirror address оставляем, жмем "Готово"

Жмем вручную, разметим диск

Размечаем примерно так:

То есть если у вас винчестер размером 1ТБ:
15-20 Гб под систему и программы (с запасом), swap равен оперативной памяти, и home все оставшееся место.
Жмем «Готово»
Ссылка на подробную статью - https://losst.ru/ustanovka-ubuntu-18-04

Заполняем учетные данные, Жмем «Готово»

В списке ничего не выбираем, установим все вручную. Жмем «Готово»

Жмем перезагрузить

Система установлена. Вводим свой логин (в моем случае marivanna) и пароль.
Сначала нам нужно получить удаленный доступ, нет смысла настраивать все локально.
После установки версии «live»(c новым установщиком) у нас уже должен быть включен ssh сервер, проверяем командой: systemctl status sshd

Проверяем какой ip адрес получила сетевая карта:

terminal
marivanna@server-nc:~$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.110 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fdd9:8897:376f::73d prefixlen 128 scopeid 0x0<global>
inet6 fe80::a00:27ff:fe95:6f54 prefixlen 64 scopeid 0x20<link>
inet6 fdd9:8897:376f:0:a00:27ff:fe95:6f54 prefixlen 64 scopeid 0x0<global>
ether 08:00:27:95:6f:54 txqueuelen 1000 (Ethernet)
RX packets 14443 bytes 1678382 (1.6 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 761 bytes 93749 (93.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 212 bytes 16820 (16.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 212 bytes 16820 (16.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

marivanna@server-nc:~$

Теперь можем подключится по ssh с домашнего PC:

terminal

user666@user666-Z87-D3HP:~$ ssh -l marivanna 192.168.0.110
marivanna@192.168.0.110's password:
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-43-generic x86_64)

* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage

System information as of Sun Jan 6 15:40:16 UTC 2019

System load: 0.01 Processes: 93
Usage of /home: 0.5% of 6.05GB Users logged in: 1
Memory usage: 7% IP address for enp0s3: 192.168.0.110
Swap usage: 0%

* MicroK8s is Kubernetes in a snap. Made by devs for devs.
One quick install on a workstation, VM, or appliance.

- https://bit.ly/microk8s

* Full K8s GPU support is now available!

- https://blog.ubuntu.com/2018/12/10/using-gpgpus-with-kubernetes

134 packages can be updated.
55 updates are security updates.

Last login: Sun Jan 6 15:36:10 2019
marivanna@server-nc:~$

В случае если установка была произведена из образа со старым установщиком, ssh сервер запущен не будет, поэтому устанавливаем и запускаем, но перед этим обновимся.

terminal

marivanna@serv-nc:~$ sudo apt update
marivanna@serv-nc:~$ sudo apt upgrade

marivanna@serv-nc:~$ sudo apt install openssh-server
marivanna@serv-nc:~$ systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2019-01-07 23:00:26 MSK; 52min ago
Main PID: 10383 (sshd)
Tasks: 1 (limit: 4508)
CGroup: /system.slice/ssh.service
└─10383 /usr/sbin/sshd -D

янв 07 23:00:26 serv-nc systemd[1]: Starting OpenBSD Secure Shell server...
янв 07 23:00:26 serv-nc sshd[10383]: Server listening on 0.0.0.0 port 22.
янв 07 23:00:26 serv-nc sshd[10383]: Server listening on :: port 22.

marivanna@serv-nc:~$ ifconfig
enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.174 netmask 255.255.255.0 broadcast 192.168.0.255

user666@user666-Z87-D3HP:~$ ssh -l marivanna 192.168.0.174
marivanna@192.168.0.174's password:
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-29-generic x86_64)

Настроим статический ip адрес (Конфигурация Netplan)

terminal
marivanna@serv-nc:~$ sudo nano /etc/netplan/01-netcfg.yaml
[sudo] пароль для marivanna:

Видим примерно следующее:

terminal
# This file describes the network interfaces available on your system
# For more information, see netplan(5).

network:
  version: 2
  renderer: networkd
  ethernets:
    enp2s0:
      dhcp4: true

Приводим к данному виду, соблюдаем смещение - (пробелы )

terminal
# This file describes the network interfaces available on your system
# For more information, see netplan(5).

network:
  version: 2
  renderer: networkd
  ethernets:
    enp2s0:
      dhcp4: no
      dhcp6: no
      addresses: [192.168.0.110/24]
      gateway4: 192.168.0.1
      nameservers:
         addresses: [192.168.0.1,8.8.8.8]

Сохраняем командой ctrl+o, enter. ctrl+x — выход
marivanna@serv-nc:~$ sudo netplan apply

Понадобится заново подключится по новому адресу.

Отредактируем конфиг ssh сервера

terminal
marivanna@serv-nc:~$ sudo nano /etc/ssh/sshd_config

Раскоментируем строки
Port 2222 — смена порта
Protocol 2 — использовать протокол только второй версии
PermitRootLogin no — запретить доступ под рут пользователем

Настройка фаервола.

Проверяем фаервол:

terminal
marivanna@serv-nc:~$ sudo ufw status

Состояние: неактивен

Добавим правило для ssh и включим фаервол

terminal
marivanna@serv-nc:~$ sudo ufw allow 2222/tcp
Правила обновлены
Правила обновлены (v6)
marivanna@serv-nc:~$ sudo ufw enable
Команда может разорвать существующие соединения ssh. Продолжить операцию (y|n)? y
Межсетевой экран включен и будет запускаться при запуске системы
marivanna@serv-nc:~$
marivanna@serv-nc:~$ sudo ufw status verbose
Состояние: активен
Журналирование: on (low)
По умолчанию: deny (входящие), allow (исходящие), disabled (маршрутизированные)
Новые профили: skip

В Действие Из
- -------- --
2222/tcp ALLOW IN Anywhere
2222/tcp (v6) ALLOW IN Anywhere (v6)

marivanna@serv-nc:~$

Перезапустим ssh сервер

terminal
marivanna@serv-nc:~$ sudo systemctl restart sshd

Пробуем залогиниться по новому порту:

terminal
user666@user666-Z87-D3HP:~$ ssh -l marivanna 192.168.0.110 -p 2222
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:Mp2rviR4vQfeDihdZvwDEJKPocFZ7VuWB/nTVsMlOh8.
Please contact your system administrator.
Add correct host key in /home/user666/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/user666/.ssh/known_hosts:3
remove with:
ssh-keygen -f "/home/user666/.ssh/known_hosts" -R "[192.168.0.110]:2222"
ECDSA host key for [192.168.0.110]:2222 has changed and you have requested strict checking.
Host key verification failed.

Если видите такую ошибку, то вводим команду из вывода:

terminal
user666@user666-Z87-D3HP:~$ sudo ssh-keygen -f "/home/user666/.ssh/known_hosts" -R "[192.168.0.110]:2222"

Проверим корректность даты/времени

terminal
marivanna@serv-nc:~$ date
Вт янв 8 16:51:01 MSK 2019
marivanna@serv-nc:~$ timedatectl
Local time: Вт 2019-01-08 16:51:16 MSK
Universal time: Вт 2019-01-08 13:51:16 UTC
RTC time: Вт 2019-01-08 13:51:16
Time zone: Europe/Moscow (MSK, +0300)
System clock synchronized: yes
systemd-timesyncd.service active: yes
RTC in local TZ: no
marivanna@serv-nc:~$

Устанавливаем веб сервер Аpache, применение PHP-FPM и Nginx по сравнению со связкой Apahe и ModPHP может дать  повышение производительности облачного хранилища до 20-25%. При домашнем использовании - небольшое количество пользователей (синхронизация фото и видео +бекап документов) заметной разницы не заметил, поэтому использую Apache, а PHP-FPM и Nginx оставим для использования в корпоративной среде с тысячами пользователей.

terminal
marivanna@serv-nc:~$ sudo apt install apache2
marivanna@serv-nc:~$ sudo systemctl enable apache2
Synchronizing state of apache2.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable apache2
marivanna@serv-nc:~$ sudo systemctl start apache2
marivanna@serv-nc:~$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Tue 2019-01-08 17:01:47 MSK; 1min 59s ago
Main PID: 4814 (apache2)
Tasks: 55 (limit: 4506)
CGroup: /system.slice/apache2.service
├─4814 /usr/sbin/apache2 -k start
├─4816 /usr/sbin/apache2 -k start
└─4817 /usr/sbin/apache2 -k start

янв 08 17:01:47 serv-nc systemd[1]: Starting The Apache HTTP Server...
янв 08 17:01:47 serv-nc systemd[1]: Started The Apache HTTP Server.
marivanna@serv-nc:~$

Добавим правило в фаервол и перейдем в браузере по адресу сервера для проверки работы веб сервера

terminal
marivanna@serv-nc:~$ sudo ufw allow 80/tcp
Правило добавлено
Правило добавлено (v6)
marivanna@serv-nc:~$

Перейдя в браузере по адресу сервера видим страничку

Устанавливаем php7.3

terminal
marivanna@serv-nc:~$ sudo apt search php7.3
Сортировка… Готово
Полнотекстовый поиск… Готово
marivanna@serv-nc:~$

Результатов нет, добавим репозиторий, список текущих: cat /etc/apt/sources.list
sudo add-apt-repository ppa:ondrej/php
terminal
marivanna@serv-nc:~$ sudo add-apt-repository ppa:ondrej/php

Установим PHP

terminal
marivanna@serv-nc:~$ sudo apt install php7.3

Проверим

terminal
marivanna@serv-nc:~$ php -v
PHP 7.3.0-2+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Dec 17 2018 09:22:47) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.0-dev, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.0-2+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
marivanna@serv-nc:~$

Устанавливаем модули необходимые, список есть на оф.сайте в требованиях https://docs.nextcloud.com/server/18/admin_manual/installation/source_installation.html#prerequisites-label

terminal
marivanna@serv-nc:~$ sudo apt install php7.3-mysql php7.3-curl php7.3-gd php7.3-json php7.3-mbstring php7.3-common php7.3-xml php7.3-zip php7.3-opcache php-apcu php-imagick

Устанавливаем MariaDB в качестве нашей базы данных:

terminal
marivanna@serv-nc:~$ sudo apt install mariadb-server
marivanna@serv-nc:~$ sudo systemctl enable mariadb.service
marivanna@serv-nc:~$ systemctl start mariadb.service

Запуск сценария безопасности:

terminal

root@server user]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Жмем enter
Задаем пароль пользователя root

terminal

Set root password? [Y/n] y
New password:
... Success!

Remove anonymous users? [Y/n] y
... Success!

Disallow root login remotely? [Y/n] y
... Success!

Remove test database and access to it? [Y/n] y

Reload privilege tables now? [Y/n] y
... Success!

terminal
[root@server user]# mysql -u root -p

вводим пароль
Для создания базы вводим ниже, вместо password — указываем пароль
terminal
CREATE DATABASE nextcloud;
CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON nextcloud.* TO 'nextclouduser'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;

Запоминаем данные БД, они нам понадобятся
Скачиваем Nextcloud (Возможно изменился адрес ссылки для загрузки, ищем тогда на оф.сайте https://nextcloud.com)


terminal

marivanna@serv-nc:~$ wget https://download.nextcloud.com/server/releases/nextcloud-15.0.0.tar.bz2

--2019-01-08 18:53:11-- https://download.nextcloud.com/server/releases/nextcloud-15.0.0.tar.bz2
Распознаётся download.nextcloud.com (download.nextcloud.com)… 88.198.160.133
Подключение к download.nextcloud.com (download.nextcloud.com)|88.198.160.133|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа… 200 OK
Длина: 36181234 (35M) [application/x-bzip2]
Сохранение в: «nextcloud-15.0.0.tar.bz2»

nextcloud-15.0.0.tar.bz2 100%[===================================================>] 34,50M 4,38MB/s за 9,2s

2019-01-08 18:53:21 (3,75 MB/s) - «nextcloud-15.0.0.tar.bz2» сохранён [36181234/36181234]

marivanna@serv-nc:~$

Архив скачался

terminal
marivanna@serv-nc:~$ ls
nextcloud-15.0.0.tar.bz2
marivanna@serv-nc:~$

Распаковываем в корень сайта

terminal
marivanna@serv-nc:~$ sudo tar -C /var/www/html/ -xvjf nextcloud-15.0.0.tar.bz2

Создадим каталог для данных, изменим владельца

terminal
marivanna@serv-nc:~$ sudo mkdir /home/data
marivanna@serv-nc:~$ sudo chown -R www-data:www-data /home/data

Следующим шагом зарегистрируем бесплатный домен (бесплатны первые 12 месяцев, продление стоит денег, можно рассмотреть платную регистрацию домена в зоне ru, например здесь https://ru.godaddy.com https://www.reg.ru).
Зарегистрируемся в Яндекс коннект, делегируем управление доменом. Переходим по адресу my.freenom.com регистрируемся на сайте, переходим по ссылке зарегистрировать новый домен, вводим желаемый домен

Не советую выбирать домен в .tk
Выбираю mvanna.ml жмем оформить заказ
Выбираем 12 месяцев бесплатно.

Жмем продолжить, заполняем форму и видим номер заказа. Домен должен появится в «моих доменах»

Далее зарегистрируемся в яндекс коннект connect.yandex.ru Необходимо будет создать сотрудника-админа и почту для домена

Переходим в домены, жмем добавить

После добавления видим, что домен не подтвержден, подтвердим с помощью dns записи

Возвращаемся на сайт my.freenom.com Переходим в раздел мои домены, жмем управление доменом, выбираем пункт добавить запись, txt из яндекс коннект, должно получится так:

Проверим добавилась ли запись

terminal
marivanna@serv-nc:~$ dig txt mvanna.ml +noall +answer

; <<>> DiG 9.11.3-1ubuntu1.3-Ubuntu <<>> txt mvanna.ml +noall +answer
;; global options: +cmd
mvanna.ml. 3580 IN TXT "yandex-verification: c0d152a47794"
marivanna@serv-nc:~$

Видим что запись есть, возвращаемся в яндекс коннект и жмем запустить проверку.
Переходим в раздел «Управление DNS»

Нас интересуют записи
NS dns2.yandex.net.
NS dns1.yandex.net.

Вернемся на сайт my.freenom.com в раздел My Domains - Management Tools
Выбираем раздел Nameservers — выбираем Use custom nameservers (enter below)

Теперь все записи можно прописывать из панели управления яндекс коннект
Добавим «А» запись — Жмем «Добавить DNS-запись»

Все готово, получили почту в домене +удобное управление доменом.
Создаем виртуальный хост

terminal
marivanna@serv-nc:~$ sudo nano /etc/apache2/sites-available/nextcloud.conf

<VirtualHost *:80>
DocumentRoot /var/www/html/nextcloud/
ServerName mvanna.ml

<Directory "/var/www/html/nextcloud">
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
</Directory>
</VirtualHost>

Включаем сайт

terminal
marivanna@serv-nc:~$ sudo a2ensite nextcloud.conf
перезагружаем конфигурацию apache
marivanna@serv-nc:~$ systemctl reload apache2.service

Изменим владельца каталога с сайтом

terminal
marivanna@serv-nc:~$ sudo chown -R www-data:www-data /var/www/html/nextcloud/

Запускаем мастер установки для этого:
переходим по ip адресу сервера или по домену (должен быть включен проброс портов 80,443 на маршрутизаторе) заполняем поля:

Переходим в Настройки-личная информация. Заполняем адрес эл. Почты, остальные поля по желанию.
Переходим в пункт «Основные настройки» заполняем поля Почтовый сервер.
Способ отправки SMTP, шифрование SSL/TLS
Адрес отправителя хххх@domain.ml (Выберите адрес с которого будут приходить уведомления)
Метод проверки подлинности Логин -ставим галочку «Требуется аутентификация»
Адрес сервера smtp.yandex.ru: 465
Учетные данные yyyyy@domain.ml password(Ваш пароль) — жмем сохранить учетные данные. (Учетные данные для входа в яндекс)
Отправить сообщение. Проверяем письмо на почте.


В этом же разделе меняем метод выполнения фоновых задач на Cron

terminal
marivanna@serv-nc:~$ sudo crontab -u www-data -e

добавляем строку:
terminal
*/15 * * * * php -f /var/www/html/nextcloud/cron.php

Далее открываем страницу с «настройками», ссылка «обзор»
Видим: «Предупреждения о текущей конфигурации»

Исправим первое предупреждение:

terminal
marivanna@serv-nc:~$ sudo nano /etc/php/7.3/mods-available/opcache.ini

Добавляем строки в файл.
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

marivanna@serv-nc:~$ sudo systemctl restart apache2

marivanna@serv-nc:~$ sudo nano /var/www/html/nextcloud/config/config.php
marivanna@serv-nc:~$

добавляем строку :

terminal
'memcache.local' => '\\OC\\Memcache\\APCu',

Смотрим далее список предупреждений

Попробуем по пунктам исправить ситуацию
Разрешённое PHP максимальное значение использования памяти ниже рекомендуемого значения в 512 МБ
Статья по настройке PHP

terminal
marivanna@serv-nc:~$ sudo nano /etc/php/7.3/apache2/php.ini

Меняем значение строк
memory_limit = 512M
upload_max_filesize = 16000M
max_file_uploads = 1000

Поиск в редакторе nano — осуществляется по Ctrl+w
Перезагружаем apache

terminal
marivanna@serv-nc:~$ sudo systemctl restart apache2


После изменения:

Еще на одно предупреждение меньше

исправим последнюю ошибку:

terminal
marivanna@serv-nc:/var/www/html/nextcloud$ sudo -u www-data php occ maintenance:mode --on
marivanna@serv-nc:/var/www/html/nextcloud$ sudo -u www-data php occ db:convert-filecache-bigint
marivanna@serv-nc:/var/www/html/nextcloud$ sudo -u www-data php occ maintenance:mode --off

Используется небезопасное соединение по протоколу HTTP. Настоятельно рекомендуется настроить сервер на использование HTTPS согласно нашим подсказкам по безопасности

Настраиваем ssl (доступ к сайту по https)

Необходимо получить сертификат от Let’s Encrypt для нашего домена mvanna.ml иначе не избежать предупреждений в браузере. Для этого установим утилиту certbot https://certbot.eff.org/ для получения и продления сертификата:

terminal
marivanna@serv-nc:~$ sudo apt update
marivanna@serv-nc:~$ sudo apt install certbot

Добавим правило в фаервол

terminal
marivanna@serv-nc:~$ sudo ufw allow 443/tcp

Включим ssl

terminal
marivanna@serv-nc:~$ sudo a2enmod ssl
marivanna@serv-nc:~$ sudo systemctl restart apache2

Для получения сертификата можно воспользоваться автоматическим скриптом для apache, который получит сертификат и пропишет путь до него в файле конфигурации виртуального хоста. Если у вас веб сервер nginx - замените на python-certbot-nginx.

terminal
marivanna@serv-nc:~$ sudo apt update
marivanna@serv-nc:~$ sudo apt install python-certbot-apache
marivanna@serv-nc:~$ sudo certbot  run --apache
выбрать цифру со своим доменом

Добавим в cron задание по обновлению сертификата
Смотрим полный путь до скрипта(user - в пути заменить на своего пользователя):
terminal
marivanna@serv-nc:~$ sudo which certbot
/usr/bin/certbot
marivanna@serv-nc:~$sudo su
root@serv-nc:~# crontab -e
30 15 * * 1 /usr/bin/certbot renew >> /home/user/le-renew.log

Каждый понедельник в 15 30 будет производится запрос на проверку сертификата, лог запросов посмотреть можно в файле /home/user/le-renew.log

Можно так же установить сертификат и в ручном режиме, подтвердив, что домен принадлежит вам при помощи DNS записи:

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

terminal
marivanna@serv-nc:~$sudo certbot certonly --manual --agree-tos --email admin@mvanna.ml --preferred-challenges=dns -d mvanna.ml

Первый вопрос хотели бы получать спам на ваш еmail от нас, отвечаю «Y»
Второй вопрос: это ваш ip? — отвечаем Y
Добавляем txt запись которую нам предлагает certbot

Переходим в яндекс коннект в управление DNS, создаем txt запись

Проверяем создание записи командой

terminal

marivanna@serv-nc:~$ dig txt _acme-challenge.mvanna.ml +noall +answer

; <<>> DiG 9.11.3-1ubuntu1.3-Ubuntu <<>> txt _acme-challenge.mvanna.ml +noall +answer
;; global options: +cmd
_acme-challenge.mvanna.ml. 2762 IN TXT "HWd3rswi3UA0m9Z- …
marivanna@serv-nc:~$

Запись создана, возвращаемся в терминал и подтверждаем, в случае успеха видим вывод команды:

terminal

Press Enter to Continue
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/mvanna.ml/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/mvanna.ml/privkey.pem
Your cert will expire on 2019-04-13. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
marivanna@serv-nc:~$

Далее редактируем конфигурацию виртуального хоста, вместо домена подставляем свой

terminal

marivanna@serv-nc:~$ sudo nano /etc/apache2/sites-available/nextcloud.conf

<Directory "/var/www/html/nextcloud">
AllowOverride All
Options +FollowSymlinks
<IfModule mod_dav.c>
Dav off
</IfModule>
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</IfModule>
SetEnv HOME /var/www/html/nextcloud
SetEnv HTTP_HOME /var/www/html/nextcloud
</Directory>

<VirtualHost *:443>
ServerName mvanna.ml
ServerAlias www.mvanna.ml
ServerAdmin admin@mvanna.ml

<If "%{HTTP_HOST} == 'www.mvanna.ml'">
Redirect permanent / https://mvanna.ml/
</If>

DocumentRoot /var/www/html/nextcloud
ErrorLog /var/log/apache2/nextcloud-error.log
CustomLog /var/log/apache2/nextcloud-access.log combined

SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/mvanna.ml/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mvanna.ml/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mvanna.ml/chain.pem

</VirtualHost>

<VirtualHost *:80>
DocumentRoot /var/www/html/nextcloud
ServerName mvanna.ml
ServerAlias www.mvanna.ml
ServerAdmin admin@mvanna.ml

Redirect permanent / https://mvanna.ml
</VirtualHost>

Перезагружаем apache

terminal
marivanna@serv-nc:~$ sudo systemctl restart apache2

Если для завершения установки перешли по ip адресу, потребуется отредактировать список доверенных адресов, добавим домен:
terminal
[marivanna@serv-nc]# nano /var/www/html/nextcloud/config/config.php
***
'trusted_domains' =>
array (
0 => '192.168.0.110',
1 => 'mvanna.ml',
),
***

Доступ по https готов. Проверяем

Появилась новая ошибка, сервер не возвращает в заголовке hsts, проверить так - это действительно или нет можно с помощью ресурса по адресу:
hstspreload.org/?domain

Так как в конфиг хоста мы уже прописали Strict-Transport-Security, то причина скорее всего в том, что не включен mod_headers (после обновления такое может случится, обновления производилось с 15.0.0 до 15.0.2)
Включим mod_headers, mod_expires и mod_rewrite

terminal
marivanna@serv-nc:~$ sudo a2enmod headers
marivanna@serv-nc:~$ sudo a2enmod expires
marivanna@serv-nc:~$ sudo a2enmod rewrite
marivanna@serv-nc:~$ sudo systemctl restart apache2



Проверим на безопасность сканером NC https://scan.nextcloud.com/

И проверим на сайте https://securityheaders.com/

Все проверки пройдены кроме Feature-Policy (Feature-Policy Feature Policy is a new header that allows a site to control which features and APIs can be used in the browser).

Добавим в конфиг нашего хоста строку (измените опции по необходимости):

terminal
Header set Feature-Policy "geolocation 'none'; midi 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; payment 'none'"

Получится так:
terminal
</IfModule>
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header set Feature-Policy "geolocation 'none'; midi 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; vibrate 'none'; payment 'none'"
</IfModule>
SetEnv HOME /var/www/html/nextcloud
SetEnv HTTP_HOME /var/www/html/nextcloud
</Directory>

Перезагружаем веб сервер

Весь список опций отправляемых в заголовке можно найти по ссылке:
https://github.com/WICG/feature-policy/blob/master/features.md

 Установим Fail2ban

Описывать подробно как работает fail2ban не буду, есть множество статей в интернете, остановимся на основной настройке:
fail2ban.conf - пример выполнения основных настроек программы;
jail.conf - пример настройки запрещающих правил;
jail.d - папка с конфигурационными файлами пользователя, для настройки правил запрета;
action.d - файлы, в которых описываются действия, выполняемые при блокировке;
filter.d - в этих файлах описываются способы разбора журналов программ для поиска неудачных попыток входа.

Устанавливаем и запускаем Fail2ban

terminal

marivanna@serv-nc:~$ sudo apt install fail2ban
marivanna@serv-nc:~$ sudo systemctl start fail2ban
marivanna@serv-nc:~$ sudo systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-01-08 22:00:40 MSK; 1min 16s ago
Docs: man:fail2ban(1)
Main PID: 5611 (fail2ban-server)
Tasks: 3 (limit: 4506)
CGroup: /system.slice/fail2ban.service
└─5611 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

янв 08 22:00:40 serv-nc systemd[1]: Starting Fail2Ban Service...
янв 08 22:00:40 serv-nc systemd[1]: Started Fail2Ban Service.
янв 08 22:00:41 serv-nc fail2ban-server[5611]: Server ready

Создадим свой файл конфигурации настройки правил, для этого скопируем готовый конфиг в файл .local

terminal
marivanna@serv-nc:~$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

отредактируем конфигурацию:

ignoreip = 192.168.0.1 190.11.25.27 192.168.0.50 - адреса или подсети которые будет игнорировать fail2ban, через пробел
bantime = 100m - Время бана по умолчанию в минутах
findtime = 30m – время между попытками
maxretry = 3 – число попыток
destemail = admin@domain.ml - адрес для отправки уведомлений
sender = admin@domain.ml – адрес с которого отправляются уведомления
action = %(action_mw)s - Какое из действий выполнить, (в данном случае забанить и отправить email)

Настройка отдельных приложений:

terminal

marivanna@serv-nc:~$ sudo nano /etc/fail2ban/jail.local

***Часть вывода пропущена***

[sshd]
enabled = true
filter = sshd
port = 2222
bantime = 604800
logpath = %(sshd_log)s
backend = %(sshd_backend)s

# HTTP servers
# выявляем неудачные попытки ввода пароля
[apache-auth]
enabled = true
filter = apache-auth
port = http,https
logpath = %(apache_error_log)s
maxretry = 3

[apache-badbots]
# Ban hosts which agent identifies spammer robots crawling the web
# for email addresses. The mail outputs are buffered.
enabled = true
port = http,https
logpath = %(apache_access_log)s
bantime = 72h
maxretry = 1

# выявляем потенциальные сканирования для применения эксплойтов и php уязвимостей
[apache-noscript]
enabled = true
port = http,https
filter = apache-noscript
logpath = %(apache_error_log)s
maxretry = 3

# выявляем попытки переполнения Апача
[apache-overflows]
enabled = true
port = http,https
filter = apache-overflows
logpath = %(apache_error_log)s
maxretry = 2

# выявляем неудачные попытки в поиске домашней директории на сервере
[apache-nohome]
enabled = true
port = http,https
filter = apache-nohome
logpath = %(apache_error_log)s
maxretry = 2

# Nextcloud
#
[nextcloud]
enabled = true
filter = nextcloud
protocol = tcp
port = http,https
logpath = %(nextcloud_log)s
bantime = 604800
findtime = 1600
maxretry = 2

***Часть вывода пропущена***

Настраиваем отправку уведомлений fail2ban о блокировке на email, настроим дополнительный фильтр для nextcloud авторизации.

Для версии Nextcloud ниже 17

terminal
marivanna@serv-nc:~$ sudo nano /etc/fail2ban/filter.d/nextcloud.conf

[Definition]
failregex=^{"reqId":".*","remoteAddr":".*","app":"core","message":"Login failed: '.*' \(Remote IP: '&amp;lt;HOST&amp;gt;'\)","level":2,"time":".*"}$
            ^{"reqId":".*","level":2,"time":".*","remoteAddr":".*","app":"core".*","message":"Login failed: '.*' \(Remote IP: '&amp;lt;HOST&amp;gt;'\)".*}$
            ^.*\"remoteAddr\":\"&amp;lt;HOST&amp;gt;\".*Trusted domain error.*$


Для версии Nextcloud 17 и выше
terminal
marivanna@serv-nc:~$ sudo nano /etc/fail2ban/filter.d/nextcloud.conf

[Definition]
failregex = ^{"reqId":".*","remoteAddr":".*","app":"core","message":"Login failed: '.*' \(Remote IP: '&amp;lt;HOST&amp;gt;'\)","level":2,"time":".*"}$
            ^{"reqId":".*","level":2,"time":".*","remoteAddr":".*","app":"core".*","message":"Login failed: '.*' \(Remote IP: '&amp;lt;HOST&amp;gt;'\)".*}$
            ^{"reqId":".*","level":2,"time":".*","remoteAddr":".*","user":".*","app":".*","method":".*","url":".*","message":"Login failed: .* \(Remote IP: &amp;lt;HOST&amp;gt;\).*}$
ignoreregex =

Укажем файл логов Nextcloud:

terminal
marivanna@serv-nc:~$ sudo nano /etc/fail2ban/paths-common.conf

В конец добавляем путь до файла логов.
terminal
#Nextcloud
nextcloud_log = /home/data/nextcloud.log
marivanna@serv-nc:~$ sudo systemctl restart fail2ban

Проверить правильность настройки правил fail2ban можно командой

terminal
sudo fail2ban-regex /home/data/nextcloud.log /etc/fail2ban/filter.d/nextcloud.conf

В результате вывода видим 20 совпадений (Предварительно необходимо попробовать несколько раз ввести не верные данные для входа)

terminal
Failregex: 20 total

Или пробуем ввести 3 раза не верный логин/пароль и видим, что все работает, страница со входом более не доступна

Проверяем список заблокированных адресов правилом "nextcloud" и включенные правила

terminal
marivanna@serv-nc:~$ sudo fail2ban-client status nextcloud
Status for the jail: nextcloud
|- Filter
| |- Currently failed: 0
| |- Total failed: 2
| `- File list: /home/data/nextcloud.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 207.108.16.10
marivanna@serv-nc:~$
marivanna@serv-nc:~$ sudo fail2ban-client status
Status
|- Number of jail: 7
`- Jail list: apache-auth, apache-badbots, apache-nohome, apache-noscript, apache-overflows, nextcloud, sshd
marivanna@serv-nc:~$

Настроим Postfix для отправки уведомлений о блокировке fail2ban через smtp серверы яндекса.
Устанавливаем:

terminal
marivanna@serv-nc:~$ sudo apt update
marivanna@serv-nc:~$ sudo apt install postfix
Выбираю установку без настройки

Редактируем файл конфигурации:

terminal
marivanna@serv-nc:~$ sudo nano /etc/postfix/main.cf

relayhost =
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_type = cyrus
smtp_sasl_mechanism_filter = login
smtp_sender_dependent_authentication = yes
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay
sender_canonical_maps = hash:/etc/postfix/canonical
smtp_generic_maps = hash:/etc/postfix/generic
smtp_use_tls = yes
mydestination = localhost.$domen.ru, localhost
inet_protocols = ipv4

ЕСЛИ почтовый домен совпадает с hostname сервера, меняем параметр mydestination

terminal
mydestination = localhost.$mydomain, localhost

terminal
marivanna@serv-nc:~$ sudo nano /etc/postfix/canonical
@mvanna.ml admin@mvanna.ml
terminal
marivanna@serv-nc:~$ sudo nano /etc/postfix/generic
root@localhost root@mvanna.ml
terminal
marivanna@serv-nc:~$ sudo nano /etc/postfix/sasl_passwd
smtp.yandex.ru admin@mvanna.ml:password
terminal
marivanna@serv-nc:~$ sudo nano /etc/postfix/sender_relay
@mvanna.ml smtp.yandex.ru
terminal

marivanna@serv-nc:~$ sudo systemctl start postfix
marivanna@serv-nc:~$ sudo systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/lib/systemd/system/postfix.service; enabled; vendor preset: enabled)
Active: active (exited) since Sat 2019-01-19 18:30:41 MSK; 2s ago
Process: 13872 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 13872 (code=exited, status=0/SUCCESS)

янв 19 18:30:41 serv-nc systemd[1]: Starting Postfix Mail Transport Agent...
янв 19 18:30:41 serv-nc systemd[1]: Started Postfix Mail Transport Agent.
marivanna@serv-nc:~$

Компилируем таблицы в понятный постфиксу формат:

terminal
marivanna@serv-nc:~$ sudo postmap /etc/postfix/canonical
marivanna@serv-nc:~$ sudo postmap /etc/postfix/generic
marivanna@serv-nc:~$ sudo postmap /etc/postfix/sasl_passwd
marivanna@serv-nc:~$ sudo postmap /etc/postfix/sender_relay
marivanna@serv-nc:~$ sudo systemctl restart postfix

Проверим отправив тестовое письмо с помощью php скрипта, 'mail@ya.ru' - замените адресом получателя

terminal
marivanna@serv-nc:~$ sudo nano testmail
<?php
$to = 'mail@ya.ru';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: admin@mvanna.ml' . "\r\n" .
'Reply-To: admin@mvanna.ml' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
if( mail($to, $subject, $message, $headers) ) {
echo "OK";
} else {
echo "FAIL";
}

Сразу письмо может не отправиться, так как сработает серый список яндекса (greylisting)

Смотрим в логах, если письмо не доставлено:

terminal
marivanna@serv-nc:~$ cat /var/log/mail.log | grep 451
Jan 19 18:40:00 serv-nc postfix/smtp[14245]: 0D385A3FD7: host mx.yandex.ru[213.180.204.89] said: 451 4.7.1 Sorry, the service is currently unavailable. Please come back later. 1547912400-TqzBrXCOI7-dxjaRjJ0 (in reply to end of DATA command)
Jan 19 18:40:00 serv-nc postfix/smtp[14245]: 0D385A3FD7: to=<mail@ya.ru>, relay=mx.yandex.ru[213.180.193.89]:25, delay=1.2, delays=0.1/0.11/0.95/0.08, dsn=4.7.1, status=deferred (host mx.yandex.ru[213.180.193.89] said: 451 4.7.1 Sorry, the service is currently unavailable. Please come back later. 1547912400-LoVbeX5Yjt-e03mxuk2 (in reply to end of DATA command))
Jan 19 18:45:38 serv-nc postfix/smtp[14308]: 1DCB6A3FE3: host mx.yandex.ru[77.88.21.89] said: 451 4.7.1 Sorry, the service is currently unavailable. Please come back later. 1547912738-oAeV65CKG0-jb9iCIX0 (in reply to end of DATA command)
Jan 19 18:45:38 serv-nc postfix/smtp[14308]: 1DCB6A3FE3: to=<mail@ya.ru>, relay=mx.yandex.ru[93.158.134.89]:25, delay=1.3, delays=0.14/0.02/0.98/0.11, dsn=4.7.1, status=deferred (host mx.yandex.ru[93.158.134.89] said: 451 4.7.1 Sorry, the service is currently unavailable. Please come back later. 1547912738-oYj9vXoHfP-jcjCKjo6 (in reply to end of DATA command))
marivanna@serv-nc:~$

Пробуем через 10 минут и видим, что письмо на email доставлено (проверьте папку спам):

Последнее, что рекомендую сделать — это включить двухфакторную авторизацию, для этого устанавливаем приложение «Two Factor TOTP Provider» из раздела приложений:

Переходим в раздел Настройки>Безопасность>Требовать двухфакторную аутентификацию, переходим в личную безопасность> внизу страницы отмечаем пункт включить TOTP, далее скачиваем приложение на телефон «google authenticator» из него сканируем штрих-код. Теперь при входе необходима ввести дополнительный код из google authenticator.

Утилиты которые могут пригодиться в процессе обслуживания:
htop — диспетчер процессов.
iftop — показывает активные сетевые соединения
lm_sensors — температура процессора
lsof — выводит информацию о файлах которые ипользуются процессами.
Traceroute (tracepath)— маршрут до узла.
Nmap — сканер портов
wget — менеджер закачки
bzip2 — архиватор
whois — сервис предоставляющий информацию о доменах, ip адресах
mc — файловый менеджер

На этом основная настройка выполнена.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *