programmera.net -> mysqldba -> normal     för utskrift      info@programmera.net

Användare i MySQL

1. Vad har man användare till?
2. Skapa en användare
3. Logga in på extern server
4. Systemdatabasen mysql
5. Ändra lösenord
6. Ändra rättigheter
7. Ta bort användare
8. Syntax för GRANT
9. Syntax för REVOKE

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 ...]