sql >> Databáze >  >> RDS >> Mysql

Jak zabezpečit MySQL:Část druhá

V předchozím příspěvku o zabezpečení MySQL jsme pokryli řadu možností, které lze použít ke zvýšení zabezpečení vaší instance (instancí) MySQL. Zahrnovaly:

  • Obecná bezpečnostní opatření MySQL;
  • Řízení přístupu v MySQL;
  • Vytváření, změna a mazání uživatelů v MySQL;
  • Udělování a odebírání oprávnění uživatelům a uživatelům v MySQL;
  • Kontrola oprávnění, která jsou uživatelům přiřazena v MySQL.

V tomto příspěvku se ponoříme do zbývajících možností, včetně:

  • Kategorie účtů v MySQL;
  • Role v MySQL;
  • Rezervované účty v MySQL;
  • Správa hesel v MySQL;
  • Zamykání účtu v MySQL;
  • Bezpečnostní pluginy nabízené MySQL;
  • Zabezpečení záloh MySQL.

Mějte na paměti, že opět nepokryjeme úplně vše, co potřebujete vědět, ale pokusíme se poskytnout dobré výchozí body pro váš vlastní výzkum.

Kategorie účtů v MySQL

Kategorie účtů byly zavedeny v MySQL 8 – konkrétně v MySQL 8.0.16. Tady je jádro věci:

  • Existují dvě samostatné kategorie účtů:běžní uživatelé a uživatelé systému;
  • Běžný uživatel je uživatel bez oprávnění SYSTEM_USER – systémový uživatel je uživatel s oprávněním SYSTEM_USER;
  • Běžný uživatel může upravovat běžné účty – takový uživatel nemůže upravovat systémové účty;
  • Uživatel systému může upravovat systémové i běžné účty;
  • Běžné účty mohou upravovat běžní uživatelé i uživatelé systému;
  • Systémové účty mohou upravovat pouze uživatelé systému.

Chcete-li používat kategorie účtů v MySQL z hlediska zabezpečení, mějte na paměti, že oprávnění SYSTEM_USER ovlivňuje věci, jako je manipulace s účtem a zabíjení relací a příkazů v rámci nich – tento koncept v MySQL umožňuje omezit určité úpravy na určité účty, čímž je MySQL bezpečnější. Kategorie účtů lze také použít k ochraně systémových účtů před manipulací ze strany běžných účtů:za tímto účelem neudělujte běžným účtům oprávnění k úpravě schématu mysql.

Chcete-li udělit účtu oprávnění SYSTEM_USER, použijte na vytvořený účet následující dotaz:

GRANT SYSTEM_USER ON *.* TO system_user;

Role v MySQL

V MySQL jsou role kolekcemi oprávnění. Když udělíte uživatelskému účtu roli v MySQL, udělíte všechna oprávnění spojená s touto rolí. Role lze vytvořit pomocí příkazu CREATE ROLE:

CREATE ROLE ‘role_1’, ‘role_2’;

Názvy rolí se skládají z uživatelské části a hostitelské části – uživatelská část nemůže být prázdná a výchozí část hostitele je „%“, pokud není specifikována.

Když jsou role vytvořeny, měli byste jim přidělit oprávnění. Oprávnění lze přidělit pomocí příkazu GRANT:

  • DEJTE VŠE NA demo_databázi.* TO ‘demo_user’; by udělil všechna oprávnění uživateli s názvem demo_user v databázi s názvem demo_database;
  • GRANT INSERT, SELECT, UPDATE, DELETE ON databáze.* TO ‘demo_user’; by udělil oprávnění INSERT, SELECT, UPDATE a DELETE uživateli s názvem demo_user v databázi s názvem demo_database;
  • GRANT SELECT ON demo_database.* TO ‘demo_user’; by udělil oprávnění SELECT uživateli s názvem demo_user v databázi s názvem demo_database.

Chcete-li přiřadit roli jednotlivému uživateli, použijte tuto syntaxi:
 

GRANT ‘role_name’ TO ‘user_name’@’localhost’;

Chcete-li přiřadit více rolí jednotlivému uživateli, použijte tuto syntaxi:

GRANT ‘role_1’, ‘role_2’ TO ‘user_name’@’localhost’;

Chcete-li přiřadit role více uživatelům současně, použijte tuto syntaxi:

GRANT ‘role_name’ TO ‘user1’@’localhost’, ‘user2’@’localhost’;

Role mohou být užitečné při předcházení bezpečnostním incidentům, protože pokud útočník zná heslo nepříliš privilegovaného uživatele nesprávně za předpokladu, že je uživatel velmi „výkonný“, vaše aplikace (a vaše databáze) by mohly být velmi dobře uložen.

