Sicurezza è DBMS: ciò chì avete bisognu di ricurdà quandu sceglite e strumenti di sicurezza

Sicurezza è DBMS: ciò chì avete bisognu di ricurdà quandu sceglite e strumenti di sicurezza

Mi chjamu Denis Rozhkov, sò u capu di sviluppu di software in a cumpagnia Gazinformservice, in a squadra di produttu. Jatoba. A legislazione è i regulamenti corporativi imponenu certi requisiti per a sicurità di u almacenamentu di dati. Nimu ùn vole chì i terzu partiti accede à l'infurmazioni cunfidenziale, cusì i seguenti prublemi sò impurtanti per ogni prughjettu: identificazione è autentificazione, gestione di l'accessu à e dati, assicurendu l'integrità di l'infurmazioni in u sistema, loging events security. Dunque, vogliu parlà di qualchi punti interessanti in quantu à a sicurità DBMS.

L'articulu hè statu preparatu basatu annantu à un discorsu at @DatabasesMeetup, urganizata Mail.ru Soluzioni Cloud. Se ùn vulete micca leghje, pudete fighjà:


L'articulu hà da esse trè parti:

  • Cumu assicurà e cunnessione.
  • Chì ghjè un auditu di l'azzioni è cumu per arregistrà ciò chì succede nantu à a basa di dati è cunnetta cù questu.
  • Cumu prutegge e dati in a basa di dati stessu è chì tecnulugia sò dispunibili per questu.

Sicurezza è DBMS: ciò chì avete bisognu di ricurdà quandu sceglite e strumenti di sicurezza
Trè cumpunenti di a sicurità DBMS: prutezzione di cunnessione, auditing di attività è prutezzione di dati

Assicurendu e vostre cunnessione

Pudete cunnette à a basa di dati direttamente o indirettamente per l'applicazioni web. In regula, l'usu di l'affari, vale à dì a persona chì travaglia cù u DBMS, interagisce cun ellu indirettu.

Prima di parlà di prutezzione di e cunnessione, avete bisognu di risponde à e dumande impurtanti chì determinanu cumu e misure di sicurezza seranu strutturate:

  • Hè un utilizatore cummerciale equivalente à un utilizatore DBMS?
  • s'ellu l'accessu à e dati DBMS hè furnitu solu per mezu di una API chì voi cuntrolla, o s'ellu si accede direttamente à e tavule;
  • se u DBMS hè attribuitu à un segmentu prutettu separatu, quale interagisce cun ellu è cumu;
  • se u pooling / proxy è i strati intermedi sò usati, chì ponu cambià l'infurmazioni nantu à cumu a cunnessione hè custruita è quale usa a basa di dati.

Avà vedemu quali strumenti ponu esse aduprati per assicurà e cunnessione:

  1. Aduprà suluzione di classi firewall di basa di dati. Un stratu supplementu di prutezzione, à u minimu, aumenterà a trasparenza di ciò chì succede in u DBMS, è à u massimu, puderà furnisce una prutezzione di dati supplementari.
  2. Utilizà e pulitiche di password. U so usu dipende di cumu a vostra architettura hè custruita. In ogni casu, una password in u schedariu di cunfigurazione di una applicazione web chì cunnetta à u DBMS ùn hè micca abbastanza per a prutezzione. Ci hè una quantità di strumenti DBMS chì permettenu di cuntrullà chì l'utilizatore è a password necessitanu l'aghjurnamentu.

    Pudete leghje più nantu à e funzioni di valutazione di l'utilizatori ccà, Pudete ancu scopre nantu à MS SQL Vulnerability Assessmen ccà

  3. Arricchisci u cuntestu di a sessione cù l'infurmazioni necessarii. Se a sessione hè opaca, ùn avete micca capitu quale hè chì travaglia in u DBMS in u so quadru, pudete, in u quadru di l'operazione esse realizatu, aghjunghje infurmazioni nantu à quale hè chì face ciò è perchè. Questa infurmazione pò esse vistu in l'auditu.
  4. Configurate SSL se ùn avete micca una separazione di rete trà u DBMS è l'utilizatori finali; ùn hè micca in una VLAN separata. In tali casi, hè imperativu di prutezzione di u canali trà u cunsumadore è u DBMS stessu. Strumenti di sicurezza sò ancu dispunibili in open source.

Cumu questu affettarà u rendiment di u DBMS?

