Når applikationssikkerhed nævnes, tænker folk på at sikre applikationer mod nogle af de mest hyppige angreb, såsom injektion, brudt godkendelse, eksponering af følsomme data og lignende. Men selvom disse angreb er fremherskende, vil det ikke være tilstrækkeligt at vide, hvordan du beskytter din applikation mod dem alene - især når du kører MySQL. I dag skal vi se på en anden side af sikkerhed - vi skal se på, hvordan man korrekt sikrer MySQL.
Da MySQL-sikkerhed er en ret stor ting, skal du behandle dette indlæg som starten på en række indlæg vedrørende MySQL-sikkerhedsforanstaltninger. Vi vil ikke dække alt, men dette indlæg bør danne grundlaget for nogle af MySQL's sikkerhedsforanstaltninger.
Hvorfor skal du sikre MySQL?
Først og fremmest skal vi besvare spørgsmålet, hvorfor vi ønsker at sikre MySQL. Når alt kommer til alt, hvis vi sikrer vores applikation mod de mest udbredte trusler, burde vi være sikre, ikke? Nå, ja og nej.
Du kan se, når du sikrer din applikation mod bestemte angreb, sørger du for, at angriberne har sværere ved at trænge ind i forsvaret af din applikation - for at sikre din database vil beskyttelse mod sådanne angreb dog ikke være tilstrækkeligt. Sikring af din database kan være dråben, der kan redde din applikation (og din database!) fra ødelæggelse.
Hvordan sikrer jeg MySQL?
Nu til det brændende spørgsmål. Hvordan sikrer man egentlig MySQL?
Når du tænker på sikkerheden af din(e) MySQL-instans(er), bør du overveje en lang række mulige muligheder. Heldigvis er nogle af disse muligheder ikke engang begrænset til MySQL, hvilket betyder, at de også vil være anvendelige i andre scenarier! Vi starter med de generelle ting.
MySQL-sikkerhed - Generelt
Når du sikrer MySQL, skal du huske på, at den bruger sikkerhedsbaserede adgangskontrollister (ACL'er) til handlinger udført af brugere (adgangskontrollister er en liste over tilladelser knyttet til et objekt). Sådan tager du dig af et par af de mest grundlæggende sikkerhedsproblemer:
- Beskyt den oprindelige MySQL-konto - dette er meget indlysende, men du bør sikre dig, at root-kontoen har en adgangskode. Root-kontoen har måske eller ikke har en adgangskode, når MySQL først installeres - du kan finde ud af, hvad adgangskoden er ved at tjekke fejlloggen og derefter ændre den til en stærkere, hvis du ønsker det. Alle de andre konti bør også have adgangskoder.
- Gem aldrig adgangskoder i nogen MySQL-databaser i almindelig tekst - brug en envejs-hash-funktion som BCrypt.
- Giv ikke nogen brugere adgang til brugertabellen i mysql-databasen (rodbrugeren er en undtagelse).
Læn dig også med adgangskontrol og kontostyring i MySQL. Dette emne fortjener en hel bog i sig selv, men de grundlæggende ting, du bør vide, inkluderer:
- Styring af adgang i MySQL;
- Oprettelse, ændring og fjernelse af brugere;
- Tildeling og tilbagekaldelse af privilegier til og fra brugere;
- Ved, hvordan man kontrollerer, hvilke privilegier der er tildelt;
- Hvad kontokategorier er;
- Hvad reserverede konti er;
- Hvad roller er;
- Sådan fungerer adgangskodeadministration;
- Sådan fungerer kontolåsning;
- Et blik på sikkerhedsplugins, der tilbydes af MySQL;
- Ved, hvordan man sikrer MySQL-sikkerhedskopier.
For så vidt angår MySQL-sikkerhed, bør sikkerhedskopier også være dækket.
Nu vil vi se nærmere på hver af disse muligheder.
Styring af adgang i MySQL
- Som allerede nævnt ovenfor, giv aldrig nogen konti, undtagen root-kontoen, adgang til brugertabellen i mysql-databasen;
- Sørg for, at alle eksisterende MySQL-konti kun bruger de privilegier, som de absolut behøver for at udføre deres handlinger.
Oprettelse, ændring og fjernelse af brugere i MySQL
I MySQL kan brugere oprettes ved at køre CREATE USER-forespørgslen:
CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;
Brugere kan ændres ved at køre ALTER USER-forespørgslen - forespørgslen giver dig mulighed for at gøre mange forskellige ting, herunder at låse og låse konti op, kræve, at kontoen forbinder ved hjælp af SSL, etablere det maksimale antal forbindelser i timen, kassere gamle adgangskoder osv. Her er et eksempel på en forespørgsel, der kan ændre din egen adgangskode:
ALTER USER USER() IDENTIFIED BY ‘password’;
Brugere kan fjernes ved at køre DROP USER-forespørgslen:
DROP USER ‘demouser’@’localhost’;
Tildeling og tilbagekaldelse af privilegier til og fra brugere i MySQL
GRANT-erklæringen skal give enten privilegier eller roller. ON-erklæringen kan fortælle dig, om privilegier eller roller vil blive tildelt. Følgende forespørgsel giver privilegier:
GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’;
Den følgende forespørgsel giver roller:
GRANT ‘demo_role’ TO ‘demouser’@’localhost’;
GRANT skal svare med forespørgsel OK, 0 rækker påvirket.
For at tilbagekalde visse privilegier fra brugere skal du bruge REVOKE-erklæringen (værtsnavndelen af kontonavnet er som standard "%"):
REVOKE SELECT ON *.* FROM ‘demouser’@’localhost’;
For at tilbagekalde alle privilegier kan REVOKE ALL bruges:
REVOKE ALL PRIVILEGES ON *.* FROM ‘demouser’@’localhost’;
Du ønsker måske at udstede en FLUSH PRIVILEGIER; erklæring efter at have udført ovenstående trin.
Tjekker, hvilke privilegier der er tildelt i MySQL
- For at kontrollere, hvilke privilegier der er tildelt, skal du udstede SHOW GRANTS; erklæring.
- For hver anmodning, der udstedes, bestemmer serveren den handling, du vil udføre, og kontrollerer derefter, om dine privilegier er tilstrækkelige nok til at udføre den pågældende handling.
- Serveren bruger bruger- og db-tabellerne i mysql-databasen for at sikre adgangskontrol.
- Bruger- og global_grants-tabellerne giver globale privilegier.
Resten af mulighederne vil blive dækket i kommende indlæg.
Oversigt
Hvad angår MySQL-sikkerhed, har du en meget bred vifte af muligheder at vælge imellem. Mulighederne inkluderer grundlæggende sikkerhedsforanstaltninger, der kan anvendes på stort set alle applikationer, men nogle af mulighederne er ret specifikke for MySQL. Husk, at ikke alle de tilgængelige muligheder er blevet dækket endnu - de vil også blive talt om i kommende udgaver af MySQL-sikkerhedsserien.