Cambiare la password di root di MySQL

In un post precedente avevo parlato di come scoprire qual era la vostra vecchia password di root di MySQL.

Quello che segue è il metodo per cambiarla direttamente:

  • Fermiamo MySQL con:
# /etc/init.d/mysql stop
  • Riavviamolo con il comando:
# mysqld_safe --skip-grant-tables --skip-networking &
  • Accediamo a MySQL con:
# mysql -u root
  • Utilizziamo il database appropriato:
mysql> USE mysql
  • Cambiamo la password:
mysql> UPDATE user 
    -> SET password=password("nuovaPassword") 
    -> WHERE user="root";
mysql> FLUSH PRIVILEGES;
  • Usciamo da MySQL:
mysql> exit
  • Riavviamo MySQL:
# /etc/init.d/mysql restart

Recuperare la password di root di MySQL

Se non vi ricordate più la password di root di MySQL, potete provare questo metodo che descriverò qui di seguito.

N.B.1: Questa procedura potrebbe non andare a buon fine (nel senso che potrebbe impiegarci davvero tanto tempo) se la password che avete scelto in origine è molto lunga e/o complessa (= avete usato lettere maiuscole e minuscole, numeri e caratteri speciali). Questo perché il programma che verrà utilizzato sfrutta tecniche di brute-force.

N.B.2: In rete è pieno di guide che vi dicono come reimpostare la password di root di MySQL, questa, invece, vi dice come scoprire qual era la vecchia password.

Si presuppone che abbiate la possibilità di accedere in remoto nella macchina su cui dovete recuperare la password di MySQL e che abbiate un secondo pc con Linux su cui effettuate questa operazione. Nel mio caso ho utilizzato una distribuzione Linux Ubuntu.

Portiamoci sulla macchina di test e installiamo il pacchetto mysql-server tramite il gestore pacchetti Synaptic (potete usare anche apt-get install); assegnamo una password all’utente root non appena viene chiesto.

Sappiamo che mysql memorizza il contenuto dei database nella cartella /var/lib/mysql e che ogni database è contenuto a sua volta in una cartella.
Ad esempio, sicuramente, avrete la cartella /var/lib/mysql/mysql poiché il database “mysql” viene creato di default. Dentro questa cartella troverete numerosi file *.frm, *.MYD, e *.MYI. Nota:

  • i file .frm definiscono la struttura della tabella
  • i file .MYD contengono i dati
  • i file .MYI servono per il rapido utilizzo dei dati

Ora dobbiamo copiare la cartella /var/lib/mysql/mysql del server remoto in locale. Per fare ciò usiamo scp (supponiamo che la porta di SSH sia la 22):

# cd
# scp -r -P 22 root@IPpcRemoto:/var/lib/mysql/mysql/ ./

Ora creiamo la cartella “mysql2”:

# mkdir /var/lib/mysql/mysql2

E poi copiamo lì dentro i file appena presi da remoto:

# cp /root/mysql/* /var/lib/mysql/mysql2/

Diamo i permessi giusti ai file:

# chown -R mysql:mysql /var/lib/mysql/mysql2

E riavviamo il servizio mysql:

# /etc/init.d/mysql restart

Ora accediamo a mysql:

# mysql -u root -p

inseriamo la password quando richiesto.

Ora dovremmo vedere il nostro database “mysql2” nell’elenco:

show databases;

Lo “prendiamo” con:

use mysql2;

mostriamo le tabelle con:

show tables;

selezioniamo i campi user e password con:

select user, password from user;

Ora verrà visualizzata una tabella contenente le password cifrate per ogni utente, simile alla seguente:

+------------------+------------------+
| user             | password         |
+------------------+------------------+
| root             | 1f12ff3e9887278e |
| debian-sys-maint | 0b553b5596ae84cf |
+------------------+------------------+

Aprite un’altra shell e create un file in cui mettete in ogni riga “user:password” copiandoli dalla tabella che avete appena letto. Ad esempio:

# vim mypassword

