Установка Nextcloud 18. Centos 7. Apache

Nextcloud 14-18. CentOS7 +Apache. Яндекс коннект/домен/postfix/fail2ban/let's encrypt

  1. Установка ОС. Разметка диска
  2. Настройка ОС. Установка утилит.
  3. Настройка фаервола.
  4. Настраиваем fail2ban.
  5. Установка веб сервера Apache, PHP, MariaDB.
  6. Установка Nextcloud
  7. Регистрация домена
  8. Окончание установки - мастер настройки Nextcloud. Ошибки после установки.
  9. Настройка ssl, Let's encrypt. Установка certbot.
  10. Проверяем рейтинг нашей установки
  11. Отправка уведомлений fail2ban о блокировке на email.

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

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

Начнем с  установки  операционной системы.
Устанавливаем centos 7 minimal (ubuntu server )
Для начала нам нужен установочный образ, скачиваем с оф.сайта http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso (с выходом новых версий ссылка изменится)

Записываем на флешку, я это делаю утилитой multibootusb -  http://multibootusb.org/page_download/ в linux
Под windows многие советуют: rufus - https://rufus.ie/ru_RU.html (я использую UltraISO)


Загружаемся с флешки. (Во многих bios eсть отдельное меню выбора устройства для загрузки, не обязательно менять приоритет загрузки в самом bios)
Выбираем первый пункт- установку


Далее заходим в расположение установки

Выбираем «я настрою разделы» Жмем готово

Выбираем стандартный раздел
Жмем создать автоматически
Меняем раздел swap, у меня 4 Гб оперативной памяти, добавлю еще 8 Гб. В системных требованиях Nextcloud сказано о минимуме в 512 Мб.

Жмем готово, принять изменения

Перейдите в раздел - "сеть и имя узла" - для включения сетевого адаптера.
Далее жмем «начать установку»
Задаем пароль root и создаем пользователя (обязательно их запоминаем)

Жмем перезагрузку, установка выполнена.

Настройка ОС
Для дальнейшей настройки OS и установки nextcloud нам нужен удаленный доступ. По умолчанию включен ssh сервер.
Смотрим какой ip адрес получила сетевая карта в настройках вашего роутера.
Активная аренда DHCP
server 192.168.0.173 00: 1D: 72: D7: 05: AD 4 ч. 44 м. 21 сек.
Или вводим команду

terminal
[user@localhost ~]$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:1d:72:d7:05:ad brd ff:ff:ff:ff:ff:ff
inet 192.168.0.173/24 brd 192.168.0.255 scope global noprefixroute enp2s0
valid_lft forever preferred_lft forever
[user@localhost ~]$

Подключаемся по ssh

terminal
666@666-Z87-D3HP:~$ ssh -l server(server - имя пользователя) 192.168.0.173
The authenticity of host '192.168.0.173 (192.168.0.173)' can't be established.
ECDSA key fingerprint is SHA256:fkgJJGMMMMloGXZQEtmQKdvJlCE7YQwIkfnnfjfjfxx.
Are you sure you want to continue connecting (yes/no)? yes

вводим пароль.
terminal
[user@localhost ~]$

установите утилиту net-tools:

terminal
[user@localhost ~]$ yum install net-tools
Загружены модули: fastestmirror

Для выполнения этой команды необходимы привилегии суперпользователя.
terminal
[user@localhost ~]$ sudo yum install net-tools
Мы полагаем, что ваш системный администратор изложил вам основы
безопасности. Как правило, всё сводится к трём следующим правилам:
№1) Уважайте частную жизнь других.
№2) Думайте, прежде что-то вводить.
№3) С большой властью приходит большая ответственность.
[sudo] пароль для user:
user is not in the sudoers file. This incident will be reported.
[user@localhost ~]$ exit

Если видите данную ошибку, значит пользователь не состоит в группе sudo, все пользователи группы wheel имеют права sudo
добавим:
Заходим под пользователем root

terminal
666@666-Z87-D3HP:~$ ssh -l root 192.168.0.173
root@192.168.0.10's password:
Last login: Fri Nov 16 17:19:15 2018 from 192.168.0.173
[root@localhost ~]#
[root@localhost ~]# usermod -aG wheel user
[root@localhost ~]# exit

