Jako distribuovaný databázový systém vyžaduje Galera Cluster ve srovnání s centralizovanou databází další bezpečnostní opatření. Data jsou distribuována přes více serverů nebo dokonce datových center. Vzhledem k tomu, že mezi uzly probíhá významná datová komunikace, může dojít k významnému ohrožení, pokud nebudou přijata příslušná bezpečnostní opatření.
V tomto příspěvku na blogu se podíváme na několik tipů, jak zabezpečit náš Galera Cluster. Upozorňujeme, že tento blog staví na našem předchozím příspěvku na blogu – Jak zabezpečit databáze s otevřeným zdrojovým kódem pomocí ClusterControl.
Skupina brány firewall a zabezpečení
Následující porty jsou pro Galera Cluster velmi důležité:
- 3306 – MySQL
- 4567 – Komunikace a replikace Galera
- 4568 – Galera IST
- 4444 – Galera SST
Z vnější sítě se doporučuje otevřít přístup pouze k portu MySQL 3306. Ostatní tři porty lze z vnější sítě uzavřít a umožňuje jim pouze vnitřní přístup mezi uzly Galera. Pokud provozujete reverzní proxy sedící před uzly Galera, například HAProxy, můžete uzamknout port MySQL z veřejného přístupu. Zajistěte také, aby byl otevřen monitorovací port pro monitorovací skript HAProxy. Výchozí port je 9200 na uzlu Galera.
Následující diagram ilustruje náš příklad nastavení na tříuzlovém clusteru Galera s HAProxy obráceným k veřejné síti se svými souvisejícími porty:
Na základě výše uvedeného diagramu jsou příkazy iptables pro uzly databáze:
$ iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 3306 -j ACCEPT
$ iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 4444 -j ACCEPT
$ iptables -A INPUT -p tcp -s 10.0.0.0/24 --dports 4567:4568 -j ACCEPT
$ iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 9200 -j ACCEPT
Při použití nástroje pro vyrovnávání zatížení:
$ iptables -A INPUT -p tcp --dport 3307 -j ACCEPT
Ujistěte se, že jste pravidla brány firewall ukončili příkazem Zakázat vše, takže je povolen pouze provoz definovaný v pravidlech výjimek. Můžete být přísnější a rozšířit příkazy tak, aby dodržovaly vaši bezpečnostní politiku – například přidáním síťového rozhraní, cílové adresy, zdrojové adresy, stavu připojení a podobně.
Šifrování klient-server MySQL
MySQL podporuje šifrování mezi klientem a serverem. Nejprve musíme vygenerovat certifikát. Po konfiguraci můžete vynutit uživatelské účty, aby specifikovaly určité možnosti připojení pomocí šifrování k serveru MySQL.
Kroky vyžadují, abyste:
- Vytvořte klíč pro certifikační autoritu (ca-key.pem)
- Vygenerujte certifikát CA s vlastním podpisem (ca-cert.pem)
- Vytvořte klíč pro certifikát serveru (server-key.pem)
- Vygenerujte certifikát pro server a podepište jej pomocí ca-key.pem (server-cert.pem)
- Vytvořte klíč pro klientský certifikát (client-key.pem)
- Vygenerujte certifikát pro klienta a podepište jej pomocí ca-key.pem (client-cert.pem)
Vždy buďte opatrní se soukromým klíčem CA (ca-key.pem) – kdokoli, kdo k němu má přístup, jej může použít ke generování dalších klientských nebo serverových certifikátů, které budou akceptovány jako legitimní, když je povoleno ověření CA. Pointa je, že všechny klíče musí být diskrétní.
Poté můžete přidat proměnné související s SSL pod direktivou [mysqld], například:
ssl-ca=/etc/ssl/mysql/ca-cert.pem
ssl-cert=/etc/ssl/mysql/server-cert.pem
ssl-key=/etc/ssl/mysql/server-key.pem
Restartujte server MySQL, aby se načetly změny. Poté vytvořte uživatele s příkazem REQUIRE SSL, například:
mysql> GRANT ALL PRIVILEGES ON db1.* TO 'dbuser'@'192.168.1.100' IDENTIFIED BY 'mySecr3t' REQUIRE SSL;
Uživatel vytvořený pomocí VYŽADOVAT SSL bude vynucen, aby se připojil ke správným klientským souborům SSL (client-cert.pem, client-key.pem a ca-cert.pem).
S ClusterControl lze šifrování SSL klient-server snadno aktivovat z uživatelského rozhraní pomocí funkce „Vytvořit šifrování SSL“.
Šifrování Galera
Povolení šifrování pro Galera znamená, že IST bude také šifrováno, protože komunikace probíhá přes stejný soket. Na druhou stranu SST musí být konfigurován samostatně, jak je znázorněno v další části. Všechny uzly v clusteru musí mít povoleno šifrování SSL a nemůžete mít kombinaci uzlů, z nichž některé povolily šifrování SSL a jiné ne. Nejlepší čas pro konfiguraci je při nastavování nového clusteru. Pokud to však potřebujete přidat do běžícího produkčního systému, budete bohužel muset cluster restartovat a dojde k výpadku.
Všechny uzly Galera v clusteru musí používat stejný klíč, certifikát a CA (volitelné). Můžete také použít stejný klíč a certifikát vytvořený pro šifrování klient-server MySQL, nebo vygenerovat novou sadu pouze pro tento účel. Chcete-li aktivovat šifrování uvnitř Galery, musíte přidat možnost a hodnotu pod wsrep_provider_options v konfiguračním souboru MySQL na každém uzlu Galera. Zvažte například následující existující řádek pro náš uzel Galera:
wsrep_provider_options = "gcache.size=512M; gmcast.segment=0;"
Připojte související proměnné do nabídky, oddělené středníkem:
wsrep_provider_options = "gcache.size=512M; gmcast.segment=0; socket.ssl_cert=/etc/mysql/cert.pem; socket.ssl_key=/etc/mysql/key.pem;"
Více informací o parametrech souvisejících s SSL Galera naleznete zde. Proveďte tuto úpravu na všech uzlech. Potom zastavte cluster (po jednom uzlu) a zaveďte systém z posledního uzlu, který se vypnul. Správné načtení protokolu SSL můžete ověřit v protokolu chyb MySQL:
2018-01-19T01:15:30.155211Z 0 [Note] WSREP: gcomm: connecting to group 'my_wsrep_cluster', peer '192.168.10.61:,192.168.10.62:,192.168.10.63:'
2018-01-19T01:15:30.159654Z 0 [Note] WSREP: SSL handshake successful, remote endpoint ssl://192.168.10.62:53024 local endpoint ssl://192.168.10.62:4567 cipher: AES128-SHA compression:
S ClusterControl lze snadno aktivovat šifrování Galera Replication pomocí funkce „Vytvořit SSL Galera Encryption“.
Šifrování SST
Když SST probíhá bez šifrování, datová komunikace je odhalena, zatímco proces SST probíhá. SST je úplný proces synchronizace dat od dárce po spojovací uzel. Pokud by útočník mohl „vidět“ celý přenos dat, dotyčná osoba by získala kompletní snímek vaší databáze.
SST se šifrováním je podporováno pouze u metod mysqldump a xtrabackup-v2. V případě mysqldump musí být uživateli uděleno "VYŽADOVAT SSL" na všech uzlech a konfigurace je podobná standardnímu šifrování SSL klient-server MySQL (jak je popsáno v předchozí části). Jakmile je šifrování klient-server aktivováno, vytvořte nového uživatele SST s vynuceným SSL:
mysql> GRANT ALL ON *.* TO 'sst_user'@'%' IDENTIFIED BY 'mypassword' REQUIRE SSL;
Pro rsync doporučujeme použít galera-secure-rsync, skript rsync SST zabezpečený SSL pro Galera Cluster. Funguje téměř přesně jako wsrep_sst_rsync kromě toho, že zajišťuje skutečnou komunikaci s SSL pomocí socat. Vygenerujte požadovaný klient/server klíč a soubory certifikátu, zkopírujte je do všech uzlů a specifikujte "secure_rsync" jako metodu SST v konfiguračním souboru MySQL, abyste ji aktivovali:
wsrep_sst_method=secure_rsync
Pro xtrabackup musí být povoleny následující možnosti konfigurace v konfiguračním souboru MySQL pod direktivou [sst]:
[sst]
encrypt=4
ssl-ca=/path/to/ca-cert.pem
ssl-cert=/path/to/server-cert.pem
ssl-key=/path/to/server-key.pem
Restart databáze není nutný. Pokud Galera vybere tento uzel jako dárce, tyto možnosti konfigurace budou automaticky vybrány, když Galera zahájí SST.
SELinux
Security-Enhanced Linux (SELinux) je mechanismus řízení přístupu implementovaný v jádře. Bez SELinuxu se k řízení přístupu uživatelů k souborům používají pouze tradiční metody řízení přístupu, jako jsou oprávnění k souborům nebo ACL.
Ve výchozím nastavení, je-li povolen režim přísného vynucování, je vše zakázáno a správce musí vytvořit sérii výjimek pro prvky, které systém vyžaduje, aby fungoval. Úplné zakázání SELinuxu se dnes stalo běžnou špatnou praxí pro mnoho instalací založených na RedHat.
V závislosti na pracovní zátěži, vzorech použití a procesech je nejlepším způsobem vytvoření vlastního modulu zásad SELinuxu přizpůsobeného vašemu prostředí. Co opravdu musíte udělat, je nastavit SELinux na permisivní režim (pouze protokolování bez vynucení) a spouštět události, které se mohou stát na uzlu Galera, aby se SELinux zaprotokoloval. Čím rozsáhlejší, tím lepší. Příklad událostí jako:
- Počáteční uzel jako dárce nebo účastník
- Restartujte uzel ke spuštění IST
- Používejte různé metody SST
- Zálohujte a obnovujte databáze MySQL pomocí mysqldump nebo xtrabackup
- Povolení a zakázání binárních protokolů
Jedním příkladem je, že pokud je uzel Galera monitorován pomocí ClusterControl a je povolena funkce sledování dotazů, ClusterControl povolí/zakáže proměnnou protokolu pomalého dotazu pro zachycení pomalu běžících dotazů. V audit.log byste tedy viděli následující odmítnutí:
$ grep -e denied audit/audit.log | grep -i mysql
type=AVC msg=audit(1516835039.802:37680): avc: denied { open } for pid=71222 comm="mysqld" path="/var/log/mysql/mysql-slow.log" dev="dm-0" ino=35479360 scontext=system_u:system_r:mysqld_t:s0 tcontext=unconfined_u:object_r:var_log_t:s0 tclass=file
Záměrem je umožnit, aby se všechna možná zamítnutí zapsala do protokolu auditu, který lze později použít ke generování modulu zásad pomocí audit2allow před nahráním do SELinuxu. Codership to podrobně popsalo na stránce dokumentace, Konfigurace SELinux.
Účet a oprávnění SST
SST je počáteční proces synchronizace, který provádí Galera. Přináší spojovací uzel aktuální se zbytkem členů v clusteru. Proces v zásadě exportuje data z donorového uzlu a obnoví je na spojovacím uzlu, než je spojovacímu členu umožněno dohnat zbývající transakce z fronty (tj. ty, které se staly během procesu synchronizace). Jsou podporovány tři metody SST:
- mysqldump
- rsync
- xtrabackup (nebo xtrabackup-v2)
Pro použití mysqldump SST jsou vyžadována následující oprávnění:
- VYBRAT, ZOBRAZIT, SPUSTIT, ZAMKNOUT TABULKY, ZNOVU NAČÍST, SOUBOR
S mysqldump nebudeme dále zacházet, protože pravděpodobně není často používán ve výrobě jako metoda SST. Kromě toho je to blokování dárce. Rsync je obvykle preferovanou druhou volbou po xtrabackup kvůli rychlejší době synchronizace a menší náchylnosti k chybám ve srovnání s mysqldump. Ověření SST je u rsync ignorováno, proto můžete přeskočit konfiguraci oprávnění účtu SST, pokud je rsync zvolenou metodou SST.
Spolu s xtrabackup se doporučují následující oprávnění pro standardní postupy zálohování a obnovy založené na stránce dokumentace Xtrabackup:
- VYTVOŘIT, VYTVOŘIT TABLESPACE, UDÁLOST, VLOŽIT, ZAMKNOUT TABULKU, ZPRACOVAT, ZNOVU NAČÍST, KLIENT REPLIKACE, VYBRAT, ZOBRAZIT ZOBRAZENÍ, SUPER
Pro použití SST xtrabackup však záleží pouze na následujících oprávněních:
- ZPRACOVÁNÍ, ZNOVU NAČÍST, REPLIKACE KLIENTA
Příkaz GRANT pro SST lze tedy minimalizovat jako:
mysql> GRANT PROCESS,RELOAD,REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost' IDENTIFIED BY '[email protected]@sTr0nG%%P4ssW0rD';
Potom podle toho nakonfigurujte wsrep_sst_auth v konfiguračním souboru MySQL:
wsrep_sst_auth = sstuser:[email protected]@sTr0nG%%P4ssW0rD
Udělte pouze uživateli SST pro localhost a použijte silné heslo. Vyhněte se použití uživatele root jako účtu SST, protože by to odhalilo heslo root v konfiguračním souboru pod touto proměnnou. Navíc, změna nebo resetování kořenového hesla MySQL by v budoucnu přerušilo SST.
Posílení zabezpečení MySQL
Galera Cluster je multimaster replikační plugin pro úložiště InnoDB, který běží na vidlicích MySQL a MariaDB. Proto se standardní doporučení pro posílení zabezpečení MySQL/MariaDB/InnoDB vztahují i na Galera Cluster.
Toto téma bylo zahrnuto v mnoha příspěvcích na blogu. Tomuto tématu jsme se věnovali také v následujících příspěvcích na blogu:
- Deset tipů, jak dosáhnout zabezpečení MySQL a MariaDB
- Tipy a triky ClusterControl:Zabezpečení instalace MySQL
- Jak zabezpečit své open source databáze pomocí ClusterControl
Výše uvedené blogové příspěvky shrnují nezbytnost šifrování klidových a přenášených dat, používání zásuvných modulů pro audit, obecných bezpečnostních pokynů, osvědčených postupů zabezpečení sítě atd.
Použijte nástroj pro vyrovnávání zatížení
Existuje celá řada nástrojů pro vyrovnávání zatížení databáze (reverzní proxy), které lze použít společně s Galerou - HAProxy, ProxySQL a MariaDB MaxScale, abychom jmenovali některé z nich. Můžete nastavit nástroj pro vyrovnávání zatížení pro řízení přístupu k vašim uzlům Galera. Je to skvělý způsob rozdělení zátěže databáze mezi instance databáze a také omezení přístupu, například pokud chcete přepnout uzel do režimu offline kvůli údržbě nebo pokud chcete omezit počet připojení otevřených na uzlech Galera. Nástroj pro vyrovnávání zátěže by měl být schopen řadit připojení do fronty, a proto poskytovat určitou ochranu proti přetížení vašich databázových serverů.
ProxySQL, výkonný databázový reverzní proxy server, který si rozumí s MySQL a MariaDB, lze rozšířit o mnoho užitečných bezpečnostních funkcí, jako je firewall pro dotazy, pro blokování problematických dotazů z databázového serveru. Modul pravidel dotazu lze také použít k přepsání špatných dotazů na něco lepšího/bezpečnějšího nebo je přesměrovat na jiný server, který dokáže absorbovat zátěž, aniž by to ovlivnilo některý z uzlů Galera. MariaDB MaxScale také dokáže pomocí filtru Database Firewall blokovat dotazy založené na regulárních výrazech.
Další výhodou nástroje pro vyrovnávání zatížení pro váš Galera Cluster je schopnost hostovat datovou službu bez vystavení databázové vrstvy veřejné síti. Proxy server lze použít jako baštu pro získání přístupu k databázovým uzlům v privátní síti. Izolací databázového clusteru od vnějšího světa jste odstranili jeden z důležitých útočných vektorů.
A je to. Vždy zůstaňte v bezpečí a chráněni.