Varulv

Искатель

Установка и настройка nextcloud

Да, да, вычитаете очередную статью о том как установить nextcloud. В первую очередь эта статья для меня самого, потом всё остальное. Пишу для того, чтобы не забыть как это делается, мне пришлось перелопатить некоторое кол-во статей на geektimes, habrahabr и других сайтов. Всю информацию собрал в эту статью. Это позволило мне собрать работающую систему без привязки к аппаратной платформе. Домашнее "облако" nexcloud спокойно себе крутится на Raspberry Pi2, Odroid-C1, Интел Нюк. Я поднимал Nextcloud на ОС Дебиан, на момент написания статьи была версия 9.4, но и для 8-ой статья подойдет, а так же сборка для АРМ, типа Rasbian и Armbian. Если вы решите использовать Дебиан, то качайте образ non-free версии, чтобы не иметь головняка с драйверами на свои устройства.

Для начала установим веб-сервер, если он у вас не установлен. Я выбрал для себя Apache, можно было взять и Nginx, дело так сказать вкуса.

														sudo apt-get install apache2 apache2-doc
													

Так же для работы нам понадобится база данных, я использовал SQLite3, а так же PHP с необходимыми дополнениями:

														sudo apt-get install php7.0 php7.0-curl php7.0-gd php7.0-json 
														sudo apt-get install php7.0-mcrypt php7.0-sqlite3 php7.0-opcache 
														sudo apt install libapache2-mod-php7.0 
														sudo apt-get install php7.0-zip php7.0-dom php7.0-mbstring
														sudo apt-get install curl libcurl3 libcurl3-dev php7.0-curl
													

Создаём директорию, в которой будут размещены файлы Nextcloud:

														mkdir /var/www/nextcloud
													

Скачиваем файлы и распаковываем их в предназначенную директорию:

										 				wget download.nextcloud.com/server/releases/nextcloud-13.0.1.tar.bz2
										 				sudo tar xjf nextcloud-13.0.1.tar.bz2 -C /var/www
													

Свежую версию всегда можно посмотреть на сайте nextcloud.

Изменяем права на папку и азначаем владельцем этой папки веб-сервер, чтобы не было проблем с записью в неё:

										 				sudo chmod 755 /var/www/nextcloud
										 				sudo chown -R www-data:www-data /var/www/nextcloud
													

Переходим к настройке.

Настройка веб-сервера Apache2

Все основные настройки веб-сервера хранятся по пути /etc/apache2. Если открыть эту директорию, то можно увидеть основной файл конфигурации apache2.conf и директории conf-available, mod-available, sites-available. В этих директориях содержатся заранее сконфигурированные файлы с настройками (так называемые сниппеты), которые можно просто использовать по умолчанию, со своими правками или взять их как шаблон для создания своих конфигураций.

Помимо директорий -available так же присутствуют ещё директории -enabled, которые содержат то, что на данный момент «включено». Если заглянуть в них, то можно увидеть, что эти директории содержат ссылки на файлы, находящиеся в директориях -available

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

									 					nano /etc/apache2/sites-available/000-default.conf
													

Содержимое конфигурационного файла делаем следующим:

									 					< VirtualHost *:80 > 
															ServerName localhost
															ServerAdmin user@localhos
															DocumentRoot /var/www
															< Directory /var/www >
																Options FollowSymLinks
																AllowOverride All
																Require all denied
															< /Directory >
															ErrorLog ${APACHE_LOG_DIR}/error.log
															CustomLog ${APACHE_LOG_DIR}/access.log combined
														< /VirtualHost >
													

Этой конфигурацией мы переустановили директорию по умолчанию на /var/www, разрешили серверу следовать по символическим ссылкам в этой директории и разрешили серверу выполнять все директивы, объявленные в найденных файлах .htaccess, а так же запретили доступ в этот каталог.

Переносим файл:

														sudo mv /var/www/html/index.html /var/www/index.html
													

Удаляем каталог:

														sudo rm /var/www/html
													

