sql >> Databáze >  >> RDS >> PostgreSQL

Jak zabezpečit databázi PostgreSQL – 10 tipů

Jakmile dokončíte proces instalace vašeho databázového serveru PostgreSQL, je nutné jej před uvedením do výroby chránit. V tomto příspěvku vám ukážeme, jak posílit zabezpečení vaší databáze, aby byla vaše data v bezpečí.

1. Řízení autentizace klienta

Při instalaci PostgreSQL se v datovém adresáři databázového clusteru vytvoří soubor s názvem pg_hba.conf. Tento soubor řídí ověřování klienta.

Z oficiální dokumentace postgresql můžeme definovat soubor pg_hba.conf jako sadu záznamů, jeden na řádek, kde každý záznam specifikuje typ připojení, rozsah IP adres klienta (pokud je to relevantní pro typ připojení), název databáze, a uživatelské jméno a metoda ověřování, která se má použít pro připojení vyhovující těmto parametrům. První záznam se shodným typem připojení, adresou klienta, požadovanou databází a uživatelským jménem se používá k ověření.

Takže obecný formát bude asi tento:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

Příklad konfigurace může být následující:

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

Existuje mnoho kombinací, kterými můžete pravidla upřesnit (oficiální dokumentace podrobně popisuje každou možnost a obsahuje několik skvělých příkladů), ale nezapomeňte se vyhnout pravidlům, která jsou příliš tolerantní, jako je povolení přístupu pro linky pomocí DATABASE all nebo ADDRESS 0.0.0.0/0.

Pro zajištění bezpečnosti, i když zapomenete přidat pravidlo, můžete přidat následující řádek dole:

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

Protože se soubor čte shora dolů, aby se nalezla odpovídající pravidla, tímto způsobem zajistíte, že pro povolení oprávnění budete muset explicitně přidat výše uvedené pravidlo shody.

2. Konfigurace serveru

Na postgresql.conf jsou některé parametry, které můžeme upravit, abychom zvýšili zabezpečení.

Pomocí parametru listen_address můžete řídit, které ips se budou moci připojit k serveru. Zde je dobrým zvykem povolit připojení pouze ze známých IP adres nebo vaší sítě a vyhnout se obecným hodnotám jako „*“, 0.0.0.0:0 nebo „::“, které PostgreSQL sdělí, aby akceptoval připojení z jakékoli IP adresy.

Možností je také změna portu, na kterém bude postgresql naslouchat (ve výchozím nastavení 5432). To lze provést úpravou hodnoty parametru port.

Parametry jako work_mem, maintenance_work_mem, temp_buffer , max_prepared_transactions, temp_file_limit je důležité mít na paměti v případě, že máte útok typu denial of service. Toto jsou parametry příkazu/relace, které lze nastavit na různých úrovních (db, uživatel, relace), takže jejich rozumná správa nám může pomoci minimalizovat dopad útoku.

3. Správa uživatelů a rolí

Zlatým pravidlem pro bezpečnost týkající se správy uživatelů je poskytnout uživatelům minimální množství přístupu, které potřebují.

Zvládnout to není vždy snadné a může to být opravdu zamotané, pokud se to od začátku nedělá dobře.

Dobrým způsobem, jak mít oprávnění pod kontrolou, je používat strategii role, skupiny a uživatele.

V postgresql je vše považováno za roli, ale uděláme v tom nějaké změny.

V této strategii vytvoříte tři různé typy nebo role:

  • role (označená předponou r_)
  • skupinová role (označená předponou g_)
  • uživatelská role (obecně osobní jména nebo jména aplikací)

Role (r_ role) budou ty, které mají oprávnění k objektům. Skupinové role ( g_ role ) budou přiděleny s r_ rolemi , takže se bude jednat o kolekci r_ rolí. A konečně, uživatelským rolím bude přidělena jedna nebo více skupinových rolí a budou to ty, které budou mít oprávnění k přihlášení.

Ukažme si to na příkladu. Vytvoříme skupinu pouze pro čtení pro example_schema a poté ji udělíme uživateli:

Vytvoříme roli pouze pro čtení a udělíme jí oprávnění k objektu

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

Vytvoříme skupinu pouze pro čtení a této skupině udělíme roli

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

