Sicherheit und DBMS: Was Sie bei der Auswahl von Schutzwerkzeugen beachten müssen


Mein Name ist Denis Rozhkov, ich bin Leiter der Softwareentwicklung bei Gazinformservice im Jatoba- Produktteam . Gesetze und Unternehmensvorschriften stellen bestimmte Anforderungen an die Sicherheit der Datenspeicherung. Niemand möchte, dass Dritte Zugriff auf vertrauliche Informationen erhalten. Daher sind die folgenden Punkte für jedes Projekt wichtig: Identifizierung und Authentifizierung, Verwaltung des Datenzugriffs, Gewährleistung der Integrität von Informationen im System, Aufzeichnung von Sicherheitsereignissen. Daher möchte ich über einige interessante Punkte in Bezug auf die DBMS-Sicherheit sprechen.

Dieser Artikel wurde von @Databases Meetup verfasst, das von Mail.ru Cloud Solutions gehostet wird . Wenn Sie nicht lesen möchten, können Sie sehen:


Der Artikel wird drei Teile haben:

  • So schützen Sie Verbindungen.
  • Was ist eine Prüfung von Aktionen und wie wird aufgezeichnet, was in der Datenbank geschieht, und es wird eine Verbindung hergestellt?
  • Wie schützt man Daten in der Datenbank selbst und welche Technologien gibt es dafür?


Die drei Komponenten der DBMS-Sicherheit: Verbindungsschutz, Aktivitätsprüfung und Datenschutz

Verbindungsschutz


Sie können entweder direkt oder indirekt über Webanwendungen eine Verbindung zur Datenbank herstellen. In der Regel interagiert der Benutzer von der Seite des Unternehmens, dh die Person, die mit dem DBMS arbeitet, nicht direkt mit dem DBMS.

Bevor Sie über das Sichern von Verbindungen sprechen, müssen Sie wichtige Fragen beantworten, die davon abhängen, wie Sicherheitsmaßnahmen aufgebaut werden:

  • ob ein Geschäftsbenutzer einem DBMS-Benutzer entspricht;
  • Wird der Zugriff auf DBMS-Daten nur über die von Ihnen gesteuerte API bereitgestellt oder erfolgt der direkte Zugriff auf Tabellen.
  • ob das DBMS in einem separaten geschützten Segment zugeordnet ist, wer mit ihm interagiert und wie;
  • ob Pooling / Proxy und Middleware verwendet werden, wodurch Informationen darüber geändert werden können, wie die Verbindung hergestellt wird und wer die Datenbank verwendet.

Nun wollen wir sehen, welche Tools zum Schutz von Verbindungen verwendet werden können:

  1. Verwenden Sie Datenbank-Firewall-Klassenlösungen. Zumindest eine zusätzliche Schutzschicht erhöht die Transparenz der Vorgänge im DBMS maximal - Sie können zusätzlichen Datenschutz bieten.
  2. . , . — -, , . , , .

    , MS SQL Vulnerability Assessmen
  3. . , , , , , . .
  4. Konfigurieren Sie SSL. Wenn Sie keine Netzwerktrennung des DBMS von den Endbenutzern haben, befindet es sich nicht in einem separaten VLAN. In solchen Fällen muss der Kanal zwischen dem Verbraucher und dem DBMS selbst geschützt werden. Schutzwerkzeuge gehören zu Open Source.

Wie wirkt sich dies auf die DBMS-Leistung aus?


Schauen wir uns ein PostgreSQL-Beispiel an, wie sich SSL auf die CPU-Auslastung auswirkt, das Timing erhöht und das TPS verringert, wenn zu viele Ressourcen verfügbar sind, wenn Sie es aktivieren.

Wir laden PostgreSQL mit pgbench - es ist ein einfaches Programm zum Ausführen von Leistungstests. Es führt wiederholt eine Folge von Befehlen aus, möglicherweise in parallelen Datenbanksitzungen, und berechnet dann die durchschnittliche Transaktionsgeschwindigkeit.

