Project

General

Profile

MySQLInitConf » History » Version 25

Simone Piccardi, 09/24/2019 03:17 PM

1 17 Simone Piccardi
h1. Configurazione di base per _MySQL_
2 16 Amministratore Truelite
 
3 1 Amministratore Truelite
4 17 Simone Piccardi
La configurazione di base di _MySQL_ eseguita da Debian subito dopo l'installazione del pacchetto consente l'accesso database con l'utente di amministrazione _root_ senza password. Per questo motivo il primo passo da fare, immediatamente dopo l'installazione, è impostare una password per _root_; questo si fa con il comando:
5 1 Amministratore Truelite
6 1 Amministratore Truelite
<pre>
7 18 Simone Piccardi
/usr/bin/mysqladmin -u root password NuovaPassword
8 11 Amministratore Truelite
</pre>
9 11 Amministratore Truelite
10 21 Simone Piccardi
con le versioni più recenti questo non è più necessario in quanto la password per l'utente _root_ viene chiesta dal sistema del _debconf_.
11 21 Simone Piccardi
12 21 Simone Piccardi
h2. Reimpostare la password di _root_
13 21 Simone Piccardi
14 17 Simone Piccardi
Se invece si è persa la password di _root_ del database il precedente comando non funziona in quanto una volta impostata detta password questa diventa necessaria per poterlo utilizzare. Per questo per poterla recuperare (o meglio resettare) occorre seguire la seguente procedura. Il primo passo è fermare il database e farlo ripartire senza meccanismi di controllo di autenticazione, questo si fa con i comandi:
15 1 Amministratore Truelite
16 16 Amministratore Truelite
<pre>
17 1 Amministratore Truelite
/etc/init.d/mysql stop
18 1 Amministratore Truelite
/usr/bin/mysqld_safe --skip-grant-tables --skip-networking &
19 16 Amministratore Truelite
</pre>
20 1 Amministratore Truelite
21 1 Amministratore Truelite
a questo punto ci si potrà collegare al database direttamente con:
22 1 Amministratore Truelite
23 16 Amministratore Truelite
<pre>
24 10 Amministratore Truelite
mysql -u root
25 16 Amministratore Truelite
</pre>
26 1 Amministratore Truelite
27 10 Amministratore Truelite
ottenendo una shell SQL con privilegi di amministrazione; qui si potrà modificare la password impostata per l'utente _root_ tramite le seguenti istruzioni:
28 16 Amministratore Truelite
29 10 Amministratore Truelite
<pre>
30 16 Amministratore Truelite
use mysql;
31 1 Amministratore Truelite
UPDATE user SET Password=PASSWORD("NuovaPassword") WHERE User="root";
32 1 Amministratore Truelite
exit
33 16 Amministratore Truelite
</pre>
34 10 Amministratore Truelite
35 17 Simone Piccardi
fatto questo la passord di _root_ è stata modificata e si potrà fermare il database e riavviarlo con:
36 10 Amministratore Truelite
37 10 Amministratore Truelite
<pre>
38 1 Amministratore Truelite
/etc/init.d/mysql stop
39 16 Amministratore Truelite
/etc/init.d/mysql start
40 8 Amministratore Truelite
</pre>
41 9 Amministratore Truelite
42 17 Simone Piccardi
Dopo di che si potrà verificare che l'accesso è possibile con la nuova password con:
43 1 Amministratore Truelite
44 16 Amministratore Truelite
<pre>
45 1 Amministratore Truelite
server:~# mysql -u root -p
46 1 Amministratore Truelite
Enter password:
47 16 Amministratore Truelite
Welcome to the [[MySQL]] monitor.  Commands end with ; or \g.
48 16 Amministratore Truelite
Your [[MySQL]] connection id is 9 to server version: 4.0.24_Debian-5-log
49 1 Amministratore Truelite
50 1 Amministratore Truelite
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
51 1 Amministratore Truelite
52 1 Amministratore Truelite
mysql> show databases;
53 1 Amministratore Truelite
+-------------+
54 1 Amministratore Truelite
| Database    |
55 1 Amministratore Truelite
+-------------+
56 1 Amministratore Truelite
| mysql       |
57 1 Amministratore Truelite
| test        |
58 1 Amministratore Truelite
+-------------+
59 1 Amministratore Truelite
2 rows in set (0.00 sec)
60 1 Amministratore Truelite
61 1 Amministratore Truelite
mysql> \q
62 1 Amministratore Truelite
Bye
63 16 Amministratore Truelite
server:~#
64 1 Amministratore Truelite
</pre>
65 9 Amministratore Truelite
66 21 Simone Piccardi
67 21 Simone Piccardi
h2. Ricreare l'utente _root_
68 21 Simone Piccardi
69 20 Simone Piccardi
Qualora invece si debba ricreare da zero l'utente root nel caso di errata cancellazione, sarà necessario reimpostare manualmente tutti i privilegi con qualcosa del tipo:
70 20 Simone Piccardi
71 20 Simone Piccardi
<pre>
72 20 Simone Piccardi
INSERT INTO mysql.user SET user = 'root',
73 20 Simone Piccardi
      host = 'localhost',
