Требовать SSL, держать SELinux включенным, отслеживать журналы и использовать текущую версию PostgreSQL .
Серверная сторона
Требовать SSL
В postgresql.conf
наборе ssl=on
и убедитесь , что у вас есть файл_ключа и CERTFILE установлены надлежащим образом (см документации и комментарии в postgresql.conf
).
Вам может потребоваться купить сертификат в ЦС, если вы хотите, чтобы клиенты доверяли ему без специальной настройки на клиенте.
В pg_hba.conf
использовании что-то вроде:
hostssl theuser thedatabase 1.2.3.4/32 md5
... возможно с "all" для пользователя и / или базы данных, и, возможно, с более широким фильтром IP-адресов источника.
Ограничение пользователей, которые могут войти, запретить удаленный вход суперпользователя
Не допускайте «все» для пользователей, если это возможно; Вы не хотите разрешать входы суперпользователя удаленно, если можете избежать этого.
Ограничить права пользователей
Ограничение прав пользователя (ей) , которые могут войти в систему . Не давать им CREATEDB
или CREATEUSER
права.
REVOKE
CONNECT
право из PUBLIC
всех баз данных, а затем вернуть его обратно только пользователь / роли , которые должны быть в состоянии получить доступ к этой базе данных. (Группируйте пользователей по ролям и предоставляйте права на роли, а не напрямую отдельным пользователям).
Убедитесь, что пользователи с удаленным доступом могут подключаться только к нужным им БД и имеют права только на те схемы, таблицы и столбцы, которые им действительно нужны. Это хорошая практика и для локальных пользователей, просто разумная безопасность.
Настройка клиента
В PgJDBC передайте параметрssl=true
:
Чтобы указать драйверу JDBC попытаться установить соединение SSL, необходимо добавить параметр URL-адреса соединения ssl = true.
... и установите сертификат сервера в хранилище доверенных сертификатов клиента или используйте сертификат сервера, которому доверяет один из ЦС, во встроенном хранилище доверенных сертификатов Java, если вы не хотите, чтобы пользователь устанавливал сертификат.
Текущие действия
Теперь убедитесь, что вы поддерживаете PostgreSQL в актуальном состоянии . В PostgreSQL было только несколько дыр в безопасности перед авторизацией, но это больше нуля, так что будьте в курсе. В любом случае, вы должны исправлять ошибки.
Добавьте брандмауэр впереди, если есть большие сетевые блоки / регионы, к которым вам не нужен доступ.
Журнал подключений и отключений (см. postgresql.conf
). Журнал запросов, если это возможно. Запустите систему обнаружения вторжений или fail2ban или аналогичную, если это возможно. Для Fail2ban с Postgres, есть удобный как к здесь
Контролировать файлы журнала.
Бонус паранойи
Дополнительные шаги, чтобы думать о ...
Требовать клиентские сертификаты
Если вы хотите, вы можете также pg_hba.conf
потребовать, чтобы клиент представил клиентский сертификат X.509, которому доверяет сервер. Для этого не нужно использовать тот же CA, что и для сертификата сервера, вы можете сделать это с CA Homebrew openssl. Пользователь JDBC должен импортировать сертификат клиента keytool
в свое хранилище ключей Java и, возможно, настроить некоторые системные свойства JSSE, чтобы указывать Java на свое хранилище ключей, поэтому он не является полностью прозрачным.
Изолировать экземпляр
Если вы хотите быть действительно параноиком, запустите экземпляр для клиента в отдельном контейнере / виртуальной машине или, по крайней мере, под другой учетной записью пользователя, используя только те базы данных, которые им необходимы.
Таким образом, если они скомпрометируют экземпляр PostgreSQL, они больше не получат.
Используйте SELinux
Я не должен был говорить это, но ...
Запустите компьютер с поддержкой SELinux, например RHEL 6 или 7, и не выключайте SELinux и не устанавливайте его в разрешающий режим . Держите его в принудительном режиме.
Использовать порт не по умолчанию
Безопасность только мраком - это глупость. Безопасность, которая использует немного неясности после того, как вы сделали разумные вещи, вероятно, не повредит.
Запустите Pg на порте не по умолчанию, чтобы немного усложнить жизнь автоматизированным злоумышленникам.
Поставь прокси перед
Вы также можете запустить PgBouncer или PgPool-II перед PostgreSQL, выступая в качестве пула соединений и прокси. Таким образом, вы можете позволить прокси обрабатывать SSL, а не реальный хост базы данных. Прокси может находиться на отдельной ВМ или машине.
В любом случае, использование PostgreSQL с прокси-серверами соединений является хорошей идеей, если только у клиентского приложения нет встроенного пула. Большинство серверов приложений Java, Rails и т. Д. Имеют встроенный пул. Даже в этом случае прокси-серверы на стороне сервера в худшем случае безвредны.