Rezervované účty v MySQL

Pokud jde o rezervované účty, mějte na paměti, že MySQL vytváří účty během inicializace datového adresáře. Existuje několik účtů, které by měly být v MySQL považovány za rezervované:

  • ‘root’@’localhost’ – tento účet je superuživatelský účet a má božská privilegia ve všech databázích MySQL (může provádět jakoukoli operaci v jakékoli databázi MySQL). Stojí za zmínku, že uživatele root lze také přejmenovat, aby se zabránilo odhalení vysoce privilegovaného účtu. Chcete-li účet přejmenovat, spusťte následující dotaz:
RENAME USER ‘root’@’localhost’ TO ‘username’@’localhost’;
  • Ujistěte se, že jste vydali FLUSH PRIVILEGES; výpis po přejmenování účtu, aby se změny projevily.
  • ‘mysql.sys’@’localhost’ – tento účet je systémový uživatel, který se používá jako definující zobrazení, procedury a funkce ve schématu sys. Přidáno v MySQL 5.7.9, aby se předešlo problémům, které by mohly nastat při přejmenování účtu root.
  • ‘mysql.session’@’localhost’ – tento účet interně používají pluginy pro přístup k serveru.

V tomto případě nemůžete dělat příliš mnoho z hlediska zabezpečení, ale mějte na paměti, že účet root má božská privilegia, což znamená, že může provádět jakoukoli operaci v jakékoli databázi MySQL a buďte opatrní při rozhodování, komu udělit oprávnění pro přístup k účtu. Také mějte na paměti, k čemu slouží ostatní účty MySQL.

Správa hesel v MySQL

MySQL také podporuje funkce správy hesel. Některé z nich zahrnují:

  • Možnost periodicky vypršet platnost hesel;
  • Možnost vyhnout se opětovnému použití hesla;
  • Možnost generování hesel;
  • Možnost zkontrolovat, zda je používané heslo silné;
  • Možnost dočasně uzamknout uživatele po příliš mnoha neúspěšných pokusech o přihlášení.

Nyní se na tyto možnosti podíváme dále.

Pro ruční ukončení platnosti hesla použijte příkaz ALTER USER takto:

ALTER USER ‘user’@’localhost’ PASSWORD EXPIRE;

Chcete-li nastavit globální politiku, upravte soubor my.cnf tak, aby obsahoval parametr default_password_lifetime. Parametr lze definovat pod sekcí [mysqld] (následující příklad nastavuje životnost hesla na 3 měsíce (90 dní)):

default_password_lifetime=90

Pokud chcete, aby platnost hesel nikdy nevypršela, nastavte parametr default_password_litetime na 0.
Můžete také nastavit dobu platnosti hesla pro konkrétní uživatele. Pokud byste chtěli nastavit interval vypršení platnosti hesla pro uživatele s názvem demo_user, můžete použít následující příklad:

ALTER USER ‘demo_user’@’localhost’ PASSWORD EXPIRE INTERVAL 90 DAY;

Zakázání vypršení platnosti hesla:

ALTER USER ‘demo_user’@’localhost’ PASSWORD EXPIRE NEVER;

Obnovení globální zásady vypršení platnosti hesla:

ALTER USER ‘demo_user’@’localhost’ PASSWORD EXPIRE DEFAULT;

​​Omezení opakovaného použití hesel neumožňují opětovné použití hesel – k využití této funkce použijte proměnné password_history a password_reuse_interval. Tyto proměnné můžete buď vložit do my.cnf podle příkladu níže, nebo je nastavit za běhu přidáním SET PERSIST před příkazy níže.

Chcete-li zakázat opětovné použití kteréhokoli z 5 dříve používaných hesel novějších než 365 dní, použijte:

password_history=5
password_reuse_interval=365

Chcete-li vyžadovat minimálně 5 změn hesla před povolením opětovného použití:

ALTER USER ‘demo_user’@’localhost’ PASSWORD HISTORY 5;

Totéž lze provést při vytváření uživatele – nahraďte ALTER USER za CREATE USER.

Chcete-li při vytváření uživatele vygenerovat náhodné heslo, spusťte:

CREATE USER [email protected] IDENTIFIED BY RANDOM PASSWORD;

Chcete-li změnit heslo uživatele na náhodně vygenerované:

SET PASSWORD FOR [email protected] TO RANDOM;

Vaše náhodné heslo se zobrazí pod ním.

Mějte na paměti, že výchozí náhodná hesla mají délku 20 znaků. Délku lze ovládat pomocí proměnné generation_random_password_length, která má rozsah od 5 do 255.

