ot Veselin Markov(31-08-2006)

reiting (20)   [ dobre ]  [ zle ]

Printer Friendly Variant za otpechatvane

Zapisvane, suhranenie i prochit na poveritelna informatsiia ot BD


Veselin Markov 08.2006


Tazi statiia ima za tsel da predstavi sravnitelno siguren podhod pri boravene s konfidentsialna informatsiia, v t.ch. personalni danni, bankova informatsiia, osiguritelni nomera i t.n.


.:Vuvedenie


Sreshtal sum kakvi li ne bezotgovorni izpulneniia, na koito smelo se razchita i bivat opredeliani kato izklyuchitelno nadezhdni. Niama da se spiram na tiah, no vseki si dava smetka, che goliama chast ot tazi informatsiia e potrebna i predmet na zloupotrebi ot treti litsa.

Napisanoto ne pretendira za tsialost po vuprosa, nesumneno ima drugi spoluchlivi varianti, koito mogat da budat realizirani i tuk e miastoto da budat raziskvani.

Izpolzvaniiat softuer vklyuchva aktualni versii na Apache, PHP, PostgreSQL, OpenSSL i Linux.

Ideiata e suvsem prostichka - tsialoto dvizhenie na dannite ot brauzura na klienta do sluzhiteliat, koito shte chete i obrabotva informatsiiata, da se sluchva po zashtiten nachin.

Kak stava tova mozhe da bude onagledeno chrez slednata shema:

klientska zaiavka za izprashtane na danni kum https survur -> kriptirane na spetsialnata informatsiia -> zapis v baza danni <- chetene i obrabotka ot sluzhitel

Uslovno https survurut se namira v zona DMZ, koiato niama dostup do LAN.

Dobre e da se spomene, che BD koiato polzvam v sluchaia ima poddruzhka na SSL. Skriptut, koito se zakacha kum neia go pravi posredstvom SSL vruzka. PostgreSQL e konfiguriran taka, che da ne priema drugi metodi na svurzvane. Po tozi nachin trafikut mezhdu ueb survura i BD e bezpolezen za neotorizirani litsa, dori da bude prihvanat ot paketen snifur, primerno. Vupreki tova, edin put poluchilo administrativen dostup do suotvetnata mashina, takova litse bi moglo da se vuzpolzva ot novopostupvashtite danni, no sushtestvuvashtata informatsiia shte ostane neprochitaema za nego.

Malko po-kusno shte se spra na tova kak se izvurshva samoto kriptirane i dekriptirane na dannite, koeto e osnovna chast ot reshenieto na problema.

.:Konfigurirane na softuera

Pri Apache neshtata stoiat taka

# ./configure --enable-ssl [...]

Pri startirane iz log failovete ni interesuva tozi red, koito potvurzhdava, che survurut e kompiliran sus suotvetnata poddruzhka.

[Sun Aug 13 04:40:51 2006] [info] Server: Apache/2.2.3, Interface: mod_ssl/2.2.3, Library: OpenSSL/0.9.8b

Ako vse oshte niamate sertifikat i planirate da si kupite takuv ot Certificate Authority organizatsiia, po tozi nachin shte si suzdadete klyuch i Certificate Signing Request, koito sled tova shte im izpratite za podpis. Dobre e klyuchut da e zashtiten s parola, v protiven sluchai ne polzvaite '-des3'.

# openssl genrsa -des3 -out secure.example.net.key 1024
# openssl req -new -key secure.example.net.key -out secure.example.net.csr

Sled kato ste se sdobili veche sus sertifikat za survura, ostava da si dovurshite konfiguratsiiata.

[extra/httpd-ssl.conf]

<VirtualHost W.X.Y.Z:443>

DocumentRoot "/opt/apache2/htdocs/secure.example.net"
ServerName secure.example.net:443
ServerAdmin adm@example.net
ErrorLog /opt/apache2/logs/secure.example.net-error_ssl_log
TransferLog /opt/apache2/logs/secure.example.net-access_ssl_log
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

SSLCertificateFile /opt/apache2/conf/secure.example.net.crt
SSLCertificateKeyFile /opt/apache2/conf/secure.example.net.key


<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/opt/apache2/cgi-bin">
SSLOptions +StdEnvVars
</Directory>

BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

CustomLog /opt/apache2/logs/ssl_request_log %t %h %{SSL_PROTOCOL}x \
%{SSL_CIPHER}x \"%r\" %b \"%{Referer}i\" \"%{User-Agent}i\""


</VirtualHost>


Za PHP -

# ./configure --with-openssl[=DIR] [...]

Proveriavate dali vsichko izglezhda nared

# php -i | grep -i ssl

Ot interes sa slednite redove

Registered Stream Socket Transports => tcp, udp, unix, udg, ssl, sslv3, sslv2, tls
SSL Support => enabled
OpenSSL Version => OpenSSL 0.9.8b 04 May 2006

Malko po-nadolu e vidno kakvo shte pravim s php.


Pri PostgreSQL sushto razreshavate poddruzhka na SSL


# ./configure --with-openssl [...]

Tuk samo e zhelatelno da polzvate podpisan ot otoriziran CA sertifikat, mozhe da bude i self-signed. Po tozi nachin suzdavate i polzvate vtoriiat:

# openssl req -new -text -out server.req
# openssl rsa -in privkey.pem -out server.key

Mozhete da mahnete parolata na klyucha ako iskate da ne si igraete s expect skriptirane -

