sobota, 29 listopada 2014

Kopia zapasowa bazy danych MySQL + zaszyfrowanie pliku + email


Wstęp 

 

Administratorzy systemów informatycznych, a szczególnie osoby odpowiedzialne za bezpieczeństwo dużych zbiorów danych dobrze wiedzą jak ważne jest prawidłowe planowanie i automatyczne wykonywanie zrzutów baz danych oraz w pełni zdają sobie sprawę z konieczności bezpiecznego przechowywania plików z kopiami zapasowymi, tak aby ich zawartość nie mogła się dostać w niepowołane ręce. Było by pięknie gdyby powyższe stwierdzenie pokrywało się z rzeczywistością, ale niestety, nie zawsze tak jest, a w wielu przypadkach, przynajmniej aż do momentu pierwszej utraty ważnych zbiorów danych. Dopiero po fakcie wiele administratorów danych uświadamia sobie jak ogromną wagę ma regularne wykonywanie kopii zapasowych.

Podstawowe zasady dotyczące bezpieczęństwa danych mówią, iż kopie zapasowe danych powinny być sporządzane w sposów zaplanowany i automatyczny, a pliki z danymi powinny być przechowywane w sposób taki, aby osoby nie uprawnione nie miały dostępu do ich zawartości.

Dziś zaprezentuję metodę umożliwiającą planowane i automatyczne wykonanie kopii zapasowej (zrzutu) bazy danych MySQL z zaszyfrowaniem wynikowego pliku kluczem kryptograficznym oraz wysłaniem zbioru danych na zewnętrzną maszynę korzystając z poczty elektronicznej. Zaszyfrowane kryptograficznie dane będą bezpieczne i nikt, poza osobą posiadającą odpowiedni klucz prywatny, konieczny do ich odszyfrowania, nie będzie miał wglądu do zbioru. Tą osobą może być także sam administrator, który automatycznie może otrzymywać zrzuty mysqldump, zaszyfrowane, na swoją domową maszynę. Pójdzmy jeszcze dalej, i wyobraźmy sobie, że zaszyfrowane pliki mogą być wysyłane na serwer poczty IMAP, z którego koszysta administrator. W takim przypadku, pliki z danymi mogą być dodatkowo archiwizowane i przechowywane na serwerze poczty, w odpowiednich katalogach IMAP, a nikt, poza osobą do tego uprawnioną nie jest w stanie rozszyfrować ich zawartości. Zaszyfrowane kluczem kryptograficznym dane, mogą być bezpiecznie przesyłanie przez internet, a nawet przechowywane na serwerach poczty IMAP w celu zapewnienia ich optymalnego sposobu przechowywania oraz pełnej dostępności w razie potrzeby.

Założenia


Niniejszy artykuł oparty jest na przykładach opracowanych i przetestowanych przeze mnie na następujących systemach:

Serwer bazy danych MySQL pracujący pod systemem operacyjnym Linux Centos 7 z zainstalowanym oprogramowaniem gpg (GnuPG) 2.0.22 - libgcrypt 1.5.3;

Domowa maszyna z systemem operacyjnym Windows 8.1 z zainstalowanym klientem pocztowym Mozilla Thunderbird w wersji anglojęzycznej.

Pojęcie kluczy kryptograficznych

 

Klucze kryptograficzne umożliwiają bezpieczną komunikację elektroniczną. Zazwyczaj generowana jest para kluczy, w skład której wchodzi klucz publiczny oraz klucz prywatny. Klucz publiczny jest udostępniany publicznie i może być porównywany z sejfem, do którego jest pakowana zawartość. Po tym, jak sejf zostaje zamknięty, tylko odpowiedni klucz prywatny może go otworzyć. Klucz prywatny, z wygenerowanej pary kluczy, jest kluczem do odszyfrowywania wiadomości zaszyfrowanych kluczem publicznym, należącym do wygenerowanej pary kluczy. Klucz prywatny powienien być należycie chroniony, a dodatkowo zabezpieczony hasłem, na przypadek gdyby miał dostać się w niepowołane ręce.