Vytvoříme roli app_user a zajistíme, aby se „připojila“ ke skupině pouze pro čtení

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

Pomocí této metody můžete spravovat granularitu oprávnění a můžete snadno udělovat a odebírat skupinám přístup k uživatelům. Nezapomeňte udělit oprávnění k objektům pouze rolím namísto toho, abyste to dělali přímo pro uživatele, a udělte oprávnění k přihlášení pouze uživatelům.

Toto je dobrá praxe, jak explicitně zrušit veřejná oprávnění k objektům, jako je zrušit veřejný přístup ke konkrétní databázi a udělit jej pouze prostřednictvím role.

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

Omezit přístup SUPERUSER, povolit připojení superuživatele pouze z domény localhost/unix.

Použijte konkrétní uživatele pro různé účely, jako jsou konkrétní uživatelé aplikací nebo uživatelé zálohování, a omezte připojení pro tohoto uživatele pouze z požadovaných IP adres.

4. Správa superuživatelů

Udržování zásad silných hesel je nutností pro udržení vašich databází v bezpečí a předcházení hackování hesel. Pro silné zásady používejte přednostně speciální znaky, čísla, velká a malá písmena a musí mít alespoň 10 znaků.

Existují také externí nástroje pro ověřování, jako je LDAP nebo PAM, které vám mohou pomoci zajistit vypršení platnosti hesla a zásady opětovného použití a také zvládnout zamykání účtu při chybách ověřování.

5. Šifrování dat (při připojení ssl)

PostgreSQL má nativní podporu pro použití připojení SSL k šifrování komunikace klient/server pro zvýšení bezpečnosti. SSL (Secure Sockets Layer) je standardní bezpečnostní technologie pro vytvoření šifrovaného spojení mezi webovým serverem a prohlížečem. Tento odkaz zajišťuje, že všechna data předávaná mezi webovým serverem a prohlížeči zůstanou soukromá a integrální.

Vzhledem k tomu, že klienti postgresql odesílají dotazy v prostém textu a data jsou také odesílána nešifrovaná, jsou zranitelná vůči síťovému spoofingu.

SSL můžete povolit nastavením parametru ssl na on v postgresql.conf.

Server bude naslouchat normálním i SSL připojením na stejném TCP portu a bude vyjednávat s jakýmkoli připojujícím se klientem, zda použít SSL. Ve výchozím nastavení je to na volbě klienta, ale máte možnost nastavit server tak, aby vyžadoval použití SSL pro některá nebo všechna připojení pomocí výše popsaného konfiguračního souboru pg_hba.

6. Šifrování dat v klidu (pg_crypto)

Existují dva základní druhy šifrování, jednosměrné a dvousměrné. V jednom směru se nikdy nestaráte o dešifrování dat do čitelné podoby, ale chcete si jen ověřit, že uživatel ví, jaký je skrytý tajný text. To se běžně používá pro hesla. Dvousměrným šifrováním chcete mít možnost šifrovat data a zároveň umožnit oprávněným uživatelům je dešifrovat do smysluplné podoby. Do této kategorie spadají údaje, jako jsou kreditní karty a SSN.

Pro jednosměrné šifrování poskytuje funkce crypt zabalená v pgcrypto přidanou úroveň zabezpečení nad způsob md5. Důvodem je, že s md5 můžete zjistit, kdo má stejné heslo, protože neexistuje sůl (V kryptografii je sůl náhodná data, která se používají jako další vstup do jednosměrné funkce, která „hašuje“ data, heslo nebo passphrase), takže všichni lidé se stejným heslem budou mít stejný zakódovaný řetězec md5. S kryptem budou jiné.

U dat, na jejichž získávání vám záleží, nechcete vědět, zda jsou tyto dvě informace stejné, ale tyto informace neznáte a chcete, aby je mohli získat pouze oprávnění uživatelé. Pgcrypto poskytuje několik způsobů, jak toho dosáhnout, takže pro další čtení o tom, jak jej používat, se můžete podívat na oficiální dokumentaci postgresql na https://www.postgresql.org/docs/current/static/pgcrypto.html.

7. Logování

Postgresql poskytuje širokou škálu konfiguračních parametrů pro řízení toho, co, kdy a kam se má protokolovat.

