ot Veselin Markov(31-08-2006)
reiting (21)
[ dobre ]
[ zle ]
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 >>
|