Установка и настройка 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.
Обсудить этот пост