1. Vad har man användare till?
Man har olika användare för att begränsa handlingsförmågan för olika personer eller program, alltså för att öka säkerheten. MySQLs användarhantering är så pass avancerad att det går att styra på en detaljerad nivå vad du som användare får och inte får göra. Man kan t. ex. begränsa:
- vilka databaser en person kan använda.
- vad en person får göra i databaserna.
- vilka datorer en person kan logga in från.
Jag brukar skapa en ny användare för varje databas med samma namn som databasen och med fulla rättigheter på sin egen databas.
2. Skapa en användare
För att skapa en användare loggar du in som root och använder GRANT. Nedan skapar jag användaren olle:
[olle@dev1]$ /usr/local/mysql/bin/mysql -u root -p
mysql> GRANT ALL
-> ON olles_db.*
-> TO olle@localhost
-> IDENTIFIED BY 'star';
|
Användaren olle kan nu göra vad han vill (alla rättigheter) med databasen olles_db som rootanvändaren har skapat tidigare, se
databaser . Användaren olle har lösenordet "star". Nu testar vi att logga in som olle:
[olle@dev1]$ /usr/local/mysql/bin/mysql -u olle -p
password: star
mysql> use olles_db;
Database changed
mysql> use mysql;
ERROR 1044: Access denied for user: 'olle@localhost' to database 'mysql'
mysql> use test;
Database changed
|
Vi ser att då olle försöker logga in på systemdatabasen mysql misslyckas han. Däremot går det bra att logga in på test. Databasen test har alla användare tillträde till.
När vi angav användarens namn i GRANTsatsen skrev vi olle@localhost, vilket innebär att anvädaren bara kan logga in från datorn MySQL är installerad på. Om man vill att olle ska kunna logga in från vilken dator som helst så måste man göra såhär (jag utgår från att användaren olle inte finns):
[olle@dev1]$ /usr/local/mysql/bin/mysql -u root -p
mysql> GRANT ALL
-> ON olles_db.*
-> TO olle@localhost
-> IDENTIFIED BY 'star';
mysql> GRANT ALL
-> ON olles_db.*
-> TO olle
-> IDENTIFIED BY 'star';
|
Den enda skillnaden mellan de två GRANTsatserna är att @localhost är borta i andra satsen. Båda GRANTsatserna måste köras, glömmer man den första satsen går det att logga in från andra datorer men inte från localhost.
3. Logga in på extern server
Att logga in på en extern server, låt oss säga 10.0.0.3, går till på följande sätt:
[olle@dev1]$ /usr/local/mysql/bin/mysql -h 10.0.0.3 -u root -p
mysql>
|
Här står h för host.
4. Systemdatabasen mysql
I MySQL finns det en databas som håller reda på vilka användare som finns och vad de kan göra. Databasen heter mysql:
[olle@dev1]$ /usr/local/mysql/bin/mysql -u root -p
mysql> USE mysql;
mysql> SHOW TABLES;
+-----------------+
| Tables_in_mysql |
+-----------------+
| columns_priv |
| db |
| func |
| host |
| tables_priv |
| user |
+-----------------+
|
De olika tabellerna har följande syfte:
Tabeller | | Beskrivning |
user | | Innehåller information om vilka användare som får logga in och deras globala rättigheter. |
db | | Innehåller information om användares rättigheter på enskilda databaser. |
host | | Innehåller information om användares rättigheter på ensklida databaser då denne loggar in från en speciell dator. |
tables_priv | | Innehåller information om användares rättigheter på enskilda tabeller. |
columns_priv | | Innehåller information om användares rättigheter på enskilda kolumner i tabeller. |
Vi tar en titt i tabellerna user och db:
mysql> SELECT host, user, select_priv, insert_priv FROM user;
+-----------+------+-------------+-------------+
| host | user | select_priv | insert_priv |
+-----------+------+-------------+-------------+
| localhost | root | Y | Y |
| dev1 | root | Y | Y |
| localhost | | N | N |
| dev1 | | N | N |
| localhost | olle | N | N |
| % | olle | N | N |
+-----------+------+-------------+-------------+
mysql> SELECT host, user, db, select_priv, insert_priv FROM db;
+-----------+------+----------+-------------+-------------+
| host | user | db | select_priv | insert_priv |
+-----------+------+----------+-------------+-------------+
| % | | test | Y | Y |
| % | | test\_% | Y | Y |
| localhost | olle | olles_db | Y | Y |
| % | olle | olles_db | Y | Y |
+-----------+------+----------+-------------+-------------+
|
I tabellen user ser vi att användaren olle kan logga in både lokalt och externt men inte hade några globala rättigheter.
I tabellen db ser vi att användaren olle har fulla rättigheter på databasen olles_db.
5. Ändra lösenord
Det går inte att se lösenordet i user-tabellen, eftersom lösenordet är krypterat.
mysql> SELECT host, user, password FROM user;
+-----------+----------+------------------+
| host | user | password |
+-----------+----------+------------------+
| localhost | root | 70d20fd360209d95 |
| qa2 | root | 70d20fd360209d95 |
| localhost | | |
| qa2 | | |
| % | olle | 14e52fcf31dc7a49 |
| localhost | olle | 6791ed0c7ad53bf1 |
+-----------+----------+------------------+
|
Vill man uppdatera lösenordet för t. ex. användaren olle gör man det såhär:
mysql> UPDATE user SET password=PASSWORD('hejsan') WHERE user='olle';
|
Funktionen PASSWORD() krypterar texten "hejsan".
6. Ändra rättigheter
Om vi bestämmer oss för att användaren olle har misskött sig kan vi dra tillbaka hans rättigheter med kommandot REVOKE:
mysql> REVOKE all ON olles_db.* FROM olle@localhost;
mysql> REVOKE all ON olles_db.* FROM olle;
mysql> SELECT host, user, db, select_priv, insert_priv FROM db;
+-----------+------+----------+-------------+-------------+
| host | user | db | select_priv | insert_priv |
+-----------+------+----------+-------------+-------------+
| % | | test | Y | Y |
| % | | test\_% | Y | Y |
+-----------+------+----------+-------------+-------------+
|
Nu kan olle i och för sig logga in på MySQL men inte komma in på någon databas. Vi vill att olle ska få se men inte röra, och ger honom därför rättigheten SELECT:
mysql> GRANT select ON olles_db.* TO olle@localhost;
mysql> GRANT select ON olles_db.* TO olle;
mysql> SELECT host, user, db, select_priv, insert_priv FROM db;
+-----------+------+----------+-------------+-------------+
| host | user | db | select_priv | insert_priv |
+-----------+------+----------+-------------+-------------+
| % | | test | Y | Y |
| % | | test\_% | Y | Y |
| localhost | olle | olles_db | Y | N |
| % | olle | olles_db | Y | N |
+-----------+------+----------+-------------+-------------+
|
Nedan listas de rättigheter man kan dela ut med GRANT på en databas:
Rättigheter | | Beskrivning |
ALL | | Tillåter allt utom GRANT. |
USAGE | | Tillåter ingenting. |
SELECT | | Tillåter SELECT. |
INSERT | | Tillåter INSERT. |
UPDATE | | Tillåter UPDATE. |
DELETE | | Tillåter DELETE. |
CREATE | | Tillåter CREATE TABLE. |
DROP | | Tillåter DROP TABLE. |
GRANT | | Tillåter användaren att dela ut rättigheter till databasen. |
REFERENCES | | Används inte ännu. |
INDEX | | Tillåter CREATE INDEX och DROP INDEX. |
ALTER | | Tillåter ALTER TABLE. |
Om du skriver DESCRIBE TABLE user; så kommer du se att i tabellen user finns ännu en del rättigheter som kan delas ut. Skillnaden är att dessa är globala d.v.s. gäller för alla databaser. Följande globala rättigheter, utöver de ovan listade, kan du dela ut med GRANT.
Rättigheter | | Beskrivning |
RELOAD | | Tillåter FLUSH. |
SHUTDOWN | | Tillåter mysqladmin shutdown. |
PROCESS | | Tillåter SHOW FULL PROCESSLIST. |
FILE | | Tillåter SELECT .. INTO OUTFILE. |
SHOW DATABASES | | Tillåter SHOW DATABASES. |
SUPER | | Tillåter CHANGE MASTER, KILL thread, mysqladmin debug, PURGE MASTER LOGS och SET GLOBAL . |
LOCK TABLES | | Tillåter LOCK TABLE på tabeller man har SELECTrättigheter. |
EXECUTE | | Ska tillåta att köra lagrade procedurer (kommer i MySQL 5.0). |
Vi vill nu låta olle få möjlighet att se vilka databaser som finns på systemet, men bara då han loggar in från localhost (samma dator som MySQL finns på):
mysql> GRANT show databases ON *.* TO olle@localhost;
mysql> SELECT host, user, select_priv, show_db_priv FROM user;
+-----------+------+-------------+--------------+
| host | user | select_priv | show_db_priv |
+-----------+------+-------------+--------------+
| localhost | root | Y | Y |
| dev1 | root | Y | Y |
| localhost | | N | N |
| dev1 | | N | N |
| % | olle | N | N |
| localhost | olle | N | Y |
+-----------+------+-------------+--------------+
|
Om olle inte klarar detta ansvar kan man ta bort denna rättighet med REVOKE:
mysql> REVOKE show databases ON *.* FROM olle@localhost;
mysql> SELECT host, user, select_priv, show_db_priv FROM user;
+-----------+------+-------------+--------------+
| host | user | select_priv | show_db_priv |
+-----------+------+-------------+--------------+
| localhost | root | Y | Y |
| dev1 | root | Y | Y |
| localhost | | N | N |
| dev1 | | N | N |
| % | olle | N | N |
| localhost | olle | N | N |
+-----------+------+-------------+--------------+
|
7. Ta bort användare
Med kommandot REVOKE kan du ta bort en användares rättigheter, men inte ta bort själva användaren. Vill du ta bort användaren måste root ändra i databasen mysql. I vårt fall måste tabellerna user och db ändras:
mysql> use mysql;
mysql> DELETE FROM db WHERE user='olle';
mysql> DELETE FROM user WHERE user='olle';
|
8. Syntax för GRANT
Med kommandot GRANT skapar du användare och lägger till rättigheter till användare. Texten visar syntaxen för en korrekt GRANTsats:
GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]
ON {tbl_name | * | *.* | db_name.*}
TO user_name [IDENTIFIED BY [PASSWORD] 'password']
[, user_name [IDENTIFIED BY 'password'] ...]
[REQUIRE
[{SSL| X509}]
[CIPHER cipher [AND]]
[ISSUER issuer [AND]]
[SUBJECT subject]]
[WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # |
MAX_UPDATES_PER_HOUR # |
MAX_CONNECTIONS_PER_HOUR #]]
|
9. Syntax för REVOKE
Med kommandot REVOKE tar du bort rättigheter från en användare:
REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]
ON {tbl_name | * | *.* | db_name.*}
FROM user_name [, user_name ...]
|