Test 1 ohne SSL und mit SSL - mit jeder Transaktion wird eine Verbindung hergestellt:

pgbench.exe --connect -c 10 -t 5000 "host=192.168.220.129 dbname=taskdb user=postgres sslmode=require 
sslrootcert=rootCA.crt sslcert=client.crt sslkey=client.key"

vs.

pgbench.exe --connect -c 10 -t 5000 "host=192.168.220.129 dbname=taskdb user=postgres"

Test 2 ohne SSL und mit SSL - alle Transaktionen werden in einer Verbindung ausgeführt:

pgbench.exe -c 10 -t 5000 "host=192.168.220.129 dbname=taskdb user=postgres sslmode=require
sslrootcert=rootCA.crt sslcert=client.crt sslkey=client.key"

vs.

pgbench.exe -c 10 -t 5000 "host=192.168.220.129 dbname=taskdb user=postgres"

Andere Einstellungen :

scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
number of transactions per client: 5000
number of transactions actually processed: 50000/50000

Testergebnisse :
 KEIN SSLSSL
Die Verbindung wird bei jeder Transaktion hergestellt
Latenzdurchschnitt171,915 ms187,695 ms
tps einschließlich Verbindungsaufbau58.16811253,278062
tps ohne Verbindungsaufbau64.08454658.725846
Zentralprozessor24%28%
Alle Transaktionen werden in einer Verbindung ausgeführt.
Latenzdurchschnitt6,722 ms6,342 ms
tps einschließlich Verbindungsaufbau1587.6572781576.792883
tps ohne Verbindungsaufbau1588.3805741577.694766
Zentralprozessor17%21%

Bei geringer Belastung ist der Effekt von SSL mit dem Messfehler vergleichbar. Wenn die übertragene Datenmenge sehr groß ist, kann die Situation anders sein. Wenn wir für jede Transaktion eine Verbindung herstellen (dies ist selten, normalerweise wird die Verbindung zwischen Benutzern geteilt), haben Sie eine große Anzahl von Verbindungen / Verbindungsabbrüchen. Der Effekt kann etwas größer sein. Das heißt, es besteht möglicherweise das Risiko einer Leistungsverschlechterung. Der Unterschied ist jedoch nicht so groß, dass kein Schutz verwendet wird.

Bitte beachten Sie, dass es beim Vergleich der Betriebsarten einen großen Unterschied gibt: Innerhalb derselben Sitzung arbeiten Sie oder anders. Dies ist verständlich: Ressourcen werden für die Erstellung jeder Verbindung aufgewendet.

Wir hatten einen Fall, als wir Zabbix im Vertrauensmodus verbunden haben, dh wir haben md5 nicht überprüft, es war keine Authentifizierung erforderlich. Dann bat der Kunde, den MD5-Authentifizierungsmodus zu aktivieren. Dies belastete die CPU stark und die Leistung sank. Sie suchten nach Optimierungsmöglichkeiten. Eine der möglichen Lösungen für das Problem besteht darin, eine Netzwerkeinschränkung zu implementieren, separate VLANs für das DBMS zu erstellen, Einstellungen hinzuzufügen, damit klar ist, wer von wo aus eine Verbindung herstellt, und die Authentifizierung zu entfernen. Sie können die Authentifizierungseinstellungen auch optimieren, um die Kosten für die Aktivierung der Authentifizierung zu senken, im Allgemeinen jedoch mithilfe verschiedener Methoden Die Authentifizierung wirkt sich auf die Leistung aus und erfordert, dass diese Faktoren beim Entwurf der Rechenleistung von Servern (Hardware) für ein DBMS berücksichtigt werden.

Fazit: In einer Reihe von Lösungen können bereits kleine Nuancen der Authentifizierung das Projekt stark beeinträchtigen. Es ist schlecht, wenn es nur bei der Implementierung in einem Produkt klar wird.