[user@localhost ~]$ sudo yum install net-tools
[sudo] пароль для user:

Устанавливаем bind-utils:

terminal
yum install bind-utils

Пропишем статический адрес для сетевой карты:
Конфиг лежит в /etc/sysconfig/network-scripts/ файл с названием вашего адаптера «ifcfg-enp2s0»

Редактируем, я использую в дальнейшем редактора nano:

terminal
[user@localhost ~]$ sudo nano /etc/sysconfig/network-scripts/ifcfg-enp2s0

Если редактора нет, устанавливаем командой

terminal
sudo yum install nano

IPADDR = ваш_ip
GATEWAY = шлюз_для_доступа_к_сети
PREFIX=″24″ - маска
DNS1 = IP_адрес_DNS1
DNS2 = IP_адрес_DNS2

после чего файл будет выглядеть так

TYPE=″Ethernet″
PROXY_METHOD=″none″
BROWSER_ONLY=″no″
BOOTPROTO=″none″
DEFROUTE=″yes″
IPV4_FAILURE_FATAL=″no″
IPV6INIT=″no″
IPV6_AUTOCONF=″yes″
IPV6_DEFROUTE=″yes″
IPV6_FAILURE_FATAL=″no″
IPV6_ADDR_GEN_MODE=″stable-privacy″
NAME=″enp2s0″
UUID=″229c473a-d591-463d-813b-7e32aae1580b″
DEVICE=″enp2s0″
ONBOOT=″yes″
IPADDR=″192.168.0.10"
PREFIX=″24″
GATEWAY=″192.168.0.1"
DNS1=″192.168.0.1"

Сохраняем командой ctrl+o, enter. ctrl+x — выход

Перезагружаем сеть чтобы применить новые параметры:

terminal
service network restart

отключаю ipv6

terminal
[root@server user]# nano /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1


Применим
terminal
[root@server user]# sysctl -p
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
[root@server user]#
[root@server user]# systemctl restart network
[root@server user]#

или

terminal
[root@server user]# nano /etc/sysconfig/network
[root@server user]#

Проверяем

terminal
[root@server user]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0d:70:d7:00:ad brd ff:ff:ff:ff:ff:ff
inet 192.168.0.10/24 brd 192.168.0.255 scope global noprefixroute enp2s0
valid_lft forever preferred_lft forever
[root@server user]#

Сменим имя ПК

terminal
[user@localhost ~]$ hostnamectl set-hostname server
==== AUTHENTICATING FOR org.freedesktop.hostname1.set-static-hostname ===
Чтобы настроить статическое имя компьютера, а также его «красивое» имя, необходимо пройти аутентификацию.
Authenticating as: user
Password:
==== AUTHENTICATION COMPLETE ===
[user@localhost ~]$

Устанавливаем файловый менеджер Midnight Commander

terminal
[user@server ~]$ sudo yum install mc

Настраиваем SSH сервер

terminal
[user@server ~]$ sudo nano /etc/ssh/sshd_config

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

Дальше настраиваем фаервол

Проверим запущен ли фаервол

terminal
[user@server ~]$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Пт 2018-11-16 16:38:30 MSK; 3h 3min ag
Проверяем зоны:
[root@server user]# firewall-cmd --get-active-zones
public
interfaces: enp2s0

Проверка настроенных правил:

terminal

[root@server user]# firewall-cmd --permanent --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

[root@server user]#

Удаляю правила для ipv6, так как не использую

terminal
[root@server user]# firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
success

Разрешим порт ssh

terminal
[root@server user]# firewall-cmd --permanent --zone=public --add-port 2222/tcp
success

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

terminal
[root@server user]# firewall-cmd --reload
success

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

terminal
systemctl restart sshd

проверяем

terminal
[user@server ~]$ exit
logout
Connection to 192.168.0.10 closed.
666@666-Z87-D3HP:~$ ssh -l user 192.168.0.10
ssh: connect to host 192.168.0.10 port 22: Connection refused
666@666-Z87-D3HP:~$ ssh -l user 192.168.0.10 -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:52ZtQ2aMbGGdoGXZQEtmQKdvJlCE7YQwWr+3zl5Bmwg.
Please contact your system administrator.
Add correct host key in /home/666/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/666/.ssh/known_hosts:2
remove with:
ssh-keygen -f "/home/666/.ssh/known_hosts" -R "[192.168.0.10]:2222"
ECDSA host key for [192.168.0.10]:2222 has changed and you have requested strict checking.
Host key verification failed.
666@666-Z87-D3HP:~$