Fighjemu l'esempiu di PostgreSQL per vede cumu SSL affetta a carica di CPU, aumenta i timings è diminuite TPS, è s'ellu cunsumerà troppu risorse se l'attivate.

Caricà PostgreSQL cù pgbench hè un prugramma simplice per eseguisce teste di rendiment. Esegue una sola sequenza di cumandamenti ripetutamente, possibbilmente in sessioni di basa di dati parallele, è poi calcula a tarifa media di transazzione.

Pruvate 1 senza SSL è cù SSL - a cunnessione hè stabilita per ogni transazzione:

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"

Pruvate 2 senza SSL è cù SSL - tutte e transazzione sò realizate in una cunnessione:

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"

Altri paràmetri:

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

Risultati di test:

 
NO SSL
SSL

Una cunnessione hè stabilita per ogni transazzione

latenza media
171.915 ms
187.695 ms

tps cumpresi i stabilimenti di cunnessione
58.168112
53.278062

tps escludendu i stabilimenti di cunnessione
64.084546
58.725846

CPU
24%
28%

Tutte e transazzione sò realizate in una cunnessione

latenza media
6.722 ms
6.342 ms

tps cumpresi i stabilimenti di cunnessione
1587.657278
1576.792883

tps escludendu i stabilimenti di cunnessione
1588.380574
1577.694766

CPU
17%
21%

À carichi ligeri, l'influenza di SSL hè paragunabile à l'errore di misurazione. Se a quantità di dati trasferiti hè assai grande, a situazione pò esse diversa. Se stabiliscemu una cunnessione per transazzione (questu hè raru, di solitu a cunnessione hè sparta trà l'utilizatori), avete un gran numaru di cunnessione / disconnections, l'impattu pò esse un pocu più grande. Questu hè, pò esse risichi di diminuite prestazioni, in ogni modu, a diferenza ùn hè micca cusì grande per ùn aduprà a prutezzione.

Per piacè nutate chì ci hè una forte diferenza se paragunate i modi operativi: travagliate in a listessa sessione o in altre diverse. Questu hè comprensibile: i risorse sò spesi per creà ogni cunnessione.

Avemu avutu un casu quandu avemu cunnessu Zabbix in modu di fiducia, vale à dì, md5 ùn era micca verificatu, ùn ci era micca bisognu di autentificazione. Allora u cliente hà dumandatu à attivà u modu di autentificazione md5. Questu hà fattu una carica pesante nantu à u CPU, è u rendiment hè cascatu. Avemu cuminciatu à circà modi per ottimisimu. Una di e pussibuli suluzioni à u prublema hè di implementà e restrizioni di a rete, fà VLAN separati per u DBMS, aghjunghje paràmetri per fà chjaru quale hè cunnessu da induve è sguassate l'autentificazione.Pudete ancu ottimisà i paràmetri di autentificazione per riduce i costi quandu attivate l'autentificazione, ma in generale, l'usu di diversi metudi d'autentificazione affetta u rendiment è esige di piglià questi fatturi in cunsiderà in u disignu di u putere di computing di i servitori (hardware) per u DBMS.

Conclusioni: in una quantità di suluzioni, ancu i picculi sfumaturi in l'autentificazione pò influenzà assai u prugettu è hè male quandu questu diventa chjaru solu quandu implementatu in a produzzione.

Audit d'azzione

L'auditu pò esse micca solu DBMS. Un auditu hè di ottene infurmazioni nantu à ciò chì succede in diversi segmenti. Questu pò esse un firewall di basa di dati o u sistema operatore nantu à quale hè custruitu u DBMS.

In i DBMS di u nivellu di l'impresa cummerciale tuttu hè bè cù l'auditu, ma in open source - micca sempre. Eccu ciò chì PostgreSQL hà:

  • log predeterminatu - logging integratu;
  • estensioni: pgaudit - se u logu predeterminatu ùn hè micca abbastanza per voi, pudete aduprà paràmetri separati chì risolve alcuni prublemi.

Aghjunghje à u rapportu in u video:

"Logging di dichjarazione di basa pò esse furnitu da una facilità di logu standard cù log_statement = all.

Questu hè accettatu per u monitoraghju è altri usi, ma ùn furnisce micca u livellu di dettagliu tipicu necessariu per l'auditu.

Ùn hè micca abbastanza per avè una lista di tutte l'operazioni realizate nantu à a basa di dati.

Hè ancu pussibule di truvà dichjarazioni specifiche chì sò d'interessu per l'auditor.

U logu standard mostra ciò chì l'utilizatore hà dumandatu, mentri pgAudit si cuncentra nantu à i dettagli di ciò chì hè accadutu quandu a basa di dati hà eseguitu a dumanda.

Per esempiu, l'auditore pò vulete verificà chì una tavola particulare hè stata creata in una finestra di mantenimentu documentata.

Questu pò sembrà un compitu simplice cù l'audizione basica è grep, ma chì si avete statu prisentatu cù qualcosa cum'è questu (intenzionalmente confusu) esempiu:

DO$$
PRINCIPIA
EXECUTE 'CREATE TABLE import' || 'ant_table (id int)';
END$$;

Logging standard vi darà questu:

LOG: dichjarazione: DO $$
PRINCIPIA
EXECUTE 'CREATE TABLE import' || 'ant_table (id int)';
END$$;

Sembra chì truvà a tavola d'interessu pò esse bisognu di una certa cunniscenza di codice in i casi induve i tavule sò creati dinamicamente.

Questu ùn hè micca l'ideale, postu chì saria preferibile solu cercà per nome di a tavola.

Questu hè induve pgAudit hè utile.

Per u listessu input, pruducerà questu output in u logu:

AUDIT: SESSION,33,1,FUNCTION,DO,,,"FA $$
PRINCIPIA
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)