Prüfung von Maßnahmen


Ein Audit kann nicht nur ein DBMS sein. Audit ist der Erhalt von Informationen darüber, was in verschiedenen Segmenten geschieht. Dies kann sowohl eine Datenbank-Firewall als auch das Betriebssystem sein, auf dem das DBMS basiert.

In kommerziellen DBMS auf Unternehmensebene mit Auditing ist alles in Ordnung, in Open Source - nicht immer. Folgendes hat PostgreSQL:

  • Standardprotokoll - integrierte Protokollierung;
  • Erweiterungen: pgaudit - Wenn Sie nicht über genügend Standardprotokollierung verfügen, können Sie separate Einstellungen verwenden, um einige der Probleme zu lösen.

Ergänzung zum Bericht im Video:

„Die grundlegende Registrierung von Bedienern kann mit einer Standardprotokollierungsfunktion mit log_statement = all bereitgestellt werden.

Dies ist für die Überwachung und andere Zwecke akzeptabel, bietet jedoch nicht den Detaillierungsgrad, der normalerweise für ein Audit erforderlich ist.

Es reicht nicht aus, eine Liste aller mit der Datenbank ausgeführten Vorgänge zu haben.

Es sollte auch möglich sein, bestimmte Aussagen zu finden, die für den Abschlussprüfer von Interesse sind.

Das Standard-Protokollierungstool zeigt an, was der Benutzer angefordert hat, während sich pgAudit auf die Details dessen konzentriert, was passiert ist, als die Datenbank die Anforderung gestellt hat.

Beispielsweise möchte der Prüfer möglicherweise sicherstellen, dass eine bestimmte Tabelle in einem dokumentierten Wartungsfenster erstellt wurde.

Dies mag wie eine einfache Aufgabe für die grundlegende Prüfung und Grep erscheinen, aber was ist, wenn Sie auf so etwas (absichtlich verwirrendes) Beispiel stoßen:

DO $$
BEGIN
EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;

Die Standardprotokollierung gibt Ihnen

Folgendes an : LOG: Anweisung: DO $$
BEGIN
EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;

Es scheint, dass die Suche nach einer Tabelle von Interesse in Fällen, in denen Tabellen dynamisch erstellt werden, einige Codekenntnisse erfordern kann.

Dies ist nicht ideal, da es vorzuziehen wäre, nur nach Tabellennamen zu suchen.

Hier ist pgAudit nützlich.

Für dieselbe Eingabe wird diese Ausgabe im Protokoll ausgegeben:

PRÜFUNG: SESSION, 33.1, FUNCTION, DO ,,, “DO $$
BEGIN
EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$; "
AUDIT: SESSION, 33,2, DDL, CREATE TABLE, TABLE, public.important_table, CREATE TABLE important_table (id INT) Es wird

nicht nur der DO-Block registriert, sondern auch der Volltext CREATE TABLE mit dem Operatortyp, dem Objekttyp und vollständiger Name, der die Suche erleichtert.

Im Verhalten des Operator-Magazins SELECT und DML kann pgAudit so konfiguriert werden, dass für jede Beziehung, auf die in der Anweisung verwiesen wird, ein separater Eintrag protokolliert wird.

Sie müssen nicht analysieren, um alle Anweisungen zu finden, die sich auf eine bestimmte Tabelle beziehen ( * ). " .

Wie wirkt sich dies auf die DBMS-Leistung aus?


Lassen Sie uns die Tests mit aktivierter vollständiger Prüfung ausführen und sehen, was mit der Leistung von PostgreSQL passiert. Wir aktivieren die maximale Datenbankprotokollierung in jeder Hinsicht.

Wir ändern fast nichts in der Konfigurationsdatei, von der wichtigen - aktivieren Sie den Debug5-Modus, um die maximalen Informationen zu erhalten.