Pro kontrolu, zda je použité heslo silné, můžete použít proměnnou VALIDATE_PASSWORD_STRENGTH - funkce zobrazí číslo od 0 do 100, přičemž 0 je nejslabší a 100 nejsilnější:
SELECT VALIDATE_PASSWORD_STRENGTH('heslo');

Zamykání účtu v MySQL

MySQL 8.0.19 také zavedlo možnost dočasně uzamknout uživatelské účty. Toho lze dosáhnout pomocí proměnných FAILED_LOGIN_ATTEMPTS a PASSWORD_LOCK_TIME.

Chcete-li povolit uzamčení účtu při vytváření uživatele, spusťte:

CREATE USER ‘demo_user’@’localhost’ IDENTIFIED BY ‘password’ FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 5;

Hodnota za FAILED_LOGIN_ATTEMPTS udává, po kolika neúspěšných pokusech bude účet uzamčen, hodnota za PASSWORD_LOCK_TIME udává čas uzamčení účtu ve dnech. Je také možné zadat hodnotu, která neskončí, dokud nebude účet odemčen, zadáním PASSWORD_LOCK_TIME jako UBOUNDED.

Bezpečnostní pluginy nabízené MySQL

MySQL také nabízí několik zásuvných modulů, které mohou dále zlepšit možnosti zabezpečení. MySQL nabízí:

  • Autentizační pluginy;
  • Pluginy pro ovládání připojení;
  • Pluginy pro ověření hesla;
  • Auditové pluginy;
  • Pluginy brány firewall;

Tyto zásuvné moduly lze použít pro řadu věcí z hlediska zabezpečení:

Pluginy pro ověřování

Ověřovací zásuvné moduly umožňují uživatelům vybrat si mezi více zásuvnými metodami ověřování dostupných v MySQL. Lze je použít společně s příkazy CREATE USER nebo ALTER USER. Zde je příklad: 

CREATE USER ‘user_1’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’;

Tento dotaz by implementoval ověřování pomocí nativní metody hašování hesla.

Pluginy pro řízení připojení

Zásuvné moduly pro řízení připojení mohou způsobit rostoucí zpoždění v odpovědích serveru na pokusy o připojení, pokud pokusy o připojení překročí určitý počet - jsou schopny zastavit potenciální útoky hrubou silou. Tato knihovna pluginů byla zavedena do MySQL ve verzi 5.7.17 a lze ji přidat do MySQL buď přes my.cnf, nebo nahráním pluginů na server za běhu.
Aby bylo možné přidat pluginy do my.cnf , přidejte následující řádek pod [mysqld]:

plugin-load-add=connection_control.so

Po úpravě souboru uložte změny a restartujte MySQL.
Chcete-li načíst pluginy na server za běhu, spusťte:

INSTALL PLUGIN CONNECTION_CONTROL SONAME ‘connection_control.so’;
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME ‘connection_control.so’;

V případě potřeby upravte příponu .so. Pokud jste vše provedli správně, tabulka CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS by měla obsahovat všechny neúspěšné pokusy o připojení.

Pluginy pro ověření hesla

Pluginy pro ověřování hesel mohou uživatelům umožnit používat silnější hesla, pokud jsou správně používána. Plugin pro ověření hesla lze nainstalovat přes my.cnf nebo nahráním pluginu na server za běhu. Chcete-li nainstalovat plugin přes my.cnf, přidejte následující řádek pod [mysqld] a restartujte server:

plugin-load-add=validate_password.so

Chcete-li načíst plugin za běhu, spusťte následující příkaz:

INSTALL PLUGIN validate_password SONAME ‘validate_password.so’;

Chcete-li načíst plugin za běhu a zabránit jeho odstranění, přidejte do my.cnf validate-password=FORCE_PLUS_PERMANENT.

Chcete-li zabránit spuštění serveru, pokud není plugin inicializován, použijte možnost --validate-password s hodnotou FORCE nebo FORCE_PLUS_PERMANENT.

Zásadu síly hesla lze také změnit:Chcete-li to provést, změňte hodnotu validate_password_policy na NÍZKÁ, STŘEDNÍ nebo SILNÁ. Hodnota LOW kontroluje pouze délku hesla, zásada MEDIUM přidává některé podmínky a zásada STRONG přidává podmínku, že podřetězce hesel, které se skládají ze 4 nebo více znaků, se nesmějí shodovat se slovy v souboru slovníku, který lze zadat úpravou proměnné validate_password_dictionary_file.

Pluginy klíčenky

