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.



Dziękuję Ci, za poświęcony czas na przeczytanie tego artykułu. Jeśli był on dla Ciebie przydatny, to gorąco zachęcam Cię do zapisania się na mój newsletter, jeżeli jeszcze Cię tam nie ma. Proszę Cię także o “polubienie” mojego bloga na Facebooku oraz kanału na YouTube – pomoże mi to dotrzeć do nowych odbiorców. Raz w tygodniu (niedziela punkt 17.00) otrzymasz powiadomienia o nowych artykułach / projektach zanim staną się publiczne. Możesz również pozostawić całkowicie anonimowy pomysł na wpis/nagranie.

Link do formularza tutaj: https://beitadmin.pl/pomysly

Pozostaw również komentarz lub napisz do mnie wiadomość odpisuję na każdą, jeżeli Masz jakieś pytania:).

Dodaj komentarz

beitadmin.pl - Droga Administratora IT