al cui interno, ricopiando da sopra, scrivete:

root:1f12ff3e9887278e

Salvate e chiudete il file.

Disconnettetevi da mysql con:

quit

Installazione di John the Ripper

Passiamo ora all’installazione del programma John The Ripper.

Poiché la sua installazione tramite il gestore di pacchetti Synaptic di Ubuntu non installa il modulo per MySQL, abbiamo deciso di scaricare i sorgenti e la patch e compilarli.

Usiamo tranquillamente un utente non-root e ci posizioniamo ad esempio nella sua home directory con:

$ cd

Scarichiamo i sorgenti di John the Ripper con:

$ wget http://www.openwall.com/john/f/john-1.7.0.2.tar.gz

e la patch:

$ wget http://www.openwall.com/john/contrib/john-1.7.2-mysql-1.diff.gz

Estraiamo i file sorgenti con:

$ tar -xzvf john-1.7.0.2.tar.gz

Estraiamo la patch con:

$ gzip -d john-1.7.2-mysql-1.diff.gz

Spostiamo la patch nella cartella di john the ripper appena creata:

$ mv john-1.7.2-mysql-1.diff john-1.7.0.2/

Se non ce li abbiamo già installati, installiamo il pacchetto “patch” e “build-essential” con:

$ sudo apt-get install patch build-essential

Ci spostiamo nella directory di john the ripper e applichiamo la patch con:

$ cd john-1.7.0.2/
$ cat john-1.7.2-mysql-1.diff | patch -p1

Ci spostiamo ora nella directory src e lanciamo il make:

$ cd src/
$ make

A questo punto viene dato un elenco di piattaforme. Scegliere quella appropriata per la propria macchina e diamo ad esempio il comando:

$ make clean linux-x86-mmx

ci spostiamo nella cartella run con:

$ cd ../run

Lanciamo ora john the ripper sul file “mypassword” che avevamo creato in precedenza:

$ sudo ./john --show /root/mypassword

Se tutto è andato come previsto, dopo qualche secondo/minuto/ora/giorno :-) (tutto dipende da quanto era robusta la password), di seguito comparirà la password di root scritta tra parentesi. Nel mio caso, fortunatamente, in meno di un minuto sono saltate fuori le password che mi servivano.

Troverete la password nel file “jack.pot” contenuto nella cartella “run” di john the ripper.

Come ultima verifica non ci resta che tornare nel pc remoto e provare ad accedere a mysql:

# mysql -u root -p

Mettiamo la password che il buon john ci ha dato. :-)

N.B.3: Potrebbe succedere che nella tabella le password siano come le seguenti:

+------------------+-------------------------------------------+
| user             | password                                  |
+------------------+-------------------------------------------+
| root             | *7E8154FA4C86DEE52EF28BED69012F4DA4F6B401 |
| debian-sys-maint | *BD55EE3E53CF587EFE8710ADC1F5EE5880A12BD3 |
+------------------+-------------------------------------------+

In questo caso bisognerebbe trovare un altro breaker di password. Se ho novità, non esito a postarle.

MySQL – Alcuni comandi utili

Premessa: per la scrittura di questo articoletto ho utilizzato come sistema di test una distribuzione Linux Ubuntu. Ho installato mysql-server tramite il gestore pacchetti Synaptic (potete usare anche apt-get install), e ho assegnato una password all’utente root non appena mi è stato chiesto.

Passiamo ora ad un elenco di comandi utili. Consiglio vivamente agli utenti non esperti di effettuare le prove su database di test, facendo attenzione a tutti i comandi impartiti. Non mi assumo nessuna responsabilità in caso arrechiate danni).

Accedere alla console mysql

# mysql -u root -p

Inseriamo la password quando ci viene chiesta. A questo punto comparirà:

mysql>

Ora possiamo impartire i nostri comandi.

Uscire dall’interfaccia mysql

quit

Mostrare tutti i database esistenti

show databases;

