MySQL is een van de meest populaire relationele databasebeheersystemen die een jackpot is voor aanvallers die proberen de databases binnen te sluipen. Een nieuw geïnstalleerde MySQL-databaseserver kan veel kwetsbaarheden en mazen hebben. Omdat gegevensbeveiliging van groot belang is, is het verplicht om elk aspect van MySQL-beveiliging te begrijpen.

Dit artikel richt zich op de controle en beveiliging van uw MySQL-database en geeft negen tips om de beveiliging te versterken.

1. Vermijd onnodige privileges

MySQL staat verschillende privilege-statements toe die, wanneer ze onnodig worden toegewezen aan een minder bevoorrechte gebruiker, kunnen leiden tot het lezen/schrijven van bestanden en het ondermijnen van andere gebruikersprivileges. Enkele van de meest potentieel riskante privilege-statements zijn FILE, GRANT, SUPER, ALTER, DELETE, SHUTDOWN, enzovoort. U kunt hier meer over lezen in de officiële MySQL-documentatie. Wijs daarom geen superuser-privileges zoals FILE, GRANT, SUPER en PROCESS toe aan niet-beheerdersaccounts. U kunt deze onnodige globale, database- en tabelniveau-machtigingen als volgt intrekken:

ALLES INTREKKEN OP *.* VAN 'user_name'@'host_name'; #Globale privileges
REVOKE CREATE, DROP ON database_name.* VAN 'user_name'@'host_name'; #Databaserechten
REVOKE INSERT, UPDATE, DELETE ON database_name.table_name VAN 'user_name'@'host_name'; #Tafelprivileges
doorspoelrechten;

2. Externe aanmeldingen beperken

Externe toegang verlicht de taak van databasebeheerders, maar brengt de server in gevaar voor mogelijke kwetsbaarheden en exploits. U kunt externe toegang voor alle typen MySQl-gebruikersaccounts uitschakelen door een netwerkvariabele voor overslaan toe te voegen aan het hoofdconfiguratiebestand en de service opnieuw te starten.

[mysqld]
skip-netwerken
sudo-service mysql opnieuw opstarten

Evenzo moet u toegang tot root-accounts uitschakelen, zo niet alles, om externe logins met root-accounts te beperken. Deze voorzorgsmaatregel voorkomt bruteforcering van het MySQL-rootaccount.

mysql> verwijderen uit mysql.user waar user='root' en host niet in ('localhost', '127.0.0.1', '::1'); mysql> flush-privileges; 

3. Functies uitschakelen (load_file, outfile, dumpfile)

Een andere voorzorgsmaatregel om MySQL te beveiligen tegen lokale bestandsinjectie is het uitschakelen van functies die alleen toegankelijk zijn via het FILE-toekenningsprivilege. Het BESTAND is een optie waarmee gebruikers met een laag privilege met algemene opdrachtopties bestanden op de server kunnen lezen of schrijven.

  • laad bestand

De functie load_file laadt de bestandsinhoud van de server als een tekenreeks. Het volgende commando laadt bijvoorbeeld alle inhoud van de /etc/passwd bestand als volgt:

selecteer load_file('/etc/passwd')
  • outfile

Op dezelfde manier schrijft de outfile-functie inhoud naar de lokale serverbestanden. Aanvallers kunnen deze functie gebruiken om als volgt een payload naar het bestand op de server te schrijven:

selecteer 'Local File SQL Injection' in outfile '/tmp/file.txt';
cat /tmp/file.txt

Uitgang:

Lokaal bestand SQL-injectie
  • dumpfile

Deze functie gebruikt de geselecteerde oorzaak om naar het bestand te schrijven zonder de uitvoer naar het scherm terug te sturen.

cat /tmp/file.txt
selecteer 'Hallo wereld!' in dumpfile '/tmp/world';

Uitgang:

Query OK, 1 rij beïnvloed (0,001 sec)

U kunt deze functies uitschakelen door het FILE-privilege als volgt in te trekken:

FILE intrekken op *.* van 'user_name'@'localhost';

Verwant: Een beginnershandleiding voor Metasploit in Kali Linux (met praktische voorbeelden)

4. Standaardpoort uitschakelen

We weten dat MySQL-services op poort 3306 draaien en dat aanvallers de poorten scannen om services te controleren die op het netwerk draaien. Om beveiliging door onduidelijkheid toe te voegen en de standaard MySQL-poort te wijzigen door de systeemvariabele poort in het hoofdconfiguratiebestand te bewerken, moet u het volgende invoeren:

vim /etc/mysql/my.cnf
poort=XXXX
sudo-service mysql opnieuw opstarten

5. Vermijd jokertekens in accountnamen

Accountnamen in MySQL bestaan ​​uit twee delen: een gebruiker en een hostnaam "gebruikersnaam"@"hostnaam". Hiermee kan de beheerder accounts maken voor de gebruikers met dezelfde naam die verbinding maken vanaf verschillende hosts. Het hostgedeelte van een accountnaam staat echter conventies met jokertekens toe die vanaf elke locatie een toegangspunt tot de database kunnen zijn.

Het optionele gebruik van de hostnaam of IP-adreswaarde is gelijk aan 'user_name'@'%' waarbij het % overeenkomt met de MySQL-patroonovereenkomst LIKE-bewerking en % een willekeurige hostnaam betekent. Ondertussen betekent toegang vanaf de '192.168.132.%' elke poging van het klasse C-netwerk. Bovendien heeft iedereen toegang tot de database door het hostgedeelte '192.18.132.mysql.com' te noemen.

Om dergelijke pogingen te voorkomen, maakt MySQL het mogelijk een netmasker met de hostwaarde te definiëren om de netwerkbits van een IP-adres te identificeren:

client-ip_add & netmask = hostnaam

