PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So sichern Sie Ihre PostgreSQL-Datenbank – 10 Tipps

Nachdem Sie den Installationsprozess Ihres PostgreSQL-Datenbankservers abgeschlossen haben, ist es notwendig, ihn zu schützen, bevor Sie in die Produktion gehen. In diesem Beitrag zeigen wir Ihnen, wie Sie die Sicherheit rund um Ihre Datenbank erhöhen können, um Ihre Daten sicher und geschützt zu halten.

1. Client-Authentifizierungskontrolle

Bei der Installation von PostgreSQL wird eine Datei mit dem Namen pg_hba.conf im Datenverzeichnis des Datenbank-Clusters erstellt. Diese Datei steuert die Client-Authentifizierung.

Aus der offiziellen postgresql-Dokumentation können wir die pg_hba.conf-Datei als eine Reihe von Datensätzen definieren, einen pro Zeile, wobei jeder Datensatz einen Verbindungstyp, einen Client-IP-Adressbereich (falls für den Verbindungstyp relevant), einen Datenbanknamen, a Benutzername und die Authentifizierungsmethode, die für Verbindungen verwendet werden soll, die diesen Parametern entsprechen. Der erste Datensatz mit übereinstimmendem Verbindungstyp, Client-Adresse, angeforderter Datenbank und Benutzername wird zur Durchführung der Authentifizierung verwendet.

Das allgemeine Format sieht also etwa so aus:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

Ein Konfigurationsbeispiel kann wie folgt aussehen:

# Allow any user from any host with IP address 192.168.93.x to connect
# to database "postgres" as the same user name that ident reports for
# the connection (typically the operating system user name).
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
 host     postgres              all             192.168.93.0/24         ident
# Reject any user from any host with IP address 192.168.94.x to connect
# to database "postgres
# TYPE  DATABASE        USER            ADDRESS                 METHOD
 host     postgres              all             192.168.94.0/24         reject

Es gibt viele Kombinationen, die Sie machen können, um die Regeln zu verfeinern (die offizielle Dokumentation beschreibt jede Option im Detail und hat einige großartige Beispiele), aber denken Sie daran, Regeln zu vermeiden, die zu freizügig sind, wie z. B. das Erlauben des Zugriffs für Zeilen mit DATABASE all oder ADDRESS 0.0.0.0/0.

Um die Sicherheit zu gewährleisten, auch wenn Sie vergessen haben, eine Regel hinzuzufügen, können Sie unten die folgende Zeile hinzufügen:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
 host     all              all             0.0.0.0/0         reject

Da die Datei von oben nach unten gelesen wird, um übereinstimmende Regeln zu finden, stellen Sie auf diese Weise sicher, dass Sie die übereinstimmende Regel oben explizit hinzufügen müssen, um die Berechtigung zu erteilen.

2. Serverkonfiguration

Es gibt einige Parameter in der postgresql.conf, die wir ändern können, um die Sicherheit zu erhöhen.

Sie können den Parameter listen_address verwenden, um zu steuern, welche IPs sich mit dem Server verbinden dürfen. Hier ist eine bewährte Vorgehensweise, um Verbindungen nur von den bekannten IPs oder Ihrem Netzwerk zuzulassen und allgemeine Werte wie „*“, „0.0.0.0:0“ oder „::“ zu vermeiden, die PostgreSQL anweisen, Verbindungen von jeder IP zu akzeptieren.

Das Ändern des Ports, auf dem postgresql lauscht (standardmäßig 5432), ist ebenfalls eine Option. Sie können dies tun, indem Sie den Wert des Port-Parameters ändern.

Parameter wie work_mem, maintenance_work_mem, temp_buffer , max_prepared_transactions, temp_file_limit sind wichtig zu beachten, falls Sie einen Denial-of-Service-Angriff haben. Dies sind Anweisungs-/Sitzungsparameter, die auf verschiedenen Ebenen (Datenbank, Benutzer, Sitzung) festgelegt werden können. Eine kluge Verwaltung dieser Parameter kann uns also dabei helfen, die Auswirkungen des Angriffs zu minimieren.

3. Benutzer- und Rollenverwaltung

Die goldene Regel für die Sicherheit in Bezug auf die Benutzerverwaltung lautet, den Benutzern den Mindestzugriff zu gewähren, den sie benötigen.

