1. Zabezpečte svůj server
Mnoho známých útoků je možné pouze při fyzickém přístupu k počítači. Z tohoto důvodu je nejlepší mít aplikační server a databázový server na různých počítačích. Pokud to není možné, je třeba dbát větší opatrnosti. V opačném případě může útočník spouštěním vzdálených příkazů přes aplikační server poškodit vaši databázi i bez oprávnění. Z tohoto důvodu by každé službě běžící na stejném počítači jako databáze mělo být uděleno nejnižší možné oprávnění, které službě stále umožňuje provoz.
Nezapomeňte si nainstalovat celý bezpečnostní balíček:Antivirus a Anti-spam, Firewall a všechny bezpečnostní balíčky doporučené dodavatelem vašeho operačního systému. Nezapomeňte také věnovat 10 minut přemýšlení o fyzickém umístění vašeho serveru – na nesprávném místě může být váš server ukraden, zaplaven, poškozen divokými zvířaty nebo tuláky.
2. Localhost Security nebo Zakázat nebo omezit vzdálený přístup
Zvažte, zda bude MySQL načteno ze systému nebo bude přímo zpřístupněno z jeho vlastního serveru. V případě, že je využíván vzdálený přístup, zaručte, že se na server mohou dostat právě charakterizovaní hostitelé. To se běžně provádí pomocí obálky TCP, tabulek IP nebo jiných nástrojů pro programování brány firewall nebo hardwarové přístupnosti.
Chcete-li zabránit MySQL v otevření síťového soketu, měl by být doprovodný parametr zahrnut v oblasti [mysqld] my.cnf nebo my.ini:
skip-networking
Dokument se nachází v "C:\Program Files\MySQL\MySQL Server 5.1" katalogu v operačním systému Windows nebo "/etc/my.cnf" nebo "/etc/mysql/my.cnf" na Linuxu.
Tento řádek ochromí začátek administrace systémů uprostřed spouštění MySQL. Bylo by ideální, kdybyste měli na paměti, že pro připojení k serveru MySQL lze použít místní připojení.
Dalším možným řešením je donutit MySQL, aby naslouchalo pouze místnímu hostiteli, přidáním následujícího řádku do [mysqld] sekce my.cnf bind-address=127.0.0.1
Možná nebudete ochotni znemožnit systémový přístup k vašemu databázovému serveru, pokud klienti ve vaší organizaci komunikují se serverem ze svých počítačů nebo webového serveru zavedeného na alternativním počítači. V takovém případě je třeba vzít v úvahu následující omezující syntaxi udělení:
mysql> GRANT SELECT, INSERT ON mydb.\* TO 'someuser'@'somehost';
3. Zakažte použití LOCAL INFILE
Další změnou je zakázání použití "LOAD DATA LOCAL INFILE" příkaz, který pomůže udržet neschválené prohlížení v záznamech sousedství. To je zvláště důležité, když jsou nalezeny nové zranitelnosti SQL Injection v aplikacích PHP.
V určitých případech navíc "LOCAL INFILE" příkaz lze použít k získání přístupu k dalším souborům v operačním systému, například "/etc/passwd" pomocí následujícího příkazu:
mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1
Nebo ještě výrazně méně obtížné:
mysql> SELECT load\_file("/etc/passwd")
Chcete-li zakázat použití "LOCAL INFILE" příkazu, měl by být do [mysqld] přidán následující parametr části konfiguračního souboru MySQL.
set-variable=local-infile=0
4. Změňte uživatelské jméno a heslo uživatele root, udržujte je silné.
Výchozí uživatelské jméno správce na serveru MySQL je "root" . Hackeři se často pokoušejí získat přístup k jeho oprávněním. Chcete-li tento úkol ztížit, přejmenujte "root" na něco jiného a poskytněte mu dlouhé, složité alfanumerické heslo.
Chcete-li přejmenovat uživatelské jméno správce, použijte příkaz rename v konzole MySQL:
mysql> RENAME USER root TO new\_user;
MySQL "PŘEJMENOVAT UŽIVATELE" se poprvé objevil ve verzi MySQL 5.0.2. Pokud používáte starší verzi MySQL, můžete k přejmenování uživatele použít jiné příkazy:
mysql> use mysql;
mysql> update user set user="new\_user" where user="root";
mysql> flush privileges;
Chcete-li změnit heslo uživatele, použijte následující příkaz příkazového řádku:
mysql> SET PASSWORD FOR 'username'@'%hostname' = PASSWORD('newpass');
Heslo je také možné změnit pomocí "mysqladmin" nástroj:
shell> mysqladmin -u username -p password newpass
5. Odeberte databázi "Test"
MySQL přichází s "testovací" databází, která je určena jako testovací prostor. Má k němu přístup anonymní uživatel, a proto jej využívají četné útoky.
Chcete-li tuto databázi odebrat, použijte příkaz drop následovně:
mysql> drop database test;
Nebo použijte "mysqladmin" příkaz:
shell> mysqladmin -u username -p drop test
6. Odebrat anonymní a zastaralé účty
Databáze MySQL přichází s některými anonymními uživateli s prázdnými hesly. V důsledku toho se může kdokoli připojit k databázi a zkontrolovat, zda tomu tak je, proveďte následující:
mysql> select \* from mysql.user where user="";
V zabezpečeném systému by se žádné řádky neměly opakovat. Další způsob, jak udělat totéž:
mysql> SHOW GRANTS FOR ''@'localhost';
mysql> SHOW GRANTS FOR ''@'myhost';
Pokud granty existují, může kdokoli přistupovat k databázi a alespoň použít výchozí databázi"test" . Zkontrolujte to pomocí:
shell> mysql -u blablabla
Chcete-li odebrat účet, spusťte následující příkaz:
mysql> DROP USER "";
MySQL "DROP USER" příkaz je podporován počínaje verzí MySQL 5.0. Pokud používáte starší verzi MySQL, můžete účet odebrat následovně:
mysql> use mysql;
mysql> DELETE FROM user WHERE user="";
mysql> flush privileges;
7. Zvyšte zabezpečení pomocí Role Based Access Control
Velmi častým doporučením pro zabezpečení databáze je snížit oprávnění udělená různým stranám. MySQL se neliší. Obvykle, když vývojáři pracují, používají maximální oprávnění systému a věnují méně pozornosti principům oprávnění, než bychom očekávali. Tento postup může vystavit databázi značnému riziku.
* Jakákoli nová instalace MySQL 5.x již nainstalovaná pomocí správných bezpečnostních opatření.
Pro ochranu databáze se ujistěte, že adresář souborů, ve kterém je databáze MySQL skutečně uložena, vlastní uživatel "mysql" a skupina "mysql".
shell>ls -l /var/lib/mysql
Kromě toho se ujistěte, že pouze uživatel "mysql" a "root" má přístup k adresáři /var/lib/mysql
.
Binární soubory mysql, které se nacházejí v adresáři /usr/bin/, by měl vlastnit „root“ nebo konkrétní systémový uživatel „mysql“. Ostatní uživatelé by neměli mít k těmto souborům přístup pro zápis.
shell>ls -l /usr/bin/my\*
8. Kontrolujte si práva k databázi
Oprávnění operačního systému byla opravena v předchozí části. Nyní pojďme mluvit o oprávněních k databázi. Ve většině případů existuje uživatel správce (přejmenovaný „root“) a jeden nebo více skutečných uživatelů, kteří koexistují v databázi. Obvykle „kořen“ nemá nic společného s daty v databázi; místo toho se používá k údržbě serveru a jeho tabulek, k udělování a odebírání oprávnění atd.
Na druhou stranu se některá uživatelská ID používají pro přístup k datům, jako je uživatelské ID přiřazené webovému serveru pro provádění dotazů "select\update\insert\delete" a pro provádění uložených procedur. Ve většině případů nejsou potřeba žádní další uživatelé; pouze vy jako správce systému však můžete skutečně znát potřeby vaší aplikace.
Pouze administrátorským účtům musí být udělena oprávnění SUPER / PROCESS /FILE a přístup k databázi mysql. Obvykle je dobré snížit oprávnění správce pro přístup k datům.
Zkontrolujte oprávnění ostatních uživatelů a ujistěte se, že jsou správně nastavena. To lze provést pomocí následujících kroků.
mysql> use mysql;
[Identifikujte uživatele]
mysql> select \* from users;
[Seznam udělení všech uživatelů]
mysql> show grants for ‘root’@’localhost’;
Výše uvedené prohlášení musí být provedeno pro každého uživatele! Pamatujte, že oprávnění root by měla být udělena pouze uživatelům, kteří skutečně potřebují.
Další zajímavou výsadou je „ZOBRAZIT DATABÁZE“. Ve výchozím nastavení může příkaz použít každý, kdo má přístup k promptu MySQL. Mohou jej použít ke shromažďování informací (např. získání názvů databází) před útokem na databázi, například krádeží dat. Abyste tomu zabránili, doporučujeme vám postupovat podle níže popsaných postupů.
- Přidejte " --skip-show-database" do spouštěcího skriptu MySQL nebo jej přidejte do konfiguračního souboru MySQL
- Udělte oprávnění ZOBRAZIT DATABÁZE pouze uživatelům, kterým chcete tento příkaz použít
Chcete-li zakázat použití příkazu "SHOW DATABASES", je třeba přidat následující parametr do sekce [mysqld] souboru /etc/my.cnf
:
[mysqld]
skip-show-database
9. Povolit protokolování
Pokud váš databázový server neprovádí mnoho dotazů, doporučuje se povolit protokolování transakcí přidáním následujícího řádku do sekce [mysqld] v /etc/my.cnf
soubor:
[mysqld]
log =/var/log/mylogfile
Toto se nedoporučuje pro vysoce produkční servery MySQL, protože to způsobuje vysokou režii serveru.
Kromě toho ověřte, že k těmto souborům protokolu mají přístup pouze id „root“ a „mysql“ (alespoň přístup pro zápis).
Protokol chyb Zajistěte, aby k souboru protokolu "hostname.err" měli přístup pouze "root" a "mysql". Soubor je uložen v datovém adresáři mysql. Tento soubor obsahuje velmi citlivé informace, jako jsou hesla, adresy, názvy tabulek, názvy uložených procedur a části kódu. Lze jej použít ke shromažďování informací a v některých případech může útočníkovi poskytnout informace potřebné ke zneužití databáze, počítače, na kterém je databáze nainstalována, nebo dat v ní.
Protokol MySQL Ujistěte se, že pouze "root" a "mysql" mají přístup k souboru protokolu "logfile XY". Soubor je uložen v datovém adresáři mysql.
10. Změňte kořenový adresář
Chroot v operačních systémech UNIX {operační systém} je operace, která mění zjevný kořenový adresář disku pro současnou spuštěnou metodu a její potomky. Program, který je znovu zakořeněn do jiného adresáře, nemůže přistupovat k souborům mimo tento adresář nebo je pojmenovávat, a proto se adresář nazývá „chroot vězení“ nebo (méně často) „chroot vězení“.
Použitím prostředí chroot lze omezit přístup k zápisu procesům mySQL (a podřízeným procesům), čímž se zvýší bezpečnost serveru.
Ujistěte se, že pro chrootované prostředí existuje vyhrazený adresář. Mělo by to být něco jako:/chroot/mysql
Kromě toho, aby bylo používání nástrojů pro správu databáze pohodlné, měl by být v konfiguračním souboru MySQL v sekci [client] změněn následující parametr:
[klient]
socket = /chroot/mysql/tmp/mysql.sock
Díky této řádce kódu nebude potřeba zadávat příkazy mysql, mysqladmin, mysqldump atd. pomocí --socket=/chroot/mysql/tmp/mysql.sock
při každém spuštění těchto nástrojů.
11. Pravidelně mažte staré protokoly
Během instalačních procedur je k dispozici spousta citlivých dat, která pomohou nevítaným uživatelům napadnout databázi. Tato data jsou uchovávána v historii serveru a mohou být velmi užitečná, pokud se jedna věc během instalace pokazí. Analýzou souborů historie mohou správci zjistit, co se pokazilo, a pravděpodobně věci opravit. Po dokončení instalace však tyto soubory nejsou potřeba.
Měli bychom odstranit obsah souboru historie MySQL (~/.mysql_history), kde jsou uchovávány všechny mrtvé příkazy SQL (zejména hesla, která jsou uchovávána jako prostý text):
cat /dev/null > ~/.mysql\_history
Na závěr bychom měli zdůraznit bezpečnost databáze. Pro každého jednotlivce nebo společnost by to však mělo být na prvním místě.