При возникновении ошибки из за подмены ECDSA key просто удалим файл с ключами

terminal
666@666-Z87-D3HP:~$ rm /home/666/.ssh/known_hosts
666@666-Z87-D3HP:~$ ssh -l user 192.168.0.10 -p 2222
The authenticity of host '[192.168.0.10]:2222 ([192.168.0.10]:2222)' can't be established.
ECDSA key fingerprint is SHA256:52ZtQ2aMb4frttttQEtmQKdvJlCE7YQwWr+3zl5Bmwg.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.0.10]:2222' (ECDSA) to the list of known hosts.
user@192.168.0.10's password:
Last login: Fri Nov 16 18:48:40 2018 from 192.168.141.100
[user@server ~]$

Проверяем

terminal
[root@server user]# firewall-cmd --zone=public --list-ports
2222/tcp
[root@server user]#

удаляем правило для стандартного порта ssh, перезагружаем

terminal
[root@server user]# firewall-cmd --permanent --zone=public --remove-service=ssh
success
[root@server user]# firewall-cmd --reload
success

Проверяем что получилось

terminal

[root@server user]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp2s0
sources:
services:
ports: 2222/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

[root@server user]#

Настраиваем время

terminal

[user@server ~]$ date
Пт ноя 16 20:47:58 MSK 2018
[user@server ~]$ timedatectl set-timezone Europe/Moscow

Проверим правильность времени

terminal

[user@server ~]$ timedatectl
Local time: Пт 2018-11-16 18:49:19 MSK
Universal time: Пт 2018-11-16 15:49:19 UTC
RTC time: Пт 2018-11-16 15:49:19
Time zone: Europe/Moscow (MSK, +0300)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
[user@server ~]$

Обновимся

terminal
[root@server user]# yum update
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirror.yandex.ru
* extras: mirror.yandex.ru
* updates: mirror.yandex.ru
No packages marked for update
[root@server user]#

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

Приступаем к установке:

terminal
[root@server user]# yum search htop
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirror.yandex.ru
* extras: mirror.yandex.ru
* updates: mirror.yandex.ru
Внимание: совпадений для htop не найдено
No matches found
[root@server user]#

Пакета htop как видим не найдено, установим дополнительные репозитории:
Вывод списка репозиториев -

terminal
[root@server user]# yum repolist
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirror.yandex.ru
* extras: mirror.yandex.ru
* updates: mirror.yandex.ru
Идентификатор репозитория репозиторий состояние
base/7/x86_64 CentOS-7 - Base 9 911
extras/7/x86_64 CentOS-7 - Extras 434
updates/7/x86_64 CentOS-7 - Updates 1 614
repolist: 11 959
[root@server user]#

EPEL или Extra Packages for Enterprise Linux - это репозиторий дополнительных пакетов для Red Hat
SСL или Software Collections - репозиторий от Red Hat

terminal
[root@server user]# yum install epel-release
[root@server user]# yum install centos-release-scl

Пробуем повторно

terminal

[root@server user]# yum repolist | grep repolist
repolist: 33 539

[root@server user]# yum search htop | grep htop
============================== N/S matched: htop
htop.x86_64 : Interactive process viewer
[root@server user]#
[root@server user]# yum install htop
[root@server user]# htop

Далее устанавливаем и настраиваем fail2ban (есть в репозитории epel):

terminal
[root@server user]# yum install fail2ban

Запускаем службу:
terminal

[root@server user]# sudo systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: man:fail2ban(1)
[root@server user]# sudo systemctl start fail2ban
[root@server user]# sudo systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled)
Active: active (running) since Вс 2018-11-18 17:52:46 MSK; 2s ago
Docs: man:fail2ban(1)
Process: 2786 ExecStart=/usr/bin/fail2ban-client -x start (code=exited, status=0/SUCCESS)
Main PID: 2789 (fail2ban-server)
CGroup: /system.slice/fail2ban.service
└─2789 /usr/bin/python2 -s /usr/bin/fail2ban-server -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail...

