MySQL-installationssikkerhed er noget, der bør huskes på enhver MySQL DBA. Selvom vi har diskuteret, hvordan du skal tage vare på din MySQL-sikkerhed som helhed (se nogle af vores tidligere indlæg, specifikt MySQL-sikkerhedsserien Part One og Part Two), har vi ikke diskuteret specifikke sikkerhedsrelaterede problemer, herunder de problemer relateret til privilegier. Det gør vi her.
Hvad er privilegier i MySQL?
Privilegier i MySQL kan gives til konti. Hvis du giver kontorettigheder i MySQL, bestemmer du, hvilke handlinger kontoen kan udføre. Privilegier kan gives til enten databaser eller databaseobjekter (tabeller, indekser, visninger osv.). Privilegier kan også være dynamiske eller statiske. Statiske privilegier er indbygget i serveren, mens dynamiske privilegier kan defineres under kørsel.
Sådan gør du brug af privilegier til MySQL-sikkerhed
For at gøre brug af privilegier i MySQL er dette, hvad du skal huske:
-
For at tildele eller tilbagekalde privilegier skal du have en MySQL-bruger. Brugere kan oprettes ved at køre en CREATE USER-forespørgsel:
CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;
-
For at tildele eller tilbagekalde privilegier skal du bruge henholdsvis GRANT- og REVOKE-erklæringerne:
GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’; REVOKE INSERT ON *.* FROM ‘demouser’@’localhost’;
-
Du kan gemme privilegier ved at køre FLUSH PRIVILEGES. Se dem ved at køre SHOW GRANTS.
-
GRANT-erklæringen kan ikke bruges til at tildele både privilegier og roller; erklæringen skal give enten privilegier eller roller.
For at gøre din MySQL-installation mere sikker, skal du overveje følgende:
-
Giv kun dine brugere de nødvendige rettigheder til at udføre deres opgaver (brug f.eks. ikke GIV ALLE, hvis det er ikke nødvendigt)
-
Generelt undgå at køre MySQL som en Unix root-bruger, fordi enhver bruger med FILE-privilegiet er i stand til at forårsage serveren til at oprette filer som root.
-
Giv ikke FILE-privilegiet til brugere, der ikke er administratorer (se forklaringen ovenfor)
-
Overvej at køre mysqld som en almindelig uprivilegeret bruger.
-
Giv ikke PROCESS- eller SUPER-rettigheder til brugere, der ikke er administratorer. PROCESS-privilegiet giver brugeren mulighed for at se alle processer, der kører i MySQL. SUPER-privilegiet muliggør blandt andet serverkonfigurationsændringer, muliggør brug af CREATE SERVER-, ALTER SERVER- og DROP SERVER-sætningerne og muliggør også brug af KILL-sætningen, der lader brugeren dræbe sætninger, der tilhører andre konti. Husk, at MySQL reserverer en ekstra forbindelse til brugere, der har SUPER-privilegiet. SUPER-privilegiet lader også en bruger kontrollere replikeringsservere.
Følg rådene ovenfor, og du burde være godt på vej til en mere sikker MySQL-installation. Men hvis du bruger en nyere version af MySQL, er der endnu en ting, som vi skal have dig til at være opmærksom på - MySQL har introduceret roller i MySQL 8.0.16.
Roller i MySQL-sikkerhed
Hvis du aldrig har hørt om roller i MySQL, skal du ikke bekymre dig. Roller minder meget om privilegier, og derfor har vi inkluderet dem i dette blogindlæg. Faktisk er roller netop det - de er samlinger af privilegier, dvs. når en rolle er tildelt en bruger, tildeles en bruger alle privilegier, der er forbundet med den pågældende rolle. Roller kan tilføjes og fjernes ved hjælp af CREATE ROLE- og DROP ROLE-sætningerne. For at gøre brug af roller i MySQL skal du oprette et rollenavn, give privilegier til den rolle og derefter tildele den til en bruger som denne:
CREATE ROLE [IF NOT EXISTS] ‘role_1’;
GRANT SELECT ON db_name.* TO user_name;
GRANT role_1 TO [email protected];
Hvilke privilegier bør du give?
Når du tildeler privilegier, skal du følge princippet om mindste privilegium:en MySQL-konto bør kun tildeles privilegier, der kræves til dens formål. De mest almindeligt anvendte privilegier er:
-
ALLE PRIVILEGIER, som giver alle privilegier til en konto.
-
CREATE giver de nødvendige rettigheder til at oprette databaser og tabeller.
-
DROP giver de nødvendige rettigheder til at slette databaser og tabeller.
-
DELETE giver de nødvendige rettigheder til at slette rækker fra tabeller.
-
INSERT giver de nødvendige rettigheder til at indsætte rækker i tabeller.
-
SELECT giver de nødvendige rettigheder til at køre SELECT-forespørgsler.
-
UPDATE giver de nødvendige rettigheder til at opdatere rækker i en tabel (for at køre OPDATERINGsforespørgsler)
Generelt er det en god idé at undgå at give alle privilegier til en konto; overvej i stedet at følge princippet om mindste privilegium. Husk også, at tildeling af yderligere privilegier til en bestemt bruger ikke fjerner privilegier, der var på plads tidligere. Du kan også se privilegierne for en bestemt bruger ved at bruge denne syntaks (erstat brugernavn med brugernavnet på din bruger):
SHOW GRANTS FOR ‘username’;
Oversigt
Når du beskæftiger dig med privilegier i MySQL, skal du huske på, at du skal følge princippet om mindste privilegium (dvs. kun give privilegier, der er nødvendige). At følge rådene, der er skitseret i denne blog, skulle hjælpe med at gøre din MySQL-installation mere sikker. Husk, at dine privilegier skal gemmes for at træde i kraft (FLUSH PRIVILEGES-erklæringen kan hjælpe dig med at gøre det), husk desuden, at du fra MySQL 8.0.16 kan gøre brug af roller i MySQL til at tildele sæt privilegier til en specifik bruger.
Vi håber, at dette blogindlæg har hjulpet dig med at sikre din(e) MySQL-instans(er). Hvis du har spørgsmål eller tanker, er du velkommen til at kommentere, overvej også at se vores MySQL-sikkerhedsserie igennem (her og her)