Dies zu verwalten ist nicht immer einfach und es kann sehr chaotisch werden, wenn es nicht von Anfang an gut gemacht wird.

Eine gute Möglichkeit, die Privilegien unter Kontrolle zu halten, ist die Verwendung der Rollen-, Gruppen-, Benutzerstrategie.

In postgresql wird alles als Rolle betrachtet, aber wir werden einige Änderungen daran vornehmen.

In dieser Strategie erstellen Sie drei verschiedene Typen oder Rollen:

  • Rolle Rolle (identifiziert durch Präfix r_)
  • Gruppenrolle (gekennzeichnet durch das Präfix g_)
  • Benutzerrolle (im Allgemeinen Personen- oder Anwendungsnamen)

Die Rollen (r_roles) sind diejenigen, die die Privilegien über die Objekte haben. Die Gruppenrollen ( g_ roles ) werden mit den r_ roles gewährt, sodass sie eine Sammlung von r_ roles darstellen. Und schließlich werden die Benutzerrollen mit einer oder mehreren Gruppenrollen versehen und sind diejenigen mit Anmeldeberechtigung.

Lassen Sie uns ein Beispiel dafür zeigen. Wir erstellen eine Nur-Lese-Gruppe für example_schema und gewähren sie dann einem Benutzer:

Wir erstellen die Nur-Lesen-Rolle und gewähren ihr die Objektberechtigungen

CREATE ROLE r_example_ro NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
GRANT USAGE ON SCHEMA example to r_example_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA example to r_example_ro;
ALTER DEFAULT PRIVILEGES IN SCHEMA example GRANT SELECT ON TABLES TO r_example_ro;

Wir erstellen die Nur-Lese-Gruppe und weisen dieser Gruppe die Rolle zu

CREATE ROLE g_example_ro NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION';
GRANT r_example_ro to g_example_ro;

Wir erstellen die app_user-Rolle und lassen sie der Nur-Lese-Gruppe „beitreten“

CREATE ROLE app_user WITH LOGIN ;
ALTER ROLE app_user WITH PASSWORD 'somePassword' ;
ALTER ROLE app_user VALID UNTIL 'infinity' ;
GRANT g_example_ro TO app_user;

Mit dieser Methode können Sie die Granularität der Berechtigungen verwalten und den Benutzern ganz einfach Zugriffsgruppen erteilen und entziehen. Denken Sie daran, Objektberechtigungen nur den Rollen zu erteilen, anstatt dies direkt für die Benutzer zu tun, und die Anmeldeberechtigung nur den Benutzern zu erteilen.

Dies ist eine bewährte Vorgehensweise, um öffentliche Berechtigungen für die Objekte explizit zu widerrufen, z. B. den öffentlichen Zugriff auf eine bestimmte Datenbank zu widerrufen und ihn nur über eine Rolle zu gewähren.

REVOKE CONNECT ON my_database FROM PUBLIC;
GRANT CONNECT ON my_database TO r_example_ro;

Beschränken Sie den SUPERUSER-Zugriff, erlauben Sie Superuser-Verbindungen nur von der localhost/unix-Domain.

Verwenden Sie bestimmte Benutzer für verschiedene Zwecke, z. B. bestimmte App-Benutzer oder Backup-Benutzer, und beschränken Sie die Verbindungen für diesen Benutzer nur auf die erforderlichen IPs.

4. Super User Management

Die Pflege einer starken Passwortrichtlinie ist ein Muss, um Ihre Datenbanken sicher zu halten und Passwort-Hacks zu vermeiden. Verwenden Sie für eine starke Richtlinie vorzugsweise Sonderzeichen, Zahlen, Groß- und Kleinbuchstaben und haben Sie mindestens 10 Zeichen.

Es gibt auch externe Authentifizierungstools wie LDAP oder PAM, die Ihnen dabei helfen können, den Ablauf und die Wiederverwendung Ihres Passworts sicherzustellen und auch die Kontosperrung bei Authentifizierungsfehlern zu handhaben.

5. Datenverschlüsselung (bei SSL-Verbindung)

PostgreSQL bietet native Unterstützung für die Verwendung von SSL-Verbindungen zum Verschlüsseln der Client/Server-Kommunikation für erhöhte Sicherheit. SSL (Secure Sockets Layer) ist die Standardsicherheitstechnologie zum Aufbau einer verschlüsselten Verbindung zwischen einem Webserver und einem Browser. Dieser Link stellt sicher, dass alle Daten, die zwischen dem Webserver und den Browsern ausgetauscht werden, privat und vollständig bleiben.