ноя 18 17:52:45 server systemd[1]: Starting Fail2Ban Service...
ноя 18 17:52:46 server fail2ban-client[2786]: 2018-11-18 17:52:46,403 fail2ban.server [2787]: INFO Start...0.9.7
ноя 18 17:52:46 server fail2ban-client[2786]: 2018-11-18 17:52:46,403 fail2ban.server [2787]: INFO Start... mode
ноя 18 17:52:46 server systemd[1]: Started Fail2Ban Service.
Hint: Some lines were ellipsized, use -l to show in full.
[root@server user]#

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

terminal
[root@server user]# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

отредактируем конфигурацию:
[root@server user]# nano /etc/fail2ban/jail.local
добавим в пункт
1.
terminal
ignoreip = 192.168.0.1 123.14.13.122 192.168.0.15
— адреса или подсети которые будет игнорироваться, через пробел
2. Время бана по умолчанию
terminal
# "bantime" is the number of seconds that a host is banned.
bantime = 360000

3. Количество попыток, меняю на 2
terminal
# "maxretry" is the number of failures before a host get banned.
Maxretry = 2

4. Укажем email для отправки оповещений

terminal
# Destination email address used solely for the interpolations in
# jail.{conf,local,d/*} configuration files.
destemail = user666@mail.ru
# Sender email address used solely for some actions
sender = user555@domen.ru
mta = sendmail
# globally (section [DEFAULT]) or per specific section
action = %(action_mwl)s

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

terminal

[sshd]
# To use more aggressive sshd filter (inclusive sshd-ddos failregex):
#filter = sshd-aggressive
enabled = true
action = iptables[name=SSH, port=2222, protocol=tcp]
findtime = 1800
maxretry = 2
bantime = 604800
port = 2222
logpath = %(sshd_log)s
backend = %(sshd_backend)s

#
# Nextcloud
#
[nextcloud]
backend = auto
enabled = false
filter = nextcloud
action = iptables-allports
protocol = tcp
port = 80 443
logpath = %(nextcloud_log)s
bantime = 604800
findtime = 1600
maxretry = 2

#
# HTTP servers
#выявляем неудачные попытки ввода пароля

[apache-auth]
enabled = true
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 = 172800
maxretry = 1

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

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

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

Проверка правильности настройки.