De syntaxis om een ​​hostnaam aan te maken is host_ip/netmask:

MAAK GEBRUIKER 'jhon'@'192.168.132.0/255.255.255.0'; 

De bovenstaande hostwaarde stelt de gebruiker in staat John om toegang te krijgen tot de database vanaf elk IP binnen het bereik van 192.168.132.0-192.168.132.255. Evenzo zullen de hostwaarden van 192.168.132.0/255.0.0.0, 192.168.132.0/255.255.0.0 hosts van de klasse A- en B-netwerken toestaan. Terwijl 192.168.132.5 alleen toegang vanaf het specifieke IP-adres toestaat.

6. Expliciete toegang uitschakelen

De gebruikersnaam in MySQL is ofwel een naam waarmee de databases inkomende verbindingen accepteren of een lege gebruikersnaam "@"hostnaam" die een anonieme gebruiker creëert. De aanwezigheid van een anonieme gebruiker kan echter aanvallers gebruiken om toegang te krijgen tot de databaseserver. Trouwens, MySQL-versies vóór MySQL 5.7 maken een anonieme set gebruikers aan, en installatie na versie-upgrade voegt deze gebruikers nog steeds toe.

selecteer gebruiker, host, wachtwoord van mysql.user waar gebruiker zoals '';

U kunt opmerken dat de gebruikers- en wachtwoordkolommen leeg zijn en dat de toegang beperkt is tot localhost. U wilt echter niet dat iemand toegang heeft tot de database. Gebruik de volgende opdracht om anonieme gebruikers te verwijderen:

drop gebruiker " "@"localhost"
doorspoelrechten;

7. Niet-rootaccount instellen als eigenaar of groep

Het instellen van een niet-rootgebruikersaccount is niet gerelateerd aan de MySQL-rootgebruiker. MySQL-installatie in Linux/Unix-systemen van tar- en tar.gz-pakketten zorgt ervoor dat de server kan worden uitgevoerd door elke minder bevoorrechte gebruiker. Dit is een veiligheidsnadeel omdat elke gebruiker met de FILE-toekenningsoptie bestanden op de server kan bewerken of maken. Het retourneert echter een fout wanneer een gebruiker toegang probeert te krijgen zonder de -gebruiker=root fout.

U kunt dit voorkomen door de vuistregel te gebruiken om als afzonderlijke Linux-gebruiker toegang te krijgen tot de databaseserver. Om mysqld als een gewone Linux-gebruiker uit te voeren, stopt u de server en wijzigt u lees-/schrijfrechten van de MySQl-server naar mysql, als volgt:

chown -R mysql /path/to/mysql/datadir

Open het MySQL-hoofdconfiguratiebestand, voeg een nieuwe mysql-gebruiker toe en start de service opnieuw om onnodige servertoegang te voorkomen:

vim /etc/mysql/my.cnf
gebruiker=mysql
sudo-service mysql opnieuw opstarten

8. Wachtwoord instellen voor root-account

MySQL-installatie via een interactieve shell in op Debian gebaseerde Linux-distributies maakt het root-gebruikersaccount aan en vraagt ​​u om een ​​wachtwoord in te stellen. Dit gebeurt echter niet bij niet-interactieve shell-installatie en op Red-Hat gebaseerde distributies. Zoals hierboven vermeld, kan een niet-rootgebruiker van een Linux-machine toegang krijgen tot het mysql-rootgebruikersaccount door gebruik te maken van de -gebruiker=root optie. U kunt dit voorkomen door het wachtwoord als volgt in te stellen:

sudo mysqladmin wachtwoord
vim /etc/mysql/my.cnf
wachtwoord=
sudo-service mysql opnieuw opstarten

9. Zorg voor gegevenscodering tijdens transport en in rust

De standaard niet-versleutelde communicatie tussen de client en de server vormt een risico op onderschepping van gegevens door een man-in-the-middle. Evenzo brengen niet-versleutelde gebruikersgegevens in de database de vertrouwelijkheid en integriteit van de gebruiker in gevaar. MySQL ondersteunt gegevenscodering tussen de client en de server via het TLS/SSL-protocol, terwijl niet-versleutelde communicatie alleen acceptabel is als beide communicerende partijen zich binnen hetzelfde netwerk bevinden.

MySQL ondersteunt nu encryptie in rust om gegevens die op de server zijn opgeslagen te beschermen, zelfs wanneer het systeem wordt geschonden.

Geavanceerde MySQL-beveiliging: bescherm uzelf

Ervoor zorgen dat u het hoogste niveau van online beveiliging heeft, is van cruciaal belang, en dit artikel heeft u enkele nuttige aanwijzingen in de goede richting gegeven. De bovenstaande stappen zijn handig voor het beveiligen van uw databaseserver, maar het is ook essentieel om te leren hoe u minimale machtigingen toewijst aan gebruikers zonder beheerdersrechten.

Beginnersgids voor het schrijven van mySQL-databaseschema's

Maak uw eigen mySQL-database met alleen een teksteditor en dit basisstructuuroverzicht, of 'schema'.

Lees volgende

DelenTweetenE-mail
Gerelateerde onderwerpen
  • Programmeren
  • Beveiliging
  • Programmeren
  • Beveiligingstips
  • Beveiliging
Over de auteur
Rumaisa Niazi (15 artikelen gepubliceerd)

Rumaisa is freelance schrijver bij MUO. Ze heeft veel hoeden gedragen, van wiskundige tot liefhebber van informatiebeveiliging, en werkt nu als SOC-analist. Haar interesses omvatten lezen en schrijven over nieuwe technologieën, Linux-distributies en alles wat met informatiebeveiliging te maken heeft.

Meer van Rumaisa Niazi

Abonneer op onze nieuwsbrief

Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!

Klik hier om je te abonneren