Postępowanie


Istnieje wiele odmiennych sposobów generowania kluczy kryptograficznych, jak i posługiwania się wygenerowanymi kluczami. W niniejszym artykule opiszę jedno z możliwych podejść. Aby ułatwić zrozumienie zagadnienia, para kluczy zostanie utworzona na maszynie, na której będzie odbywało się odszyfrowywanie danych. 



Krok I -Instalacja narzędzi GnuPG na maszynie Windows oraz utworzenie nowych kluczy kryptograficznych

Narzędzia cryptograficzne GnuPG umożliwiają tworzenie kluczy kryptograficznych oraz zaawansowane zarządzanie takowymi kluczami.

Pierwszą czynnością którą należy wykonać jest instalacja pakietu Gpg4Win dla systemu operacyjnego Windows. Pakiet można pobrać pod adresem http://gpg4win.org/download.html

Pakiet gpg4win umożliwia prawidłowe działanie rozszerzenia Enigmail dla klienta poczty Thunderbird.

W systemie Windows, aby ułatwić integrację kluczy cryptograficznych gpg z klientem poczty elektronicznej Thunderbird, należy zainstalować rozszerzenie Enigmail dla Thunderbird korystając z pozycji menu Thunderbird Tools->Add-ons i wybierając Extensions w lewej kolumnie menedżera dodatków. Dodatku Enigmail należy wyszukać w górnym prawym pasku wyszukiwania dodatków w menedżerze dodatków. Odnaleziony dodatek należy zainstalować korzystając w przycisku Install.

Enigmail - inatalacja
Instalacja dodatku Emigmail dla klienta poczty Thunderbird

Po prawidłowo przeprowadzonej instalacji pakietu Gpg4Win, oraz rozszerzenia Enigmail dla klienta poczty Mozilla Thunderbird, można rozpocząć tworzenie pary kluczy kryptograficznych. Należy pamiętać o tym, że klucz publiczny, który zostanie utworzony w systemie Windows będzie stosowany do szyfrowania danych w systemie Linux, a klucz prywatny, który zostanie utworzony w systemie Windows, będzie stosowany do odszyfrowywania załączników mailowych w kliencie poczty Mozilla Thunderbird. Należy również pamiętać o tym, że klucze prywatne muszą być przechowywane w sposób taki, aby nikt nie miał do nich dostępu, oprócz ich właściciela.


Aby zarządzać istniejącymi kluczami kryprograficznymi, lub utworzyć nową parę kluczy kryptograficznych w systemie Windows, należy uruchomić narzędzie Enigmail Key Management poprzez wybór pozycji Enigmail->Key Management z głównego menu klienta pocztowego Thunderbird.  W celu utworzenia nowych kluczy kryptograficznych można również skorzystać z narzędzia Enigmail Setup Wizard, lecz tutaj opiszę wyłącznie metodę z zastosowaniem Enigmail Key Management.

Enigmail - zarządzanie kluczami
Uruchomienie narzędzia Enigmail Key Management z programu Thunderbird

Należy wygenerować nową parę kluczy kryptograficznych wybierając Generate->New Key Pair z menu Enigmail Key Management Tool.


Enigmail - generowanie kluczy
Rozpoczęcie generowania nowej pary kluczy kryptograficznych


Klucz prywatny powinien być chroniony hasłem, które należy wprowadzić, aby rozpocząć generowanie pary kluczy. Zalecane jest zaznaczenie opcji Use generated key for the selected identity, która spowoduje przypisanie wygenerowanych kluczy kryptograficznych do wybranej tożsamości programu Thunderbird.


Klucze kryptograficzne OpenPGP - Enigmail
Generowanie kluczy kryptograficznych OpenPGP