terminal
[root@server user]# fail2ban-client -d
ERROR No file(s) found for glob /var/log/httpd/*error_log
ERROR Failed during configuration: Have not found any log file for apache-auth jail
Traceback (most recent call last):
File "/bin/fail2ban-client", line 472, in <module>
if client.start(sys.argv):
File "/bin/fail2ban-client", line 405, in start
self.dumpConfig(self.__stream)
File "/bin/fail2ban-client", line 461, in dumpConfig
for c in cmd:
TypeError: 'NoneType' object is not iterable
[root@server user]#

В данном случае у нас еще нет файлов логов.

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

terminal
[root@server user]# yum install httpd


Запускаем службу
terminal
[root@server user]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@server user]# systemctl start httpd
[root@server user]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Пн 2018-11-19 19:48:14 MSK; 10s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 2004 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─2004 /usr/sbin/httpd -DFOREGROUND
├─2005 /usr/sbin/httpd -DFOREGROUND
├─2006 /usr/sbin/httpd -DFOREGROUND
├─2007 /usr/sbin/httpd -DFOREGROUND
├─2008 /usr/sbin/httpd -DFOREGROUND
└─2009 /usr/sbin/httpd -DFOREGROUND

ноя 19 19:48:13 server systemd[1]: Starting The Apache HTTP Server...
ноя 19 19:48:14 server httpd[2004]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, u...message
ноя 19 19:48:14 server systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@server user]#

Устанавливаем PHP

Версия php по умолчанию 5.4 в centos7, нам потребуется версия 7.1 (на данный момент лучше использовать более новую версию 7.3)  версия php 7.3 поддерживается с Nextcloud 15 версии.
Добавим репозиторий Remi

terminal
[root@server user]# rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
[root@server user]# ls -l /etc/yum.repos.d/remi*
-rw-r--r--. 1 root root 446 июн 19 11:28 /etc/yum.repos.d/remi-glpi91.repo
-rw-r--r--. 1 root root 446 июн 19 11:28 /etc/yum.repos.d/remi-glpi92.repo
-rw-r--r--. 1 root root 446 июн 19 11:28 /etc/yum.repos.d/remi-glpi93.repo
-rw-r--r--. 1 root root 456 июн 19 11:28 /etc/yum.repos.d/remi-php54.repo
-rw-r--r--. 1 root root 1314 июн 19 11:28 /etc/yum.repos.d/remi-php70.repo
-rw-r--r--. 1 root root 1314 июн 19 11:28 /etc/yum.repos.d/remi-php71.repo
-rw-r--r--. 1 root root 1314 июн 19 11:28 /etc/yum.repos.d/remi-php72.repo
-rw-r--r--. 1 root root 1314 июн 19 11:28 /etc/yum.repos.d/remi-php73.repo
-rw-r--r--. 1 root root 2605 июн 19 11:28 /etc/yum.repos.d/remi.repo
-rw-r--r--. 1 root root 750 июн 19 11:28 /etc/yum.repos.d/remi-safe.repo
[root@server user]#

для установки php7.1 отредактируем remi-php71.repo

terminal
[root@server user]# nano /etc/yum.repos.d/remi-php71.repo

Изменим
terminal
enabled=0 на 1


Устанавливаем php и необходимые модули:
terminal
[root@server user]# yum install php php-mysql php-pecl-zip php-xml php-mbstring php-gd php-intl php-posix php-opcache php-pecl-apcu php-imagick

Версия PHP:
php -v

Устанавливаем MariaDB. Что бы установить актуальную версию, по ссылке идем на официальный сайт и выбираем свой дистрибутив и выполняем инструкцию:

Here is your custom MariaDB YUM repository entry for CentOS. Copy and paste it into a file under /etc/yum.repos.d/ (we suggest naming the file MariaDB.repo or something similar).

# MariaDB 10.4 CentOS repository list - created 2019-12-22 14:49 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

After the file is in place, install MariaDB with:
sudo yum install MariaDB-server MariaDB-client

Или устанавливаем ту, что есть в официальном репозитории, но с версией 10.2 и ниже - вы получите предупреждение после установки о том, что  не поддерживаются 4-байтовые символы.

terminal
[root@server user]# yum install mariadb-server

Включаем автозапуск

terminal

[root@server user]# systemctl enable mariadb.service
[root@server user]# 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

terminal
[root@server user]# wget https://download.nextcloud.com/server/releases/nextcloud-14.0.3.tar.bz2
[root@server user]# ls
nextcloud-14.0.3.tar.bz2
[root@server user]#

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

terminal
[root@server user]# tar -C /var/www/html -xvjf nextcloud-14.0.3.tar.bz2

Создадим каталог для данных, изменим владельца (Каталог с данными лучше вынести за пределы каталога с сайтом)

terminal
[root@server ~]# mkdir /var/www/html/nextcloud/data
[root@server ~]# chown -R apache.apache /var/www/html/nextcloud
[root@server html]# ls -l
итого 4
drwxr-xr-x. 15 apache apache 4096 ноя 20 16:33 nextcloud
[root@server html]#

Регистрируем домен, (бесплатно на 12 месяцев, продление стоит денег, можно рассмотреть платную регистрацию домена в зоне ru, например здесь https://www.reg.ru) на freenom.com. Более подробно в инструкции

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

terminal
[root@server ~]# firewall-cmd --zone=public --add-service=http --permanent
success
[root@server ~]# firewall-cmd --reload
success
[root@server ~]#

selinux — на данном этапе отключаем.  Позже разобравшись в настройке selinux можно включить и настроить для Nextcloud.

terminal
[root@server data]# nano /etc/selinux/config
SELINUX=disabled

Далее создаем виртуальный хост

terminal

[root@server conf.d]# nano /etc/httpd/conf.d/nextcloud.conf

<VirtualHost *:80>
DocumentRoot /var/www/html/nextcloud/
ServerName Ваш_Домен.tk

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

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

terminal
[root@server ~]# systemctl restart httpd

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

Nextcloud установлен, переходим в настройки/администрирование и видим несколько предупреждений

Поправим opcache

terminal
[root@server config]# nano /etc/php.d/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

сохраняем, выходим.
Рестарт сервера
terminal
[root@server config]# systemctl restart httpd

Обновляем страницу

Следующим шагом — настроим memcache
terminal
[root@server ~]# nano /var/www/html/nextcloud/config/config.php

Добавляем эту строку перед конечной скобкой.
terminal
'memcache.local' => '\OC\Memcache\APCu',

terminal
[root@server ~]# systemctl restart httpd

Далее переходим в раздел «Основные настройки» - «Почтовый сервер».
Я зарегистрировался в яндекс коннект, буду использовать smtp сервер яндекса для отправки. Туда же делегирован и домен.

Отправляем тестовое письмо указав предварительно в личной информации свой email
Проверяем почту, письмо успешно доставлено:

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

terminal
[root@server nextcloud]# crontab -u apache -e (открывается в редакторе vi)
*/15 * * * * php -f /var/www/html/nextcloud/cron.php