postgresql.conf
log_destination = 'stderr'
logging_collector = on
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10
MB log_min_messages = debug5
log_min_error_statement = debug5
log_min_duration_statement = 0
debug_print_parse =
debug_print_rewritten = on
debug_print_plan = on
debug_pretty_print = on
log_checkpoints = on
log_connections = on
log_disconnections = on
log_duration = on
log_hostname = on
log_lock_waits = on
log_replication_commands = on
log_temp_files = 0
log_timezone =

Auf dem PostgreSQL-DBMS mit den Parametern 1 CPU, 2,8 GHz, 2 GB RAM, 40 GB Festplatte führen wir drei Auslastungstests mit den folgenden Befehlen durch:

$ pgbench -p 3389 -U postgres -i -s 150 benchmark
$ pgbench -p 3389 -U postgres -c 50 -j 2 -P 60 -T 600 benchmark
$ pgbench -p 3389 -U postgres -c 150 -j 2 -P 60 -T 600 benchmark

Testergebnisse:
Ohne ProtokollierungMit der Protokollierung
Gesamtfüllzeit der Datenbank43,74 Sek53,23 Sek
RAM24%40%
Zentralprozessor72%91%
Test 1 (50 Verbindungen)
Anzahl der Transaktionen in 10 Minuten7416932445
Transaktion / Sek12354
Durchschnittliche Verzögerung405 ms925 ms
Test 2 (150 Verbindungen bei 100 möglich)
Anzahl der Transaktionen in 10 Minuten8172731429
Transaktion / Sek13652
Durchschnittliche Verzögerung550 ms1432 ms
Über Größen
DB-Größe2251 MB2262 MB
Größe des Datenbankprotokolls0 Mb4587 Mb

Fazit: Eine vollständige Prüfung ist nicht sehr gut. Die Daten aus dem Audit werden als Volumen, als Daten in der Datenbank selbst oder noch mehr angezeigt. Der Umfang der Protokollierung, der bei der Arbeit mit dem DBMS generiert wird, ist ein häufiges Problem des Produkts.

Wir betrachten andere Parameter:

  • Die Geschwindigkeit ändert sich nicht viel: ohne Protokollierung - 43,74 Sekunden, mit Protokollierung - 53,23 Sekunden.
  • Die Leistung auf RAM und CPU sinkt, da Sie mit dem Audit eine Datei erstellen müssen. Es macht sich auch bei der Produktivität bemerkbar.

Mit zunehmender Anzahl von Verbindungen wird sich die Leistung natürlich leicht verschlechtern.

In Unternehmen mit Wirtschaftsprüfung ist es noch schwieriger:

  • es gibt viele Daten;
  • Die Prüfung ist nicht nur über Syslog in SIEM erforderlich, sondern auch für Dateien: Mit Syslog passiert plötzlich etwas. Die Datei, in der die Daten gespeichert werden, sollte sich in der Nähe der Datenbank befinden.
  • Für die Prüfung ist ein separates Regal erforderlich, um nicht auf E / A-Festplatten zu sinken, da es viel Platz beansprucht.
  • Es kommt vor, dass IS-Mitarbeiter überall GOSTs benötigen, sie benötigen einen Gastausweis.

Datenzugriffsbeschränkung


Schauen wir uns die Technologien an, die zum Schutz von Daten und zum Zugriff darauf in kommerziellem DBMS und Open Source verwendet werden.

Was kann als Ganzes verwendet werden:

  1. Verschlüsselung und Verschleierung von Prozeduren und Funktionen (Wrapping) - dh separate Tools und Dienstprogramme, die Code von lesbarem Code unlesbar machen. Es stimmt, dann kann es weder geändert noch zurückgestaltet werden. Ein solcher Ansatz ist manchmal zumindest auf der DBMS-Seite erforderlich - die Logik der Lizenzbeschränkungen oder die Autorisierungslogik wird genau auf der Ebene der Prozedur und Funktion verschlüsselt.
  2. (RLS) — , , - - .
  3. (Masking) — , , - . , .
  4. Security DBA/Application DBA/DBA — , , , database- application-. open source , . , .
  5. . , , .
  6. — .
  7. End-to-end encryption — client-side .
  8. . , — , .

