Потрібна SSL, увімкніть SELinux, стежте за журналами та використовуйте поточну версію PostgreSQL .
Сторона сервера
Потрібна SSL
У postgresql.conf
наборі ssl=on
і переконайтеся , що у вас є файл_ключа і CERTFILE встановлені належним чином (див документації та коментарі в postgresql.conf
).
Можливо, вам доведеться придбати сертифікат у ЦА, якщо ви хочете, щоб клієнти йому довіряли без спеціальних налаштувань на клієнта.
У pg_hba.conf
використанні щось на кшталт:
hostssl theuser thedatabase 1.2.3.4/32 md5
... можливо, з "всім" для користувача та / або бази даних та, можливо, із ширшим фільтром IP-адреси джерела.
Обмежте користувачів, які можуть увійти, відмовити у віддаленому вході в систему суперпользователя
Не дозволяйте "все" для користувачів, якщо можливо; ви не хочете віддаляти дозвіл на вхід суперпользователя, якщо ви можете уникнути необхідності.
Обмежте права користувачів
Обмежте права користувачів (користувачів), які можуть увійти. Не дайте їм CREATEDB
чи CREATEUSER
прав.
REVOKE
CONNECT
право з PUBLIC
усіх баз даних, а потім повернути його назад тільки користувач / ролі , які повинні бути в змозі отримати доступ до цієї бази даних. (Групуйте користувачів на ролі та надайте права на ролі, а не безпосередньо окремим користувачам).
Переконайтеся, що користувачі з віддаленим доступом можуть підключатися лише до необхідних БД і мати лише права на схеми, таблиці та стовпці в межах, які вони насправді потребують. Це хороша практика і для місцевих користувачів, це просто розумна безпека.
Налаштування клієнта
У PgJDBC передайте параметрssl=true
:
Щоб доручити драйверу JDBC спробувати встановити SSL-з'єднання, потрібно додати параметр URL-адреси підключення ssl = true.
... і встановіть серверний сертифікат у довіре клієнта або використовуйте сертифікат сервера, якому довіряється один із ЦС у вбудованому довіреному сховищі Java, якщо ви не хочете, щоб користувач мав встановити cert.
Постійні дії
Тепер переконайтесь, що ви постійно оновлюєте PostgreSQL . У PostgreSQL було лише декілька попередніх аукціонів, але це більше ніж нуль, тому будьте в курсі. У будь-якому випадку, ви повинні виправити помилки.
Додайте брандмауер попереду, якщо є великі мережеві блоки / регіони, до яких ви знаєте, що вам ніколи не потрібен доступ.
Підключення та відключення журналу (див. postgresql.conf
). Запитуйте журнал, якщо це практично. Запустити систему виявлення вторгнень або несправність2ban або подібне попереду, якщо це можливо. Для fail2ban з postgres тут є зручне керівництво
Контроль файлів журналу.
Бонусна параноїя
Додаткові кроки для роздумів ...
Потрібні клієнтські сертифікати
Якщо ви хочете, ви також pg_hba.conf
можете вимагати, щоб клієнт представив клієнтський сертифікат X.509, якому довіряє сервер. Тут не потрібно використовувати той самий CA, що і сервер cert, ви можете зробити це за допомогою homebrew openssl CA. Користувачеві JDBC потрібно імпортувати клієнтський сертифікат у keytool
свою сховище Java за допомогою та, можливо, налаштувати деякі властивості системи JSSE, щоб вказати Java на їхній сховище клавіш, тому це не зовсім прозоро.
Карантинний примірник
Якщо ви хочете бути дійсно параноїком, запустіть екземпляр для клієнта в окремому контейнері / VM або, принаймні, під іншим обліковим записом користувача, лише з потрібними базами даних.
Таким чином, якщо вони скомпрометують екземпляр PostgreSQL, вони більше не отримають.
Використовуйте SELinux
Я не повинен був цього говорити, але ...
Запустіть машину з підтримкою SELinux, наприклад RHEL 6 або 7, і не вимикайте SELinux і не перемикайте його на дозвільний режим . Тримайте його в режимі примусового виконання.
Використовуйте порт, який не використовується за замовчуванням
Безпека лише незрозумілістю - це дурість. Безпека, яка використовує трохи невідомості, як тільки ви зробите розумні речі, ймовірно, не зашкодить.
Запустіть Pg на порт, який не використовується за замовчуванням, щоб зробити життя трохи важчим для автоматизованих нападників.
Поставте проксі спереду
Ви також можете запустити PgBouncer або PgPool-II перед PostgreSQL, виконуючи функції пулу з'єднань та проксі. Таким чином ви можете дозволити проксі обробляти SSL, а не справжній хост бази даних. Проксі-сервер може бути на окремому ВМ або на машині.
Використання проксі-серверів для об'єднання підключень, як правило, хороша ідея з PostgreSQL, якщо тільки у клієнтського додатка вже немає вбудованого пулу. Більшість серверів додатків Java, Rails тощо мають вбудований пул. Навіть тоді проксі-сервер об'єднання на стороні сервера в гіршому випадку нешкідливий.