Da postgresql-Clients Abfragen im Klartext senden und Daten auch unverschlüsselt gesendet werden, ist es anfällig für Netzwerk-Spoofing.

Sie können SSL aktivieren, indem Sie den ssl-Parameter in postgresql.conf auf on setzen.

Der Server lauscht sowohl auf normale als auch auf SSL-Verbindungen am selben TCP-Port und verhandelt mit jedem sich verbindenden Client darüber, ob SSL verwendet werden soll. Standardmäßig ist dies die Option des Clients, aber Sie haben die Möglichkeit, den Server so einzurichten, dass er die Verwendung von SSL für einige oder alle Verbindungen erfordert, indem Sie die oben beschriebene pg_hba-Konfigurationsdatei verwenden.

6. Datenverschlüsselung im Ruhezustand (pg_crypto)

Es gibt zwei grundlegende Arten der Verschlüsselung, Einweg- und Zweiwegverschlüsselung. In gewisser Weise kümmern Sie sich nie darum, die Daten in lesbare Form zu entschlüsseln, sondern möchten nur überprüfen, ob der Benutzer weiß, was der zugrunde liegende geheime Text ist. Dies wird normalerweise für Passwörter verwendet. Bei der Zwei-Wege-Verschlüsselung möchten Sie die Möglichkeit haben, Daten zu verschlüsseln und autorisierten Benutzern zu ermöglichen, sie in eine aussagekräftige Form zu entschlüsseln. Daten wie Kreditkarten und SSNs würden in diese Kategorie fallen.

Für die Einwegverschlüsselung bietet die in pgcrypto gepackte Crypt-Funktion eine zusätzliche Sicherheitsstufe über dem md5-Weg. Der Grund dafür ist, dass Sie mit md5 feststellen können, wer dasselbe Passwort hat, weil es kein Salt gibt (in der Kryptografie sind Salt zufällige Daten, die als zusätzliche Eingabe für eine Einwegfunktion verwendet werden, die Daten, ein Passwort, „hasht“. oder Passphrase), sodass alle Personen mit demselben Passwort dieselbe verschlüsselte md5-Zeichenfolge haben. Mit Crypt werden sie anders sein.

Bei Daten, die Sie abrufen möchten, möchten Sie nicht wissen, ob die beiden Informationen identisch sind, aber Sie kennen diese Informationen nicht, und Sie möchten, dass nur autorisierte Benutzer sie abrufen können. Pgcrypto bietet mehrere Möglichkeiten, dies zu erreichen. Weitere Informationen zur Verwendung finden Sie in der offiziellen Postgresql-Dokumentation unter https://www.postgresql.org/docs/current/static/pgcrypto.html.

7. Protokollierung

Postgresql bietet eine Vielzahl von Konfigurationsparametern, um zu steuern, was, wann und wo protokolliert werden soll.

Sie können Sitzungsverbindungen/-trennungen, lange laufende Abfragen, temporäre Dateigrößen und so weiter aktivieren. Dies kann Ihnen helfen, Ihre Arbeitsbelastung besser zu kennen, um ungewöhnliche Verhaltensweisen zu erkennen. Alle Optionen zur Anmeldung erhalten Sie unter folgendem Link https://www.postgresql.org/docs/9.6/static/runtime-config-logging.html

Für detailliertere Informationen zu Ihrer Arbeitslast können Sie das Modul pg_stat_statements aktivieren, das eine Möglichkeit bietet, Ausführungsstatistiken aller von einem Server ausgeführten SQL-Anweisungen zu verfolgen. Es gibt einige Sicherheitstools, die die Daten aus dieser Tabelle aufnehmen können und eine SQL-Whitelist generieren, um Ihnen dabei zu helfen, Abfragen zu identifizieren, die nicht den erwarteten Mustern folgen.

Weitere Informationen finden Sie unter https://www.postgresql.org/docs/9.6/static/pgstatstatements.html.

Laden Sie noch heute das Whitepaper PostgreSQL-Verwaltung und -Automatisierung mit ClusterControl herunterErfahren Sie, was Sie wissen müssen, um PostgreSQL bereitzustellen, zu überwachen, zu verwalten und zu skalierenLaden Sie das Whitepaper herunter