?


Schauen wir uns ein Beispiel für die Spaltenverschlüsselung in PostgreSQL an. Es gibt ein pgcrypto-Modul, mit dem Sie ausgewählte Felder in verschlüsselter Form speichern können. Dies ist nützlich, wenn nur einige Daten wertvoll sind. Um die verschlüsselten Felder zu lesen, übergibt der Client den Entschlüsselungsschlüssel, der Server entschlüsselt die Daten und gibt sie an den Client aus. Ohne einen Schlüssel mit Ihren Daten kann niemand etwas tun.

Lassen Sie uns mit pgcrypto testen . Erstellen Sie eine Tabelle mit verschlüsselten Daten und regulären Daten. Unten finden Sie den Befehl zum Erstellen von Tabellen. In der ersten Zeile erstellt ein nützlicher Befehl die Erweiterung selbst mit der Registrierung des DBMS:

CREATE EXTENSION pgcrypto;
CREATE TABLE t1 (id integer, text1 text, text2 text);
CREATE TABLE t2 (id integer, text1 bytea, text2 bytea);
INSERT INTO t1 (id, text1, text2)
VALUES (generate_series(1,10000000), generate_series(1,10000000)::text, generate_series(1,10000000)::text);
INSERT INTO t2 (id, text1, text2) VALUES (
generate_series(1,10000000),
encrypt(cast(generate_series(1,10000000) AS text)::bytea, 'key'::bytea, 'bf'),
encrypt(cast(generate_series(1,10000000) AS text)::bytea, 'key'::bytea, 'bf'));

Als nächstes werden wir versuchen, Daten aus jeder Tabelle abzutasten und die Ausführungszeiten zu betrachten.

Auswahl aus der Tabelle ohne Verschlüsselungsfunktion :

psql -c "\timing" -c "select * from t1 limit 1000;" "host=192.168.220.129 dbname=taskdb
user=postgres sslmode=disable" > 1.txt

Stoppuhr ist an.

  id | text1 | text2
------ + ------- + -------
1 | 1 | 1
2 | 2 | 2
3 | 3 | 3
...
997 | 997 | 997
998 | 998 | 998.999
| 999 | 999
1000 | 1000 | 1000
(1000 Zeilen)

Zeit: 1,386 ms.

Abtastung aus einer Tabelle mit Verschlüsselungsfunktion:

psql -c "\timing" -c "select id, decrypt(text1, 'key'::bytea, 'bf'),
decrypt(text2, 'key'::bytea, 'bf') from t2 limit 1000;"
"host=192.168.220.129 dbname=taskdb user=postgres sslmode=disable" > 2.txt

Stoppuhr ist an.

  id | entschlüsseln | entschlüsseln
----- + -------------- + ------------
1 | \ x31 | \ x31
2 | \ x32 | \ x32
3 | \ x33 | \ x33
...
999 | \ x393939 | \ x393939
1000 | \ x31303030 | \ x31303030
(1000 Zeilen)

Zeit: 50,203 ms

Testergebnisse :
 Keine VerschlüsselungPgcrypto (entschlüsseln)
1000 Zeilen abrufen1.386 ms50,203 ms
Zentralprozessorfünfzehn%35%
RAM + 5%

Die Verschlüsselung hat einen großen Einfluss auf die Leistung. Es ist ersichtlich, dass das Timing zugenommen hat, da die Entschlüsselung verschlüsselter Daten (und die Entschlüsselung normalerweise noch in Ihrer Logik enthalten ist) erhebliche Ressourcen erfordert. Das heißt, die Idee, alle Spalten zu verschlüsseln, die Daten enthalten, ist mit einer verringerten Leistung behaftet.

