czwartek, 24 stycznia 2013

Zarządzanie kilkoma bazami MySQL poprzez jeden PHPMyAdmin przy współpracy SSL - Debian Wheezy/Ubuntu 12

Przydatna kwestia jak zapanować na kilkoma bazami rozrzuconymi na innych maszynach. Będziemy potrzebować dwóch maszyn z jednym z wymienionych w tytule maszyn (Debian lub Ubuntu, przy czym Debian Wheezy to wersja testowa, na Squeeze też da się to zrobić). Do tego dwie bazy MySQL oraz PHPMyAdmin na serwerze.
Jak to zrobić pisałem we wcześniejszych postach.


Serwer:
IP: 192.168.1.100, nazwa server1.example.com

Pomocniczy host:
IP: 192.168.1.101, nazwa remote.example.com

1) SSL dla zdalnej bazy:

remote.example.com

Logujemy się do bazy:


mysql -u root -p



następnie:


show variables like '%ssl%';


powinniśmy otrzymać wynik podobny do poniższego:
    +---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ssl_ca        |          |
| ssl_capath    |          |
| ssl_cert      |          |
| ssl_cipher    |          |
| ssl_key       |          |
+---------------+----------+
7 rows in set (0.00 sec)

Będzie to oznaczało, że SSL jest już połączone z bazą, ale nie jest włączone. 

Wychodzimy poleceniem quit.

Następnie otwieramy już spoza konsoli mysql plik konfiguracyjny bazy:

nano /etc/mysql/my.cnf

odnajdujemy w min sekcję * Security Features

dodajemy w nim


ssl


Sekcja ta powinna wyglądać mniej więcej tak:


 * Security Features# * Security Features## Read the manual, too, if you want chroot!# chroot = /var/lib/mysql/## For generating SSL certificates I recommend the OpenSSL GUI "tinyca".ssl# ssl-ca=/etc/mysql/cacert.pem# ssl-cert=/etc/mysql/server-cert.pem# ssl-key=/etc/mysql/server-key.pem

Następnie restartujemy bazę:

/etc/init.d/mysql restart

następnie:


mysql -u root -p


na koniec:



show variables like '%ssl%';



Powinniśmy otrzymać już włączone SSL:


      +---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl  | YES   |
| have_ssl      | YES   |
| ssl_ca        |       |
| ssl_capath    |       |
| ssl_cert      |       |
| ssl_cipher    |       |
| ssl_key       |       |
+---------------+-------+
7 rows in set (0.00 sec)



Wychodzimy z konsoli mysql poprzez quit.






2) Instalacja OpenSSL:


remote.example.com


apt-get install openssl


Jeżeli ściągnie się wersja 1.0.1c, wystąpią problemy z certyfikatami. Dlatego wygenerujemy go sobie sami. O błędach możemy poczytać tutaj:


https://bugs.launchpad.net/percona-server/+bug/1007164http://bugs.mysql.com/bug.php?id=64870http://forums.mysql.com/read.php?11,400856,401127#msg-401127
Jeżeli wersja będzie inna poniższych poleceń nie trzeba wykonywać.
cd /tmpwget http://www.openssl.org/source/openssl-0.9.8x.tar.gztar xvfz openssl-0.9.8x.tar.gzcd openssl-0.9.8x./config --prefix=/usr/local/openssl-0.9.8makemake install





mkdir /etc/mysql/newcerts && cd /etc/mysql/newcerts
/usr/local/openssl-0.9.8/bin/openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem
/usr/local/openssl-0.9.8/bin/openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
/usr/local/openssl-0.9.8/bin/openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
/usr/local/openssl-0.9.8/bin/openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem

/usr/local/openssl-0.9.8/bin/openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem


Na koniec listujemy utworzone pliki ls -l:


Jeżeli wersja jest wyższa niż 1.0.1c robimy tak:


mysql --ssl-ca=/etc/mysql/newcerts/ca-cert.pem --ssl-cert=/etc/mysql/newcerts/client-cert.pem --ssl-key=/etc/mysql/newcerts/client-key.pem -h remote.example.com -u root -p