Меняем максимальный размер загружаемого файла по необходимости

Включим доступ по https, добавим включение виртуальных хостов из директории sites-enabled

terminal
[root@server httpd]# cd /etc/httpd/
[root@server httpd]# mkdir sites-available
[root@server httpd]# mkdir sites-enabled
[root@server conf]# cd /etc/httpd/conf/
[root@server conf]# nano httpd.conf

в конце добавим строку
terminal
IncludeOptional sites-enabled/*.conf

Скопируем наш файл конфигурации
terminal
[root@server user]# cp /etc/httpd/conf.d/nextcloud.conf /etc/httpd/sites-available/

Для включения нужно создать символьную ссылку для хоста в каталоге sites-enabled:
terminal
ln -s /etc/httpd/sites-available/nextcloud.conf /etc/httpd/sites-enabled/nextcloud.conf
[root@server conf.d]/etc/httpd/conf.d
[root@server conf.d]rm nextcloud.conf
[root@server conf.d]# apachectl restart

Проверим установлен ли mod_ssl
terminal
[root@server ~]# rpm -qa | grep mod_ssl
[root@server ~]#

устанавливаем
terminal
[root@server ~]# yum install mod_ssl

Установим сертификат от Let’s Encrypt
Первым шагом установим certbot

terminal
[root@server conf]# yum install certbot

Для получения сертификата можно воспользоваться автоматическим скриптом для apache (получит сертификат и пропишет путь в файле конфигурации виртуального хоста).

terminal
[root@server /]# yum install python-certbot-apache
[root@server /]# certbot  run --apache

выбрать цифру со своим доменом

Добавим задание  в cron для автопродления, вместо user в пути - имя своего пользователя, в файл le-renew.log будет записан лог попыток обновлений сертификата

terminal
[root@server /]# which certbot
/bin/certbot
[root@server /]# crontab -e
30 2 * * 1 /bin/certbot renew >> /home/user/le-renew.log

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

Добавим правило в фаервол для 443 порта

terminal
[root@server conf]# firewall-cmd --zone=public --add-service=https —permanent

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

terminal
[root@server conf]# certbot certonly --manual --agree-tos --email admin@Ваш_Домен.tk --preferred-challenges=dns -d Ваш_Домен.tk

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

На примере яндекса

После добавления записи в зоне, нужно проверить так как обновляется не сразу, командой
terminal
666@666-Z87-D3HP:~$ dig txt _acme-challenge.ВАШ_ДОМЕН +noall +answer
; <<>> DiG 9.11.3-1ubuntu1.3-Ubuntu <<>> txt _acme-challenge.ВАШ_ДОМЕН +noall +answer
;; global options: +cmd
_acme-challenge.ВАШ_ДОМЕН. 2746 IN TXT "xxxxxfjhdfjiwfl38r4rtho4th39th348484y734FH"
666@666-Z87-D3HP:~$

После проверки жмем «Enter» - запускается верификация.
Если все впорядке, то увидите:

terminal
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/ваш_домен/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/ваш_домен/privkey.pem
Your cert will expire on 2019-02-20. 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"

 

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

terminal

[root@server sites-available]# nano /etc/httpd/sites-available/Ваш_Домен.tk.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=15552000; includeSubDomains"
Header always set Referrer-Policy no-referrer
</IfModule>
SetEnv HOME /var/www/html/nextcloud
SetEnv HTTP_HOME /var/www/html/nextcloud
</Directory>
<VirtualHost *:443>
ServerName Ваш_Домен.tk
ServerAlias www.Ваш_Домен.tk
ServerAdmin admin@Ваш_Домен.tk

<If "%{HTTP_HOST} == 'www.Ваш_Домен.tk'">
Redirect permanent / https://Ваш_Домен.tk/
</If>

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

SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/Ваш_Домен.tk/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/Ваш_Домен.tk/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/Ваш_Домен.tk/chain.pem
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/nextcloud
ServerName Ваш_Домен.tk
ServerAlias www.Ваш_Домен.tk
ServerAdmin admin@Ваш_Домен.tk
Redirect permanent / https://Ваш_Домен.tk
</VirtualHost>

[root@server sites-available]# apachectl restart


Предупреждений больше нет, можно проверить уязвимости на https://securityheaders.com/
так же ресурсе от nextcloud https://scan.nextcloud.com/


Что бы решить Feature-Policy добавим в конфигурацию строку:
Header set Feature-Policy "geolocation 'none'; midi 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; payment 'none'"

terminal
[root@server ~]# nano /etc/httpd/sites-available/Ваш_Домен.tk.conf

Получится так

terminal
</IfModule>
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
Header always set Referrer-Policy no-referrer
Header set Feature-Policy "geolocation 'none'; midi 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; vibrate 'none'; payment 'none'"
</IfModule>

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

Далее с помощью гугла можно попробовать решить остальные проблемы на которые укажет securityheaders.com.

Настраиваем отправку уведомлений fail2ban о блокировке на email, Настроим дополнительный фильтр для nextcloud авторизации.
Для версии Nextcloud ниже 17
[root@server ~]# nano /etc/fail2ban/filter.d/nextcloud.conf

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

Для версии Nextcloud 17 и выше
[root@server ~]# nano /etc/fail2ban/filter.d/nextcloud.conf

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

Меняем значение «enabled» = true

terminal
[root@server ~]# nano /etc/fail2ban/jail.local
[nextcloud]
backend = auto
enabled = true
filter = nextcloud
action = iptables-allports
protocol = tcp
port = 80 443
logpath = %(nextcloud_log)s
bantime = 604800
findtime = 1600
maxretry = 2
[root@server ~]# nano /etc/fail2ban/paths-common.conf

Вконце добавляем путь до файла логов.
terminal
nextcloud_log = /var/www/html/nextcloud/data/nextcloud.log

Проверить правильность настройки fail2ban можно командой
terminal
[root@server ~]# fail2ban-regex /var/www/html/nextcloud/data/nextcloud.log /etc/fail2ban/filter.d/nextcloud.conf

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

Далее настроим Postfix для отправки уведомлений о блокировке fail2ban через smtp серверы яндекса.
Добавляем в конец конфигурационного файла

terminal
[root@server satana666]# 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
[root@server ]# nano /etc/postfix/canonical
@domen.ru admin@domen.ru

Добавляем в конец
terminal
[root@server ]# nano /etc/postfix/generic
root@localhost root@domen.ru

terminal

[root@server ]# nano /etc/postfix/sasl_passwd
smtp.yandex.ru admin@domen.ru:password

[root@server ]# nano /etc/postfix/sender_relay
@domen.ru smtp.yandex.ru

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

terminal
postmap /etc/postfix/canonical
postmap /etc/postfix/generic
postmap /etc/postfix/sasl_passwd
postmap /etc/postfix/sender_relay
[root@server ]# systemctl restart postfix

Необходимо доустановить в систему недостающие SASL-библиотеки:

terminal
yum install cyrus-sasl{,-plain}

проверим отправив тестовое письмо с помощью php скрипта

terminal

[root@server ~]# nano /home/user/testmail
<?php
$to = 'admin@domen.ru';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: test@domen.ru' . "\r\n" .
'Reply-To: test@domen.ru' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
if( mail($to, $subject, $message, $headers) ) {
echo "OK";
} else {
echo "FAIL";
}

[root@server ~]# php /home/user/testmail

Проверяем прохождение письма.

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

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

На этом настройка закончена, ваше облачное хранилище готово к работе.

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

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