Перезапускаем сервер для вступления в силу новых настроек виртуального хоста по умолчанию:

														sudo service apache2 restart
													

Создадим файл ssl-params.conf. Для этого воспользуемся генератором конфигурации SSL на mozilla.github.io В генераторе выбираем Apache2, профиль Modern, указываем версию Apache и OpenSSL. Узнать версии можно так:

														sudo apache2 -v
														sudo openssl version
													

Должно получиться что-то типа такого:

														# 14-01-2018 / for apache2 2.4.10 & openssl 1.0.1t
														# from https://mozilla.github.io/server-side-tls/ssl-config-generator/
														# parametrs help: https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html
														# modern configuration, tweak to your needs
														SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
														SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
														SSLHonorCipherOrder on
														SSLCompression off
														# OCSP Stapling, only in httpd 2.3.3 and later
														SSLUseStapling on
														SSLStaplingResponderTimeout 5
														SSLStaplingReturnResponderErrors off
														SSLStaplingCache shmcb:/var/run/ocsp(128000)
													

Копируем эту информацию, открывем файл

								 						sudo nano /etc/apache2/conf-available/ssl-params.conf
													

Вставляем, файл сохраняем.

Теперь настраиваем виртуальный хост с поддержкой SSL:

								 						sudo nano /etc/apache2/sites-available/nextcloud-ssl.conf
													

Записываем в него следующий текст:

						 								< IfModule mod_ssl.c >
							  								< VirtualHost *:443 >
																ServerAdmin user@localhost
																ServerName <имя домена>
																DocumentRoot /var/www/nextcloud
																< Directory /var/www/nextcloud >
										  							Options FollowSymLinks
										  							AllowOverride All
										  							Require all granted
																< /Directory >
							
																# HSTS (mod_headers is required) (15768000 seconds = 6 months)
																Header always set Strict-Transport-Security "max-age=15768000"
										
																ErrorLog ${APACHE_LOG_DIR}/error.log
																CustomLog ${APACHE_LOG_DIR}/access.log combined
										
																SSLEngine on
																SSLCertificateFile  /etc/ssl/certs/apache-selfsigned.crt
																SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

																< FilesMatch "\.(cgi|shtml|phtml|php)$" >
										  							SSLOptions +StdEnvVars
																< /FilesMatch >
																< Directory /usr/lib/cgi-bin >
										  							SSLOptions +StdEnvVars
																< /Directory >
																BrowserMatch "MSIE [2-6]" \
										  						nokeepalive ssl-unclean-shutdown \
										  						downgrade-1.0 force-response-1.0
																BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
											
									  						< /VirtualHost >
														< /IfModule >
													

Для работы по SSL необходимо создать сертификат. Можно самому сгенерировать самоподписанный сертификат или воспользоваться. certbot. Перед использованием Certbot откройте 80-ый порт на вашем роутере.

Включаем модули Apache для поддержки SSL и HSTS:

														sudo a2enmod ssl
														sudo a2enmod headers
													

Включим конфигурацию SSL и виртуальный хост:

														sudo a2enconf ssl-params
														sudo a2enmod  a2ensite nextcloud-ssl
													

Делаем перенаправление с HTTP на HTTPS. Для этого сначала включим модуль перенаправления:

														sudo a2enmod rewrite
													

Теперь откроем файл 000-default.conf:

														sudo nano /etc/apache2/sites-available/000-default.conf
													

Перед закрывающим тегом добавим нижеприведённый текст:

														RewriteEngine On
														RewriteCond %{HTTPS} off
														RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]
													

Увеличиваем лимит и размер загружаемых файлов в PHP, для этого открываем файл настроек:

														sudo nano /etc/php/7.0/apache2/php.ini
													

Ищем строки:

														memory_limit = 128M
														upload_max_filesize = 2M                                                                                                                        
													

Я заменил значения на 2048M и 8G соответственно.

Защита Apache.

Установим fail2ban:

                                                                                                	        sudo apt-get install fail2ban
                                                                                                        

