Telkens wanneer applicatiebeveiliging wordt genoemd, denken mensen aan het beveiligen van applicaties tegen enkele van de meest voorkomende aanvallen, zoals injectie, verbroken authenticatie, blootstelling aan gevoelige gegevens en dergelijke. Hoewel deze aanvallen veel voorkomen, is het niet voldoende om te weten hoe u uw toepassing er alleen tegen kunt beschermen, vooral niet wanneer u MySQL gebruikt. Vandaag gaan we kijken naar een andere kant van beveiliging - we gaan onderzoeken hoe we MySQL goed kunnen beveiligen.
Omdat MySQL-beveiliging een behoorlijk groot iets is, moet u dit bericht beschouwen als het begin van een reeks berichten over MySQL-beveiligingsmaatregelen. We zullen niet alles behandelen, maar dit bericht zou de basis moeten vormen van enkele van de beveiligingsmaatregelen van MySQL.
Waarom moet u MySQL beveiligen?
Allereerst moeten we de vraag beantwoorden waarom we MySQL willen beveiligen. Als we onze applicatie beveiligen tegen de meest voorkomende bedreigingen, moeten we toch veilig zijn? Nou ja en nee.
Zie je, als je je applicatie beveiligt tegen bepaalde aanvallen, zorg je ervoor dat de aanvallers het moeilijker hebben om de verdediging van je applicatie binnen te dringen - om je database te beveiligen, zal bescherming tegen dergelijke aanvallen niet voldoende zijn. Het beveiligen van uw database kan de laatste druppel zijn die uw toepassing (en uw database!) van vernietiging zou kunnen redden.
Hoe beveilig ik MySQL?
Nu, op naar de brandende vraag. Hoe beveilig je MySQL eigenlijk?
Als je nadenkt over de beveiliging van je MySQL-instantie(s), moet je een breed scala aan mogelijke opties overwegen. Gelukkig zijn sommige van die opties niet eens beperkt tot MySQL, wat betekent dat ze ook in andere scenario's van toepassing zullen zijn! We beginnen met de algemene dingen.
MySQL-beveiliging - algemeen
Houd er bij het beveiligen van MySQL rekening mee dat het gebruikmaakt van op beveiliging gebaseerde toegangsbeheerlijsten (ACL's) voor bewerkingen die door gebruikers worden uitgevoerd (toegangscontrolelijsten zijn een lijst met machtigingen die aan een object zijn gekoppeld). Hier leest u hoe u een aantal van de meest elementaire beveiligingsproblemen kunt oplossen:
- Beveilig het oorspronkelijke MySQL-account - dit is heel duidelijk, maar je moet ervoor zorgen dat het root-account een wachtwoord heeft. Het root-account kan al dan niet een wachtwoord hebben wanneer MySQL voor het eerst wordt geïnstalleerd - u kunt erachter komen wat het wachtwoord is door het foutenlogboek te controleren en het desgewenst naar een sterker wachtwoord te wijzigen. Alle andere accounts zouden ook wachtwoorden moeten hebben.
- Sla wachtwoorden nooit op in MySQL-databases als platte tekst - gebruik een eenrichtings-hashfunctie zoals BCrypt.
- Geen gebruikers toegang geven tot de gebruikerstabel in de mysql-database (de rootgebruiker is een uitzondering).
Maak uzelf ook vertrouwd met toegangscontrole en accountbeheer in MySQL. Dit onderwerp verdient op zich een heel boek, maar de basisdingen die je moet weten zijn:
- Toegang beheren in MySQL;
- Gebruikers maken, wijzigen en verwijderen;
- Toekennen en intrekken van rechten aan en van gebruikers;
- Weten hoe te controleren welke rechten zijn toegewezen;
- Welke accountcategorieën zijn;
- Wat gereserveerde accounts zijn;
- Wat zijn de rollen;
- Hoe wachtwoordbeheer werkt;
- Hoe accountvergrendeling werkt;
- Een blik werpen op de beveiligingsplug-ins die worden aangeboden door MySQL;
- Weten hoe je MySQL-back-ups kunt beveiligen.
Wat de MySQL-beveiliging betreft, moeten back-ups ook worden gedekt.
Nu gaan we elk van deze opties nader bekijken.
Toegang beheren in MySQL
- Zoals hierboven al opgemerkt, geef nooit accounts, behalve het root-account, toegang tot de gebruikerstabel in de mysql-database;
- Zorg ervoor dat alle bestaande MySQL-accounts alleen de privileges gebruiken die ze absoluut nodig hebben om hun acties uit te voeren.
Gebruikers maken, wijzigen en verwijderen in MySQL
In MySQL kunnen gebruikers worden aangemaakt door de CREATE USER-query uit te voeren:
CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;
Gebruikers kunnen worden gewijzigd door de ALTER USER-query uit te voeren - met de query kunt u veel verschillende dingen doen, waaronder het vergrendelen en ontgrendelen van accounts, vereisen dat het account verbinding maakt via SSL, het maximale aantal verbindingen per uur tot stand brengen, oude wachtwoorden verwijderen, enz. Hier is een voorbeeldquery waarmee u uw eigen wachtwoord kunt wijzigen:
ALTER USER USER() IDENTIFIED BY ‘password’;
Gebruikers kunnen worden verwijderd door de DROP USER-query uit te voeren:
DROP USER ‘demouser’@’localhost’;
Bevoegdheden toekennen en intrekken aan en van gebruikers in MySQL
De GRANT-instructie moet privileges of rollen toekennen. Het ON-statement kan u vertellen of privileges of rollen worden toegekend. De volgende zoekopdracht verleent privileges:
GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’;
De volgende zoekopdracht kent rollen toe:
GRANT ‘demo_role’ TO ‘demouser’@’localhost’;
GRANT zou moeten reageren met Query OK, 0 rijen beïnvloed.
Om bepaalde rechten van gebruikers in te trekken, gebruikt u de REVOKE-instructie (het hostnaamgedeelte van de accountnaam is standaard "%"):
REVOKE SELECT ON *.* FROM ‘demouser’@’localhost’;
Om alle privileges in te trekken, kan REVOKE ALL worden gebruikt:
REVOKE ALL PRIVILEGES ON *.* FROM ‘demouser’@’localhost’;
Misschien wilt u een FLUSH PRIVILEGES uitgeven; verklaring na het uitvoeren van de bovenstaande stappen.
Controleren welke rechten zijn toegewezen in MySQL
- Om te controleren welke privileges zijn toegewezen, geeft u de SHOW GRANTS toe; verklaring.
- Voor elk verzoek dat wordt gedaan, bepaalt de server de bewerking die u wilt uitvoeren en controleert vervolgens of uw rechten voldoende zijn om de betreffende bewerking uit te voeren.
- De server gebruikt de gebruikers- en db-tabellen in de mysql-database om toegangscontrole te garanderen.
- De gebruikers- en global_grants-tabellen verlenen globale privileges.
De rest van de opties zal worden behandeld in komende berichten.
Samenvatting
Wat betreft MySQL-beveiliging heeft u een zeer breed scala aan opties om uit te kiezen. De opties omvatten basisbeveiligingsmaatregelen die van toepassing kunnen zijn op vrijwel alle toepassingen, maar sommige opties zijn vrij specifiek voor MySQL. Houd er rekening mee dat nog niet alle beschikbare opties zijn behandeld - ze zullen ook worden besproken in de komende edities van de MySQL-beveiligingsserie.