Můžete povolit připojení/odpojení relace, dlouhotrvající dotazy, velikosti dočasných souborů a tak dále. To vám může pomoci lépe poznat vaši pracovní zátěž, abyste mohli identifikovat zvláštní chování. Všechny možnosti přihlášení můžete získat na následujícím odkazu https://www.postgresql.org/docs/9.6/static/runtime-config-logging.html

Chcete-li získat podrobnější informace o své pracovní zátěži, můžete povolit modul pg_stat_statements, který poskytuje prostředky pro sledování statistik provádění všech příkazů SQL prováděných serverem. Existují některé bezpečnostní nástroje, které dokážou zpracovat data z této tabulky a vygenerovat sql whitelist, aby vám pomohly identifikovat dotazy, které se neřídí očekávanými vzory.

Pro více informací https://www.postgresql.org/docs/9.6/static/pgstatstatements.html.

Stáhněte si Whitepaper Today Správa a automatizace PostgreSQL s ClusterControlZjistěte, co potřebujete vědět k nasazení, monitorování, správě a škálování PostgreSQLStáhněte si Whitepaper

8. Audit

Rozšíření PostgreSQL Audit Extension (pgAudit) poskytuje podrobné protokolování auditu relace a/nebo objektu prostřednictvím standardního protokolovacího zařízení PostgreSQL.

Základní protokolování příkazů lze zajistit standardním protokolovacím zařízením s log_statement =all. To je přijatelné pro monitorování a další použití, ale neposkytuje úroveň podrobností obecně požadovanou pro audit. Nestačí mít seznam všech operací provedených proti databázi. Musí být také možné najít konkrétní prohlášení, která jsou pro auditora zajímavá. Standardní funkce protokolování ukazuje, co uživatel požadoval, zatímco pgAudit se zaměřuje na podrobnosti o tom, co se stalo, když databáze uspokojovala požadavek.

9. Patching

Pravidelně a často kontrolujte stránku s informacemi o zabezpečení PostgreSQL, kde najdete důležité bezpečnostní aktualizace a opravy.

Mějte na paměti, že bezpečnostní chyby operačního systému nebo knihoven mohou také vést k úniku databáze, takže se ujistěte, že budete opravovat tyto opravy aktuální.

ClusterControl poskytuje provozní zprávu, která vám poskytne tyto informace a provede opravy a upgrady za vás.

10. Zabezpečení na úrovni řádku

Kromě standardního systému oprávnění SQL dostupného prostřednictvím GRANT mohou mít tabulky zásady zabezpečení řádků, které na základě jednotlivých uživatelů omezují, které řádky mohou být vráceny normálními dotazy nebo vkládány, aktualizovány nebo odstraňovány příkazy pro úpravu dat. Tato funkce je také známá jako zabezpečení na úrovni řádků.

Je-li v tabulce povoleno zabezpečení řádků, veškerý běžný přístup k tabulce pro výběr řádků nebo úpravu řádků musí být povolen zásadou zabezpečení řádků.

Zde je jednoduchý příklad, jak vytvořit zásadu pro vztah k účtu, která umožní přístup k řádkům pouze členům role správce a pouze k řádkům jejich účtů:

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

Více informací o této funkci můžete získat v oficiální dokumentaci postgresql https://www.postgresql.org/docs/9.6/static/ddl-rowsecurity.html

Pokud byste se chtěli dozvědět více, zde je několik zdrojů, které vám mohou pomoci lépe posílit zabezpečení vaší databáze…

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

Závěr

Pokud budete postupovat podle výše uvedených tipů, váš server bude bezpečnější, ale to neznamená, že bude nerozbitný.

Pro vaši vlastní bezpečnost vám doporučujeme použít bezpečnostní testovací nástroj, jako je Nessus, abyste zjistili, jaké jsou vaše hlavní slabiny a pokusili se je vyřešit.

Svou databázi můžete také sledovat pomocí ClusterControl. Díky tomu můžete v reálném čase vidět, co se děje ve vaší databázi, a analyzovat to.


  1. MySQL COALESCE() Vysvětleno

  2. Jak obnovit databázi SQL Server na Macu pomocí Azure Data Studio

  3. Funkce WIDTH_BUCKET() v Oracle

  4. Jak získám aktuální název časového pásma v Postgres 9.3?