Сразу после установки утилита уже сконфигурирована на защиту большинства портов и если в логах системы за десять минут появится больше шести провальных попыток подключиться, то нарушитель будет заблокирован на десять минут. Механизм работы fail2ban довольно прост – по определённым триггерам срабатывают так называемые джейлы, которые определяют действие, предназначенное для защиты приложения.

Параметры блокировки можно задавать индивидуально, для этого создадим файл:

                                                                                                        	sudo nano /etc/fail2ban/jail.local
                                                                                                        

Вот пример файла:

														# общие настройки
														[DEFAULT]
														ignoreip = 127.0.0.1
														bantime = 2592000
														findtime = 43200
														maxretry = 6
														banaction = iptables-multiport
														# настройка отправки сообщения на почту
														destemail = user@localhost
														sendername = Fail2Ban
														mta = sendmail
														action = %(action_mwl)s
														# защита SSH
														[ssh]
														enabled = true
														port = 22
														filter = sshd
														logpath = /var/log/auth.log
														# выявляем неудачные попытки ввода пароля
														[apache]
														enabled = true
														port = http,https
														filter = apache-auth
														logpath = /var/log/apache*/*error.log
														# выявляем потенциальные сканирования для применения эксплойтов и php уязвимостей
														[apache-noscript]
														enabled = true
														port = http,https
														filter = apache-noscript
														logpath = /var/log/apache*/*error.log

														# выявляем попытки переполнения Апача
														[apache-overflows]
														enabled = true
														port = http,https
														filter = apache-overflows
														logpath = /var/log/apache*/*error.log
														maxretry = 2

														# выявляем неудачные попытки в поиске домашней директории на сервере
														[apache-nohome]
														enabled = true
														port = http,https
														filter = apache-nohome
														logpath = /var/log/apache*/*error.log
														maxretry = 2
													

Приведённая выше настройка позволяет не контролировать локальный доступ, а при шести неверных попыток входа в течение 12 часов банит IP адрес атакующего, используя iptables, на 30 дней. Контролируется не только доступ по порту для SSH, но и подозрительные действия, направленные на дестабилизацию работы веб-сервера.

Перезагружаем сервис:

														sudo service fail2ban restart
                                                                                                        

Переходим к настройке Nextcloud

Настройка Nextcloud.

В принципе всё уже будет работать, все данные будут храниться в директории /var/www/nextcloud/nxcdata. но я хотел использовать внешний HDD, поэтому решил организовать хранение данных на нём.

Я сделал следующее:

Создал каталог:

														sudo mkdir /mnt/nxcdata
                                                                                                        

Изменил права и сделал владельцем веб-сервер:

														sudo chmod 770 /mnt/nxcdata
														sudo chown www-data:www-data /mnt/nxcdata
                                                                                                        

Теперь можно свои данные располагать где угодно, главное создать символьную ссылку на этот каталог разместить в папке /mnt/nxcdata и назвать её nxcdata

Создадим новую папку и смонтируем в неё внешний HDD:

														sudo mkdir /mnt/sdb1
														sudo mount -t ext4 /dev/sdb1 /mnt/sdb1
                                                                                                        

Мой внешний HDD отформатирован в EXT4, но ничто не мешает использовать другую ФС.

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

                                                                                                	        sudo mkdir /mnt/sdb1/nxcdata & chmod 770 /mnt/sdb1/nxcdata & chown -R www-data:www-data /mnt/sdb1/nxcdata
                                                                                                        

Далее необходимо так же создать скрипт для автомонтирования и откорректировать команду монтирования в скрипте (примеры подключения диска с NTFS и EXT4 в скрипте уже есть и закомментированы) и добавить скрипт в автозагрузку.

                                                                                                	        sudo nano /etc/init.d/nxcdata_automount.sh
                                                                                                        