Ùn hè solu u bloccu DO hè registratu, ma ancu u testu sanu di u CREATE TABLE cù u tipu di dichjarazione, u tipu d'ughjettu è u nome cumpletu, facenu a ricerca più faciule.

Quandu si registranu dichjarazioni SELECT è DML, pgAudit pò esse cunfiguratu per logà una entrata separata per ogni relazione riferita in a dichjarazione.

Nisuna analisi hè necessaria per truvà tutte e dichjarazioni chì toccanu una tavola particulare (*) ».

Cumu questu affettarà u rendiment di u DBMS?

Eseguimu testi cù l'audizione cumpleta attivata è vede ciò chì succede à u rendiment PostgreSQL. Abilitemu a registrazione massima di basa di dati per tutti i paràmetri.

Ùn cambiamu quasi nunda in u schedariu di cunfigurazione, u più impurtante hè di accende u modu debug5 per ottene a massima infurmazione.

postgresql.conf

log_destination = 'stderr'
logging_collector = attivu
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 = on
debug_print_rewritten = on
debug_print_plan = attivu
debug_pretty_print = on
log_checkpoints = on
log_connections = on
log_disconnections = on
log_duration = on
log_hostname = on
log_lock_wait = on
log_replication_commands = on
log_temp_files = 0
log_timezone = 'Europa/Mosca'

In un DBMS PostgreSQL cù paràmetri di 1 CPU, 2,8 GHz, 2 GB RAM, 40 GB HDD, facemu trè teste di carica cù i cumandamenti:

$ 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

I risultati di u test:

Nisun logging
Cù logging

Tempu tutale di riempimentu di a basa di dati
43,74 sec
53,23 sec

RAM
24%
40%

CPU
72%
91%

Test 1 (50 cunnessione)

Numero di transacciones in 10 minuti
74169
32445

Transazzione / sec
123
54

Latenza media
405 ms
925 ms

Test 2 (150 cunnessione cù 100 pussibuli)

Numero di transacciones in 10 minuti
81727
31429

Transazzione / sec
136
52

Latenza media
550 ms
1432 ms

À propositu di dimensioni

dimensione DB
2251 MB
2262 MB

Dimensione di u logu di a basa di dati
0 MB
4587 MB

Bottom line: un auditu cumpletu ùn hè micca assai bonu. I dati da l'auditu seranu quant'è i dati in a basa di dati stessu, o ancu più. A quantità di logging chì hè generata quandu u travagliu cù un DBMS hè un prublema cumuni in a produzzione.

Fighjemu à altri paràmetri:

  • A vitezza ùn cambia assai: senza logging - 43,74 seconde, cù logging - 53,23 seconde.
  • U rendiment RAM è CPU soffrenu perchè avete bisognu di generà un schedariu di auditu. Questu hè ancu notu in a produtividade.

Cum'è u numeru di cunnessione aumenta, naturalmente, u rendiment si deteriora ligeramente.