Odpowiadamy na kolejne pytania w trakcie generowania klucza.

Musimy skopiować teraz: ca-cert.pemclient-cert.pem oraz client-key.pem z maszyny zdalnej na lokalną. 

Przechodzimy teraz na:

server1.example.com


mkdir /etc/mysql/newcerts


po utworzeniu katalogu wracamy na: 

remote.example.com

Wykonujemy poniższe polecenia:


scp /etc/mysql/newcerts/ca-cert.pem root@server1.example.com:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-cert.pem root@server1.example.com:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-key.pem root@server1.example.com:/etc/mysql/newcerts


Następnie ponownie edytujemy konfigurację bazy:


nano /etc/mysql/my.cnf


usuwamy komentarze (pogrubione wiersze):


# * Security Features## Read the manual, too, if you want chroot!# chroot = /var/lib/mysql/## For generating SSL certificates I recommend the OpenSSL GUI "tinyca".sslssl-ca=/etc/mysql/newcerts/ca-cert.pemssl-cert=/etc/mysql/newcerts/server-cert.pemssl-key=/etc/mysql/newcerts/server-key.pem 


Restart bazy:


/etc/init.d/mysql restart


ponownie sprawdzamy magiczna tabelkę SSL:

mysql -u root -p
show variables like '%ssl%';

Ostatecznie powinniśmy zobaczyć tabelkę z włączonym SSL:

+---------------+-------------------------------------+
| Variable_name | Value                               |
+---------------+-------------------------------------+
| have_openssl  | YES                                 |
| have_ssl      | YES                                 |
| ssl_ca        | /etc/mysql/newcerts/ca-cert.pem     |
| ssl_capath    |                                     |
| ssl_cert      | /etc/mysql/newcerts/server-cert.pem |
| ssl_cipher    |                                     |
| ssl_key       | /etc/mysql/newcerts/server-key.pem  |
+---------------+-------------------------------------+
7 rows in set (0.00 sec)


Zostajemy w konsoli mysql.

Spróbujemy podłączyć się do do bazy z server1.example.com do remote.example.com przy użyciu SSL, w tym celu musimy utworzyć użytkownika, który będzie mógł coś takiego zrobić:


CREATE USER 'root'@'192.168.1.100' IDENTIFIED BY 'mysqlrootpassword';GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.0.100' IDENTIFIED BY 'mysqlrootpassword' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

GRANT USAGE ON *.* TO 'root'@'192.168.1.100' REQUIRE SSL;
CREATE USER 'root'@'server1.example.com' IDENTIFIED BY 'mysqlrootpassword';GRANT ALL PRIVILEGES ON * . * TO 'root'@'local.example.com' IDENTIFIED BY 'mysqlrootpassword' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
GRANT USAGE ON *.* TO 'root'@'server1.example.com' REQUIRE SSL;

FLUSH PRIVILEGES;

na koniec quit

Od teraz możemy logować się z server1 na remote.






3) Konfiguracja phpMyAdmin:


server1.example.com

Sprawdzimy czy faktycznie nasze zabiegi przyniosły skutek, czyli logowanie z server1 na remote:


mysql --ssl-ca=/etc/mysql/newcerts/ca-cert.pem --ssl-cert=/etc/mysql/newcerts/client-cert.pem --ssl-key=/etc/mysql/newcerts/client-key.pem -h remote.example.com -u root -p


Powinniśmy otrzymać takie komunikaty:


Enter password:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 101Server version: 5.5.24-8-log (Debian)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Jeżeli wszystko jest ok, robimy quit.

Teraz zajmiemy się konfiguracją phpMyAdmin:


nano /usr/share/phpmyadmin/libraries/dbi/mysqli.dbi.lib.php

Szukamy w pliku takiej sekcji:


 /* Optionally enable SSL */
    if ($GLOBALS['cfg']['Server']['ssl'] && defined('MYSQLI_CLIENT_SSL')) {
        $client_flags |= MYSQLI_CLIENT_SSL;
    }