Attenzione, se vi dimenticare di digitare il “;” e premete invio, non vi preoccupate perché potete digitarlo nella riga successiva.

Quello che vedrete sarà simile a:

+------------+
| Database   |
+------------+
| mysql      |
| mysql_test |
+------------+

Creare un nuovo database “myNewDb”

create database myNewDb;

Al posto di “myNewDb”, mettete un nome a vostro piacimento. Se diamo ancora il comando “show databases;” possiamo vedere il nuovo database nella tabella a video.

Selezionare un database

use myNewDb;

Ora possiamo lavorare sul database myNewDb.

Cancellare un database

drop database nyNewDb;

Così abbiamo cancellato il database che avevamo creato in precedenza.

Mostrare le tabelle di un database

Per mostrare le tabelle di un database dobbiamo prima di tutto selezionarlo con il comando use (in questo altro esempio ho usato il database “mysql”):

use mysql;

e successivamente diamo il comando:

show tables;

Quello che vedrete sarà simile a:

+-----------------+
| Tables_in_mysql |
+-----------------+
| columns_priv    |
| db              |
| func            |
| ...             |
| user            |
+-----------------+
17 rows in set (0.00 sec)

Visualizzare la struttura di una tabella

Nel nostro caso, scegliamo di vedere la struttura della tabella “user”.

describe user;

Visualizzare tutto il contenuto di una tabella

select * from user;

Visualizzare alcuni campi di una tabella

In questo esempio ho deciso di selezionare solo i campi “user” e “password” della tabella “user”:

select user, password from user;

Creazione di una tabella

Per creare una nuova tabella, decidiamo di lavorare su un nuovo database (perché se avete seguito tutte le istruzioni passo passo non avete nessun database nuovo su cui lavorare); lo creiamo con:

create database mysql_test;

Controllate che sia stato creato:

show databases;

Selezioniamo il nuovo database con:

use mysql_test;

Controlliamo che sia vuoto con:

show tables;

Creiamo la tabella “persone”:

CREATE TABLE persone (
nome VARCHAR(20),
cognome VARCHAR(20)
);

Controlliamo che la nuova tabella compaia nel database:

show tables;

Visualizziamo la struttura della tabella appena creata con:

describe persone;

Popolare una tabella

Se vogliamo ora inserire valori nella nostra tabella “persone” creata appena sopra, facciamo ad esempio:

INSERT INTO persone VALUES ('Mario', 'Rossi');

e così via per tutti gli altri valori che vogliamo inserire.

Rinominare una tabella

Se vogliamo modificare il nome ad una tabella, diamo il comando:

ALTER TABLE nome_tabella RENAME nuovo_nome;

Modificare una colonna della tabella

Se vogliamo cambiare il nome di una colonna, lanciamo:

ALTER TABLE nome_tabella CHANGE nome_colonna nuovo_nome_colonna proprietà_nuova_colonna;

Esempio:

ALTER TABLE persone CHANGE cognome surname VARCHAR(20);

Se vogliamo cambiare solo le proprietà, lanciamo ad esempio:

ALTER TABLE persone CHANGE cognome cognome VARCHAR(15);

Aggiungere una colonna alla tabella

Se vogliamo aggiungere una colonna, lanciamo:

ALTER TABLE nome_tabella ADD nuova_colonna proprietà_nuova_colonna;

Esempio:

ALTER TABLE persone ADD indirizzo VARCHAR(30);

Cancellare una colonna della tabella

Se vogliamo cancellare una colonna, lanciamo:

ALTER TABLE nome_tabella DROP nome_colonna;

Esempio:

ALTER TABLE persone DROP indirizzo;

Cancellare una tabella

Cancelliamo la tabella creata in precedenza con:

drop table persone;

Mysql – Backup e Restore

Concludo questa breve guida ai comandi di base di MySQL con un link interessante che illustra come fare backup e restore di database MySQL utilizzando i tool mysqlhotcopy e mysqldump:

http://www.openskill.info/infobox.php?ID=939

Un ringraziamento particolare a Gandalf.