In corporazioni cù auditu hè ancu più difficiule:

  • ci hè assai dati;
  • L'auditu hè necessariu micca solu per u syslog in SIEM, ma ancu in i schedarii: se qualcosa succede à syslog, deve esse un schedariu vicinu à a basa di dati in quale i dati sò salvati;
  • per auditing, un scaffale separatu hè necessariu per ùn perde micca in dischi I / O, postu chì occupa assai spaziu;
  • Succece chì l'impiegati di a sicurità di l'infurmazioni necessitanu standard GOST in ogni locu, necessitanu l'identificazione statale.

Restrizzione di l'accessu à i dati

Fighjemu i tecnulugii chì sò usati per prutege e dati è accede in i DBMS cummirciali è open source.

Chì pudete aduprà in generale:

  1. Encryption and offuscation of procedures and functions (Wrapping) - vale à dì, arnesi è utilità separati chì facenu u codice leggibile illeggibile. True, allora ùn pò esse nè cambiatu nè refactored back. Stu approcciu hè qualchì volta necessariu almenu in u latu DBMS - a logica di restrizioni di licenza o logica d'autorizazione hè criptata precisamente à u nivellu di prucedura è funzione.
  2. A limitazione di a visibilità di e dati per fila (RLS) hè quandu l'utilizatori diffirenti vedenu una tavola, ma una cumpusizioni diffirenti di fila in questu, vale à dì, qualcosa ùn pò micca esse mostratu à qualchissia à u livellu di fila.
  3. L'edità di e dati affissati (Masking) hè quandu l'utilizatori in una colonna di a tavula vedenu o dati o solu asterischi, vale à dì, per certi utilizatori l'infurmazioni seranu chjusi. A tecnulugia determina quale utilizatore hè mostratu ciò chì basatu nantu à u so livellu di accessu.
  4. U cuntrollu di l'accessu DBA / DBA di Seguretat hè, piuttostu, di limità l'accessu à u DBMS stessu, vale à dì, l'impiegati di sicurezza di l'infurmazioni ponu esse separati da l'amministratori di basa di dati è l'amministratori di l'applicazioni. Ci sò pochi tali tecnulugia in open source, ma ci sò assai in DBMS cummirciali. Sò necessarii quandu ci sò parechji utilizatori cù accessu à i servitori stessi.
  5. Restrizzione di l'accessu à i schedari à u livellu di u sistema di schedari. Pudete cuncede diritti è privilegi d'accessu à i cartulari per chì ogni amministratore hà accessu solu à e dati necessarii.
  6. Accessu ubligatoriu è cancellazione di memoria - sti tecnulugii sò raramente usati.
  7. A criptografia end-to-end direttamente da u DBMS hè una criptografia di u cliente cù a gestione di chjave in u latu di u servitore.
  8. Criptazione di dati. Per esempiu, a criptografia di colonna hè quandu utilizate un mecanismu chì cripta una sola colonna di a basa di dati.

Cumu questu affetta u rendiment di u DBMS?

Fighjemu l'esempiu di criptografia di colonna in PostgreSQL. Ci hè un modulu pgcrypto, vi permette di almacenà i campi selezziunati in forma criptata. Questu hè utile quandu solu qualchi dati sò preziosi. Per leghje i campi criptati, u cliente trasmette una chjave di decryption, u servitore decripta i dati è torna à u cliente. Senza a chjave, nimu pò fà nunda cù i vostri dati.

Testemu cù pgcrypto. Creemu una tavula cù dati criptati è dati regularmente. Quì sottu sò i cumandamenti per a creazione di tavule, in a prima linea ci hè un cumandamentu utile - creendu l'estensione stessu cù a registrazione 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'));

In seguitu, pruvemu à fà una mostra di dati da ogni tavula è fighjemu i timings d'esekzione.

Selezzione da una tavula senza funzione di criptografia:

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

U cronometru hè attivu.

  id | testu1 | testu 2
——+——-+——-
1 | 1 | 1
2 | 2 | 2
3 | 3 | 3
...
997 | 997 | 997
998 | 998 | 998
999 | 999 | 999
1000 | 1000 | 1000
(1000 linee)

Tempu: 1,386 ms

Selezzione da una tavula cù funzione di criptografia:

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

U cronometru hè attivu.

  id | decifrare | decifrare
——+—————+————
1 | x31 | x31
2 | x32 | x32
3 | x33 | x33
...
999 | x393939 | x393939
1000 | x31303030 | x31303030
(1000 linee)