następnie zamieniamy ją na:


/* Optionally enable SSL */    if ($GLOBALS['cfg']['Server']['ssl'] && defined('MYSQLI_CLIENT_SSL')) {        mysqli_ssl_set($link, $GLOBALS['cfg']['Server']['key'], $GLOBALS['cfg']['Server']['cert'], $GLOBALS['cfg']['Server']['ca'], $GLOBALS['cfg']['Server']['capath'], $GLOBALS['cfg']['Server']['cipher']);        $client_flags |= MYSQLI_CLIENT_SSL;    }

następnie:

nano /etc/phpmyadmin/config.inc.php

odnajdujemy:



/* Configure according to dbconfig-common if enabled */if (!empty($dbname)) {    /* Authentication type */    $cfg['Servers'][$i]['auth_type'] = 'cookie';    /* Server parameters */    if (empty($dbserver)) $dbserver = 'localhost';    $cfg['Servers'][$i]['host'] = $dbserver;
    if (!empty($dbport) || $dbserver != 'localhost') {        $cfg['Servers'][$i]['connect_type'] = 'tcp';        $cfg['Servers'][$i]['port'] = $dbport;    }    //$cfg['Servers'][$i]['compress'] = false;    /* Select mysqli if your server has it */    $cfg['Servers'][$i]['extension'] = 'mysqli';    /* Optional: User for advanced features */    $cfg['Servers'][$i]['controluser'] = $dbuser;    $cfg['Servers'][$i]['controlpass'] = $dbpass;    /* Optional: Advanced phpMyAdmin features */    $cfg['Servers'][$i]['pmadb'] = $dbname;    $cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark';    $cfg['Servers'][$i]['relation'] = 'pma_relation';    $cfg['Servers'][$i]['table_info'] = 'pma_table_info';    $cfg['Servers'][$i]['table_coords'] = 'pma_table_coords';    $cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages';    $cfg['Servers'][$i]['column_info'] = 'pma_column_info';    $cfg['Servers'][$i]['history'] = 'pma_history';    $cfg['Servers'][$i]['designer_coords'] = 'pma_designer_coords';    $cfg['Servers'][$i]['tracking'] = 'pma_tracking';    $cfg['Servers'][$i]['userconfig'] = 'pma_userconfig';
    /* Uncomment the following to enable logging in to passwordless accounts,     * after taking note of the associated security risks. */    // $cfg['Servers'][$i]['AllowNoPassword'] = TRUE;
    /* Advance to next server for rest of config */    $i++;}

następnie dodajemy:


/* localhost.example.com *//* Authentication type */$cfg['Servers'][$i]['auth_type'] = 'cookie';/* Server parameters */$cfg['Servers'][$i]['host'] = 'localhost';$cfg['Servers'][$i]['connect_type'] = 'tcp';$cfg['Servers'][$i]['compress'] = false;/* Select mysqli if your server has it */$cfg['Servers'][$i]['extension'] = 'mysqli';$cfg['Servers'][$i]['hide_db'] = '(information_schema|performance_schema|test)';$i++;

$cfg['Servers'][$i]['hide_db'] pozwala wyłączyć pewne elementy bazy z widoczności ich w phpMyAdmin

dla remote.example.com dodajemy:


/* remote.example.com *//* Authentication type */$cfg['Servers'][$i]['auth_type'] = 'cookie';/* Server parameters */$cfg['Servers'][$i]['host'] = 'remote.example.com';$cfg['Servers'][$i]['connect_type'] = 'tcp';$cfg['Servers'][$i]['compress'] = false;$cfg['Servers'][$i]['ssl'] = true;$cfg['Servers'][$i]['key'] = '/etc/mysql/newcerts/client-key.pem';$cfg['Servers'][$i]['cert'] = '/etc/mysql/newcerts/client-cert.pem';$cfg['Servers'][$i]['ca'] = '/etc/mysql/newcerts/ca-cert.pem';$cfg['Servers'][$i]['capath'] = NULL;$cfg['Servers'][$i]['cipher'] = NULL;/* Select mysqli if your server has it */$cfg['Servers'][$i]['extension'] = 'mysqli';$cfg['Servers'][$i]['hide_db'] = '(information_schema|performance_schema|test)';$i++;

