ProHoster > блог > Администрација > Безбедност и DBMS: што треба да запомните при изборот на безбедносни алатки
Безбедност и DBMS: што треба да запомните при изборот на безбедносни алатки
Јас се викам Денис Рожков, раководител сум за развој на софтвер во компанијата Газинформсервис, во тимот на производи Јатоба. Законодавството и корпоративните регулативи наметнуваат одредени барања за безбедноста на складирањето податоци. Никој не сака трети страни да добијат пристап до доверливи информации, затоа следниве прашања се важни за секој проект: идентификација и автентикација, управување со пристапот до податоците, обезбедување на интегритетот на информациите во системот, евиденција на безбедносни настани. Затоа, сакам да зборувам за некои интересни точки во врска со безбедноста на DBMS.
Статијата е подготвена врз основа на говор во @DatabasesMeetup, организирано Mail.ru Cloud Solutions. Доколку не сакате да читате, можете да гледате:
Статијата ќе има три дела:
Како да ги обезбедите врските.
Што е ревизија на акции и како да се евидентира што се случува на страната на базата на податоци и да се поврзе со неа.
Како да се заштитат податоците во самата база на податоци и кои технологии се достапни за ова.
Три компоненти на безбедноста на DBMS: заштита на конекцијата, ревизија на активности и заштита на податоци
Обезбедување на вашите врски
Можете да се поврзете со базата на податоци директно или индиректно преку веб-апликации. По правило, деловниот корисник, односно лицето кое работи со DBMS, индиректно комуницира со него.
Пред да зборувате за заштита на врските, треба да одговорите на важни прашања кои одредуваат како ќе бидат структурирани безбедносните мерки:
Дали еден деловен корисник е еквивалентен на еден корисник на DBMS?
дали пристапот до податоците на DBMS е обезбеден само преку API што вие го контролирате или дали до табелите се пристапува директно;
дали DBMS е доделен на посебен заштитен сегмент, кој и како комуницира со него;
дали се користат здружени/прокси и средни слоеви, што може да ги промени информациите за тоа како е изградена врската и кој ја користи базата на податоци.
Сега да видиме кои алатки може да се користат за да се обезбедат врски:
Користете решенија за класа за заштитен ѕид на базата на податоци. Дополнителен слој на заштита, во најмала рака, ќе ја зголеми транспарентноста на она што се случува во DBMS, а максимално ќе можете да обезбедите дополнителна заштита на податоците.
Користете политики за лозинка. Нивната употреба зависи од тоа како е изградена вашата архитектура. Во секој случај, една лозинка во конфигурациската датотека на веб апликација која се поврзува со DBMS не е доволна за заштита. Постојат голем број на алатки за DBMS кои ви дозволуваат да контролирате дали корисникот и лозинката бараат ажурирање.
Можете да прочитате повеќе за функциите за оценување на корисниците тука, можете да дознаете и за MS SQL Vulnerability Assessmen тука.
Збогатете го контекстот на сесијата со потребните информации. Ако сесијата е непроѕирна, не разбирате кој работи во DBMS во нејзините рамки, можете, во рамките на операцијата што се изведува, да додадете информации за тоа кој што прави и зошто. Оваа информација може да се види во ревизијата.
Конфигурирајте SSL ако немате мрежна поделба помеѓу DBMS и крајните корисници; тој не е во посебен VLAN. Во такви случаи, императив е да се заштити каналот помеѓу потрошувачот и самиот DBMS. Безбедносните алатки се исто така достапни во отворен код.
Како ова ќе влијае на перформансите на DBMS?
Ајде да го погледнеме примерот на PostgreSQL за да видиме како SSL влијае на оптоварувањето на процесорот, ги зголемува тајмингот и го намалува TPS и дали ќе потроши премногу ресурси ако го овозможите.
Вчитувањето на PostgreSQL со помош на pgbench е едноставна програма за извршување на тестови за перформанси. Извршува единечна секвенца на команди постојано, можеби во паралелни сесии на базата на податоци, а потоа ја пресметува просечната стапка на трансакција.
Тест 1 без SSL и користење SSL — врската е воспоставена за секоја трансакција:
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
Резултати од тестот:
НЕМА SSL SSL
Се воспоставува врска за секоја трансакција
просек на латентност
171.915 ms
187.695 ms
tps вклучувајќи воспоставување врски
58.168112
53.278062
tps со исклучок на воспоставување врски
64.084546
58.725846
Процесорот
24%
28%
Сите трансакции се вршат во една врска
просек на латентност
6.722 ms
6.342 ms
tps вклучувајќи воспоставување врски
1587.657278
1576.792883
tps со исклучок на воспоставување врски
1588.380574
1577.694766
Процесорот
17%
21%
При мали оптоварувања, влијанието на SSL е споредливо со грешката во мерењето. Ако количината на пренесените податоци е многу голема, ситуацијата може да биде поинаква. Ако воспоставиме една врска по трансакција (ова е ретко, обично врската се споделува помеѓу корисниците), имате голем број на врски/исклучувања, влијанието може да биде малку поголемо. Односно, може да има ризици од намалени перформанси, но разликата не е толку голема за да не се користи заштита.
Имајте предвид дека постои голема разлика ако ги споредите режимите на работа: работите во иста сесија или на различни. Ова е разбирливо: ресурсите се трошат за создавање на секоја врска.
Имавме случај кога го поврзавме Zabbix во trust mode, односно md5 не беше проверен, немаше потреба од автентикација. Потоа клиентот побара да го овозможи режимот за автентикација md5. Ова стави големо оптоварување на процесорот и перформансите паднаа. Почнавме да бараме начини за оптимизирање. Едно од можните решенија за проблемот е да се имплементираат мрежни ограничувања, да се направат посебни VLAN за DBMS, да се додадат поставки за да се разјасни кој од каде се поврзува и да се отстрани автентикацијата. општо, употребата на различни методи за автентикација влијае на перформансите и бара да се земат предвид овие фактори при дизајнирање на компјутерската моќ на серверите (хардверот) за DBMS.
Заклучок: во голем број решенија, дури и малите нијанси во автентикацијата можат многу да влијаат на проектот и лошо е кога тоа станува јасно само кога се имплементира во производството.
Акциска ревизија
Ревизијата може да биде не само DBMS. Ревизијата е за добивање информации за тоа што се случува во различни сегменти. Ова може да биде или заштитен ѕид на базата на податоци или оперативен систем на кој е изграден DBMS.
Во комерцијалните DBMS на ниво на претпријатија сè е во ред со ревизијата, но во отворен код - не секогаш. Еве што има PostgreSQL:
стандардно најавување - вградено најавување;
екстензии: pgaudit - ако стандардното евидентирање не е доволно за вас, можете да користите посебни поставки кои решаваат некои проблеми.
Дополнување на извештајот во видеото:
„Основното евидентирање на искази може да биде обезбедено од стандарден објект за евидентирање со log_statement = сите.
Ова е прифатливо за мониторинг и други намени, но не го обезбедува нивото на детали што обично се потребни за ревизија.
Не е доволно да се има листа на сите операции извршени во базата на податоци.
Исто така, треба да биде можно да се најдат конкретни изјави кои се од интерес за ревизорот.
Стандардно логирање покажува што бара корисникот, додека pgAudit се фокусира на деталите за тоа што се случило кога базата на податоци го извршила барањето.
На пример, ревизорот можеби ќе сака да потврди дека одредена табела е креирана во документиран прозорец за одржување.
Ова може да изгледа како едноставна задача со основна ревизија и grep, но што ако ви се претстави нешто како овој (намерно збунувачки) пример:
DO$$
ПОЧНЕТЕ
ИЗВРШЕТЕ „КРЕИРАЈ ТАБЕЛА увоз“ || 'ant_table (id int)';
КРАЈ $$;
Стандардна логирање ќе ви го даде ова:
LOG: изјава: НАПРАВИ $$
ПОЧНЕТЕ
ИЗВРШЕТЕ „КРЕИРАЈ ТАБЕЛА увоз“ || 'ant_table (id int)';
КРАЈ $$;
Се чини дека наоѓањето на табела од интерес може да бара одредено знаење за кодот во случаи кога табелите се креираат динамички.
Ова не е идеално, бидејќи би било подобро едноставно да се пребарува по име на табелата.
Ова е местото каде што pgAudit ни доаѓа.
За истиот влез, ќе го произведе овој излез во дневникот:
РЕВИЗИЈА: СЕСИЈА,33,1,ФУНКЦИЈА,ПРАВИ,,,"ПРАВИ $$
ПОЧНЕТЕ
ИЗВРШЕТЕ „КРЕИРАЈ ТАБЕЛА увоз“ || 'ant_table (id int)';
КРАЈ $$;"
РЕВИЗИЈА: SESSION,33,2,DDL,CREATE TABLE,TABLE,public.important_table,CREATE TABLE important_table (id INT)
Не само блокот DO е евидентиран, туку и целосниот текст на CREATE TABLE со тип на изјава, тип на објект и целосно име, што го олеснува пребарувањето.
При евидентирање на изјавите SELECT и DML, pgAudit може да се конфигурира да евидентира посебен запис за секоја врска наведена во изјавата.
Не е потребно парсирање за да се најдат сите искази што допираат одредена табела(*) ».
Како ова ќе влијае на перформансите на DBMS?
Ајде да извршиме тестови со овозможена целосна ревизија и да видиме што ќе се случи со перформансите на PostgreSQL. Ајде да овозможиме максимално евидентирање на базата на податоци за сите параметри.
Не менуваме речиси ништо во конфигурациската датотека, најважно е да го вклучите режимот debug5 за да добиете максимални информации.
Вкупно време за полнење на базата на податоци
43,74 сек
53,23 сек
RAM меморија
24%
40%
Процесорот
72%
91%
Тест 1 (50 врски)
Број на трансакции за 10 минути
74169
32445
Трансакции/сек
123
54
Просечна латентност
405 ms
925 ms
Тест 2 (150 врски со 100 можни)
Број на трансакции за 10 минути
81727
31429
Трансакции/сек
136
52
Просечна латентност
550 ms
1432 ms
За големини
Големина на DB
2251 MB
2262 MB
Големина на дневникот на базата на податоци
0 MB
4587 MB
Крајна линија: целосната ревизија не е многу добра. Податоците од ревизијата ќе бидат големи колку податоците во самата база на податоци, па дури и повеќе. Количината на логирање што се генерира при работа со DBMS е чест проблем во производството.
Ајде да погледнеме во други параметри:
Брзината не се менува многу: без логирање - 43,74 секунди, со логирање - 53,23 секунди.
Перформансите на RAM и процесорот ќе страдаат, бидејќи треба да генерирате ревизорска датотека. Ова е забележливо и во продуктивноста.
Како што се зголемува бројот на врски, нормално, перформансите малку ќе се влошат.
Во корпорациите со ревизија е уште потешко:
има многу податоци;
ревизијата е потребна не само преку syslog во SIEM, туку и во датотеки: ако нешто се случи со syslog, мора да има датотека блиску до базата на податоци во која се зачувуваат податоците;
Потребна е посебна полица за ревизија за да не се трошат I/O дисковите, бидејќи зазема многу простор;
Се случува на вработените во информациската безбедност да им требаат стандарди ГОСТ насекаде, тие бараат државна идентификација.
Ограничување на пристапот до податоци
Да ги погледнеме технологиите што се користат за заштита на податоците и пристап до нив во комерцијални DBMS и со отворен код.
Што генерално можете да користите:
Шифрирање и замаглување на процедури и функции (Wrapping) - односно, одделни алатки и алатки што го прават читливиот код нечитлив. Точно, тогаш тоа не може ниту да се промени ниту да се рефакторира назад. Овој пристап понекогаш е потребен барем на страната на DBMS - логиката на ограничувањата на лиценцата или логиката на авторизација е шифрирана токму на ниво на процедура и функција.
Ограничувањето на видливоста на податоците по редови (RLS) е кога различни корисници гледаат една табела, но различен состав на редови во неа, односно нешто не може да се прикаже некому на ниво на ред.
Уредувањето на прикажаните податоци (маскирање) е кога корисниците во една колона од табелата гледаат или податоци или само ѕвездички, односно за некои корисници информациите ќе бидат затворени. Технологијата одредува на кој корисник што му се прикажува врз основа на нивото на пристап.
Безбедност DBA/Application Контролата на пристап DBA/DBA е, напротив, за ограничување на пристапот до самиот DBMS, односно, вработените во безбедноста на информациите можат да се одвојат од администраторите на базата на податоци и администраторите на апликациите. Има неколку такви технологии во отворен код, но ги има многу во комерцијалните DBMS. Тие се потребни кога има многу корисници со пристап до самите сервери.
Ограничување на пристапот до датотеки на ниво на датотечен систем. Можете да давате права и привилегии за пристап до директориумите, така што секој администратор има пристап само до потребните податоци.
Задолжителен пристап и чистење на меморијата - овие технологии ретко се користат.
Шифрирањето од крај до крај директно од DBMS е шифрирање од страна на клиентот со управување со клучеви на страната на серверот.
Шифрирање на податоци. На пример, колонообразно шифрирање е кога користите механизам кој шифрира една колона од базата на податоци.
Како ова влијае на перформансите на DBMS?
Да го погледнеме примерот на колонообразно шифрирање во PostgreSQL. Постои pgcrypto модул, тој ви овозможува да ги зачувате избраните полиња во шифрирана форма. Ова е корисно кога само некои податоци се вредни. За да ги прочита шифрираните полиња, клиентот пренесува клуч за дешифрирање, серверот ги дешифрира податоците и ги враќа на клиентот. Без клучот, никој не може да направи ништо со вашите податоци.
Ајде да тестираме со pgcrypto. Ајде да создадеме табела со шифрирани податоци и редовни податоци. Подолу се наредбите за креирање табели, во првата линија има корисна команда - креирање на самата екстензија со регистрација на 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'));
Следно, ајде да се обидеме да направиме примерок на податоци од секоја табела и да ги погледнеме тајмингот на извршување.
Енкрипцијата има големо влијание врз перформансите. Може да се види дека времето е зголемено, бидејќи операциите за дешифрирање на шифрирани податоци (а дешифрирањето обично сè уште е обвиткано во вашата логика) бараат значителни ресурси. Односно, идејата за шифрирање на сите колони што содржат некои податоци е полн со намалување на перформансите.
Сепак, шифрирањето не е сребрена куршума што ги решава сите проблеми. Дешифрираните податоци и клучот за дешифрирање за време на процесот на дешифрирање и пренос на податоците се наоѓаат на серверот. Затоа, клучевите може да бидат пресретнати од некој кој има целосен пристап до серверот на базата на податоци, како што е системскиот администратор.
Кога има едно копче за целата колона за сите корисници (дури и ако не за сите, туку за клиенти од ограничен сет), тоа не е секогаш добро и точно. Затоа почнаа да прават шифрирање од крај до крај, во DBMS почнаа да разгледуваат опции за шифрирање податоци на страната на клиентот и серверот, а се појавија истите тие складишта во сводот на клучеви - посебни производи кои обезбедуваат управување со клучеви на DBMS страна.
МонгоДб
слободен
-
+
-
-
Достапно само во MongoDB Enterprise
Табелата е далеку од комплетна, но ситуацијата е следна: во комерцијалните производи, безбедносните проблеми се решени долго време, во отворен код, како по правило, се користат некакви додатоци за безбедност, недостасуваат многу функции. , понекогаш треба да додадете нешто. На пример, политики за лозинка - PostgreSQL има многу различни екстензии (1, 2, 3, 4, 5), кои имплементираат политики за лозинка, но, според мене, ниту една од нив не ги покрива сите потреби на домашниот корпоративен сегмент.
Што да направите ако никаде го немате она што ви треба? На пример, сакате да користите специфичен DBMS што ги нема функциите што ги бара клиентот.
Потоа можете да користите решенија од трети страни кои работат со различни DBMS, на пример, Crypto DB или Garda DB. Ако зборуваме за решенија од домашниот сегмент, тогаш тие знаат за ГОСТ подобро отколку во отворен код.
Втората опција е сами да напишете што ви треба, да имплементирате пристап до податоци и шифрирање во апликацијата на ниво на процедура. Точно, ќе биде потешко со ГОСТ. Но, генерално, можете да ги скриете податоците по потреба, да ги ставите во DBMS, потоа да ги вратите и да ги дешифрирате по потреба, токму на ниво на апликација. Во исто време, веднаш размислете како ќе ги заштитите овие алгоритми во апликацијата. Според нас, ова треба да се направи на ниво на DBMS, бидејќи ќе работи побрзо.