8. Rechnungsprüfung

Die PostgreSQL-Audit-Erweiterung (pgAudit) bietet eine detaillierte Sitzungs- und/oder Objekt-Audit-Protokollierung über die standardmäßige PostgreSQL-Protokollierungsfunktion.

Die Protokollierung grundlegender Anweisungen kann von der Standardprotokollierungsfunktion mit log_statement =all bereitgestellt werden. Dies ist für die Überwachung und andere Verwendungen akzeptabel, bietet jedoch nicht den Detaillierungsgrad, der im Allgemeinen für eine Prüfung erforderlich ist. Es reicht nicht aus, eine Liste aller Operationen zu haben, die für die Datenbank durchgeführt wurden. Auch bestimmte Aussagen, die für einen Wirtschaftsprüfer interessant sind, müssen auffindbar sein. Die standardmäßige Protokollierungsfunktion zeigt, was der Benutzer angefordert hat, während sich pgAudit auf die Details dessen konzentriert, was passiert ist, während die Datenbank die Anforderung erfüllt hat.

9. Patchen

Überprüfen Sie regelmäßig und häufig die Sicherheitsinformationsseite von PostgreSQL auf wichtige Sicherheitsupdates und Patches.

Denken Sie daran, dass Sicherheitslücken in Betriebssystemen oder Bibliotheken ebenfalls zu einem Datenbankleck führen können, also stellen Sie sicher, dass Sie die Patches für diese auf dem neuesten Stand halten.

ClusterControl stellt einen Betriebsbericht bereit, der Ihnen diese Informationen liefert, und führt die Patches und Upgrades für Sie aus.

10. Sicherheit auf Zeilenebene

Zusätzlich zu dem durch GRANT verfügbaren SQL-Standard-Berechtigungssystem können Tabellen Zeilensicherheitsrichtlinien haben, die auf Benutzerbasis einschränken, welche Zeilen durch normale Abfragen zurückgegeben oder durch Datenänderungsbefehle eingefügt, aktualisiert oder gelöscht werden können. Diese Funktion wird auch als Sicherheit auf Zeilenebene bezeichnet.

Wenn die Zeilensicherheit für eine Tabelle aktiviert ist, muss jeder normale Zugriff auf die Tabelle zum Auswählen von Zeilen oder zum Ändern von Zeilen durch eine Zeilensicherheitsrichtlinie zugelassen werden.

Hier ist ein einfaches Beispiel, wie eine Richtlinie für die Kontobeziehung erstellt wird, um nur Mitgliedern der Managerrolle den Zugriff auf Zeilen und nur Zeilen ihrer Konten zu ermöglichen:

CREATE TABLE accounts (manager text, company text, contact_email text);
ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;
CREATE POLICY account_managers ON accounts TO managers USING (manager = current_user);

Weitere Informationen zu dieser Funktion finden Sie in der offiziellen Postgresql-Dokumentation https://www.postgresql.org/docs/9.6/static/ddl-rowsecurity.html

Wenn Sie mehr erfahren möchten, finden Sie hier einige Ressourcen, die Ihnen helfen können, Ihre Datenbanksicherheit besser zu stärken…

  • https://www.postgresql.org/docs/9.6/static/auth-pg-hba-conf.html
  • https://www.postgresql.org/docs/9.6/static/ssl-tcp.html
  • https://www.postgresql.org/docs/current/static/pgcrypto.html
  • http://www.postgresonline.com/journal/archives/165-Encrypting-data-with-pgcrypto.html
  • https://github.com/pgaudit/pgaudit
  • https://www.postgresql.org/docs/9.6/static/pgstatstatements.html

Schlussfolgerung

Wenn Sie die obigen Tipps befolgen, wird Ihr Server sicherer, aber das bedeutet nicht, dass er unzerstörbar ist.

Zu Ihrer eigenen Sicherheit empfehlen wir Ihnen, ein Sicherheitstesttool wie Nessus zu verwenden, um Ihre größten Schwachstellen zu kennen und zu versuchen, sie zu beheben.

Sie können Ihre Datenbank auch mit ClusterControl überwachen. Damit können Sie in Echtzeit sehen, was in Ihrer Datenbank passiert, und es analysieren.