Содержимое скрипта:

														#!/bin/sh
														# nxcdata_automount.sh 1.0

														### BEGIN INIT INFO
															# Provides: myscript
															# Required-Start:
															# Required-Stop:
															# Default-Start: 1 2 3 4 5
															# Default-Stop: 0 6
															# Short-Description: nxcdata_automount.sh 1.0
															# Description: nxcdata_automount.sh 1.0
														### END INIT INFO

														. /lib/lsb/init-functions

														# Start actions
														perform_start()
															{
																log_daemon_msg «Start nxcdata_automount»
																sleep 30
																#mount -t vmhgfs -o uid=www-data,gid=www-data,fmask=007,dmask=007 .host:/vmw-nxcdata /mnt/vmw-nxcdata
																#mount -t ntfs-3g -o uid=www-data,gid=www-data,fmask=007,dmask=007 /dev/sdb1 /mnt/sdb1
																mount -t ext4 /dev/sdb1 /mnt/sdb1
																sleep 5
																service fail2ban restart
																log_end_msg 0
																return 0
															}

														# Stop actions
														perform_stop()
															{
																log_daemon_msg «Stop nxcdata_automount»
  																umount /mnt/nxcdata
  																log_end_msg 0
  																return 0
															}
														case $1 in
															start)
																perform_start
															;;

															stop)
																perform_stop
															;;

															*)
																echo “Usage: /etc/init.d/myscript {start|stop}”
																exit 3
															;;
														esac
													

В секции perform_start есть пара закомментированных строк, первая это если вы пользуетесь виртуальной машиной, вторая если у вас диск форматирован в NTFS

Создаём символьную ссылку:

                                                                                                	        sudo ln -s /mnt/sdb1/nxcdata /mnt/nxcdata/nxcdata 
                                                                                                        

Делаем наш скрипт исполняемым и добавляем в автозагрузку:

														sudo chmod +x /etc/init.d/nxcdata_automount.sh
														sudo update-rc.d nxcdata_automount.sh defaults
													

Для удаления скрипта надо будет сделать следующее:

                                                                                                        	sudo update-rc.d -f nxcdata_automount.sh remove
                                                                                                                sudo rm -f /etc/init.d/nxcdata_automount.sh
                                                                                                        

Этим делом мы обеспечиваем простой перенос директории с данными в будущем — не нужно править конфигурацию в движке Nextcloud и вообще лезть в него — всё, что нужно сделать — подключить новый диск, перекопировать на него данные и пересоздать символьную ссылку, ведущую к новой директории с данными. При этом, все действия не выходят за каталог /mnt.

Теперь открываем браузер, указываем ip-адрес или свой домен, задаём логин/пароль администратора, используемую базу данных и указываем путь к месту хранения наших данных: /mnt/nxcdata/nxcdata.

Дальше идёте в настройки и настраиваете как вам будет угодно. В насройках Администрирование/Дополнительные настройки/Управление файлами: "Максимальный размер загружаемого файла, я установил 8 ГБайт.

Создаём юзера, указываем его пароль и создаём новую группу, например users.

Теперь включим кеширование. Открываем файл:

                                                                                                	        sudo nano /var/www/nextcloud/config/config.php
													

И в самый конец, перед ");" добавляем нижеследующее:

														'memcache.local' => '\OC\Memcache\Memcached',
														'memcache.distributed' => '\OC\Memcache\Memcached',
														'memcached_servers' => array(
															array('localhost', 11211),
														),
                                                                                                        

Разрешаем внешний доступ к Nextcloud на уровне его "движка":

														'trusted_domains' =>
															array (
																0 => '127.0.0.1',
																1 => '192.168.233.138',
																2 => < ваш домен >,
															),
													

По идее все готово для работы, можно проверить работоспособность нашего сервиса, открываем сайт и авторизуемся. Если всё прошло успешно, можно устанавливать приложения для синхронизации на смартфоны и компьютеры и вперёд с песней.

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

Так как изначально всё это я настраивал на Raspberry pi2, то делал дополнительные настройки для снижения нагрузки на microSD. Сейчас облако у меня крутится на Intel Nuc с SSD под систему, то я решил проделать те же манипуляции.