Tempu: 50,203 ms

Risultati di test:

 
Nisuna criptografia
Pgcrypto (decifrare)

Sample 1000 fila
1,386 ms
50,203 ms

CPU
15%
35%

RAM
 
+ 5%

A criptografia hà un grande impattu nantu à u rendiment. Pò esse vistu chì u timing hè aumentatu, postu chì l'operazioni di decifrazione di dati criptati (è a decifrazione hè di solitu sempre impannillata in a vostra logica) necessitanu risorse significati. Vale à dì, l'idea di criptà tutte e culonne chì cuntenenu qualchi dati hè piena di una diminuzione di u rendiment.

Tuttavia, a criptografia ùn hè micca una bala d'argentu chì risolve tutti i prublemi. I dati decrypted è a chjave di decryption durante u prucessu di decrypting è di trasmissione di e dati sò situati in u servitore. Dunque, i chjavi ponu esse interceptati da qualchissia chì hà accessu sanu à u servitore di basa di dati, cum'è un amministratore di sistema.

Quandu ci hè una chjave per a colonna sana per tutti l'utilizatori (ancu s'ellu ùn hè micca per tutti, ma per i clienti di un settore limitatu), questu ùn hè micca sempre bonu è currettu. Hè per quessa ch'elli cuminciaru à fà una criptografia end-to-end, in u DBMS cuminciaru à cunsiderà l'opzioni per a criptografia di dati in u latu di u cliente è di u servitore, è quelli stessi magazzini di chjave-vuota apparsu - prudutti separati chì furnisce una gestione di chjave in u DBMS. latu.

Sicurezza è DBMS: ciò chì avete bisognu di ricurdà quandu sceglite e strumenti di sicurezza
Un esempiu di tali criptografia in MongoDB

Funzioni di sicurezza in DBMS cummerciale è open source

Funzioni
Type
Politica di password
Audit
Prutezzione di u codice fonte di prucedure è funzioni
RLS
bez

oraculu
cummerciale
+
+
+
+
+

MsSql
cummerciale
+
+
+
+
+

Jatoba
cummerciale
+
+
+
+
pralongu

PostgreSQL
Free
pralongu
pralongu
-
+
pralongu

MongoDb
Free
-
+
-
-
Disponibile solu in MongoDB Enterprise

A tavula hè luntanu da esse cumpleta, ma a situazione hè questu: in i prudutti cummerciale, i prublemi di sicurità sò stati risolti per un bellu pezzu, in open source, in regula, un tipu di add-ons sò usati per a sicurità, parechje funzioni mancanu. , qualchì volta ci vole à aghjunghje qualcosa. Per esempiu, pulitiche di password - PostgreSQL hà parechje estensioni diverse (1, 2, 3, 4, 5), chì implementanu e pulitiche di password, ma, in my opinion, nimu d'elli copre tutti i bisogni di u segmentu corporativu domesticu.

Cosa da fà sè ùn avete micca ciò chì avete bisognu in ogni locu? Per esempiu, vulete usà un DBMS specificu chì ùn hà micca e funzioni chì u cliente necessita.

Allora pudete aduprà suluzioni di terzu chì travaglianu cù diversi DBMS, per esempiu, Crypto DB o Garda DB. Se parlemu di suluzioni da u segmentu domesticu, allora sanu di GOST megliu cà in open source.

A seconda opzione hè di scrive ciò chì avete bisognu, implementà l'accessu di dati è a criptografia in l'applicazione à u livellu di a prucedura. True, serà più difficiule cù GOST. Ma in generale, pudete ammuccià e dati cum'è necessariu, mette in un DBMS, dopu ricuperà è decriptate cum'è necessariu, ghjustu à u livellu di l'applicazione. À u listessu tempu, pensate immediatamente à cumu prutege questi algoritmi in l'applicazione. In u nostru parè, questu deve esse fattu à u livellu DBMS, perchè travaglià più veloce.

Stu rapportu hè statu prima presentatu à @Databases Meetup da Mail.ru Cloud Solutions. Vede видео altre prestazioni è abbonate à l'annunzii di l'avvenimenti in Telegram Intornu à Kubernetes in Mail.ru Group.

Chì altru à leghje nantu à u tema:

  1. Più di Ceph: MCS cloud block storage.
  2. Cumu sceglie una basa di dati per un prughjettu per ùn avè micca bisognu di sceglie di novu.

Source: www.habr.com

Add a comment