Zásuvné moduly pro klíčování mohou umožnit serverovým komponentám a zásuvným modulům bezpečně ukládat citlivé informace pro účely načítání. Chcete-li načíst plugin do MySQL, přidejte pod [mysqld] následující:

early-plugin-load=keyring_file.so

Chcete-li určit soubor úschovny klíčů, přidejte následující (proměnná keyring_vault_config by měla ukazovat na konfigurační soubor):

loose-keyring_vault_config=”/var/lib/mysql_keyring/keyring_vault.conf”

Soubor klíčového svazku by měl obsahovat proměnnou vault_url, která definuje adresu serveru úschovny, proměnnou secret_mount_point, která definuje název přípojného bodu, kde úschovna klíčenek ukládá klíče, a token, který by měl být definován serverem úschovny. Volitelně lze také definovat proměnnou vault_ca (měla by ukazovat na certifikát CA používaný k podepisování certifikátů vaultu).

Restartujte server, aby se změny projevily;

Pluginy auditu

Auditové zásuvné moduly umožňují monitorování, protokolování a blokování aktivit prováděných na serverech MySQL. Chcete-li nainstalovat MySQL Enterprise Audit, spusťte skript umístěný ve sdíleném adresáři vaší instance MySQL (nezadávejte heslo instance MySQL do terminálu – použijte my.cnf):

mysql < /path/to/audit_log_filter_linux_install.sql

Můžete také zabránit odebrání pluginu za běhu – přidejte následující do sekce [mysqld]:

audit_log=FORCE_PLUS_PERMANENT

Restartujte server, aby se změny projevily. Pamatujte, že protokolování založené na pravidlech ve výchozím nastavení nezaznamenává žádné auditovatelné události, takže aby protokolovalo vše, vytvořte filtr:

SELECT audit_log_filter_set_filter(‘log_filter’, ‘{ “filter”: { “log”: true } }’);

Poté jej přiřaďte k účtu:

SELECT audit_log_filter_set_user(‘%’, ‘log_filter’);

Uvědomte si, že pluginy auditu jsou dostupné pouze v MySQL Enterprise Edition;

Pluginy brány firewall

Zásuvné moduly brány firewall mohou uživatelům umožnit povolit nebo zakázat provádění konkrétních příkazů SQL na základě konkrétních vzorů. MySQL Enterprise Firewall byl představen v MySQL 5.6.24 – je schopen chránit data monitorováním, upozorňováním a blokováním neoprávněné aktivity:je schopen blokovat útoky SQL injection, monitorovat hrozby a blokovat podezřelý provoz a také detekovat průniky do databáze. Firewall je také schopen protokolovat blokované příkazy – lze je kontrolovat a lze také sledovat počet schválených a zamítnutých příkazů v reálném čase.

Chcete-li nainstalovat bránu firewall MySQL Enterprise Firewall, jednoduše ji povolte při instalaci serveru MySQL v systému Windows, lze ji také nainstalovat, zakázat nebo odinstalovat pomocí nástroje MySQL Workbench 6.3.4. Firewall lze také nainstalovat ručně spuštěním skriptu ve sdíleném adresáři vaší instalace MySQL. Chcete-li povolit bránu firewall, přidejte následující řádek pod [mysqld] a restartujte server:

mysql_firewall_mode=ON

Bránu firewall lze také povolit za běhu:

SET GLOBAL mysql_firewall_mode = ON;

Alternativně pro zachování brány firewall (to znamená, že bránu firewall nebude nutné znovu zapínat při každém dalším restartu serveru):

SET PERSIST mysql_firewall_mode = ON;

Potom udělte oprávnění FIREWALL_ADMIN každému účtu, který spravuje bránu firewall, a oprávnění FIREWALL_USER každému účtu, který by měl mít přístup pouze ke svým vlastním pravidlům brány firewall. Také  udělte oprávnění EXECUTE pro uložené procedury brány firewall v databázi mysql. Aby firewall fungoval, registrujte u něj profily, poté natrénujte firewall, aby znal povolené příkazy, které může databáze provádět, a poté řekněte firewallu, aby porovnal příchozí příkazy s nastaveným whitelistem. Každý profil má provozní režim - VYPNUTO, NAHRÁVÁNÍ, OCHRANA nebo DETEKCE. OFF deaktivuje profil, RECORDING trénuje firewall, PROTECTING povoluje nebo zakazuje provádění příkazů a DETECTING detekuje (ale neblokuje) pokusy o narušení. Pravidla pro určitý profil lze resetovat nastavením jeho hodnoty na RESET. OFF deaktivuje profil. K nastavení režimu použijte následující dotaz, kde name je název profilu a OFF je provozní režim: 

