MySQL wordt geleverd met een geavanceerde toegangscontrole en privilege systeem om te voorkomen dat onbevoegde cliënten toegang krijgen tot het systeem. Dit systeem, geïmplementeerd als een hiërarchie, maakt het mogelijk om veelomvattende en uitgebreide toegangsregels te creëren die MySQL gebruikt om te beslissen hoe het met een bepaalde gebruikershandeling moet omgaan.
In dit hoofdstuk wordt ingegaan op het MySQL toegangscontrole systeem en geeft een zicht op de MySQL toekenningstabellen (grant tables). Deze tabellen, die integraal deel uitmaken van het beveiligingssysteem van de server, bieden database administrators een groot deel van de kracht en flexibiliteit bij het bepalen van de regels die de toegang tot het systeem regelt. Daarnaast wordt in de dit hoofdstuk ingegaan op het beheer van gebruikersaccounts en wachtwoorden in het MySQL toegangscontrole systeem, waarin wordt uitgelegd hoe wachtwoorden (In het bijzonder het zeer belangrijke ‘root’ password) kan worden gewijzigd en hoe een verloren superuser wachtwoord opnieuw ingesteld kan worden.
De gebruikelijke MySQL server installatie bestaat uit twee niveaus van beveiliging:
- Verbinding met de server is slechts toegestaan indien deze overeenkomt met de toegangsregels bepaald aan de hand van een account, bijvoorbeeld: gebruiker, host (specifiek subnetwerk, IP range), wachtwoord.
- Zodra een verbinding tot stand is gebracht, controleert MySQL elke actie die door een gebruiker wordt uitgevoerd om te controleren of de gebruiker voldoende rechten heeft om het te mogen uitvoeren. Een gebruiker kan worden beperkt tot het uitvoeren van specifieke bewerkingen: SELECT, INSERT, DELETE, UPDATE, … of bepaalde databanken, tabellen, velden of opgeslagen procedures/functies.
De beveiliging van het systeem is verder verbeterd door gebruik te maken van een eenrichtings encryptieschema voor gebruikerswachtwoorden. Nieuwere versies van MySQL ondersteunen ook SSL die gebruikt kan worden om, voor een betere beveiliging, de gegevens te gecodeerd te verzenden over de MySQL client-server verbinding (zoals resultaten van queries).
Als MySQL voor het eerst wordt geïnstalleerd, zorgt MySQL-installer automatisch voor de aanmaak van een databank, de MySQL database, die zes MySQL toekennings tabellen bevat, zoals:
- user: Gebruikersaccounts, globale privileges, niet-priviligeerde kolommen.
- db: Database-niveau privileges.
- tables_priv: Tabel-niveau privileges.
- columns_priv: Kolom-niveau privileges.
- procs_priv: Privilegen met betrekking tot opgeslagen procedures en functies.
- proxies_priv: Proxy-gebruiker privileges.
Elk van deze tabellen heeft een andere rol bij de beslissing of een gebruiker toegang heeft tot een bepaalde database, tabelveld of opgeslagen procedure. Toegangsregels kunnen worden ingesteld op basis van de gebruikersnaam, verbindende gastheer, of opgevraagde database. In de volgende paragrafen wordt elk van deze tabellen in meer detail besproken.
MySQL
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='mysql' and TABLE_NAME = 'user';
(67 row(s) returned)
TABLE_NAME | COLUMN_NAME | COLUMN_TYPE | PRIVILEGES | COLUMN_COMMENT |
db | Host | char(60) | select | insert |
db | Db | char(64) | select | insert |
db | User | char(32) | select | insert |
db | Select_priv | enum(‘N’ | select | |
db | Insert_priv | enum(‘N’ | select | |
db | Update_priv | enum(‘N’ | select | |
db | Delete_priv | enum(‘N’ | select | |
db | Create_priv | enum(‘N’ | select | |
db | Drop_priv | enum(‘N’ | select | |
db | Grant_priv | enum(‘N’ | select | |
db | References_priv | enum(‘N’ | select | |
db | Index_priv | enum(‘N’ | select | |
db | Alter_priv | enum(‘N’ | select | |
db | Create_tmp_table_priv | enum(‘N’ | select | |
db | Lock_tables_priv | enum(‘N’ | select | |
db | Create_view_priv | enum(‘N’ | select | |
db | Show_view_priv | enum(‘N’ | select | |
db | Create_routine_priv | enum(‘N’ | select | |
db | Alter_routine_priv | enum(‘N’ | select | |
db | Execute_priv | enum(‘N’ | select | |
db | Event_priv | enum(‘N’ | select | |
db | Trigger_priv | enum(‘N’ | select | |
user | Host | char(60) | select | insert |
user | User | char(32) | select | insert |
user | Select_priv | enum(‘N’ | select | |
user | Insert_priv | enum(‘N’ | select | |
user | Update_priv | enum(‘N’ | select | |
user | Delete_priv | enum(‘N’ | select | |
user | Create_priv | enum(‘N’ | select | |
user | Drop_priv | enum(‘N’ | select | |
user | Reload_priv | enum(‘N’ | select | |
user | Shutdown_priv | enum(‘N’ | select | |
user | Process_priv | enum(‘N’ | select | |
user | File_priv | enum(‘N’ | select | |
user | Grant_priv | enum(‘N’ | select | |
user | References_priv | enum(‘N’ | select | |
user | Index_priv | enum(‘N’ | select | |
user | Alter_priv | enum(‘N’ | select | |
user | Show_db_priv | enum(‘N’ | select | |
user | Super_priv | enum(‘N’ | select | |
user | Create_tmp_table_priv | enum(‘N’ | select | |
user | Lock_tables_priv | enum(‘N’ | select | |
user | Execute_priv | enum(‘N’ | select | |
user | Repl_slave_priv | enum(‘N’ | select | |
user | Repl_client_priv | enum(‘N’ | select | |
user | Create_view_priv | enum(‘N’ | select | |
user | Show_view_priv | enum(‘N’ | select | |
user | Create_routine_priv | enum(‘N’ | select | |
user | Alter_routine_priv | enum(‘N’ | select | |
user | Create_user_priv | enum(‘N’ | select | |
user | Event_priv | enum(‘N’ | select | |
user | Trigger_priv | enum(‘N’ | select | |
user | Create_tablespace_priv | enum(‘N’ | select | |
user | ssl_type | enum(” | ‘SPECIFIED’) | |
user | ssl_cipher | blob | select | insert |
user | x509_issuer | blob | select | insert |
user | x509_subject | blob | select | insert |
user | max_questions | int(11) unsigned | select | insert |
user | max_updates | int(11) unsigned | select | insert |
user | max_connections | int(11) unsigned | select | insert |
user | max_user_connections | int(11) unsigned | select | insert |
user | plugin | char(64) | select | insert |
user | authentication_string | text | select | insert |
def | user | password_expired | enum(‘N’ | |
def | user | password_last_changed | timestamp | select |
def | user | password_lifetime | smallint(5) unsigned | |
def | user | account_locked | enum |