Gebruikers (MySQL): verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
 
(45 tussenliggende versies door dezelfde gebruiker niet weergegeven)
Regel 1: Regel 1:
 +
Wat ik meestal zoek:
 +
 +
<pre>
 +
create database mw collate utf8_general_ci;
 +
drop user if exists username@localhost;
 +
create user username@localhost identified by 'password';
 +
grant all on mw.* to username@localhost;
 +
</pre>
  
== Gebruikers aanmaken ==
+
* Merk op dat alleen het wachtwoord omgeven is door apostrophes
 +
* Sinds een update uit 2018, kun je binnen de MySQL-client met 'pijltje omhoog' dit commando niet terughalen vanwege beveiliging
 +
* Sinds een update uit 2020, krijg ik foutmeldingen als ik de laatste twee commando's samenvoeg in één (met zoiets als <code>grant all on mw.* to username@localhost identified by 'password';</code>)
  
Het basiscommando om een gebruiker aan te maken [https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql]:
+
== See all users ==
  
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
+
<pre>
 +
select host, user from mysql.user;
 +
</pre>
  
maar hiermee kun je nix, omdat er geen rechten (''privileges'') zijn toegekend.
+
== Create user ==
  
Veel uitgebreider:
+
Not very exciting:
  
GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';
+
<pre>
 +
create user username@localhost identified by 'password';
 +
</pre>
  
Deze gebruiker mag 'alles' op alle databases.Dit doe ik alleen als ik bv. voor mezelf een admin-account aanmaak.  
+
* If you run this command when the user already exists, you will get an error message
 +
* The password must be between apostrophes
 +
* When <code>username</code> needs to be escaped, you also need to include it in apostrophes - I've never had such a situation
 +
* Probably to be on the safe side: Include all three identities in apostrophes? Just as MySQL WorkBenech includes table names always in apostrophes.
  
Wat ik meestal zoek:
+
== Recreate a user ==
 +
 
 +
Want to recreate a user, for example because you don't remember the password?
 +
 
 +
<pre>
 +
drop user if exists username@localhost;
 +
create user username@localhost identiefied by 'GeheimWachtwoord';
 +
</pre>
 +
 
 +
== Assign rights ==
  
grant all on mijn_db.* to mijn_user@localhost identified by 'mijn_wachtwoord';
+
Usual syntax to grant rights to a user:
  
* <code>mijn_db.*</code> - Alle objecten van de betreffende database
+
<pre>
* Wachtwoord moet tussen haakjes staan. Overige haakjes optioneel
+
grant all on my_db.* to username@localhost;
* Nog een keertje uitzoeken of ik deze rechten niet verder kan beperken
+
</pre>
  
=== Flush ===
+
* <code>my_db.*</code> - Alle objecten van de betreffende database
 +
* Zoals je hieronder bij ''rechten'' kunt zien, heb je al snel ''create'' en ''drop'' nodig. Vandaar dat je snel belandt bij ''all''.
  
Na het toekennen van rechten, moet je die activeren middels
+
Om dit te verifiëren:
  
FLUSH PRIVILEGES;
+
<pre>
 +
select user, grant_priv from mysql.user;
 +
</pre>
  
 
=== Verschillende rechten ===
 
=== Verschillende rechten ===
  
