Veel bekende aanvallen zijn alleen mogelijk als ze fysiek toegang hebben tot een machine. Om deze reden is het het beste om de applicatieserver en de databaseserver op verschillende machines te hebben. Als dit niet mogelijk is, moet er meer op worden gelet. Anders kan een aanvaller, door externe opdrachten uit te voeren via een toepassingsserver, uw database beschadigen, zelfs zonder toestemming. Om deze reden moet elke service die op dezelfde machine als de database draait, de laagst mogelijke toestemming krijgen waarmee de service nog steeds kan werken.
Vergeet niet het hele beveiligingspakket te installeren:antivirus en antispam, firewall en alle beveiligingspakketten die worden aanbevolen door de leverancier van uw besturingssysteem. Vergeet ook niet 10 minuten te besteden aan de fysieke locatie van uw server - op de verkeerde locatie kan uw server worden gestolen, overstroomd, beschadigd door wilde dieren of zwervers.
Overweeg of MySQL van het systeem wordt opgehaald of rechtstreeks vanaf de eigen server wordt benaderd. Als er gebruik wordt gemaakt van externe toegang, garandeer dan dat alleen gekarakteriseerde hosts de server kunnen bereiken. Dit wordt meestal gedaan via TCP-wrappers, IP-tabellen of andere hulpprogramma's voor firewallprogrammering of hardwaretoegankelijkheid.
Om te voorkomen dat MySQL een netwerksocket opent, moet de bijbehorende parameter worden opgenomen in het [mysqld]-gebied van my.cnf of my.ini:
skip-netwerken
Het document bevindt zich in de "C:\Program Files\MySQL\MySQL Server 5.1" catalogus op het Windows-besturingssysteem of "/etc/my.cnf" of "/etc/mysql/my.cnf" op Linux.
Deze regel verlamt de start van systeembeheer tijdens het opstarten van MySQL. Het zou ideaal zijn als u er rekening mee houdt dat een lokale verbinding kan worden gebruikt om een verbinding met de MySQL-server op te zetten.
Een andere mogelijke oplossing is om MySQL te dwingen alleen naar de localhost te luisteren door de volgende regel toe te voegen aan de [mysqld] sectie van my.cnf bind-adres=127.0.0.1
U bent misschien niet bereid om de systeemtoegang tot uw databaseserver uit te schakelen als clients in uw organisatie een interface hebben met de server vanaf hun machines of de webserver die op een andere computer is geïntroduceerd. In dat geval moet de volgende beperkende syntaxis worden overwogen:
mysql> GRANT SELECT, INSERT ON mydb.\* TO 'someuser'@'somehost';
De volgende wijziging is het uitschakelen van het gebruik van de "LOAD DATA LOCAL INFILE" commando, wat zal helpen om niet-goedgekeurde inzage in buurtgegevens te voorkomen. Dit is met name van belang wanneer nieuwe SQL Injection-kwetsbaarheden in PHP-applicaties worden gevonden.
Bovendien, in bepaalde gevallen, de "LOCAL INFILE" commando kan worden gebruikt om toegang te krijgen tot andere bestanden op het besturingssysteem, bijvoorbeeld "/etc/passwd" , met het volgende commando:
mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1
Of zelfs aanzienlijk minder moeilijk:
mysql> SELECT load\_file("/etc/passwd")
Het gebruik van het "LOCAL INFILE" uitschakelen commando, moet de volgende parameter worden toegevoegd in de [mysqld] gedeelte van het MySQL-configuratiebestand.
set-variable=local-infile=0
De standaard gebruikersnaam van de beheerder op de MySQL-server is "root" . Hackers proberen vaak toegang te krijgen tot de machtigingen. Om deze taak moeilijker te maken, hernoem je "root" naar iets anders en geef het een lang, complex alfanumeriek wachtwoord.
Gebruik de opdracht hernoemen in de MySQL-console om de gebruikersnaam van de beheerder te hernoemen:
mysql> RENAME USER root TO new\_user;
De MySQL "RENAME USER" commando verscheen voor het eerst in MySQL versie 5.0.2. Als u een oudere versie van MySQL gebruikt, kunt u andere opdrachten gebruiken om de naam van een gebruiker te wijzigen:
mysql> use mysql;
mysql> update user set user="new\_user" where user="root";
mysql> flush privileges;
Gebruik de volgende opdrachtregelopdracht om het wachtwoord van een gebruiker te wijzigen:
mysql> SET PASSWORD FOR 'username'@'%hostname' = PASSWORD('newpass');
Het is ook mogelijk om het wachtwoord te wijzigen met de "mysqladmin" hulpprogramma:
shell> mysqladmin -u username -p password newpass
MySQL wordt geleverd met een "test"-database die bedoeld is als testruimte. Het is toegankelijk voor de anonieme gebruiker en wordt daarom gebruikt door tal van aanvallen.
Gebruik het drop-commando als volgt om deze database te verwijderen:
mysql> drop database test;
Of gebruik de "mysqladmin" commando:
shell> mysqladmin -u username -p drop test
De MySQL-database wordt geleverd met enkele anonieme gebruikers met lege wachtwoorden. Als gevolg hiervan kan iedereen verbinding maken met de database om te controleren of dit het geval is, doe het volgende:
mysql> select \* from mysql.user where user="";
In een beveiligd systeem mogen geen regels worden teruggestuurd. Een andere manier om hetzelfde te doen:
mysql> SHOW GRANTS FOR ''@'localhost';
mysql> SHOW GRANTS FOR ''@'myhost';
Als de subsidies bestaan, kan iedereen toegang krijgen tot de database en op zijn minst de standaarddatabase gebruiken"test" . Controleer dit met:
shell> mysql -u blablabla
Voer de volgende opdracht uit om het account te verwijderen:
mysql> DROP USER "";
De MySQL "DROP USER" commando wordt ondersteund vanaf MySQL versie 5.0. Als u een oudere versie van MySQL gebruikt, kunt u het account als volgt verwijderen:
mysql> use mysql;
mysql> DELETE FROM user WHERE user="";
mysql> flush privileges;
Een veel voorkomende aanbeveling voor databasebeveiliging is om de machtigingen die aan verschillende partijen worden gegeven, te verlagen. MySQL is niet anders. Wanneer ontwikkelaars werken, gebruiken ze doorgaans de maximale toestemming van het systeem en houden ze minder rekening met toestemmingsprincipes dan we zouden verwachten. Deze praktijk kan de database blootstellen aan aanzienlijke risico's.
* Elke nieuwe MySQL 5.x-installatie die al is geïnstalleerd met de juiste beveiligingsmaatregelen.
Om uw database te beschermen, moet u ervoor zorgen dat de bestandsdirectory waarin de MySQL-database daadwerkelijk is opgeslagen, eigendom is van de gebruiker "mysql" en de groep "mysql".
shell>ls -l /var/lib/mysql
Zorg er daarnaast voor dat alleen de gebruiker "mysql" en "root" toegang hebben tot de directory /var/lib/mysql
.
De binaire bestanden van mysql, die zich onder de map /usr/bin/ bevinden, moeten eigendom zijn van "root" of de specifieke systeemgebruiker "mysql". Andere gebruikers zouden geen schrijftoegang tot deze bestanden moeten hebben.
shell>ls -l /usr/bin/my\*
De machtigingen voor het besturingssysteem zijn in de vorige sectie opgelost. Laten we het nu hebben over databaserechten. In de meeste gevallen is er een beheerdergebruiker (de hernoemde "root") en een of meer daadwerkelijke gebruikers die naast elkaar in de database bestaan. Meestal heeft de "root" niets te maken met de gegevens in de database; in plaats daarvan wordt het gebruikt om de server en zijn tabellen te onderhouden, om machtigingen te geven en in te trekken, enz.
Aan de andere kant worden sommige gebruikers-ID's gebruikt om toegang te krijgen tot de gegevens, zoals de gebruikers-ID die aan de webserver is toegewezen om "select\update\insert\delete"-query's uit te voeren en om opgeslagen procedures uit te voeren. In de meeste gevallen zijn er geen andere gebruikers nodig; alleen u, als systeembeheerder, kan echter echt de behoeften van uw toepassing kennen.
Alleen beheerdersaccounts moeten de SUPER / PROCESS / FILE-rechten en toegang tot de mysql-database krijgen. Meestal is het een goed idee om de beheerdersrechten voor toegang tot de gegevens te verlagen.
Controleer de privileges van de rest van de gebruikers en zorg ervoor dat deze correct zijn ingesteld. Dit kan met behulp van de volgende stappen.
mysql> use mysql;
[Gebruikers identificeren]
mysql> select \* from users;
[Lijst subsidies van alle gebruikers]
mysql> show grants for ‘root’@’localhost’;
Het bovenstaande statement moet voor elke gebruiker worden uitgevoerd! Merk op dat alleen gebruikers die echt root-rechten nodig hebben, deze mogen worden verleend.
Een ander interessant voorrecht is "SHOW DATABASES". Standaard kan de opdracht worden gebruikt door iedereen die toegang heeft tot de MySQL-prompt. Ze kunnen het gebruiken om informatie te verzamelen (bijvoorbeeld het verkrijgen van databasenamen) voordat ze de database aanvallen door bijvoorbeeld de gegevens te stelen. Om dit te voorkomen, is het raadzaam de hieronder beschreven procedures te volgen.
- Voeg " --skip-show-database" toe aan het opstartscript van MySQL of voeg het toe aan het MySQL-configuratiebestand
- Verleen het recht SHOW DATABASES alleen aan de gebruikers die deze opdracht willen gebruiken
Om het gebruik van de opdracht "SHOW DATABASES" uit te schakelen, moet de volgende parameter worden toegevoegd in de sectie [mysqld] van de /etc/my.cnf
:
[mysqld]
skip-show-database
Als uw databaseserver niet veel query's uitvoert, is het raadzaam transactieregistratie in te schakelen door de volgende regel toe te voegen aan de sectie [mysqld] van de /etc/my.cnf
bestand:
[mysqld]
log =/var/log/mylogfile
Dit wordt niet aanbevolen voor MySQL-servers met een zware productie, omdat dit een hoge overhead op de server veroorzaakt.
Controleer daarnaast of alleen de "root"- en "mysql"-id's toegang hebben tot deze logbestanden (ten minste schrijftoegang).
Foutenlogboek Zorg ervoor dat alleen "root" en "mysql" toegang hebben tot het logbestand "hostname.err". Het bestand wordt opgeslagen in de mysql-gegevensmap. Dit bestand bevat zeer gevoelige informatie zoals wachtwoorden, adressen, tabelnamen, opgeslagen procedurenamen en codeonderdelen. Het kan worden gebruikt voor het verzamelen van informatie en in sommige gevallen kan het de aanvaller voorzien van de informatie die nodig is om de database, de machine waarop de database is geïnstalleerd of de gegevens erin te misbruiken.
MySQL-logboek Zorg ervoor dat alleen "root" en "mysql" toegang hebben tot het logbestand "logfile XY". Het bestand wordt opgeslagen in de mysql-gegevensmap.
Een chroot op UNIX {besturingssysteem}-besturingssystemen is een bewerking die de schijnbare schijfhoofdmap verandert voor de huidige actieve methode en zijn kinderen. Een programma dat opnieuw is geroot naar een andere map, heeft geen toegang tot bestanden buiten die map en kan deze geen naam geven, en daarom wordt de map een "chroot-gevangenis" of (minder vaak) een "chroot-gevangenis" genoemd.
Door gebruik te maken van de chroot-omgeving kan de schrijftoegang van de mySQL-processen (en onderliggende processen) worden beperkt, waardoor de beveiliging van de server toeneemt.
Zorg ervoor dat er een speciale map bestaat voor de gechroote omgeving. Dit zou zoiets moeten zijn als:/chroot/mysql
Om het gebruik van de databasebeheertools gemakkelijk te maken, moet bovendien de volgende parameter worden gewijzigd in het [client]-gedeelte van het MySQL-configuratiebestand:
[klant]
socket = /chroot/mysql/tmp/mysql.sock
Dankzij die regel code is het niet nodig om de opdrachten mysql, mysqladmin, mysqldump enz. te voorzien van de --socket=/chroot/mysql/tmp/mysql.sock
parameter elke keer dat deze tools worden uitgevoerd.
Tijdens de installatieprocedures zijn er tal van gevoelige gegevens die ongewenste gebruikers zullen helpen een database aan te vallen. Deze gegevens worden bewaard in de geschiedenis van de server en kunnen erg handig zijn als er iets misgaat tijdens de installatie. Door de geschiedenisbestanden te analyseren, kunnen beheerders achterhalen wat er is misgegaan en waarschijnlijk dingen oplossen. Deze bestanden zijn echter niet nodig nadat de installatie is voltooid.
We moeten de inhoud van het MySQL-geschiedenisbestand (~/.mysql_history) verwijderen, overal waar alle dode SQL-commando's worden bewaard (vooral wachtwoorden, die als platte tekst worden bewaard):
cat /dev/null > ~/.mysql\_history
Tot slot moeten we de nadruk leggen op databasebeveiliging. Het zou echter het eerste moeten zijn voor een persoon of een bedrijf.