Защита PostgreSQL на сервере Ubuntu

PostgreSQL (или postgres) – популярная система управления базами данных (СУБД), используемая для хранения и управления данными сайтов и веб-приложений.

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

Примечание: Руководство было разработано для Ubuntu 12.04, но подойдёт для большинства современных дистрибутивов.

Установка PostgreSQL

Если СУБД PostgreSQL не была установлена ранее, установите её сейчас.

sudo apt-get update
sudo apt-get install postgresql postgresql-contrib

Теперь система PostgreSQL установлена на сервер.

Одноранговая аутентификация

Для локальных соединений PostgreSQL по умолчанию использует так называемую «одноранговую аутентификацию» (англ. peer authentication). Проще говоря, это означает, что если имя пользователя операционной системы Linux совпадает с именем валидного пользователя Postgres, данный системный пользователь может войти в СУБД без дальнейшей аутентификации.

Во время установки PostgreSQL создаёт пользователя операционной системы по имени postgres, что совпадает с пользователем postgres – администратором системы PostgreSQL. Измените пользователя и войдите как postgres:

sudo su - postgres

Затем запустите сессию PostgreSQL:

psql

Обратите внимание, что при подключении не был запрошен пароль, поскольку пользователь прошёл аутентификацию по имени.

Внимание: Крайне не рекомендуется использовать аккаунт postgres для выполнения каких-либо задач, не связанных с базой данных. Это может негативно отразиться на безопасности.

Закройте PostgreSQL и переключитесь на предыдущего пользователя:

\q
exit

Блокировка удалённых подключений

Один из самых простых способов предотвратить удалённую атаку – запретить удалённые подключения к БД. Эта настройка задаётся по умолчанию при установке PostgreSQL из репозиториев Ubuntu. Но на всякий случай лучше проверить, так ли это. Откройте следующий файл:

sudo nano /etc/postgresql/9.1/main/pg_hba.conf
local   all             postgres                                peer
local   all             all                                     peer
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5

Примечание: Вывод этой команды был раскомментирован.

Как видите, первые две строки настроек имеют значение local. То есть, они используют сокеты Unix/Linux.

Следующие две строки отвечают за удалённый доступ. Обратите внимание на их значения: 127.0.0.1/32 и ::1/128 указывают на интерфейсы локальной машины.

Но иногда бывает необходимость подключиться к БД удалённо. Что делать, если вам нужно получить удалённый доступ к базам данных?

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

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

Кроме того, можно использовать сертификаты SSL; подробные инструкции о получении SSL-сертификата ищите по этой ссылке.

Безопасность PostgreSQL

Блокировка доступа – очень важный аспект безопасности. Но не менее важно защитить данные в окружении PostgreSQL. Для этого СУБД PostgreSQL использует так называемые роли.

Войдите в PostgreSQL:

sudo su - postgres
psql

Создание ролей для приложений

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

Чтобы создать новую роль, введите:

CREATE ROLE role_name WITH optional_permissions;

Чтобы просмотреть права, которые можно предоставить роли, введите:

\h CREATE ROLE

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

ALTER ROLE role_name WITH optional_permissions;

Чтобы просмотреть текущие роли и их свойства, наберите:

\du
List of roles
Role name |                   Attributes                   | Member of
----------+------------------------------------------------+-----------
hello     | Create DB                                      | {}
postgres  | Superuser, Create role, Create DB, Replication | {}
testuser  |                                                | {}

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

Разделение пользователей и функций

Роли – довольно гибкий способ управления доступом. Они имею некоторое сходство с пользователями и группами и могут работать аналогичным образом. Роли могут входить в другие роли.

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

К примеру, так можно определить роли для входа пользователей (так же, как роли для приложений), а также роли доступа, предоставляющие право на выполнение определённых операций с данными.

Такое разделение прав позволяет управлять каждым пользователем в индивидуальном порядке.

Для примера создайте две роли:

CREATE ROLE login_role WITH login;
CREATE ROLE access_role;
\du
List of roles
Role name  |                   Attributes                   | Member of
-----------+------------------------------------------------+-----------
access_role| Cannot login                                   | {}
login_role |                                                | {}
postgres   | Superuser, Create role, Create DB, Replication | {}

Как видите, теперь в PostgreSQL есть две роли, одна из которых не имеет права входа.

Создайте БД для access_role:

CREATE DATABASE demo_application WITH OWNER access_role;

Теперь подключитесь к этой БД и заблокируйте все права, разрешив только access_role создавать таблицы.

\c demo_application
REVOKE ALL ON SCHEMA public FROM public;
GRANT ALL ON SCHEMA public TO access_role;

Протестируйте роли; для этого перейдите в login_role и попробуйте создать таблицу:

SET ROLE login_role;
CREATE TABLE test_table(
name varchar(25));
ERROR: permission denied for schema public

Теперь сделайте роль login_role членом роли access_role. После этого login_role получит доступ к функциям, доступным access_role.

Верните начальный набор привилегий и  добавьте login_role в access_role. Затем попробуйте снова создать таблицу:

RESET ROLE;
GRANT access_role TO login_role;
SET ROLE login_role;
CREATE TABLE test_table(
name varchar(25));
CREATE TABLE

Как видите, в этот раз роль login_role получила доступ к работе с таблицами.

Теперь можно войти при помощи роли login_role и управлять БД.

Как видите, использование ролей – удобный и гибкий способ выдавать и отнимать права доступа к данным.

Заключение

К сожалению, это руководство охватывает только основные методы защиты данных PostgreSQL. Требования безопасности каждого сервера уникальны и зависят от различных факторов (например, от пользователей баз данных, объёма и типа трафика).

Рекомендуется самостоятельно ознакомиться с преимуществами и недостатками каждого метода защиты, а затем выбрать наиболее подходящие из них. Также крайне важно регулярно и тщательно проводить проверки безопасности, чтобы убедиться, что безопасность данных находится на должном уровне, и устранить случайные ошибки.

Tags: ,

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