De verschillende rechten die er zijn:
+
Er zijn tientallen verschillende rechten [https://dev.mysql.com/doc/refman/8.0/en/grant.html]. Wellicht de belangrijkste:
  
* CREATE - Databases aanmaken
+
* CREATE - Databases én tabellen aanmaken
* DROP - Databases verwijderen
+
* DROP - Databases én tabellen verwijderen
 
* INSERT - Rijen toevoegen aan een database
 
* INSERT - Rijen toevoegen aan een database
 
* SELECT - select-queries uitvoeren
 
* SELECT - select-queries uitvoeren
 
* UPDATE - Rijen bijwerken
 
* UPDATE - Rijen bijwerken
* GRANT OPTION - Beheer van privileges van andere gebruikers
+
* GRANT OPTION - Beheer van privileges van andere gebruikers.
 +
 
 +
Deze rechten kun je meestal per database, per tabel, en op nog een derde niveau (effe vergeten wat precies) inregelen. Op tabel-niveau doe je dit door iets in te vullen voor het '*' in <code>mijn_db.*</code>.
 +
 
 +
=== Flush privileges ===
 +
 
 +
Na het toekennen van rechten, moet je die activeren middels
 +
 
 +
<pre>
 +
flush privileges;
 +
</pre>
 +
 
 +
Meestal heb ik dat niet nodig. Misschien alleen als je iemand beheerrechten toekent?
  
 
=== Website-database ===
 
=== Website-database ===
  
Indien ik werk met aparte MySQL-accounts per website, dan zijn dit de relevante rechten voor zo'n account:
+
[[file:20180508-0934.png|thumb|MySQL-rechten volgens Worfence - Handig!]]
 +
 
 +
In situaties dat ik per website een apart MySQL-gebruikersaccount aanmaak, doe ik dat meestal met zoiets als dit:
 +
 
 +
<pre>
 +
grant all on mijn_db.* to mijn_user@localhost identified by 'mijn_wachtwoord';
 +
</pre>
 +
 
 +
Vermoedelijk kan dit fijnmaziger. Bv. wel drop-privilege op tabel-niveau, maar niet op database-niveau. Zie afbeelding hiernaast.
  
* CREATE - Nee
+
=== Beheerder-rechten ===
* DROP - Nee
 
* INSERT - Ja
 
* SELECT - Ja
 
* UPDATE - Ja
 
* GRANT OPTION - Nee.
 
  
Interessant dat er geen apart privilege is om nieuwe tabellen te mogen aanmaken - Relevant voor website-databases.
+
Om beheerder-rechten aan een gebruiker toe te kennen, moet je de ''grant-privilege'' apart benoemen. Bv.:
  
=== Beheerder ===
+
<pre>
 +
grant all on *.* to jeroen@localhost with grant option;
 +
</pre>
  
* De routine tijdens installatie van een MySQL-database, doet het niet goed. Oa. het aanmaken van een gebruiker werkt niet. In dat geval kun je in ieder geval als root inloggen middels <code>sudo mysql</code>
+
Complete procedure to create an admin account:
* Met <code>select Host, User from mysql.user;</code> kun je zien of het betreffende account wel of niet is aangemaakt
 
* Om beheerder-accounts aan te maken, moet je de ''grant-privilege'' apart instellen!
 
  
 +
<pre>
 +
create user jeroen@localhost identified by 'password';
 +
grant all on *.* to jeroen@localhost with grant option;
 +
flush privileges;
 +
</pre>
  
== Rechten inzien ==
+
=== Rechten inzien ===
  
 
De rechten per gebruiker worden bijgehouden in tabel <code>mysql.user</code>. Deze tabel is meestal te groot om goed te kunnen zien via de mysql-client. Wellicht handiger:
 
De rechten per gebruiker worden bijgehouden in tabel <code>mysql.user</code>. Deze tabel is meestal te groot om goed te kunnen zien via de mysql-client. Wellicht handiger:
  
 
<pre>
 
<pre>
select Host, User from mysql.user;
+
select host, user from mysql.user;
 
+-----------+------------------+
 
+-----------+------------------+
 
| Host      | User            |
 
| Host      | User            |
Regel 78: Regel 127:
 
</pre>
 
</pre>
  
== grant-privileges aan een gebruiker toekennen ==
+
== Inloggegevens onthouden ==
  
Wat in ieder geval werkt (ingelogd via <code>sudo mysql</code>):
+
Godzijdank is er een methode waardoor je niet meer steeds je wachtwoord hoeft in te voeren bij inloggen. Dankzij aangepaste bestandspermissies, valt het beveiligingsprobleem ook mee:
  
 
<pre>
 
<pre>
update mysql.user set grant_priv="Y" where User like "konijn";
+
Create a file named .my.cnf in your home directory that looks like this.  
 +
Make sure the filesystem permissions are set such that only the owning user can read it (0600).
 +
</pre>
 +
 
 +
Voorbeeld-bestand <code>.my.cnf</code>:
 +
 
 +
<pre>
 +
[client]
 +
host    = localhost
 +
user    = username
 +
password = thepassword
 +
socket  = /var/run/mysqld/mysqld.sock
 +
#database = mysql
 
</pre>
 
</pre>
  
En om het zeker te weten:
+
Bestandsrechten aanpassen:
  
 
<pre>
 
<pre>
select Grant_priv from mysql.user where User like "root" or User like "konijn";
+
chmod 0600 .my.cnf
 
</pre>
 
</pre>
  
== Probleem met inloggen in een verse instantie? ==
+
Zie ook [[Configuratiebestanden (MySQL)]].
  
Probeer
+
== Problem logging into a fresh instance? (May 2018) ==
  
sudo mysql -u root -p
+
* The routine during installation of a MySQL database does not work properly. Oa. creating a user does not work. In that case you can at least log in as root using <code>sudo mysql</code>
 +
* With <code>select Host, User from mysql.user;</code> you can see whether the account in question has been created or not → See at the beginning of this article for an example.
  
== Inloggegevens onthouden ==
+
== Remove user ==
  
Werkt fantastisch, en dankzij aanpassen bestandspermissies, valt het beveiligingsprobleem mee:
+
E.g.:
  
 
<pre>
 
<pre>
Create a file named .my.cnf in your home directory that looks like this.  
+
select host, user from mysql.user;
Make sure the filesystem permissions are set such that only the owning user can read it (0600).
 
  
[client]
+
drop user en_s1;            # Error: No host specified
host     = localhost
+
drop user en_s1@localhost;   # OK
user     = username
 
password = thepassword
 
socket   = /var/run/mysqld/mysqld.sock
 
#database = mysql
 
 
</pre>
 
</pre>
 +
 +
== Zie ook ==
 +
 +
* [[Configuratiebestanden (MySQL)]]
 +
* [[Mysql secure installation]]
  
 
== Bronnen ==
 
== Bronnen ==

Huidige versie van 16 apr 2024 om 16:53

Wat ik meestal zoek:

create database mw collate utf8_general_ci;
drop user if exists username@localhost;
create user username@localhost identified by 'password';
grant all on mw.* to username@localhost;
  • Merk op dat alleen het wachtwoord omgeven is door apostrophes
  • Sinds een update uit 2018, kun je binnen de MySQL-client met 'pijltje omhoog' dit commando niet terughalen vanwege beveiliging
  • Sinds een update uit 2020, krijg ik foutmeldingen als ik de laatste twee commando's samenvoeg in één (met zoiets als grant all on mw.* to username@localhost identified by 'password';)

See all users

select host, user from mysql.user;

Create user

Not very exciting:

create user username@localhost identified by 'password';
  • If you run this command when the user already exists, you will get an error message
  • The password must be between apostrophes
  • When username needs to be escaped, you also need to include it in apostrophes - I've never had such a situation
  • Probably to be on the safe side: Include all three identities in apostrophes? Just as MySQL WorkBenech includes table names always in apostrophes.

Recreate a user

Want to recreate a user, for example because you don't remember the password?

drop user if exists username@localhost;
create user username@localhost identiefied by 'GeheimWachtwoord';

Assign rights

Usual syntax to grant rights to a user:

grant all on my_db.* to username@localhost;
  • my_db.* - Alle objecten van de betreffende database
  • Zoals je hieronder bij rechten kunt zien, heb je al snel create en drop nodig. Vandaar dat je snel belandt bij all.

Om dit te verifiëren:

select user, grant_priv from mysql.user;

Verschillende rechten

Er zijn tientallen verschillende rechten [1]. Wellicht de belangrijkste:

  • CREATE - Databases én tabellen aanmaken
  • DROP - Databases én tabellen verwijderen
  • INSERT - Rijen toevoegen aan een database
  • SELECT - select-queries uitvoeren
  • UPDATE - Rijen bijwerken
  • GRANT OPTION - Beheer van privileges van andere gebruikers.

Deze rechten kun je meestal per database, per tabel, en op nog een derde niveau (effe vergeten wat precies) inregelen. Op tabel-niveau doe je dit door iets in te vullen voor het '*' in mijn_db.*.

Flush privileges

Na het toekennen van rechten, moet je die activeren middels

flush privileges;

Meestal heb ik dat niet nodig. Misschien alleen als je iemand beheerrechten toekent?

Website-database

MySQL-rechten volgens Worfence - Handig!

In situaties dat ik per website een apart MySQL-gebruikersaccount aanmaak, doe ik dat meestal met zoiets als dit:

grant all on mijn_db.* to mijn_user@localhost identified by 'mijn_wachtwoord';

Vermoedelijk kan dit fijnmaziger. Bv. wel drop-privilege op tabel-niveau, maar niet op database-niveau. Zie afbeelding hiernaast.

Beheerder-rechten

Om beheerder-rechten aan een gebruiker toe te kennen, moet je de grant-privilege apart benoemen. Bv.:

grant all on *.* to jeroen@localhost with grant option;

Complete procedure to create an admin account:

create user jeroen@localhost identified by 'password';
grant all on *.* to jeroen@localhost with grant option;
flush privileges;

Rechten inzien

De rechten per gebruiker worden bijgehouden in tabel mysql.user. Deze tabel is meestal te groot om goed te kunnen zien via de mysql-client. Wellicht handiger:

select host, user from mysql.user;
+-----------+------------------+
| Host      | User             |
+-----------+------------------+
| localhost | debian-sys-maint |
| localhost | kbb3             |
| localhost | kbb_2_           |
| localhost | kbb_2_2          |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+

Inloggegevens onthouden

Godzijdank is er een methode waardoor je niet meer steeds je wachtwoord hoeft in te voeren bij inloggen. Dankzij aangepaste bestandspermissies, valt het beveiligingsprobleem ook mee:

Create a file named .my.cnf in your home directory that looks like this. 
Make sure the filesystem permissions are set such that only the owning user can read it (0600).

Voorbeeld-bestand .my.cnf:

[client]
host     = localhost
user     = username
password = thepassword
socket   = /var/run/mysqld/mysqld.sock
#database = mysql

Bestandsrechten aanpassen:

chmod 0600 .my.cnf

Zie ook Configuratiebestanden (MySQL).

Problem logging into a fresh instance? (May 2018)

  • The routine during installation of a MySQL database does not work properly. Oa. creating a user does not work. In that case you can at least log in as root using sudo mysql
  • With select Host, User from mysql.user; you can see whether the account in question has been created or not → See at the beginning of this article for an example.

Remove user

E.g.:

select host, user from mysql.user;

drop user en_s1;             # Error: No host specified
drop user en_s1@localhost;   # OK

Zie ook

Bronnen