Облака — белогривые лошадки или безопасный ownCloud для «маленьких» в FreeNAS
ownCloud, как утверждает Википедия — это Свободное и открытое веб-приложение для синхронизации данных, расшаривания файлов и удалённого хранения документов в «облаке». И, как мне кажется, довольно интересное решение для организации собственного домашнего облака.
- Во-первых, устанавливается в связке с SQLite, что подходит только если у вас небольшое кол-во файлов и пользователей, и абсолютно не подходит, если вы планируете синхронизацию с помощью клиента. У меня же хранилище уже расползлось почти на 5Tb и установленный таким образом ownCloud просто отказывался видеть часть файлов. Да и без синхронизации отдача от облака не велика. Заменим базу данных на MariaDB.
- Во-вторых, отсутствует работа по https, а мне совсем не нравится мысль о том, что кто-то может перехватить мои файлы. Включим https.
- В-третьих, начисто отсутствует защита от банального подбора пароля методом брутфорса. Защитимся от брутфорса с помощью fail2ban.
- В-четвёртых, мне лень часто просматривать логи на предмет взлома, но очень хочется оперативно узнавать о таких попытках. Настроим push-оповещения о попытках подбора пароля с помощью сервиса pushover.net.
Все настройки будем делать из консоли, ручками, максимально приближено к тому, как это, как мне видится, делают «взрослые» айтишники.
1 Подготовка Jail для ownCloud 1.1 Создаём JailДанный шаг описывать не буду. Если у вас получилось установить FreeNAS и он у вас работает, то проблем с данным шагом у вас быть не должно. Создание первого Jail может занять довольно продолжительное время.
1.2 Открываем доступ по SSH к данному JailУдобнее всего дальнейшую настройку выполнять не через web-терминал, а через полноценную программу-терминал. Например, putty. Для этого откроем доступ по SSH к нашему Jail и создадим нового пользователя, от которого и будем проводить дальнейшую настройку.
Выбираем в web-интерфейсе FreeNAS созданный нами Jail и нажимаем внизу кнопку Shell.
В веб-консоли Jail вводим:
Запускаем демон для работы ssh:
Создаём пользователя от имени которого будем потом настраивать нашу систему. Пользователь будет иметь привилегии superuser, для чего мы включим его в группу wheel.
2 Установка и подготовка к работе ownCloudПрисоединяемся с помощью программы-терминала к нашему Jail. Вводим имя созданного нами пользователя и его пароль. На приглашение командной строки $ пишем su. Теперь приглашение командной строки сменится на что-то типа root@ownCloud:/usr/home/superstepa #, а все наши команды будут выполняться от имени superuser. Для упрощения, приглашение командной строки я буду обозначать символом #, а мои комментарии, которые вводить не надо, буду начинать с //.
2.1 Устанавливаем необходимые пакетыСначала обновляем текущие пакеты:
Затем устанавливаем необходимые для работы ownCloud пакеты (на все возникающие вопросы отвечаем yes):
Для того, чтобы включить работу по https, собираем с нужными нам пакетами, а затем и устанавливаем из портов, web-сервер nginx:
В процессе сборки убеждаемся, что выбраны следующие пакеты:
2.2 Создаём самоподписанные ключи и сертификатыСоздаём корневой ключ server.key (алгоритм шифрования des3, длиной 1024 bit):
Для этого система дважды попросит ввести парольную фразу. Придумываем её и вводим.
Создаём корневой сертификат:
Отвечать на вопросы можно как угодно. Главное: — на первый запрос Enter pass phrase for server.key ввести правильный пароль от корневого ключа созданного ранее, — обязательно ответить на все вопросы, иначе клиент ownCloud в дальнейшем может отказаться от синхронизации файлов, — запомнить введённые данные, чтобы в дальнейшем можно было легко вспомнить, что сертификат именно Ваш, — запомнить пароль введённый на вопросе A challenge password []:. Можно изменить срок действия нашего сертификата, например до 10000 дней, добавив в команду выше аргумент -days 10000.
2.3 Включаем автозапуск web-сервера, PHP и базы данных 2.4 Устанавливаем редактор для удобного редактирования конфиговВсё-таки мы еще «маленькие» и пользоваться предустановленным редактором vi нам еще сложновато, поэтому поставим простенький редактор nano (на все возникающие вопросы отвечаем yes).
Для того чтобы это исправить выполним всего 2 команды:
2.5 Корректируем конфиг веб-сервера nginxКак настоящие администраторы, всегда перед корректировкой конфига делаем его копию, чтобы в случае возникновения проблем всегда можно было откатиться назад:
И редактируем файл конфига:
Выход из редактора по нажатию Ctrl+X. Не забываем при выходе сохранять изменения.
2.6 Корректируем конфиг php 2.7 Корректируем php-fpm.conf: 2.8 Корректируем /var/db/mysql/my.cnf: 2.9 Запускаем веб-сервер nginx, PHP, MariaDB и настраиваем базу данных:Если всё было сделано верно, то всё запустится без ошибок и можно попробовать пройти в браузере по адресу https://<YOUR_JAIL_IP>. Нам напомнят, что сертификат у нас самоподписанный, но приняв его мы попадём на страницу с надписью 403 Forbidden.
Настраиваем базу данных MariaDB:
Настраиваем базу данных ownСloud введя свои значения, где owncloud — название базы, ownclouduserdb — имя пользователя для работы с базой, а passwordownclouddb — пароль этого пользователя:
2.10 Скачиваем и устанавливаем актуальную версию OwnCloudПо ссылке смотрим текущую актуальную версию ownCloud. На момент написания статьи это была версия 8.0.2.
Скачиваем архив, где вместо 8.0.2 указываем текущую актуальную версию:
Удаляем ненужный теперь нам архив:
Назначаем системных владельцев (пользователя и группу) ownCloud:
2.11 Создаём задание в crone:Прописываем в нём:
Если всё было прописано верно, то мы получим следующее системное сообщение:
Идём теперь в браузере по адресу https://<YOUR_JAIL_IP>/owncloud и производим там последние настройки. Не забываем, что нам надо изменить тип применяемой базы данных, а для этого нажмём Хранилище и база данных и выберем наш тип базы: MySQL/MariaDB.
Наш ownCloud уже готов к работе.
3 Дополнительные настройки 3.1 Просим поисковых роботов (Yandex, Google и т.д.) не индексировать наш сайт: 4 Защита от подбора пароля 4.1 Устанавливаем fail2ban из портов: 4.2 Настраиваем логирование в ownCloud:Создаём файл в который будут писаться логи ownCloud при неудачной попытке входа:
Файл должен быть доступен для записи пользователю www:
Включаем логирование неудачных входов в ownCloud:
Несколько раз пробуем войти в web-интерфейс ownCloud с заведомо неправильным паролем или именем пользователя.
Затем выполним в консоли команду:
Если всё сделано правильно, то в файле появятся записи вида:
4.3 Создаём файл фильтра для fail2ban:По сути это парсер, который во всей той служебной информации, которую ownCloud пишет в свой лог, должен найти ip-адрес того, кто пытался подобрать пароль на вход. Те элементы, что никогда не меняются в записях лога — указаны тут в явном виде. Те, что меняются — заменены на *. Ну а собственно ip-адресс, который мы ищем, заменён на переменную <\HOST>\.
4.4 Редактируем файл настроек сервисов: 4.5 Проверяем работает ли наш фильтр и может ли он найти в логе ownCloud нужные строки с попытками неудачного входа:Если всё верно, то внизу выдачи будет строка вида:
4.6 Настраиваем действия, которые будут производится в случае неудавшихся попыток входа:Оставляем в нём всё по умолчанию. В нём уже прописано правило, что при отправке в бан, ip-адрес добавляется в table(1) файервола ipfw:
Добавляем в сам файервол ipfw правило, блокирующее все ip-адреса, находящиеся в таблице table(1), т.к. пока нет никаких правил у файервола что делать с адресами из этой нашей таблицы(1):
4.7 Запускаем fail2ban:Перед запуском создадим для fail2ban файл описывающий действие pushover-notify, о котором была уже речь выше и о котором мы ещё поговорим:
Прописываем автостарт fail2ban в /etc/rc.conf:
И запускаем его:
Если всё сделали правильно, то он запустится, если нет — разбирайтесь где ошибка. Если запустился, то проверяем на бан: заходим со стороннего ip-адреса с неправильным паролем. Должно забанить на время, которое мы указали в файле jail.conf.
Собственно теперь у нас есть ownCloud, работающий на «взрослой» базе данных по https с защитой от подбора паролей. Почти всё, но давайте ещё добавим уведомление о блокировке при неправильном вводе пароля в виде push-уведомлений на наш телефон.
5 Уведомление о блокировке ip-адресаДля push-уведомлений будем использовать сервис pushover.net. Я думаю Вам теперь не составит труда разобраться с его API. Но если возникнут сложности, то пишите в комментариях и я добавлю соотвествующее описание по работе с данным сервисом.
5.1 Настраиваем уведомления pushover о неудачных попытках входа и бане:, где [API Token/key (application key)] и [User key] соответствующие значения с сайта pushover.net. Перезапускаем fail2ban
Проверяем работу уведомлений выполнив несколько неудачных попыток входа в ownCloud:
Вот и всё. Не забываем пробросить на роутере порты 80 и 443 для доступа к ownCloud. И да, для большей безопасности можно заменить стандартные порты на что-то более экзотическое.