Po zatwierdzeniu procesu przyciskiem Generate key, generowanie kluczy kryptograficznych może trochę potrwać. W trakcie procedury tworzenia kluczy pojawia się możliwość wygenerowania i zapisania certyfikatu odwołującego klucz publiczny. Zalecane jest utworzenie i zapisanie w bezpiecznym miejscu takiego certyfikatu. Certyfikat odwołujący klucz publiczny będzie mógł zostać zastosowany w przypadku, gdy nie będziemy już mieli zamiaru korzystać z klucza publicznego, który zdążyliśmy jednak już wysłać do korzystających z niego osób.

Krok II - Eksportowanie klucza publicznego z Enigmail oraz importowanie klucza w systemie Linux

Po wygenerowaniu pary kluczy, należy eksportować z programu Enigmail utworzony klucz publiczny, ponieważ będzie on potrzebny do szyfrowania przesyłanych danych z systemu Linux. Klucz publiczny należy eksportować korzystając z pozycji File->Export Keys to File narzędzia Enigmail Key Management, po uprzednim utworzeniu pary kluczy. Dla celów niniejszego artykułu należy wyeksportować wyłącznie klucz publiczny, wybierając opcję Export Public Keys Only. Druga opcja, która pojawia się przy eksporcie kluczy do pliku, daje możliwość eksportowania również klucza prywatnego. Dobrą praktyką jest eksportowanie klucza prywatnego wraz z publicznym i zachowanie pliku z kluczem prywatnym w bezpiecznym miejscu.

Eksportowanie klucza publicznego
Eksportowanie klucza publicznego OpenPGP


Klucz publiczny może również zostać wysłany pocztą elektroniczną do wybranego odbiorcy, korzystając z odpowiedniej pozycji powyżej przedstawionej listy wyboru.
Dla celów opisanych w niniejszym artykule ważne jest, aby plik z kluczem publicznym, wygenerowany programem Enigmail został przeniesiony do systemu Linux, tak aby mógł zostać tam zaimportowany do listy kluczy publicznych w oprogramowaniu GnuPG systemu Linux.

W systemie Linux, po skopiowaniu pliku z wygenerowanym w systemie Windows kluczem publicznym do wybranego katalogu, należy zaimportować klucz publiczny w następujący sposób:

[root@myserver]# gpg --import plik-z-kluczem-publicznym.asc
gpg: key AXA1ZX: public key "Jan Kowalski <j.kowalski@kowalski.pl>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

Po zaimportowaniu pliku z kluczem publicznym należy przejść do edytowania zaimportowanego klucza publicznego oraz przypisania do klucza najwyższego poziomu zaufania. Jest to ważne, aby uniknąć konieczności ręcznego potwierdzania procesu szyfrowania z zastosowaniem tego klucza. Dobrą praktyką jest także sprawdzenie czy odciski kluczy (fingerprint) zgadzają się na obu systemach.

Aby sprawdić, czy klucz został prawidłowo zaimportowany do listy kluczy, wystarczy wydać komendę gpg --list-keys. Klucz publiczny j.kowalski@kowalski.pl powinien widnieć w spisie kluczy publicznych.

Aby edytować zaimportowany klucz publiczny należy wydać komendę gpg z odpowiedną opcją:

[root@myserver]# gpg --edit-key j.kowalski@kowalski.pl
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

pub  xxxxxxxxx  created: 2014-11-29  expires: never       usage: SCA
                     trust: unknown       validity: unknown
sub  xxxxxxxxx created: 2014-11-29  expires: never       usage: E
[ unknown] (1). Jan Kowalski <j.kowalski@kowalski.pl>


Po uruchomieniu trybu edytowania klucza publicznego, aby sprawdzić jego odcisk (fingerprint) należy użyć komendy fpr pozostając w trybie edytowania:

gpg> fpr
pub   xxxxxxxxx 2014-11-29 Jan Kowalski <j.kowalski@kowalski.pl>
Primary key fingerprint: 8SSC 4220 3AAA 8A3A 00A1  6D06 8E52 81E1 B041 3D75

Aby ustawić odpowiedni poziom zaufania dla zaimportowanego klucza publicznego należy wydać komendę trust pozostając w trybie edytowania klucza:

gpg> trust
pub  xxxxxxxxx  created: 2014-11-29  expires: never       usage: SCA
                     trust: unknown       validity: unknown
sub  xxxxxxxxx created: 2014-11-29  expires: never       usage: E
[ unknown] (1). Jan Kowalski <j.kowalski@kowalski.pl>

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y

pub  xxxxxxxxx  created: 2014-11-29  expires: never       usage: SCA
                     trust: unknown       validity: unknown
sub  xxxxxxxxx created: 2014-11-29  expires: never       usage: E
[ unknown] (1). Jan Kowalski <j.kowalski@kowalski.pl>

Please note that the shown key validity is not necessarily correct
unless you restart the program.

Po wyznaczeniu najwyszego poziomu zaufania dla klucza, należy wyjść z trybu edytowania wprowadzając komendę quit.

Na tym etapie kryptograficzny klucz publiczny, który został utworzony przy pomocy oprogramowania Enigmail w środowisku Windows, znajduje się na liście kluczy publicznych oprogramowania GnuPG na serwerze Linux, posiada najwyższy poziom zaufania i może być śmiało stosowany do szyfrowania wiadomości wysyłanych do posiadacza opdowiedniego klucza prywatnego, bez konieczności ręcznego zatwierdzania procesu szyfrowania. Zaszyfrowane załączniki wiadomości, przy pomocy takiego klucza publicznego, będą mogły zostać odszyfrowane wyłącznie poprzez osobę posiadającą opdowiedni klucz prywatny, należący do wygenerowanej pary kluczy, oraz znającą hasło do klucza prywatnego.

Krok III - sprawdzenie czy wszystko działa

W tym momencie warto sprawdzić czy można bezproblemowo szyfrować pliki korzystając z uprzednio zaimportowanego oraz edytowanego klucza publicznego. Najprostszym sposobem na przeprowadzenie takiego testu może być wykonanie następujących czynności:


[root@myserver]# echo "jakiś tekst" > doc.txt
[root@myserver]# gpg --output doc.gpg --encrypt --recipient j.kowalski@kowalski.pl doc.txt
[root@myserver]# cat doc.gpg

Tutaj powinna pojawić się zaszyfrowana zawartość pliku. Pojawienie się zaszyfrowanej zawartości oznacza, że wszystko działa jak powinno, więc można przejść do następnego kroku.

Krok IV - Automatyczna procedura zrzutu bazy danych z zaszyfrowaniem zawartości pliku kopii zapasowej oraz wysłanie pliku na domową maszynę z systemem Windows 8.1

Opisana przeze mnie procedura tworzenia kopii zapasowej bazy danych MySQL opiera się na narzędziu mysqldump, które generuje zrzut danych, w określony przez użytkownika sposób. Należy pamiętać, że aby wykonać zrzut bazy danych MySQL należy mieć do tego odpowiednie uprawnienia.
W tym przykładzie zakładam, że użytkownikiem MySQL, który wykonuje zrzut jest sam root.

Należy utworzyć odpowiedni skrypt, odpowiedzialny za wykonywanie całej procedury, a następnie dodać odpowiedni wpis do crontab'a w cely totalnej automatyzacji.

Poniższy skrypt, opracowany przeze mnie jako prosty przykład, może być podstawą do dalszej rozbudowy, wegług potrzeb. Skrypt wywołuje procedurę generowania zrzutu wszystkich baz danych MySQL obecnych na serwerze, uruchamia gpg w celu zaszyfrowania danych kopii zapasowej
oraz powoduje wysłanie pocztą elektroniczną zaszyfrowanego kluczem publicznym załącznika do ustalonego odbiorcy. Skrypt, z uprawnieniami 700 [-rwx------], powinien być umieszczony w katalogu użytkownika, do którego pliku crontab zostanie przypisane zadanie w celu jego automatyzacji.
 