CALL mysql.sp_set_firewall_mode(name, ‘OFF’);

Zásuvný modul brány firewall je také dostupný pouze v MySQL Enterprise Edition.

Zabezpečení záloh MySQL

Pokud jde o zálohování MySQL, máte několik možností.

  • Pokud používáte mysqldump, můžete uložit své uživatelské jméno a heslo do my.cnf a vyvolat mysqldump takto (následující příkaz vypíše všechny databáze do souboru /home/backup.sql):
$ mysqldump --defaults-extra-file=/var/lib/my.cnf --single-transaction --all-databases > /home/backup.sql
  • ​Uložením svého uživatelského jména a hesla do souboru my.cnf nezapisujete své heslo do terminálu – taková metoda zálohování je bezpečnější, protože při spuštění výpisu lze příkaz zobrazit prostřednictvím ps axe příkaz.
  • Můžete také zvážit použití mysqldump-secure, což je obalový skript vyhovující standardu POSIX, který je schopen komprimovat a šifrovat zálohy s ohledem na silné zabezpečení .

  • Zálohy lze šifrovat pomocí OpenSSL – jednoduše vezměte zálohu a zašifrujte ji následujícím příkazem:

    $ openssl enc -aes-256-cbc -salt -in backup.tar.gz -out backup.tar.gz.enc -k password

    Výše uvedený příkaz vytvoří nový zašifrovaný soubor backup.tar.gz.enc v aktuálním adresáři. Soubor bude zašifrován vámi zvoleným heslem (heslo nahraďte požadovaným heslem). Soubor lze dešifrovat později spuštěním následujícího příkazu:

    $ openssl aes-256-cbc -d -in backup.tar.gz.enc -out backup.tar.gz -k password

    Nahraďte heslo svým heslem.

  • mysqldump má další možnost šifrování záloh (následující příklad je také komprimuje pomocí gzip):

    $ mysqldump --all-databases --single-transaction --triggers --routines | gzip | openssl  enc -aes-256-cbc -k password > backup.xb.enc

    Nahraďte heslo požadovaným heslem.

  • Zálohy můžete také zašifrovat pomocí mariabackup nebo xtrabackup. Zde je příklad z dokumentace MariaDB:

    $ mariabackup --user=root --backup --stream=xbstream  | openssl  enc -aes-256-cbc -k password > backup.xb.enc

    Nahraďte heslo požadovaným heslem.

  • Zálohy lze také šifrovat pomocí ClusterControl – pokud je pro konkrétní zálohu povolena možnost šifrování, ClusterControl zálohu zašifruje pomocí AES-256 CBC (šifrování probíhá na záložním uzlu). Pokud je záloha uložena v uzlu řadiče, jsou záložní soubory streamovány v zašifrovaném formátu pomocí socat nebo netcat. Pokud je povolena komprese, ClusterControl nejprve zkomprimuje zálohu a poté ji zašifruje. Šifrovací klíč bude vygenerován automaticky, pokud neexistuje, a poté uložen v konfiguraci CMON ve volbě backup_encryption_key. Mějte na paměti, že tento klíč je zakódován a měl by být nejprve dekódován. Chcete-li tak učinit, spusťte následující příkaz:

    $ cat /etc/cmon.d/cmon_ClusterID.cnf | grep ^backup_encryption_key | cut -d"'" -f2 | base64 -d > keyfile.key

    Příkaz přečte backup_encryption_key a dekóduje jeho hodnotu na binární výstup. Klíčový soubor lze použít k dešifrování zálohy takto:

    $ cat backup.aes256 | openssl enc -d -aes-256-cbc -pass file:/path/to/keyfile.key > backup_file.xbstream.gz

    Další příklady naleznete v dokumentaci ClusterControl.

Závěr

V těchto příspěvcích o zabezpečení MySQL jsme se zabývali některými bezpečnostními opatřeními, která mohou být užitečná, pokud cítíte potřebu zpřísnit zabezpečení vaší instance (instancí) MySQL. I když jsme nepokryli úplně všechno, máme pocit, že tyto body mohou být dobrým výchozím bodem při zpřísňování zabezpečení vaší instalace MySQL. Vezměte si z těchto příspěvků, co chcete, proveďte svůj vlastní průzkum a aplikujte bezpečnostní opatření, která jsou ve vaší situaci nejvhodnější.


  1. MySQL - Použití COUNT(*) v klauzuli WHERE

  2. Vytvořte úlohu SQL Server Agent v Azure Data Studio

  3. DROP DATABASE MySQL

  4. Jak vytvořit databázi MySQL a nastavit oprávnění