74 20 Simone Piccardi
      password = Password('passwordlungaecomplicata'),
75 20 Simone Piccardi
      super_priv = 'y',
76 20 Simone Piccardi
      select_priv = 'y',
77 20 Simone Piccardi
      insert_priv = 'y',
78 20 Simone Piccardi
      update_priv = 'y',
79 20 Simone Piccardi
      delete_priv = 'y',
80 20 Simone Piccardi
      create_priv = 'y',
81 20 Simone Piccardi
      drop_priv = 'y',
82 20 Simone Piccardi
      reload_priv = 'y',
83 20 Simone Piccardi
      shutdown_priv = 'y',
84 20 Simone Piccardi
      process_priv = 'y',
85 20 Simone Piccardi
      file_priv = 'y',
86 20 Simone Piccardi
      grant_priv = 'y',
87 20 Simone Piccardi
      references_priv = 'y',
88 20 Simone Piccardi
      index_priv = 'y',
89 20 Simone Piccardi
      alter_priv = 'y',
90 20 Simone Piccardi
      show_db_priv = 'y',
91 20 Simone Piccardi
      create_tmp_table_priv = 'y',
92 20 Simone Piccardi
      lock_tables_priv = 'y',
93 20 Simone Piccardi
      execute_priv = 'y',
94 20 Simone Piccardi
      repl_slave_priv = 'y',
95 20 Simone Piccardi
      repl_client_priv = 'y',
96 20 Simone Piccardi
      create_view_priv = 'y',
97 20 Simone Piccardi
      show_view_priv = 'y',
98 20 Simone Piccardi
      create_routine_priv = 'y',
99 20 Simone Piccardi
      alter_routine_priv = 'y',
100 20 Simone Piccardi
      create_user_priv = 'y';