Verschlüsselung ist jedoch kein Patentrezept, das alle Probleme löst. Die entschlüsselten Daten und der Entschlüsselungsschlüssel bei der Entschlüsselung und Datenübertragung befinden sich auf dem Server. Daher können Schlüssel von Personen abgefangen werden, die vollen Zugriff auf den Datenbankserver haben, z. B. einem Systemadministrator.

Wenn die gesamte Spalte für alle Benutzer einen Schlüssel enthält (auch wenn nicht für alle, aber für eine begrenzte Anzahl von Kunden), ist dies nicht immer gut und richtig. Aus diesem Grund begannen sie mit der End-to-End-Verschlüsselung. Im DBMS begannen sie, Optionen zum Verschlüsseln von Daten vom Client und Server in Betracht zu ziehen. Es wurden dieselben Key-Vault-Repositorys angezeigt - separate Produkte, die die Schlüsselverwaltung auf der DBMS-Seite ermöglichen.


Ein Beispiel für eine solche Verschlüsselung in MongoDB

Sicherheitsfunktionen in kommerziellem und Open Source DBMS


FunktionenEine ArtKennwortrichtliniePrüfungSchutz des Quellcodes für Prozeduren und FunktionenRLSVerschlüsselung
Orakelkommerziell+++++
Msqlkommerziell+++++
Jatobakommerziell++++Erweiterungen
PostgreSQLKostenlosErweiterungenErweiterungen- -+Erweiterungen
MongodbKostenlos- -+- -- -Nur in MongoDB Enterprise verfügbar

Die Tabelle ist bei weitem nicht vollständig, aber die Situation ist folgende: Bei kommerziellen Produkten wurden Sicherheitsprobleme schon lange gelöst, bei Open Source werden in der Regel einige Add-Ons für die Sicherheit verwendet, viele Funktionen reichen nicht aus, manchmal muss etwas hinzugefügt werden. Zum Beispiel Passwortrichtlinien - In PostgreSQL gibt es viele verschiedene Erweiterungen ( 1 , 2 , 3 , 4 , 5 ), die Passwortrichtlinien implementieren, aber meiner Meinung nach deckt keine alle Anforderungen des inländischen Unternehmenssegments ab.

Was tun, wenn nirgendwo etwas benötigt wird ? Zum Beispiel möchte ich ein bestimmtes DBMS verwenden, in dem es keine Funktionen gibt, die der Kunde benötigt.

Anschließend können Sie Lösungen von Drittanbietern verwenden, die mit verschiedenen DBMS funktionieren, z. B. "Crypto DB" oder "Garda DB". Wenn es sich um Lösungen aus dem Inlandsbereich handelt, kennen sie GOSTs besser als Open Source.

Die zweite Möglichkeit besteht darin, sich selbst zu schreiben, was Sie benötigen, Datenzugriff und Verschlüsselung in der Anwendung auf Prozedurebene zu implementieren. Es stimmt, mit GOST wird es schwieriger. Aber im Allgemeinen können Sie die Daten nach Bedarf ausblenden, in das DBMS einfügen, dann abrufen und direkt auf Anwendungsebene entschlüsseln. Denken Sie gleichzeitig sofort darüber nach, wie Sie diese Algorithmen bei der Anwendung schützen können. Unserer Meinung nach sollte dies auf DBMS-Ebene erfolgen, da dies schneller funktioniert.

Dieser Vortrag wurde erstmals bei @Databases Meetup von Mail.ru Cloud Solutions gehalten. Sehen Sie sich das Video anandere Auftritte und melden Sie sich für Ankündigungen von Telegrammveranstaltungen rund um Kubernetes bei der Mail.ru Group an .

Was gibt es sonst noch zu diesem Thema zu lesen :

  1. Mehr als Ceph: MCS Block Cloud Storage .
  2. So wählen Sie eine Datenbank für das Projekt aus, um sie nicht erneut auszuwählen .

All Articles