Настройка безопасности сервера под управлением Ubuntu

Peter Bazov
4 min readJan 10, 2019

--

Данная статья рассчитана на то, что у вас уже имеется сервер под управлением Ubuntu 14, 16, 18 или 20 с доступом по SSH через пользователя с правами sudo, отличного от root.

В примерах используется веб-сервер nginx и база данных PostgreSQL, однако общие принципы универсальны.

После выполнения каждой секции инструкции следует убедиться, что ваш веб-сервер функционирует в штатном режиме.

Задание сложных паролей для пользователей системы

Самое легкое, что можно сделать для хорошей защиты веб-сервера, это настроить как можно более сложные пароли для root и пользователя, под которым вы подключаетесь к серверу по SSH.

Сложный пароль длиной в 24 символа можно создать следующей командой:

head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 ; echo ''

Скопируйте результат команды и выполните указанную ниже команду для задания нового пароля пользователю, заменив username на актуальное имя:

passwd username

Система запросит текущий пароль и новый пароль с его подтверждением.

Усиление безопасности подключения по SSH

Подключение по SSH используется для удаленного управления веб-сервером. Чтобы настроить минимальную защиту, смените стандартный порт 22 на какой-либо другой, а так же запретите вход по SSH для пользователя root.

Как это сделать, описано в статье Начальная настройка сервера с Ubuntu в разделе Шаг 5 — запрет подключения через SSH под root.

Чтобы постоянно не пользоваться паролем пользователя, настройте авторизацию по открытому ключу. Инструкция так же присутствует в указанной выше статье.

Настройка безопасности базы данных

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

В данной статье я уделю внимание PostgreSQL, но общие принципы одинаковы для многих баз данных.

Настройка сложных паролей для пользователей базы данных

После установки многие базы данных уже имеют одного пользователя с правами администратора, однако у них задан слабый пароль, либо вообще не задан. В PostgreSQL это пользователь postgres.

Зайдите в оболочку PostgreSQL:

sudo -u postgres psql

Задайте пароль. Для этого скопируйте текст ниже, замените new_strong_password на сложный пароль, вставьте в оболочку и нажмите Enter:

ALTER USER postgres PASSWORD 'new_strong_password';

Выйдете из оболочки:

\q

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

Если вы имеете дополнительных пользователей базы данных, удостоверьтесь, что им так же заданы сложные пароли.

Ограничение прав на подключение к базе данных

Подключение к базе данных должно быть разрешено только из тех мест, откуда это действительно необходимо.

Данная настройка производится путем редактирования файла /etc/postgresql/N/main/pg_hba.conf, где N, это номер версии PostgreSQL. Откройте его в вашем любимом текстовом редакторе. На всякий случай перед редактированием можно сохранить копию этого файла, чтобы иметь возможность восстановить настройки, если вы что-то испортите.

Для начала нужно избавиться от peer аутентификации, если никакие приложения её не используют. Этот способ позволяет подключиться к базе данных, минуя ввод пароля, если вы произвели вход в систему под пользователем, имя которого совпадает с именем пользователя базы данных.

Найдите строчку вида local all postgres peer и замените peer на md5. Данный способ подразумевает ввод пароля для подключения к базе данных. Строка должна принять вид:

local   all             postgres                                md5

Найдите и закомментируйте символом # все остальные строки с peer аутентификацией, чтоб отключить ее для других пользователей.

Далее следует запретить все подключения к базе извне, разрешив только localhost. За такие подключения отвечают строки файла, которые начинаются с host. Удалите все такие строки кроме следующей:

host    all             all             127.0.0.1/32            md5

Если у вас имеются веб-приложения, которые удаленно подключаются к базе данных, или вы работаете с базой через клиент, разрешите удаленное подключение только для ваших IP адресов через вашего пользователя БД. Для этого вставьте в файл следующую строку, заменив имя пользователя БД и IP адрес на актуальные:

host    all             db_user         111.111.111.111/32      md5

Если в файле остались еще какие-то строки, которые не были оговорены в инструкции, их так же следует удалить или закомментировать.

Сохраните файл и перезапустите базу данных.

Для Ubuntu ≥ 16:

sudo systemctl restart postgresql

Для Ubuntu 14:

sudo service postgresql restart

После перезапуска стоит убедиться, что ваш веб-сервер продолжил функционировать в штатном режиме, и вы не испортили доступ к данным со стороны веб-приложения.

Отключение выдачи системной информации в заголовках ответов веб-сервера

В стандартных конфигурациях веб-серверы могут отдавать информацию, которой можно воспользоваться в недобросовестных целях. В частности, nginx в заголовках ответа в зависимости от настроек может возвращать своё название и номер сборки.

Откройте конфигурационный файл nginx.conf для редактирования. По умолчанию он должен находиться по пути /etc/nginx/nginx.conf. В секции http задайте значение off параметру server_tokens:

http {
...
server_tokens off;
...
}

Сохраните файл и перезагрузите nginx.

Для Ubuntu ≥ 16:

sudo systemctl restart nginx

Для Ubuntu 14:

sudo service nginx restart

Закрытие всех неиспользуемых портов от внешнего доступа

Любой открытый внешний порт, это маленькая дверка для доступа к системе. Следует закрыть сетевым экраном внешний доступ ко всем портам, которые не нужны для функционирования вашего веб-сервера.

Для управления сервером через SSH нужно оставить открытым соответствующий порт. По умолчанию это 22, но вы уже должны были сменить его на другой.

Для запросов через протокол HTTP следует открыть порт 80.

Если у вас настроено подключение через протокол HTTPS, то нужно открыть порт 443.

Необходимость открыть другие порты вы должны проверить самостоятельно, основываясь на используемых сервером утилитах.

Если вы опытный администратор Linux, то вы уже наверняка настроили сетевой экран через утилиту iptables. Если нет, то предлагаю воспользоваться утилитой ufw для упрощенной настройки сетевого экрана.

У Digital Ocean есть замечательная соответствующая инструкция:

Автоматическая блокировка после неудачных попыток получить доступ к серверу

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

Для данных целей можно воспользоваться утилитой fail2ban, которая следит за действием пользователей и блокирует IP адреса, с которых были произведены несанкционированные действия.

Из коробки fail2ban можно интегрировать с SSH, различными веб-серверами, включая nginx и apache и т.д.

Для настройки и интеграции с nginx можно воспользоваться инструкцией Digital Ocean:

Инструкция рассчитана на Ubuntu 14, однако подходит и для версий ≥ 16. Нужно лишь заменить команды upstart на systemd.

--

--