101 20 Simone Piccardi
</pre>
102 17 Simone Piccardi
103 22 Simone Piccardi
h2. Accesso remoto a MySQL e configurazione SSL
104 21 Simone Piccardi
105 1 Amministratore Truelite
Si tenga presente infine che le ultime versioni del pacchetto Debian non richiedono più un intervento manuale per abilitare l'ascolto su @localhost@ in quanto la riga:
106 16 Amministratore Truelite
107 1 Amministratore Truelite
<pre>
108 16 Amministratore Truelite
bind-address            = 127.0.0.1
109 1 Amministratore Truelite
</pre>
110 1 Amministratore Truelite
111 21 Simone Piccardi
è già presente in @/etc/my.cnf@; occorre però fare attenzione, l'uso del comando @mysql -h localhost@ comporta automaticamente l'uso del socket, per cui in caso di più istanze accessibili su porte diverse non saranno mai raggiunte in quanto l'opzione @-p@ verrà ignorata in maniera silente (nel caso si usi l'opzione @-h 127.0.0.1@). 
112 1 Amministratore Truelite
113 21 Simone Piccardi
114 21 Simone Piccardi
Qualora si debba abilitare il raggiungimento del server da altre macchine occorrerà modificare la direttiva, ed inserire qualcosa del tipo:
115 21 Simone Piccardi
116 19 Simone Piccardi
<pre>
117 19 Simone Piccardi
bind-address            = 0.0.0.0
118 19 Simone Piccardi
</pre>
119 1 Amministratore Truelite
120 21 Simone Piccardi
Se oltre a questo si vuole abilitare l'uso di SSL diventano necessarie anche le ulteriori direttive che consentono di indicare i file con certificati e chiavi da usare per SSL, un possibile esempio è:
121 21 Simone Piccardi
122 21 Simone Piccardi
<pre>
123 21 Simone Piccardi
ssl-ca = /etc/mysql/ca.pem
124 21 Simone Piccardi
ssl-cert = /etc/mysql/server-cert.pem
125 21 Simone Piccardi
ssl-key = /etc/mysql/server-key.pem
126 21 Simone Piccardi
</pre>
127 21 Simone Piccardi
128 21 Simone Piccardi
dove @ssl-ca@ indica il certificato della Certification Authority che firma i certificati (il cui uso può anche essere omesso se non interessa autenticare i client, cosa che comunque non viene fatta di default). Invece @ssl-cert@ e @ssl-key@ indicano rispettivamente i file che contengono certificato e corrispondente chiave che verranno usate dal server per SSL.
129 21 Simone Piccardi
130 21 Simone Piccardi
Questi file si possono creare seguendo le istruzioni fornite dalla documentazione su http://dev.mysql.com/doc/refman/5.7/en/creating-ssl-rsa-files-using-mysql.html ma se li si vogliono creare con un qualunque programma di gestione di Certification Authority SSL (@tiny-ca@, @easy-rsa@ o @openssl@ stessa) o ottenere direttamente da una CA commerciale si possono avere problemi.  
131 21 Simone Piccardi
132 23 Simone Piccardi
Il supporto di SSL di MySQL infatti è abbastanza penoso, ed in particolare accetta solo chiavi in formato PKCS#1 (quelle introdotte da una riga di intestazione nella forma @-----BEGIN RSA PRIVATE KEY-----@). Ma il server fallisce miseramente (partendo però lo stesso, ma con un  warning di @SSL error: Unable to get private key from '/etc/mysql/server-key.pem'@ nei log) se gli si fornisce una chiave nel più recente PKCS#8 (quelle con intestazione nella forma @-----BEGIN PRIVATE KEY-----@), che però è il default per @openssl@ ed è quello che viene usato anche da @easy-rsa@ e dalla gran parte delle CA commerciali. 
133 21 Simone Piccardi
134 21 Simone Piccardi
Qualora si disponga di una di queste chiavi questa deve essere convertita al vecchio formato con:
135 21 Simone Piccardi
136 21 Simone Piccardi
<pre>
137 21 Simone Piccardi
openssl rsa -in chiave-che-non-va-in-pkcs8.pem -out chiave-che-andra-in-pkcs1.pem 
138 21 Simone Piccardi
</pre>
139 21 Simone Piccardi
140 1 Amministratore Truelite
(aggiungere il mancante @RSA@ alla riga di intestazione *NON* funziona). 
141 23 Simone Piccardi
142 25 Simone Piccardi
Una volta riavviato il server, si potrà verificare che il supporto per SSL sia attivo con:
143 23 Simone Piccardi
144 25 Simone Piccardi
<pre>
145 25 Simone Piccardi
show variables like '%ssl%';
146 25 Simone Piccardi
</pre>
147 25 Simone Piccardi
148 25 Simone Piccardi
e si deve ottenere qualcosa del tipo:
149 25 Simone Piccardi
150 25 Simone Piccardi
<pre>
151 25 Simone Piccardi
+---------------------+----------------------------+
152 25 Simone Piccardi
| Variable_name       | Value                      |
153 25 Simone Piccardi
+---------------------+----------------------------+
154 25 Simone Piccardi
| have_openssl        | NO                         |
155 25 Simone Piccardi
| have_ssl            | YES                        |
156 25 Simone Piccardi
| ssl_ca              | /etc/mysql/ca-cert.pem     |
157 25 Simone Piccardi
| ssl_capath          |                            |
158 25 Simone Piccardi
| ssl_cert            | /etc/mysql/server-cert.pem |
159 25 Simone Piccardi
| ssl_cipher          |                            |
160 25 Simone Piccardi
| ssl_crl             |                            |
161 25 Simone Piccardi
| ssl_crlpath         |                            |
162 25 Simone Piccardi
| ssl_key             | /etc/mysql/server-key.pem  |
163 25 Simone Piccardi
| version_ssl_library | YaSSL 2.4.4                |
164 25 Simone Piccardi
+---------------------+----------------------------+
165 25 Simone Piccardi
10 rows in set (0.00 sec)
166 25 Simone Piccardi
</pre> 
167 25 Simone Piccardi
168 25 Simone Piccardi
con @have_ssl@ o @have_openssl@ a @YES@.
169 25 Simone Piccardi
170 25 Simone Piccardi
171 23 Simone Piccardi
h2. Provare la connessione remota SSL
172 23 Simone Piccardi
173 23 Simone Piccardi
Si potrebbe pensare che se si richiede l'utilizzo di una connessione cifrata con SSL invocando il client con l'opzione @--ssl@ (se non la si specifica non verrà comunque usato, che sia disponibile o meno) e che la connessione venga stabilita comporti che sia tutto a posto. In realtà non è affatto così ed il client, se SSL non sta funzionando sul server (perché assente o perché la sua configurazione è fallita, cosa che comunque non blocca l'avvio del server) si collega in chiaro. 
174 23 Simone Piccardi
175 23 Simone Piccardi
Pertanto per verificare che la connessione cifrata è funzionante occorre verificarlo esplicitamente all'interno della connessione, con qualcosa del tipo:
176 23 Simone Piccardi
177 23 Simone Piccardi
<pre>
178 23 Simone Piccardi
$ mysql -h mysql.truelite.it -u prova -p -ssl
179 23 Simone Piccardi
...
180 23 Simone Piccardi
> SHOW SESSION STATUS LIKE 'Ssl_version';
181 23 Simone Piccardi
</pre>
182 23 Simone Piccardi
183 24 Simone Piccardi
se il risultato è:
184 23 Simone Piccardi
185 23 Simone Piccardi
<pre>
186 23 Simone Piccardi
+---------------+-------+
187 23 Simone Piccardi
| Variable_name | Value |
188 23 Simone Piccardi
+---------------+-------+
189 23 Simone Piccardi
| Ssl_version   |       |
190 23 Simone Piccardi
+---------------+-------+
191 23 Simone Piccardi
</pre>
192 23 Simone Piccardi
193 24 Simone Piccardi
SSL non sta funzionando, se invece funziona comparirà qualcosa del tipo:
194 23 Simone Piccardi
195 23 Simone Piccardi
<pre>
196 23 Simone Piccardi
+---------------+-------+
197 23 Simone Piccardi
| Variable_name | Value |
198 23 Simone Piccardi
+---------------+-------+
199 23 Simone Piccardi
| Ssl_version   | TLSv1 |
200 23 Simone Piccardi
+---------------+-------+
201 23 Simone Piccardi
</pre>
202 23 Simone Piccardi
203 25 Simone Piccardi
alternativamente si potranno verificare i dati della connessione controllando che sia attiva con:
204 25 Simone Piccardi
205 25 Simone Piccardi
<pre>
206 25 Simone Piccardi
mysql> \s
207 25 Simone Piccardi
...
208 25 Simone Piccardi
SSL:			Cipher in use is DHE-RSA-AES256-SHA
209 25 Simone Piccardi
...
210 25 Simone Piccardi
</pre>
211 25 Simone Piccardi
212 25 Simone Piccardi
mentre se non è attiva si avrà:
213 25 Simone Piccardi
214 25 Simone Piccardi
<pre>
215 25 Simone Piccardi
MySQL [(none)]> \s
216 25 Simone Piccardi
--------------
217 25 Simone Piccardi
...
218 25 Simone Piccardi
SSL:			Not in use
219 25 Simone Piccardi
...
220 25 Simone Piccardi
</pre>
221 21 Simone Piccardi
222 21 Simone Piccardi
223 21 Simone Piccardi
h2. Creazione di database ed utenti
224 19 Simone Piccardi
225 1 Amministratore Truelite
Fatto questo si potrà passare alla creazione di un proprio database con il comando:
226 18 Simone Piccardi
227 16 Amministratore Truelite
<pre>
228 3 Amministratore Truelite
mysqladmin -u root -p create nomedb
229 1 Amministratore Truelite
</pre>
230 18 Simone Piccardi
231 1 Amministratore Truelite
che chiederà la precedente password, creando il database, a questo punto ci si potrà collegare al nuovo database con:
232 18 Simone Piccardi
233 16 Amministratore Truelite
<pre>
234 3 Amministratore Truelite
mysql -u root -p nomedb
235 1 Amministratore Truelite
</pre>
236 18 Simone Piccardi
237 1 Amministratore Truelite
e si potrà dare l'accesso allo stesso ad uno specifico utente con i comandi:
238 18 Simone Piccardi
239 16 Amministratore Truelite
<pre>
240 15 Amministratore Truelite
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, ALTER, DROP 
241 12 Amministratore Truelite
ON nomedb.* TO 'utentedb'@'localhost' IDENTIFIED BY 'password';
242 1 Amministratore Truelite
</pre>
243 18 Simone Piccardi
244 1 Amministratore Truelite
e per garantirsi che questi siano immediatamente disponibili, si dovrà aggiuntere:
245 18 Simone Piccardi
246 16 Amministratore Truelite
<pre>
247 6 Amministratore Truelite
FLUSH PRIVILEGES;
248 16 Amministratore Truelite
</pre>
249 5 Amministratore Truelite
250 1 Amministratore Truelite
Nel caso si sia fatto un errore nell'assegnare i permessi e nel creare l'utente, lo si potrà cancellare con i comandi:
251 18 Simone Piccardi
252 16 Amministratore Truelite
<pre>
253 1 Amministratore Truelite
use mysql;
254 1 Amministratore Truelite
DELETE FROM user WHERE user="utentedacancellare";
255 19 Simone Piccardi
</pre>
256 19 Simone Piccardi
257 19 Simone Piccardi
Nel caso si voglia cancellare completamente un database si potrà farlo sia con i comandi SQL specifici (@DROP DATABASE nomedb@) da dentro la riga di comando di @mysql@ oppure direttamente dalla della shell con il comando:
258 19 Simone Piccardi
259 19 Simone Piccardi
<pre>
260 19 Simone Piccardi
mysqladmin -u root -p drop nomedb
261 16 Amministratore Truelite
</pre>