Переносим папку /tmp в ОЗУ, т.к. PHP использует данную папку для временного хранения файлов при загрузке, Т.е. каждый раз, когда мы что-то загружаем в своё облако, это сначала записывается в папку /tmp, а уже потом на внешнее хранилище.

Для этого открываем файл:

                                                                                                               	sudo nano /etc/fstab
													

И прописываем следующие строки:

														tmpfs /tmp tmpfs defaults,noatime,nosuid,nodev,noexec,mode=1777,size=2048M 0 0
														tmpfs /var/tmp tmpfs defaults,noatime,nosuid,size=128m 0 0
													

Сохраняем и перезагружаем устройство:

                                                                                                        	sudo reboot
                                                                                                        

Ещё неплохо было бы перенести в ОЗУ папку /var/log, но после этого у меня перестал запускаться Nexcloud.

Защита Nexcloud

Для защиты нашего облака от перебора паролей я использовал fail2ban. Для этого нужно описать характерное выражение, встречающееся в логах nextcloud при неудачной авторизации, по которому будет срабатывать соответствующий триггер.

Вот тут пришлось изрядно помучиться ибо большинство примеров, которые я нашёл не работали, после некоторых fai2ban вылетал с ошибкой, но в большинстве просто игнорировал записанное и, соответственно, никак не реагировал на ошибки в подборе пароля.

В и тоге удалось сделать работающее правило для fail2ban.

Создаём файл:

                                                                                                		sudo nano /etc/fail2ban/filter.d/nextcloud.conf         
                                                                                                        

Добавляем в него следующее:

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

Открываем файл:

                                                                                                	        sudo nano /etc/fail2ban/jail.local
                                                                                                        

В конец файла добавляем:

														# выявляем неудачные попытки ввода пароля к nextcloud
														[nextcloud]
														enabled = true
														port = http,https
														filter = nextcloud
														logpath = /var/log/nextcloud.log
                                                                                                        

Перезагружаем сервис:

                                                                                                        	sudo service fail2ban restart
                                                                                                        

Вот, в общем-то и всё.

Немного о логах.

При работе Nextcloud столкнулся ситуацией, которую не ожидал. Во-первых, по умолчанию Nextcloud сохраняет логи не там где хотелось бы. Во-вторых, по документации разработчика по умолчанию в лог сохраняются только предупреждения. Но у меня сохранялась вся статистика. С одной стороны это не плохо, т.к. позволяет отследить тех, кто смог угадать/подобрать пароль, с другой стороны лог весьма быстро разростался до приличных размеров.

Решение такое, открываем файл:

                                                                                                        	sudo nano /var/www/nextcloud/config/config.php 
                                                                                                        

Перед закрывающей скобкой ");" добавляем:

														'logtimezone' => 'Europe/Moscow',
  														'log_type' => 'file',
  														'logfile' => '/var/log/nextcloud.log',
  														'loglevel' => 2,
  														'log_rotate_size' => 1048576,
                                                                                                        

где,

  • logtimezone часовой пояс для журнала логов, по умолчанию выбран UTC.
  • log_type тип лога, может иметь следующие значения: file(по умолчанию), либо syslog.
  • logfile путь к файлу лога.
  • loglevel в данном случае выбрано сохранять все предупреждения.
  • log_rotate_size размер лога, после которого произойдёт ротация.

Если после обновления у вас появилось сообщение вида:

														Этот сервер Nextcloud находится в режиме технического обслуживания, которое может занять некоторое время. 
														Эта страница автоматически обновится, когда сервер Nextcloud снова станет доступен. 
														Обратитесь к вашему системному администратору если это сообщение не исчезает или появляется неожиданно. 
														Спасибо за терпение. 
                                                                                                        

Решается следующим образом: в файле:

                                                                                                	        sudo nano /var/www/nextcloud/config/config.php
                                                                                                        

Ищем строчку:

                                                                                                	        'maintenance' => true,
                                                                                                        

Меняем true на fasle

И запускаем обновление Nextcloud.

Обсудить этот пост