#!/bin/bash
# Set variables.
#
#                      Uwaga!
#                      EMAIL_FROM, EMAIL_TO oraz GPG_RECIPIENT
#                      zależy ustawić wg. własnych potrzeb
#                 
#
#
EMAIL_FROM="root@myserver.exampledomain.com"
EMAIL_TO="j.kowalski@kowalski.pl"
EMAIL_SUBJECT="MySQL-data-dump"
DATETIME=`date +%d-%m-%Y-%H.%M.%S`
BASE_FILENAME="mysqldump"_$DATETIME
GPG_RECIPIENT="j.kowalski@kowalski.pl"
# Dump tables
echo "Dumping tables...";
# uwaga: mojehasło należy zastąpić prawdziwym hasłem MySQL użytkownika --user !!!
mysqldump -c ---user=root --all-databases --password=mojehasło > $BASE_FILENAME.sql
#If file exists and is not zero then encrypt the file
 if [ -e $BASE_FILENAME.sql ] && [ -s $BASE_FILENAME.sql ]; then
  echo "OK!\n";
  echo "Encrypting dumped data with recipient's public key...";
  gpg --output $BASE_FILENAME.gpg --encrypt --recipient $GPG_RECIPIENT  $BASE_FILENAME.sql;
#If encrypted file exists and is not zero then send file as email attachement
  if [ -e $BASE_FILENAME.gpg ] && [ -s $BASE_FILENAME.gpg ]; then
   echo "OK!\n";
   echo "Sending encrypted data to "$EMAIL_TO"...";
   echo $DATETIME | mailx -r $EMAIL_FROM -s $EMAIL_SUBJECT -a $BASE_FILENAME.gpg $EMAIL_TO
   echo "OK!";
  else
   echo "\n\nMySQL tables content could not have been encrypted..." | mailx -r $EMAIL_FROM -s $EMAIL_SUBJECT $EMAIL_TO;
  fi
 else
  echo "\n\nMySQL tables could not have been dumped..." | mailx -r $EMAIL_FROM -s $EMAIL_SUBJECT $EMAIL_TO;
 fi

Zakładając, że skrypt zawarty jest w pliku /root/daily_mysqldump, aby zautomatyzować wykonywanie kopii zapasowych bazy danych należy edytować crontab wybranego użytkownika dodając, przykładowo, następujący wpis:

20      22      *       *       * /root/daily_mysqldump

Powyższy wpis do crontaba powoduje codzienne wykonanie zadania, o godzinie 22.20.

Krok V  - Odszyfrowywanie

Aby sprawdzić czy wszystko działa prawidłowo, można wykonać skrypt daily_mysqldump ręcznie. Jeżeli wszystko zostało skonfigurowane poprawnie, w skutek uruchomienia skryptu zaszyfrowany załącznik z kopią zapasową bazy danych powinien zostać wysłany na wskazany w skrypcie adres poczty elektronicznej. Na maszynie z systemem operacyjnym Windows 8.1 należy odebrać zaszyfrowany załącznik za pomocą klienta poczty Thunderbird, ze wczesniej skonfigurowanymi opcjami Enigmail. Po kliknięciu w załącznik powinna pojawić się prośba o wprowadzenie hasła kryptograficznego klucza prywatnego. Po wprowadzeniu hasła klucza prywatnego, należącego do uprzednio wygenerowanej pary kluczy, powinno być możliwe odczytanie odszyfrowanej zawartości załącznika, zawierającego kopię zapasową bazy danych.

W przypadku jakichkolwiek niejasności proszę o komentarze. Służę pomocą.















Brak komentarzy:

Prześlij komentarz