{"id":81884,"date":"2020-05-17T13:42:18","date_gmt":"2020-05-17T11:42:18","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/bezopasnost-i-subd-o-chyom-nado-pomnit-podbiraya-sredstva-zashhity"},"modified":"2020-05-17T13:42:18","modified_gmt":"2020-05-17T11:42:18","slug":"bezopasnost-i-subd-o-chyom-nado-pomnit-podbiraya-sredstva-zashhity","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bezopasnost-i-subd-o-chyom-nado-pomnit-podbiraya-sredstva-zashhity","title":{"rendered":"Bezpiecze\u0144stwo i bazy danych: o czym nale\u017cy pami\u0119ta\u0107, dobieraj\u0105c \u015brodki ochrony","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo i bazy danych: o czym nale\u017cy pami\u0119ta\u0107, dobieraj\u0105c \u015brodki ochrony\" src=\"\/wp-content\/uploads\/2020\/05\/ac49253838e36336af127d71394139d8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/h1>\n<p>\nNazywam si\u0119 Denis Rozhkov, jestem kierownikiem rozwijania oprogramowania w firmie \"Gazinformservice\", w zespole produktu <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gaz-is.ru\/produkty\/inform-sistemy\/subd-jatoba.html\">Jatoba<\/a><\/noindex>. Prawo i normy korporacyjne stawiaj\u0105 okre\u015blone wymagania dotycz\u0105ce bezpiecze\u0144stwa przechowywania danych. Nikt nie chce, aby osoby trzecie mia\u0142y dost\u0119p do poufnych informacji, dlatego w ka\u017cdym projekcie wa\u017cne s\u0105 nast\u0119puj\u0105ce kwestie: identyfikacja i uwierzytelnienie, zarz\u0105dzanie dost\u0119pem do danych, zapewnienie integralno\u015bci informacji w systemie oraz rejestrowanie zdarze\u0144 bezpiecze\u0144stwa. Dlatego chc\u0119 opowiedzie\u0107 o kilku interesuj\u0105cych aspektach dotycz\u0105cych bezpiecze\u0144stwa baz danych. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nArtyku\u0142 przygotowano na podstawie wyst\u0105pienia na <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/databases-1\/\">@Databases Meetup,<\/a><\/noindex> zorganizowanego <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/\">Mail.ru Cloud Solutions<\/a><\/noindex>. Je\u015bli nie chcesz czyta\u0107, mo\u017cesz obejrze\u0107:<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"n-54j9FHaMU\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/n-54j9FHaMU\/hqdefault.jpg\" alt=\"Odtwarzaj wideo\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nW artykule b\u0119d\u0105 trzy cz\u0119\u015bci:<\/p>\n<ul>\n<li>Jak zabezpiecza\u0107 po\u0142\u0105czenia.<\/li>\n<li>Czym jest audyt dzia\u0142a\u0144 i jak rejestrowa\u0107 to, co dzieje si\u0119 po stronie bazy danych i po\u0142\u0105czenia z ni\u0105.<\/li>\n<li>Jak zabezpiecza\u0107 dane w samej bazie danych i jakie technologie s\u0105 do tego dost\u0119pne.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Bezpiecze\u0144stwo i bazy danych: o czym nale\u017cy pami\u0119ta\u0107, dobieraj\u0105c \u015brodki ochrony\" src=\"\/wp-content\/uploads\/2020\/05\/fbdca7f4a925b9ceb78de06c6e245b23.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Trzy komponenty bezpiecze\u0144stwa baz danych: ochrona po\u0142\u0105cze\u0144, audyt dzia\u0142a\u0144 i ochrona danych<\/i><\/p>\n<h2>Ochrona po\u0142\u0105cze\u0144<\/h2>\n<p>\nMo\u017cna \u0142\u0105czy\u0107 si\u0119 z baz\u0105 danych zar\u00f3wno bezpo\u015brednio, jak i po\u015brednio przez aplikacje internetowe. Zazwyczaj u\u017cytkownik ze strony biznesowej, czyli osoba pracuj\u0105ca z baz\u0105 danych, nie wchodzi w bezpo\u015bredni\u0105 interakcj\u0119 z ni\u0105.<\/p>\n<p>Zanim zaczniemy m\u00f3wi\u0107 o ochronie po\u0142\u0105cze\u0144, musimy odpowiedzie\u0107 na wa\u017cne pytania, od kt\u00f3rych zale\u017cy, jak b\u0119d\u0105 budowane dzia\u0142ania zwi\u0105zane z bezpiecze\u0144stwem:<\/p>\n<ul>\n<li>czy jeden u\u017cytkownik biznesowy jest r\u00f3wnowa\u017cny jednemu u\u017cytkownikowi bazy danych;<\/li>\n<li>czy dost\u0119p do danych bazy danych jest zapewniany tylko przez API, kt\u00f3re kontrolujesz, czy te\u017c jest bezpo\u015bredni dost\u0119p do tabel;<\/li>\n<li>czy baza danych znajduje si\u0119 w oddzielnym chronionym segmencie, kto i jak wchodzi z ni\u0105 w interakcj\u0119;<\/li>\n<li>czy wykorzystywany jest pooling\/proxy i warstwy po\u015brednie, kt\u00f3re mog\u0105 zmienia\u0107 informacje o tym, jak zbudowane jest po\u0142\u0105czenie i kto korzysta z bazy danych.<\/li>\n<\/ul>\n<p>\nTeraz przyjrzyjmy si\u0119, jakie narz\u0119dzia mo\u017cna zastosowa\u0107 do ochrony po\u0142\u0105cze\u0144:<\/p>\n<ol>\n<li>Stosuj rozwi\u0105zania klasy firewalla bazy danych. Dodatkowa warstwa ochrony, przynajmniej zwi\u0119kszy przejrzysto\u015b\u0107 tego, co dzieje si\u0119 w bazie danych, maksymalnie \u2014 b\u0119dziesz m\u00f3g\u0142 zapewni\u0107 dodatkow\u0105 ochron\u0119 danych.<\/li>\n<li>U\u017cywaj polityk hase\u0142. Ich zastosowanie zale\u017cy od tego, jak jest zbudowana Twoja architektura. W ka\u017cdym przypadku \u2013 jedno has\u0142o w pliku konfiguracyjnym aplikacji internetowej, kt\u00f3re \u0142\u0105czy si\u0119 z baz\u0105 danych, to za ma\u0142o, aby zapewni\u0107 ochron\u0119. Istnieje szereg narz\u0119dzi dla baz danych, kt\u00f3re pozwalaj\u0105 kontrolowa\u0107, czy u\u017cytkownik i has\u0142o wymagaj\u0105 aktualizacji.\n<p>Wi\u0119cej informacji na temat funkcji oceny u\u017cytkownik\u00f3w mo\u017cna znale\u017a\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.cloud.oracle.com\/en-us\/iaas\/data-safe\/doc\/user-assessment-reports.html\">tutaj<\/a><\/noindex>, a tak\u017ce mo\u017cna dowiedzie\u0107 si\u0119 o MS SQL Vulnerability Assessment <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/relational-databases\/security\/sql-vulnerability-assessment?view=sql-server-ver15\">tutaj<\/a><\/noindex>.\u00a0<\/li>\n<li>Wzbogacaj kontekst sesji o potrzebne informacje. Je\u015bli sesja jest nieprzezroczysta, nie rozumiesz, kto dzia\u0142a w ramach bazy danych, mo\u017cna w ramach wykonywanej operacji doda\u0107 informacje o tym, kto, co i dlaczego robi. Te informacje mo\u017cna zobaczy\u0107 w audycie.<\/li>\n<li>Konfiguruj SSL, je\u015bli nie masz rozdzielenia sieciowego bazy danych od ko\u0144cowych u\u017cytkownik\u00f3w, nie jest ona w osobnym VLAN. W takich przypadkach zawsze nale\u017cy chroni\u0107 kana\u0142 mi\u0119dzy u\u017cytkownikiem a sam\u0105 baz\u0105 danych. Narz\u0119dzia ochrony s\u0105 dost\u0119pne r\u00f3wnie\u017c w open source.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Jak to wp\u0142ynie na wydajno\u015b\u0107 bazy danych?<\/h3>\n<p>\nPrzyjrzymy si\u0119 na przyk\u0142adzie PostgreSQL, jak SSL wp\u0142ywa na obci\u0105\u017cenie CPU, zwi\u0119kszenie op\u00f3\u017anie\u0144 i zmniejszenie TPS, czy nie wykorzysta zbyt wielu zasob\u00f3w po jego w\u0142\u0105czeniu.<\/p>\n<p>Obci\u0105\u017camy PostgreSQL, korzystaj\u0105c z pgbench \u2013 to prosta aplikacja do uruchamiania test\u00f3w wydajno\u015bci. Wiele razy wykonuje sekwencj\u0119 polece\u0144, mo\u017cliwie w r\u00f3wnoleg\u0142ych sesjach bazy danych, a nast\u0119pnie oblicza \u015bredni\u0105 pr\u0119dko\u015b\u0107 transakcji.<\/p>\n<p><strong>Test 1 bez SSL i z u\u017cyciem SSL<\/strong> \u2013 po\u0142\u0105czenie jest nawi\u0105zywane przy ka\u017cdej transakcji:<\/p>\n<pre><code class=\"plaintext\">pgbench.exe --connect -c 10 -t 5000 \"host=192.168.220.129 dbname=taskdb user=postgres sslmode=require\nsslrootcert=rootCA.crt sslcert=client.crt sslkey=client.key\"<\/code><\/pre>\n<p>\n<strong>vs<\/strong><\/p>\n<pre><code class=\"plaintext\">pgbench.exe --connect -c 10 -t 5000 \"host=192.168.220.129 dbname=taskdb user=postgres\"<\/code><\/pre>\n<p>\n<strong>Test 2 bez SSL i z u\u017cyciem SSL<\/strong> \u2013 wszystkie transakcje s\u0105 wykonywane w jednym po\u0142\u0105czeniu:<\/p>\n<pre><code class=\"plaintext\">pgbench.exe -c 10 -t 5000 \"host=192.168.220.129 dbname=taskdb user=postgres sslmode=require\nsslrootcert=rootCA.crt sslcert=client.crt sslkey=client.key\"<\/code><\/pre>\n<p>\n<strong>vs<\/strong><\/p>\n<pre><code class=\"plaintext\">pgbench.exe -c 10 -t 5000 \"host=192.168.220.129 dbname=taskdb user=postgres\"<\/code><\/pre>\n<p>\n<strong>Pozosta\u0142e ustawienia<\/strong>:<\/p>\n<pre><code class=\"plaintext\">wsp\u00f3\u0142czynnik skalowania: 1\ntryb zapyta\u0144: proste\nliczba klient\u00f3w: 10\nliczba w\u0105tk\u00f3w: 1\nliczba transakcji na klienta: 5000\nliczba transakcji faktycznie przetworzonych: 50000\/50000<\/code><\/pre>\n<p>\n<strong>Wyniki testowania<\/strong>:<\/p>\n<p>\u00a0<br \/>\n<strong>BRAK SSL<\/strong><br \/>\n<strong>SSL<\/strong><\/p>\n<p><strong>Po\u0142\u0105czenie jest nawi\u0105zywane przy ka\u017cdej transakcji<\/strong><\/p>\n<p>\u015brednie op\u00f3\u017anienie<br \/>\n171.915 ms<br \/>\n187.695 ms<\/p>\n<p>tps, w tym nawi\u0105zywanie po\u0142\u0105cze\u0144<br \/>\n58.168112<br \/>\n53.278062<\/p>\n<p>tps bez nawi\u0105zywania po\u0142\u0105cze\u0144<br \/>\n64.084546<br \/>\n58.725846<\/p>\n<p>CPU<br \/>\n24%<br \/>\n28%<\/p>\n<p><strong>Wszystkie transakcje s\u0105 wykonywane w jednym po\u0142\u0105czeniu<\/strong><\/p>\n<p>\u015brednie op\u00f3\u017anienie<br \/>\n6.722 ms<br \/>\n6.342 ms<\/p>\n<p>tps, w tym nawi\u0105zywanie po\u0142\u0105cze\u0144<br \/>\n1587.657278<br \/>\n1576.792883<\/p>\n<p>tps bez nawi\u0105zywania po\u0142\u0105cze\u0144<br \/>\n1588.380574<br \/>\n1577.694766<\/p>\n<p>CPU<br \/>\n17%<br \/>\n21%<\/p>\n<p>\nPrzy niewielkich obci\u0105\u017ceniach wp\u0142yw SSL jest por\u00f3wnywalny z b\u0142\u0119dem pomiarowym. Je\u015bli ilo\u015b\u0107 przesy\u0142anych danych jest bardzo du\u017ca, sytuacja mo\u017ce by\u0107 inna. Je\u015bli zestawiamy jedno po\u0142\u0105czenie na ka\u017cd\u0105 transakcj\u0119 (co rzadko si\u0119 zdarza, zwykle po\u0142\u0105czenia s\u0105 dzielone mi\u0119dzy u\u017cytkownik\u00f3w), mamy wiele po\u0142\u0105cze\u0144\/roz\u0142\u0105cze\u0144, wp\u0142yw mo\u017ce by\u0107 nieco wi\u0119kszy. To znaczy, \u017ce ryzyko spadku wydajno\u015bci mo\u017ce wyst\u0119powa\u0107, jednak r\u00f3\u017cnica nie jest na tyle du\u017ca, aby zrezygnowa\u0107 z ochrony.<\/p>\n<p>Zwr\u00f3\u0107 uwag\u0119 \u2014 istnieje znaczna r\u00f3\u017cnica, je\u015bli por\u00f3wnamy tryby pracy: w ramach jednej sesji pracujesz lub w r\u00f3\u017cnych. To jasne: stworzenie ka\u017cdego po\u0142\u0105czenia wymaga zasob\u00f3w.<\/p>\n<p>Mieli\u015bmy przypadek, gdy pod\u0142\u0105czali\u015bmy Zabbix w trybie zaufanym, czyli nie sprawdzali\u015bmy md5, nie by\u0142o potrzeby autoryzacji. Potem klient poprosi\u0142 o w\u0142\u0105czenie trybu autoryzacji md5. To przyczyni\u0142o si\u0119 do du\u017cego obci\u0105\u017cenia CPU, wydajno\u015b\u0107 spad\u0142a. Zacz\u0119li\u015bmy szuka\u0107 sposob\u00f3w optymalizacji. Jednym z mo\u017cliwych rozwi\u0105za\u0144 problemu jest wdro\u017cenie ogranicze\u0144 sieciowych, stworzenie osobnych VLAN dla SGBD, dodanie ustawie\u0144, aby by\u0142o jasne, kto i sk\u0105d si\u0119 \u0142\u0105czy oraz rezygnacja z autoryzacji. Mo\u017cna tak\u017ce zoptymalizowa\u0107 ustawienia autoryzacji, aby zredukowa\u0107 koszty przy w\u0142\u0105czonej autoryzacji, jednak w og\u00f3lnym uj\u0119ciu stosowanie r\u00f3\u017cnych metod autoryzacji wp\u0142ywa na wydajno\u015b\u0107 i nale\u017cy bra\u0107 to pod uwag\u0119 przy projektowaniu mocy obliczeniowych serwer\u00f3w (sprz\u0119tu) dla SGBD.<\/p>\n<p>Wniosek: w niekt\u00f3rych rozwi\u0105zaniach nawet niewielkie niuanse w autoryzacji mog\u0105 mie\u0107 znacz\u0105cy wp\u0142yw na projekt i jest to niekorzystne, gdy staje si\u0119 to jasne dopiero po wdro\u017ceniu do produkcji.<\/p>\n<h2>Audyt dzia\u0142a\u0144<\/h2>\n<p>\nAudyt mo\u017ce dotyczy\u0107 nie tylko SGBD. Audyt to pozyskiwanie informacji o tym, co dzieje si\u0119 w r\u00f3\u017cnych segmentach. Mo\u017ce to by\u0107 zar\u00f3wno zapora baz danych, jak i system operacyjny, na kt\u00f3rym opiera si\u0119 SGBD.<\/p>\n<p>W komercyjnych SGBD klasy Enterprise z audytem wszystko jest w porz\u0105dku, w open source \u2014 nie zawsze. Oto co jest w PostgreSQL:<\/p>\n<ul>\n<li>default log \u2014 wbudowane logowanie;<\/li>\n<li>rozszerzenia: pgaudit \u2014 je\u015bli domy\u015blne logowanie nie wystarcza, mo\u017cna skorzysta\u0107 z dodatkowych ustawie\u0144, kt\u00f3re rozwi\u0105zuj\u0105 cz\u0119\u015b\u0107 problem\u00f3w.<\/li>\n<\/ul>\n<p>\n<b>Dodatkowe informacje do raportu w wideo:<\/b><\/p>\n<p>Podstawowa rejestracja operator\u00f3w mo\u017ce by\u0107 zapewniona standardowym narz\u0119dziem do rejestrowania z log_statement = all.<\/p>\n<p>Jest to akceptowalne do monitorowania i innych rodzaj\u00f3w u\u017cycia, ale nie zapewnia poziomu szczeg\u00f3\u0142owo\u015bci zazwyczaj wymaganego do audytu.<\/p>\n<p>Nie wystarczy mie\u0107 list\u0119 wszystkich operacji wykonywanych na bazie danych.<\/p>\n<p>Powinna by\u0107 tak\u017ce mo\u017cliwo\u015b\u0107 znalezienia konkretnych stwierdze\u0144, kt\u00f3re s\u0105 interesuj\u0105ce dla audytora.<\/p>\n<p>Standardowe narz\u0119dzie do rejestrowania pokazuje to, co za\u017c\u0105da\u0142 u\u017cytkownik, podczas gdy pgAudit skupia si\u0119 na szczeg\u00f3\u0142ach tego, co si\u0119 wydarzy\u0142o, gdy baza danych realizowa\u0142a zapytanie.<\/p>\n<p>Na przyk\u0142ad audytor mo\u017ce chcie\u0107 upewni\u0107 si\u0119, \u017ce konkretna tabela zosta\u0142a utworzona w udokumentowanym oknie serwisowym.<\/p>\n<p>Mo\u017ce si\u0119 to wydawa\u0107 prostym zadaniem do podstawowego audytu i grep\u2019a, ale co, je\u015bli staniecie przed czym\u015b takim (celowo z\u0142o\u017conym) przyk\u0142adem:<\/p>\n<p>DO $$<br \/>\nBEGIN<br \/>\n EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';<br \/>\nKONIEC $$;<\/p>\n<p>Standardowe rejestrowanie da ci to:<\/p>\n<p>LOG:  statement: DO $$<br \/>\nBEGIN<br \/>\n EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';<br \/>\nKONIEC $$;<\/p>\n<p>Wydaje si\u0119, \u017ce zlokalizowanie interesuj\u0105cej tabeli mo\u017ce wymaga\u0107 pewnej wiedzy o kodzie w przypadku, gdy tabele s\u0105 tworzone dynamicznie.<\/p>\n<p>To nie jest idealne, poniewa\u017c lepiej by\u0142oby po prostu szuka\u0107 po nazwie tabeli.<\/p>\n<p>Tu przyda si\u0119 pgAudit.<\/p>\n<p>Dla tego samego wej\u015bcia wygeneruje ten output w logu:<\/p>\n<p>AUDYT: SESSION,33,1,FUNCTION,DO,,,\u2018DO $$<br \/>\nBEGIN<br \/>\n EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';<br \/>\nEND $$;\"<br \/>\nAUDYT: SESSION,33,2,DDL,UTW\u00d3RZ TABEL\u0118,TABELA,public.important_table,UTW\u00d3RZ TABEL\u0118 important_table (id INT)<\/p>\n<p>Rejestrowany jest nie tylko blok DO, ale i pe\u0142en tekst UTW\u00d3RZ TABEL\u0118 z typem operatora, typem obiektu i pe\u0142n\u0105 nazw\u0105, co u\u0142atwia wyszukiwanie.<\/p>\n<p>Podczas rejestrowania operator\u00f3w SELECT i DML pgAudit mo\u017cna skonfigurowa\u0107 do rejestrowania oddzielnego wpisu dla ka\u017cdej relacji, do kt\u00f3rej si\u0119 odnosi w operatorze.<\/p>\n<p>Nie wymaga to analizy sk\u0142adni, aby znale\u017a\u0107 wszystkie operatory, kt\u00f3re dotycz\u0105 konkretnej tabeli (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgaudit\/pgaudit\/blob\/master\/README.md\">*<\/a><\/noindex>)\u00bb.<\/p>\n<h3>Jak to wp\u0142ynie na wydajno\u015b\u0107 bazy danych?<\/h3>\n<p>\nZr\u00f3bmy testy z w\u0142\u0105czonym pe\u0142nym audytem i zobaczmy, jak wp\u0142ynie to na wydajno\u015b\u0107 PostgreSQL. W\u0142\u0105czmy maksymalne rejestrowanie Bazy Danych dla wszystkich parametr\u00f3w.<\/p>\n<p>W pliku konfiguracyjnym prawie nic nie zmieniamy, z wa\u017cnych rzeczy \u2014 w\u0142\u0105czamy tryb debug5, aby uzyska\u0107 maksymaln\u0105 ilo\u015b\u0107 informacji.<\/p>\n<p>postgresql.conf<\/p>\n<p>log_destination = 'stderr'<br \/>\nlogging_collector = on<br \/>\nlog_truncate_on_rotation = on<br \/>\nlog_rotation_age = 1d<br \/>\nlog_rotation_size = 10MB<br \/>\nlog_min_messages = <strong>debug5<\/strong><br \/>\nlog_min_error_statement = <strong>debug5<\/strong><br \/>\nlog_min_duration_statement = 0<br \/>\ndebug_print_parse = on<br \/>\ndebug_print_rewritten = on<br \/>\ndebug_print_plan = on<br \/>\ndebug_pretty_print = w\u0142\u0105czone<br \/>\nlog_checkpoints = w\u0142\u0105czone<br \/>\nlog_connections = w\u0142\u0105czone<br \/>\nlog_disconnections = w\u0142\u0105czone<br \/>\nlog_duration = w\u0142\u0105czone<br \/>\nlog_hostname = w\u0142\u0105czone<br \/>\nlog_lock_waits = w\u0142\u0105czone<br \/>\nlog_replication_commands = w\u0142\u0105czone<br \/>\nlog_temp_files = 0<br \/>\nlog_timezone = 'Europe\/Moscow'<\/p>\n<p>\nNa bazie danych PostgreSQL z parametrami 1 CPU, 2,8 GHz, 2 GB RAM, 40 GB HDD przeprowadzamy trzy testy obci\u0105\u017ceniowe, u\u017cywaj\u0105c polece\u0144:<\/p>\n<pre><code class=\"plaintext\">$ pgbench -p 3389 -U postgres -i -s 150 benchmark\n$ pgbench -p 3389 -U postgres -c 50 -j 2 -P 60 -T 600 benchmark\n$ pgbench -p 3389 -U postgres -c 150 -j 2 -P 60 -T 600 benchmark<\/code><\/pre>\n<p>\n<strong>Wyniki testowania:<\/strong><\/p>\n<p><strong>Bez logowania<\/strong><br \/>\n<strong>Z logowaniem<\/strong><\/p>\n<p>\u0141\u0105czny czas wype\u0142nienia bazy danych<br \/>\n43,74 sek<br \/>\n53,23 sek<\/p>\n<p>RAM<br \/>\n24%<br \/>\n40%<\/p>\n<p>CPU<br \/>\n72%<br \/>\n91%<\/p>\n<p><strong>Test 1 (50 po\u0142\u0105cze\u0144)<\/strong><\/p>\n<p>Liczba transakcji w ci\u0105gu 10 minut<br \/>\n74169<br \/>\n32445<\/p>\n<p>Transakcji\/sek<br \/>\n123<br \/>\n54<\/p>\n<p>\u015arednie op\u00f3\u017anienie<br \/>\n405 ms<br \/>\n925 ms<\/p>\n<p><strong>Test 2 (150 po\u0142\u0105cze\u0144 przy 100 mo\u017cliwych)<\/strong><\/p>\n<p>Liczba transakcji w ci\u0105gu 10 minut<br \/>\n81727<br \/>\n31429<\/p>\n<p>Transakcji\/sek<br \/>\n136<br \/>\n52<\/p>\n<p>\u015arednie op\u00f3\u017anienie<br \/>\n550 ms<br \/>\n1432 ms<\/p>\n<p><strong>O rozmiarach<\/strong><\/p>\n<p>Rozmiar bazy danych<br \/>\n2251 MB<br \/>\n2262 MB<\/p>\n<p>Rozmiar log\u00f3w bazy danych<br \/>\n0 MB<br \/>\n4587 MB<\/p>\n<p>\nW rezultacie: audyt ca\u0142kowity \u2014 to nie jest zbyt dobrze. Volume danych z audytu b\u0119dzie r\u00f3wny lub wi\u0119kszy ni\u017c dane w samej bazie danych. Taki przyrost log\u00f3w, kt\u00f3ry generuje si\u0119 podczas pracy z DBMS, jest powszechnym problemem na produkcji.<\/p>\n<p>Patrzymy na inne parametry:<\/p>\n<ul>\n<li>Pr\u0119dko\u015b\u0107 nie zmienia si\u0119 znacz\u0105co: bez logowania \u2014 43,74 sek, z logowaniem \u2014 53,23 sek.<\/li>\n<li>Wydajno\u015b\u0107 RAM i CPU b\u0119dzie spada\u0107, poniewa\u017c nale\u017cy utworzy\u0107 plik audytowy. To tak\u017ce jest zauwa\u017calne na produkcji.<\/li>\n<\/ul>\n<p>\nPrzy zwi\u0119kszeniu liczby po\u0142\u0105cze\u0144, naturalnie, wyniki b\u0119d\u0105 si\u0119 nieco pogarsza\u0107.<\/p>\n<p>W korporacjach z audytem jest jeszcze trudniej:<\/p>\n<ul>\n<li>jest du\u017co danych;<\/li>\n<li>audyt nie tylko przez syslog w SIEM, ale r\u00f3wnie\u017c w plikach: na wszelki wypadek, je\u015bli co\u015b stanie si\u0119 z syslog, musi by\u0107 blisko bazy skrypt, w kt\u00f3rym zachowaj\u0105 si\u0119 dane;<\/li>\n<li>do audytu potrzebna jest osobna p\u00f3\u0142ka, aby nie obci\u0105\u017ca\u0107 I\/O dysk\u00f3w, poniewa\u017c zajmuje ona du\u017co miejsca;<\/li>\n<li>czasami pracownikom z dzia\u0142u bezpiecze\u0144stwa potrzebne s\u0105 wsz\u0119dzie normy, wymagaj\u0105 identyfikacji wg standard\u00f3w.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Ograniczenie dost\u0119pu do danych<\/h2>\n<p>\nPrzyjrzymy si\u0119 technologiom, kt\u00f3re stosuj\u0105 do ochrony danych i dost\u0119pu do nich w komercyjnych DBMS i open source.<\/p>\n<p>Czego og\u00f3lnie mo\u017cna u\u017cy\u0107:<\/p>\n<ol>\n<li>Szyfrowanie i obfuskacja procedur oraz funkcji (Wrapping) \u2014 czyli osobne narz\u0119dzia i pomoce, kt\u00f3re przekszta\u0142caj\u0105 czytelny kod w nieczytelny. Prawda, p\u00f3\u017aniej nie mo\u017cna go ani zmieni\u0107, ani zrefaktoryzowa\u0107 z powrotem. Takie podej\u015bcie czasami jest wymagane przynajmniej po stronie DBMS \u2014 logika ogranicze\u0144 licencyjnych lub logika autoryzacji jest szyfrowana dok\u0142adnie na poziomie procedur i funkcji.<\/li>\n<li>Ograniczenie widoczno\u015bci danych wierszy (RLS) to sytuacja, w kt\u00f3rej r\u00f3\u017cni u\u017cytkownicy widz\u0105 t\u0119 sam\u0105 tabel\u0119, ale r\u00f3\u017cne wiersze w niej, to znaczy, \u017ce pewnym osobom nie mo\u017cna pokazywa\u0107 niekt\u00f3rych danych na poziomie wierszy.<\/li>\n<li>Edycja wy\u015bwietlanych danych (Masking) to proces, w kt\u00f3rym u\u017cytkownicy w jednej kolumnie tabeli widz\u0105 albo dane, albo same gwiazdki, co oznacza, \u017ce dla niekt\u00f3rych u\u017cytkownik\u00f3w informacje b\u0119d\u0105 zablokowane. Technologia ta okre\u015bla, kt\u00f3re dane s\u0105 dost\u0119pne dla poszczeg\u00f3lnych u\u017cytkownik\u00f3w w zale\u017cno\u015bci od poziomu dost\u0119pu.<\/li>\n<li>Rozgraniczenie dost\u0119pu Security DBA\/Application DBA\/DBA dotyczy g\u0142\u00f3wnie ograniczenia dost\u0119pu do samej bazy danych, co pozwala na oddzielenie pracownik\u00f3w odpowiedzialnych za bezpiecze\u0144stwo od administrator\u00f3w bazy danych i administrator\u00f3w aplikacji. W przypadku technologii open source jest ich niewiele, ale w komercyjnych bazach danych jest ich du\u017co. S\u0105 one potrzebne, gdy wielu u\u017cytkownik\u00f3w ma dost\u0119p do serwer\u00f3w.<\/li>\n<li>Ograniczenie dost\u0119pu do plik\u00f3w na poziomie systemu plik\u00f3w. Mo\u017cna przydziela\u0107 prawa i uprawnienia dost\u0119pu do katalog\u00f3w, aby ka\u017cdy administrator mia\u0142 dost\u0119p tylko do potrzebnych danych.<\/li>\n<li>Dost\u0119p mandatu i oczyszczanie pami\u0119ci to technologie, kt\u00f3re stosuje si\u0119 rzadko.<\/li>\n<li>Szyfrowanie end-to-end w samej bazie danych to szyfrowanie po stronie klienta z zarz\u0105dzaniem kluczami po stronie serwera.<\/li>\n<li>Szyfrowanie danych. Na przyk\u0142ad szyfrowanie kolumnowe \u2014 kiedy u\u017cywasz mechanizmu, kt\u00f3ry szyfruje konkretn\u0105 kolumn\u0119 w bazie danych.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Jak to wp\u0142ywa na wydajno\u015b\u0107 bazy danych?<\/h3>\n<p>\nZobaczmy na przyk\u0142adzie szyfrowania kolumnowego w PostgreSQL. Istnieje tam modu\u0142 pgcrypto, kt\u00f3ry pozwala na przechowywanie wybranych p\u00f3l w postaci zaszyfrowanej. To jest przydatne, gdy tylko niekt\u00f3re dane maj\u0105 warto\u015b\u0107. Aby odczyta\u0107 zaszyfrowane pola, klient przesy\u0142a klucz deszyfruj\u0105cy, serwer odszyfrowuje dane i zwraca je klientowi. Bez klucza nikt nie mo\u017ce zrobi\u0107 nic z va\u0161ymi danymi.<\/p>\n<p><strong>Przeprowadzimy test z pgcrypto.<\/strong>. Stworzymy tabel\u0119 z zaszyfrowanymi danymi i z danymi zwyk\u0142ymi. Poni\u017cej polecenia do tworzenia tabel, a w samej pierwszej linii przydatne polecenie \u2014 utworzenie samego rozszerzenia z rejestracj\u0105 bazy danych:<\/p>\n<pre><code class=\"plaintext\">CREATE EXTENSION pgcrypto;\nCREATE TABLE t1 (id integer, text1 text, text2 text);\nCREATE TABLE t2 (id integer, text1 bytea, text2 bytea);\nINSERT INTO t1 (id, text1, text2)\nVALUES (generate_series(1,10000000), generate_series(1,10000000)::text, generate_series(1,10000000)::text);\nINSERT INTO t2 (id, text1, text2) VALUES (\ngenerate_series(1,10000000),\nencrypt(cast(generate_series(1,10000000) AS text)::bytea, 'key'::bytea, 'bf'),\nencrypt(cast(generate_series(1,10000000) AS text)::bytea, 'key'::bytea, 'bf'));<\/code><\/pre>\n<p>\nSpr\u00f3bujmy nast\u0119pnie wykona\u0107 zapytanie z ka\u017cdej tabeli i przyjrzymy si\u0119 czasom wykonania.<\/p>\n<p><strong>Zapytanie z tabeli bez zastosowania funkcji szyfrowania<\/strong>:<\/p>\n<pre><code class=\"plaintext\">psql -c \"timing\" -c \"select * from t1 limit 1000;\" \"host=192.168.220.129 dbname=taskdb\nuser=postgres sslmode=disable\" &gt; 1.txt<\/code><\/pre>\n<p>\nStoper w\u0142\u0105czony.<\/p>\n<p>\u00a0\u00a0id  | text1 | text2<br \/>\n--------+--------+-<br \/>\n 1 | 1 \u00a0 \u00a0 | 1<br \/>\n 2 | 2 \u00a0 \u00a0 | 2<br \/>\n 3 | 3 \u00a0 \u00a0 | 3<br \/>\n\u2026<br \/>\n997 | 997 \u00a0 | 997<br \/>\n998 | 998 \u00a0 | 998<br \/>\n999 | 999 \u00a0 | 999<br \/>\n1000 | 1000\u00a0 | 1000<br \/>\n(1000 wierszy)<\/p>\n<p>Czas: 1,386 ms<\/p>\n<p><strong>Zapytanie z tabeli z zastosowaniem funkcji szyfrowania:<\/strong><\/p>\n<pre><code class=\"plaintext\">psql -c \"timing\" -c \"select id, decrypt(text1, 'key'::bytea, 'bf'),\ndecrypt(text2, 'key'::bytea, 'bf') from t2 limit 1000;\"\n\"host=192.168.220.129 dbname=taskdb user=postgres sslmode=disable\" &gt; 2.txt<\/code><\/pre>\n<p>\nStoper w\u0142\u0105czony.<\/p>\n<p>\u00a0\u00a0id  |  decrypt   |  decrypt<br \/>\n--------+--------+-------<br \/>\n 1 | x31   | x31<br \/>\n 2 | x32   | x32<br \/>\n 3 | x33 | x33<br \/>\n\u2026<br \/>\n999 | x393939   | x393939<br \/>\n1000 | x31303030 | x31303030<br \/>\n(1000 wierszy)<\/p>\n<p>Czas: 50,203 ms<\/p>\n<p><strong>Wyniki testowania<\/strong>:<\/p>\n<p>\u00a0<br \/>\n<strong>Bez szyfrowania<\/strong><br \/>\n<strong>Pgcrypto (decryption)<\/strong><\/p>\n<p>Zapytanie 1000 wierszy<br \/>\n1,386 ms<br \/>\n50,203 ms<\/p>\n<p>CPU<br \/>\n15%<br \/>\n35%<\/p>\n<p>RAM<br \/>\n\u00a0<br \/>\n+5%<\/p>\n<p>\nSzyfrowanie ma znacz\u0105cy wp\u0142yw na wydajno\u015b\u0107. Wida\u0107, \u017ce czas wzr\u00f3s\u0142, poniewa\u017c operacje deszyfrowania zaszyfrowanych danych (a deszyfrowanie jest zazwyczaj owini\u0119te w twoj\u0105 logik\u0119) wymagaj\u0105 znacznych zasob\u00f3w. Oznacza to, \u017ce pomys\u0142 szyfrowania wszystkich kolumn zawieraj\u0105cych dane mo\u017ce prowadzi\u0107 do spadku wydajno\u015bci.<\/p>\n<p>Jednak szyfrowanie nie jest panaceum, kt\u00f3re rozwi\u0105zuje wszystkie problemy. Odszyfrowane dane i klucz deszyfruj\u0105cy w trakcie deszyfrowania i przesy\u0142ania danych znajduj\u0105 si\u0119 na serwerze. Dlatego klucze mog\u0105 by\u0107 przechwycone przez osob\u0119 maj\u0105c\u0105 pe\u0142ny dost\u0119p do serwera bazy danych, np. przez administratora systemu.<\/p>\n<p>Kiedy dla ca\u0142ej kolumny dla wszystkich u\u017cytkownik\u00f3w jest jeden klucz (nawet je\u015bli nie dla wszystkich, a dla klient\u00f3w ograniczonego zestawu), to nie zawsze jest to dobre i w\u0142a\u015bciwe. Dlatego zacz\u0119to stosowa\u0107 szyfrowanie end-to-end, w systemach DB zacz\u0119to rozwa\u017ca\u0107 opcje szyfrowania danych ze strony klienta i serwera, powsta\u0142y te tak zwane magazyny kluczy \u2014 oddzielne produkty, kt\u00f3re zapewniaj\u0105 zarz\u0105dzanie kluczami po stronie systemu DB.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo i bazy danych: o czym nale\u017cy pami\u0119ta\u0107, dobieraj\u0105c \u015brodki ochrony\" src=\"\/wp-content\/uploads\/2020\/05\/cbaa7b9579a65963518ba3cec6114842.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/security-client-side-encryption\/\"><i>Przyk\u0142ad takiego szyfrowania w MongoDB<\/i><\/a><\/noindex><\/p>\n<h2>\u015arodki bezpiecze\u0144stwa w komercyjnych i open source systemach DB<\/h2>\n<p><\/p>\n<p><strong>Funkcje<\/strong><br \/>\n<strong>Typ<\/strong><br \/>\n<strong>Polityka hase\u0142<\/strong><br \/>\n<strong>Audyt<\/strong><br \/>\n<strong>Ochrona kodu \u017ar\u00f3d\u0142owego procedur i funkcji<\/strong><br \/>\n<strong>RLS<\/strong><br \/>\n<strong>Szyfrowanie<\/strong><\/p>\n<p><strong>Oracle<\/strong><br \/>\nKomercyjna<br \/>\n+<br \/>\n+<br \/>\n+<br \/>\n+<br \/>\n+<\/p>\n<p><strong>MsSql<\/strong><br \/>\nKomercyjna<br \/>\n+<br \/>\n+<br \/>\n+<br \/>\n+<br \/>\n+<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.gaz-is.ru\/produkty\/inform-sistemy\/subd-jatoba.html\"><strong>Jatoba<\/strong><\/a><\/noindex><br \/>\nKomercyjna<br \/>\n+<br \/>\n+<br \/>\n+<br \/>\n+<br \/>\nrozszerzenia<\/p>\n<p><strong>PostgreSQL<\/strong><br \/>\nDarmowe<br \/>\nrozszerzenia<br \/>\nrozszerzenia<br \/>\n\u2014<br \/>\n+<br \/>\nrozszerzenia<\/p>\n<p><strong>MongoDb<\/strong><br \/>\nDarmowe<br \/>\n\u2014<br \/>\n+<br \/>\n\u2014<br \/>\n\u2014<br \/>\nDost\u0119pne tylko w MongoDB Enterprise<\/p>\n<p>\nTabela nie jest pe\u0142na, ale sytuacja jest taka: w produktach komercyjnych problemy bezpiecze\u0144stwa s\u0105 rozwi\u0105zane od dawna, w open source zwykle korzysta si\u0119 z r\u00f3\u017cnego rodzaju nadbud\u00f3w, brakuje wielu funkcji, czasem trzeba co\u015b dopisa\u0107. Na przyk\u0142ad polityki hase\u0142 \u2014 w PostgreSQL jest wiele r\u00f3\u017cnych rozszerze\u0144.<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/postgres\/postgres\/tree\/master\/contrib\/passwordcheck\">1<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ykrysko\/passwordcheck\">2<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/michaelpq\/pg_plugins\/tree\/master\/passwordcheck_extra\">3<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devrimgunduz\/passwordcheck_cracklib\">4<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/asio\/password\">5<\/a><\/noindex>), kt\u00f3re wdra\u017caj\u0105 polityki hase\u0142, ale wszystkie potrzeby krajowego segmentu korporacyjnego, moim zdaniem, \u017cadna z nich nie spe\u0142nia.<\/p>\n<p><strong>Co zrobi\u0107, je\u015bli nigdzie nie ma tego, czego potrzebujesz<\/strong>? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0421\u0423\u0411\u0414, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a.<\/p>\n<p>W takim razie mo\u017cna u\u017cy\u0107 zewn\u0119trznych rozwi\u0105za\u0144, kt\u00f3re wsp\u00f3\u0142pracuj\u0105 z r\u00f3\u017cnymi DBMS, na przyk\u0142ad \u201eKrypto Baza\u201d lub \u201eGarda Baza\u201d. Je\u015bli mowa o rozwi\u0105zaniach z krajowego segmentu, to tam znaj\u0105 GOSTy lepiej ni\u017c w open source.<\/p>\n<p>Drug\u0105 opcj\u0105 jest samodzielne napisanie tego, czego potrzebujesz, wdro\u017cenie na poziomie procedur dost\u0119pu do danych i szyfrowania w aplikacji. Prawda, GOST b\u0119dzie trudniejszy. Ale og\u00f3lnie \u2014 mo\u017cesz ukry\u0107 dane, jak chcesz, umie\u015bci\u0107 w DBMS, a potem je wyci\u0105gn\u0105\u0107 i odszyfrowa\u0107, jak chcesz, bezpo\u015brednio na poziomie aplikacji. Przy tym od razu pomy\u015bl, jak b\u0119dziesz chroni\u0107 te algorytmy na poziomie aplikacji. Naszym zdaniem, powinno si\u0119 to robi\u0107 na poziomie DBMS, poniewa\u017c wtedy b\u0119dzie dzia\u0142a\u0107 szybciej.<\/p>\n<p>Ta prezentacja pierwszy raz zosta\u0142a zaprezentowana na <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/databases-1\/\">@Databases Meetup<\/a><\/noindex> by Mail.ru Cloud Solutions. Zobacz<noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/redirect?q=https%3A%2F%2Fbit.ly%2F2U57FAd&amp;redir_token=XNWSBN1AKQA2sjhdReDAv6VnkOV8MTU4OTAxNjMwMEAxNTg4OTI5OTAw&amp;v=wigSv2_zWBU&amp;event=video_description\"> wideo <\/a><\/noindex>inne prezentacje i subskrybuj zapowiedzi wydarze\u0144 w Telegramie <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/k8s_mail\">Wok\u00f3\u0142 Kubernetes w Mail.ru Group<\/a><\/noindex>.<\/p>\n<p><strong>Co jeszcze przeczyta\u0107 na ten temat<\/strong>:<\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/472694\/\">Wi\u0119cej ni\u017c Ceph: blokowe przechowywanie w chmurze MCS<\/a><\/noindex>.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/blog\/kakuyu-bazu-dannyh-vybrat-dlya-proekta-chtoby-ne-oshibitsya\">Jak wybra\u0107 baz\u0119 danych dla projektu, aby nie wybiera\u0107 ponownie<\/a><\/noindex>.<\/li>\n<\/ol>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/500708\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0435\u043d\u0438\u0441 \u0420\u043e\u0436\u043a\u043e\u0432, \u044f \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u041f\u041e \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u00ab\u0413\u0430\u0437\u0438\u043d\u0444\u043e\u0440\u043c\u0441\u0435\u0440\u0432\u0438\u0441\u00bb, \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 Jatoba. \u0417\u0430\u043a\u043e\u043d\u043e\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0438 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043d\u043e\u0440\u043c\u044b \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0438\u043a\u0442\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u0442\u0440\u0435\u0442\u044c\u0438 \u043b\u0438\u0446\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u0430\u0436\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b: \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430\u043c\u0438 \u043a \u0434\u0430\u043d\u043d\u044b\u043c, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":81885,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-81884","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0435\u043d\u0438\u0441.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bezopasnost-i-subd-o-chyom-nado-pomnit-podbiraya-sredstva-zashhity\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0438 \u0421\u0423\u0411\u0414: \u043e \u0447\u0451\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u044f \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0437\u0430\u0449\u0438\u0442\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0435\u043d\u0438\u0441.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bezopasnost-i-subd-o-chyom-nado-pomnit-podbiraya-sredstva-zashhity\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-17T11:42:18+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-17T11:42:18+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Bezpiecze\u0144stwo i DBMS: o czym nale\u017cy pami\u0119ta\u0107, dobieraj\u0105c \u015brodki ochrony | ProHoster","description":"Nazywam si\u0119 Denis.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bezopasnost-i-subd-o-chyom-nado-pomnit-podbiraya-sredstva-zashhity","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0438 \u0421\u0423\u0411\u0414: \u043e \u0447\u0451\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u044f \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0437\u0430\u0449\u0438\u0442\u044b | ProHoster","og:description":"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0435\u043d\u0438\u0441.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bezopasnost-i-subd-o-chyom-nado-pomnit-podbiraya-sredstva-zashhity","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-17T11:42:18+00:00","article:modified_time":"2020-05-17T11:42:18+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"81884","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 15:48:24","updated":"2022-10-05 02:01:28","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/81884","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=81884"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/81884\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/81885"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=81884"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=81884"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=81884"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}