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
/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.pem, client-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;
}
/* 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; }
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:).