Ważne, aby $cfg['Servers'][$i]['ssl'] (pogrubione) miało wartość true.


Nasz w pliku zawarte było:


/* Configure according to dbconfig-common if enabled */if (!empty($dbname)) {    /* Authentication type */    $cfg['Servers'][$i]['auth_type'] = 'cookie';    /* Server parameters */    if (empty($dbserver)) $dbserver = 'localhost';    $cfg['Servers'][$i]['host'] = $dbserver;
    if (!empty($dbport) || $dbserver != 'localhost') {        $cfg['Servers'][$i]['connect_type'] = 'tcp';        $cfg['Servers'][$i]['port'] = $dbport;    }    //$cfg['Servers'][$i]['compress'] = false;    /* Select mysqli if your server has it */    $cfg['Servers'][$i]['extension'] = 'mysqli';    /* Optional: User for advanced features */    $cfg['Servers'][$i]['controluser'] = $dbuser;    $cfg['Servers'][$i]['controlpass'] = $dbpass;    /* Optional: Advanced phpMyAdmin features */    $cfg['Servers'][$i]['pmadb'] = $dbname;    $cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark';    $cfg['Servers'][$i]['relation'] = 'pma_relation';    $cfg['Servers'][$i]['table_info'] = 'pma_table_info';    $cfg['Servers'][$i]['table_coords'] = 'pma_table_coords';    $cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages';    $cfg['Servers'][$i]['column_info'] = 'pma_column_info';    $cfg['Servers'][$i]['history'] = 'pma_history';    $cfg['Servers'][$i]['designer_coords'] = 'pma_designer_coords';    $cfg['Servers'][$i]['tracking'] = 'pma_tracking';    $cfg['Servers'][$i]['userconfig'] = 'pma_userconfig';
    /* Uncomment the following to enable logging in to passwordless accounts,     * after taking note of the associated security risks. */    // $cfg['Servers'][$i]['AllowNoPassword'] = TRUE;
    /* Advance to next server for rest of config */    $i++;}
/* localhost.example.com *//* Authentication type */$cfg['Servers'][$i]['auth_type'] = 'cookie';/* Server parameters */$cfg['Servers'][$i]['host'] = 'localhost';$cfg['Servers'][$i]['connect_type'] = 'tcp';$cfg['Servers'][$i]['compress'] = false;/* Select mysqli if your server has it */$cfg['Servers'][$i]['extension'] = 'mysqli';$cfg['Servers'][$i]['hide_db'] = '(information_schema|performance_schema|test)';$i++;
/* remote.example.com *//* Authentication type */$cfg['Servers'][$i]['auth_type'] = 'cookie';/* Server parameters */$cfg['Servers'][$i]['host'] = 'remote.example.com';$cfg['Servers'][$i]['connect_type'] = 'tcp';$cfg['Servers'][$i]['compress'] = false;$cfg['Servers'][$i]['ssl'] = true;$cfg['Servers'][$i]['key'] = '/etc/mysql/newcerts/client-key.pem';$cfg['Servers'][$i]['cert'] = '/etc/mysql/newcerts/client-cert.pem';$cfg['Servers'][$i]['ca'] = '/etc/mysql/newcerts/ca-cert.pem';$cfg['Servers'][$i]['capath'] = NULL;$cfg['Servers'][$i]['cipher'] = NULL;/* Select mysqli if your server has it */$cfg['Servers'][$i]['extension'] = 'mysqli';$cfg['Servers'][$i]['hide_db'] = '(information_schema|performance_schema|test)';$i++;
/* End of servers configuration */


Powinniśmy w ekranie logowania do phpMyAdmin móc wybrać bazę na zdalnej maszynie. Od teraz mamy możliwość podglądania stanu bazy na zdalnej maszynie.



Brak komentarzy:

Prześlij komentarz