# openssl rsa -in privkey.pem -out server.key ; rm privkey.pem

Taka shte si podpishete sami sertifikata

# openssl req -x509 -in server.req -text -key server.key -out server.crt
# chmod og-rwx server.key

PostgreSQL shte tursi suzdadenite failove v data direktoriiata. Ostava da se ukazhe, che survurut shte polzva ssl komunikatsiia v postgresql.conf - ssl = on

V pg_hba.conf mozhe da iziskvate edinstveno takuv nachin za svurzvane na klientsko prilozhenie s bazata:

hostssl all all 0.0.0.0/0 md5

.:Simetrichno/Asimetrichno Kriptirane


Sled kato trafikut e podsiguren, sega e vreme da se pomisli kak shte se kriptirat samite danni. Pri simetrichno kriptirane obiknoveno se polzva edin i susht klyuch za kriptirane i dekriptirane na dannite. Sled kato v nashiia sluchai triabva da imame klyuch, koito shte e vurhu survura, tozi variant se eliminira po prostata prichina, che vseki s dostup do nego bi mogul eventualno da prochete kakvo ima v BD.

Udachno e da se izpolzva RSA asimetrichno kriptirane, pri koeto shte imame publichen i chasten klyuch. Asimetrichnoto kriptirane ne se svezhda samo do Public Key kriptirane, tui kato mozhe da se polzva sistema ot 2 chastni klyucha.

Mozhem da suzdadem i polzvame 8192 bitovi klyuchove, no dekriptiraneto na dannite shte otnema znachitelno poveche protsesorno vreme.
CHastniiat klyuch triabva da zashtitim s parola:

# openssl genrsa -des3 -out private.pem 2048

V sluchaia PEM (privacy enhanced mail) failut sadurzha i publichniia klyuch, koito shte izvlechem taka:

# openssl rsa -in private.pem -out public.pem -outform PEM -pubout

Toi izglezhda taka

 
 -----BEGIN PUBLIC KEY-----
 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuFSjgsIjIlyEo9qbjn+8
 86TyFI+78vVM5PJjKyFqpmWeJMPrmDK86ng1uPwIjEbSJKxhrYAhhR8+za8Q8DVU
 9ksTCdiH6jVwDm0VHoQuVaXuHTI7U5oCZFFrqkkN7x8GiulF8gQtbv8k5Z/P0JCQ
 43eEujiGdaB/xI4zoZe7RSyHur3ILGV32q7cS+/kiMe/SgCPGYDuYmr7cO1q/8QW
 kHHKHaJm29BUY2rXFGXXDeKEdXnNRYlQNJGKf5m8tg9lHm1IQq2g9S+aWedXN5Qz
 o6lZP4B34H0nA1eULWEO+gocXcUgBhlY2HO/T8nYn6VmNDmJnvv2j8gSpjMajcVH
 1QIDAQAX
 -----END PUBLIC KEY-----
 

Proverka dali vsichko e napraveno pravilno

# echo test > cleartext.txt
# openssl rsautl -encrypt -inkey public.pem -pubin -in cleartext.txt -out enctext.dat
# openssl rsautl -decrypt -inkey private.pem -in enctext.dat -out cleartext1.txt
# cat cleartext1.txt
test


private.pem premestvame na sistema, do koiato niama dostup ot zonata v koiato se namira nashiiat ueb survur. Ostava da se napishe prilozhenie, koeto teoritichno se svezhda do logvane na operator na vuprosnata mashina (#2) po https, startirane na prilozhenie, zakachashto se po ssl kum BD na ueb survura i chetene ot neia. S chastniiat klyuch i vuvedenata kum nego parola informatsiiata se dekriptira.


.:PHP, Primeri

Sled kato sme kompilirali PHP s poddruzhka na OpenSSL veche imame dostup do takiva funktsii i po-natatuk neshtata sa poveche ot trivialni. Referentsii za rabota s tiah - http://php.net/openssl.

...

// kriptirane pri survura

$text = somefilter($_POST['data']);

$fp = fopen('public.pem','r');
$pub_key = fread($fp,1024);
fclose($fp);

$res = openssl_get_publickey($pub_key);
openssl_public_encrypt($text,$crypttext,$pub_key);
openssl_free_key($res);

$data = base64_encode($crypttext);

// v po-'chetliv' vid

echo 'string crypted: ' . $data . "\n";

...

...

// dekriptirane na drug host

$priv_key_pass = somefilter($_POST['priv_key_pass']);

pg_connect(host=W.X.Y.Z port=5432 dbname= user= password= sslmode=require);

// vurzka kum BD i chetene ot neia, metodut na zakachane se nalaga i ot samata BD
...

$enctext = base64_decode($data);

$fp = fopen('private.pem','r');
$priv_key = fread($fp,1024);
fclose($fp);

$res = openssl_get_privatekey($priv_key,$priv_key_pass);
openssl_private_decrypt($enctext,$text,$res);
openssl_pkey_free($res);

echo 'string decrypt : ' . $text . "\n";

...

Alternativno e izpolzvaneto na PGP (GnuPG) s PHP, no za tselta gpg triabva da se vika kato vunshna programa, koeto v niakoi sluchai ne e osobeno udobno.


.:Vruzki

[1] http://www.php.net/openssl
[2] http://www.postgresql.org/docs/
[3] http://www.openssl.org/docs/





<< Kak da instalirame, izpolzvame i testvame s quemu seamlessrd | Smiana na IP blok >>