32.18. ÐоддеÑжка SSL
- 32.18.1. ÐÑовеÑка ÑеÑÑиÑикаÑов ÑеÑвеÑа на ÑÑоÑоне клиенÑа
- 32.18.2. ÐлиенÑÑкие ÑеÑÑиÑикаÑÑ
- 32.18.3. ÐаÑиÑа, обеÑпеÑÐ¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð² ÑазлиÑнÑÑ ÑежимаÑ
- 32.18.4. ФайлÑ, иÑполÑзÑемÑе клиенÑом SSL
- 32.18.5. ÐниÑиализаÑÐ¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки SSL
- 32.18.2. ÐлиенÑÑкие ÑеÑÑиÑикаÑÑ
Postgres Pro ÑеализÑÐµÑ ÑобÑÑвеннÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ SSL-подклÑÑений Ð´Ð»Ñ ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ-ÑеÑвеÑного взаимодейÑÑÐ²Ð¸Ñ Ð² каÑеÑÑве меÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи. ÐодÑобнее ÑÑнкÑионалÑноÑÑÑ SSL на ÑÑоÑоне ÑеÑвеÑа опиÑÑваеÑÑÑ Ð² Разделе 17.9.
ÐиблиоÑека libpq ÑиÑÐ°ÐµÑ ÑиÑÑемнÑй Ñайл конÑигÑÑаÑии OpenSSL. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÐ¾Ñ Ñайл назÑваеÑÑÑ openssl.cnf и наÑ
одиÑÑÑ Ð² каÑалоге, коÑоÑÑй ÑообÑÐ°ÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° openssl version -d. ÐÑли ÑÑебÑеÑÑÑ ÑказаÑÑ Ð´ÑÑгое ÑаÑположение Ñайла конÑигÑÑаÑии, его можно задаÑÑ Ð² пеÑеменной окÑÑÐ¶ÐµÐ½Ð¸Ñ OPENSSL_CONF.
32.18.1. ÐÑовеÑка ÑеÑÑиÑикаÑов ÑеÑвеÑа на ÑÑоÑоне клиенÑа
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Postgres Pro не вÑполнÑÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ пÑовеÑки ÑеÑÑиÑикаÑа ÑеÑвеÑа. ÐÑо ознаÑаеÑ, ÑÑо клиенÑа можно ввеÑÑи в заблÑждение, подменив ÑеÑÐ²ÐµÑ (напÑимеÑ, изменив запиÑÑ Ð² DNS или занÑв его IP-адÑеÑ). ЧÑÐ¾Ð±Ñ Ð·Ð°ÑиÑиÑÑÑÑ Ð¾Ñ Ñакой подменÑ, ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿ÑовеÑÑÑÑ Ð¿Ð¾Ð´Ð»Ð¸Ð½Ð½Ð¾ÑÑÑ ÑеÑвеÑа по ÑепоÑке довеÑиÑ. ÐÐ»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑепоÑки довеÑÐ¸Ñ Ð½Ñжно ÑÑÑановиÑÑ ÐºÐ¾Ñневой (ÑамоподпиÑаннÑй) ÑеÑÑиÑÐ¸ÐºÐ°Ñ ÑенÑÑа ÑеÑÑиÑикаÑии (ЦС) на одном компÑÑÑеÑе, а конеÑнÑй ÑеÑÑиÑикаÑ, подпиÑаннÑй коÑневÑм, на дÑÑгом. Ð ÑепоÑке Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¸ «пÑомежÑÑоÑнÑй» ÑеÑÑиÑикаÑ, коÑоÑÑй подпиÑÑваеÑÑÑ ÐºÐ¾ÑневÑм ÑеÑÑиÑикаÑом и подпиÑÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð´ÑинÑннÑе ÑеÑÑиÑикаÑÑ.
ЧÑÐ¾Ð±Ñ ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð³ пÑовеÑиÑÑ Ð¿Ð¾Ð´Ð»Ð¸Ð½Ð½Ð¾ÑÑÑ ÑеÑвеÑа, ÑÑÑановиÑе на клиенÑе коÑневой ÑеÑÑиÑикаÑ, а на ÑеÑвеÑе ÑÑÑановиÑе конеÑнÑй ÑеÑÑиÑикаÑ, подпиÑаннÑй ÑÑим коÑневÑм. ЧÑÐ¾Ð±Ñ ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð³ пÑовеÑиÑÑ Ð¿Ð¾Ð´Ð»Ð¸Ð½Ð½Ð¾ÑÑÑ ÐºÐ»Ð¸ÐµÐ½Ñа, ÑÑÑановиÑе на ÑеÑвеÑе коÑневой ÑеÑÑиÑикаÑ, а на клиенÑе конеÑнÑй ÑеÑÑиÑикаÑ, подпиÑаннÑй даннÑм коÑневÑм. ÐонеÑнÑй ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ñакже Ð¼Ð¾Ð¶ÐµÑ ÑвÑзÑваÑÑÑÑ Ñ ÐºÐ¾ÑневÑм ÑеÑез один или неÑколÑко пÑомежÑÑоÑнÑÑ ÑеÑÑиÑикаÑов (они обÑÑно Ñ ÑанÑÑÑÑ Ð²Ð¼ÐµÑÑе Ñ ÐºÐ¾Ð½ÐµÑнÑм ÑеÑÑиÑикаÑом).
Ðогда ÑепоÑка довеÑÐ¸Ñ Ð¿ÑиÑÑÑÑÑвÑеÑ, ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑовеÑиÑÑ ÐºÐ¾Ð½ÐµÑнÑй ÑеÑÑиÑикаÑ, пеÑеданнÑй ÑеÑвеÑом, двÑÐ¼Ñ ÑпоÑобами. ÐÑли паÑамеÑÑ sslmode Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение verify-ca, libpq бÑÐ´ÐµÑ Ð¿ÑовеÑÑÑÑ Ð¿Ð¾Ð´Ð»Ð¸Ð½Ð½Ð¾ÑÑÑ ÑеÑвеÑа, пÑовеÑÑÑ ÑепоÑÐºÑ Ð´Ð¾Ð²ÐµÑÐ¸Ñ Ð´Ð¾ коÑневого ÑеÑÑиÑикаÑа, ÑÑÑановленного на клиенÑе. ÐÑли в sslmode вÑбÑан Ñежим verify-full, libpq бÑÐ´ÐµÑ Ñакже пÑовеÑÑÑÑ ÑооÑвеÑÑÑвие имени Ñзла ÑеÑвеÑа имени, запиÑÐ°Ð½Ð½Ð¾Ð¼Ñ Ð² ÑеÑÑиÑикаÑе. SSL-подклÑÑение не бÑÐ´ÐµÑ ÑÑÑановлено, еÑли пÑовеÑиÑÑ ÑеÑÑиÑÐ¸ÐºÐ°Ñ ÑеÑвеÑа не ÑдаÑÑÑÑ. Режим verify-full ÑекомендÑеÑÑÑ Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва окÑÑжений, где важна безопаÑноÑÑÑ.
Ð Ñежиме verify-full Ð¸Ð¼Ñ Ñзла ÑвеÑÑеÑÑÑ Ñ Ð°ÑÑибÑÑом (или аÑÑибÑÑами) Subject Alternative Name (ÐлÑÑеÑнаÑивное Ð¸Ð¼Ñ ÑÑбÑекÑа) в ÑеÑÑиÑикаÑе или Ñ Ð°ÑÑибÑÑом Common Name (ÐбÑее имÑ), еÑли в ÑеÑÑиÑикаÑе оÑÑÑÑÑÑвÑÐµÑ Ð°ÑÑибÑÑ Subject Alternative Name Ñипа dNSName. ÐÑли аÑÑибÑÑ Ð¸Ð¼ÐµÐ½Ð¸ ÑеÑÑиÑикаÑа наÑинаеÑÑÑ Ñо звÑздоÑки (*), звÑздоÑка воÑпÑинимаеÑÑÑ ÐºÐ°Ðº подÑÑановоÑнÑй знак и ей бÑдÑÑ ÑооÑвеÑÑÑвоваÑÑ Ð²Ñе ÑимволÑ, кÑоме ÑоÑки (.). ÐÑо ознаÑаеÑ, ÑÑо Ñакой ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ð½Ðµ бÑÐ´ÐµÑ ÑооÑвеÑÑÑвоваÑÑ Ð¿Ð¾Ð´Ð´Ð¾Ð¼ÐµÐ½Ð°Ð¼. ÐÑли подклÑÑение ÑÑÑанавливаеÑÑÑ Ð¿Ð¾ IP-адÑеÑÑ, а не по имени Ñзла, пÑовеÑÑÑÑÑÑ Ð±ÑÐ´ÐµÑ IP-адÑÐµÑ (без поиÑка в DNS).
ЧÑÐ¾Ð±Ñ Ð½Ð°ÑÑÑоиÑÑ Ð¿ÑовеÑÐºÑ ÑеÑÑиÑикаÑа ÑеÑвеÑа, необÑ
одимо помеÑÑиÑÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко коÑневÑÑ
ÑеÑÑиÑикаÑов в Ñайл ~/.postgresql/root.crt в домаÑнем каÑалоге полÑзоваÑелÑ. (Ð Microsoft Windows ÑÑÐ¾Ñ Ñайл назÑваеÑÑÑ %APPDATA%\postgresql\root.crt.) Также ÑледÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ Ð² ÑÑÐ¾Ñ Ñайл пÑомежÑÑоÑнÑе ÑеÑÑиÑикаÑÑ, еÑли они нÑÐ¶Ð½Ñ Ð´Ð»Ñ ÑвÑзÑÐ²Ð°Ð½Ð¸Ñ ÑепоÑки ÑеÑÑиÑикаÑов, пеÑеданнÑÑ
ÑеÑвеÑом, Ñ ÐºÐ¾ÑневÑми ÑеÑÑиÑикаÑами, ÑÑÑановленнÑми на клиенÑе.
ÐÑли ÑÑÑеÑÑвÑÐµÑ Ñайл ~/.postgresql/root.crl (или %APPDATA%\postgresql\root.crl в Microsoft Windows), пÑи пÑовеÑке Ñакже ÑÑиÑÑваеÑÑÑ ÑодеÑжаÑийÑÑ Ð² нÑм ÑпиÑок оÑозваннÑÑ
ÑеÑÑиÑикаÑов (CRL, Certificate Revocation List).
РазмеÑение Ñайла коÑневÑÑ
ÑеÑÑиÑикаÑов и CRL можно поменÑÑÑ, задав паÑамеÑÑÑ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ sslrootcert и sslcrl или пеÑеменнÑе окÑÑÐ¶ÐµÐ½Ð¸Ñ PGSSLROOTCERT и PGSSLCRL, ÑооÑвеÑÑÑвенно.
ÐÑимеÑание
ÐÐ»Ñ Ð¾Ð±ÑаÑной ÑовмеÑÑимоÑÑи Ñ Ð¿ÑедÑдÑÑими веÑÑиÑми Postgres Pro, пÑи налиÑии Ñайла Ñ ÑеÑÑиÑикаÑами коÑневÑÑ
ЦС поведение Ñежима sslmode=require не оÑлиÑаеÑÑÑ Ð¾Ñ Ñежима verify-ca, Ñо еÑÑÑ ÑеÑÑиÑÐ¸ÐºÐ°Ñ ÑеÑвеÑа бÑÐ´ÐµÑ Ð¿ÑовеÑÑÑÑÑÑ Ð¿Ð¾ ÑеÑÑиÑикаÑÑ Ð¦Ð¡. ÐолагаÑÑÑÑ Ð½Ð° ÑÑо поведение не ÑекомендÑеÑÑÑ â пÑиложениÑ, коÑоÑÑм нÑжно пÑовеÑÑÑÑ ÑеÑÑиÑикаÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ñегда вÑбиÑаÑÑ Ñежим verify-ca или verify-full.
32.18.2. ÐлиенÑÑкие ÑеÑÑиÑикаÑÑ
ÐÑли ÑеÑÐ²ÐµÑ Ð¿Ð¾Ð¿ÑÑаеÑÑÑ Ð¿ÑовеÑиÑÑ Ð¿Ð¾Ð´Ð»Ð¸Ð½Ð½Ð¾ÑÑÑ ÐºÐ»Ð¸ÐµÐ½Ñа, запÑаÑÐ¸Ð²Ð°Ñ ÐºÐ¾Ð½ÐµÑнÑй ÑеÑÑиÑÐ¸ÐºÐ°Ñ ÐºÐ»Ð¸ÐµÐ½Ñа, libpq бÑÐ´ÐµÑ Ð¿ÐµÑедаваÑÑ ÑеÑÑиÑикаÑÑ, ÑоÑ
ÑанÑннÑе в Ñайле ~/.postgresql/postgresql.crt в домаÑнем каÑалоге полÑзоваÑелÑ. ÐÑи ÑеÑÑиÑикаÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑвÑзÑваÑÑÑÑ Ð¿Ð¾ ÑепоÑке Ñ ÐºÐ¾ÑневÑм ÑеÑÑиÑикаÑом, коÑоÑÐ¾Ð¼Ñ Ð´Ð¾Ð²ÐµÑÑÐµÑ ÑеÑвеÑ. Также должен пÑиÑÑÑÑÑвоваÑÑ ÑооÑвеÑÑÑвÑÑÑий закÑÑÑÑй клÑÑ ~/.postgresql/postgresql.key. Ð Microsoft Windows ÑÑи ÑÐ°Ð¹Ð»Ñ Ð½Ð°Ð·ÑваÑÑÑÑ %APPDATA%\postgresql\postgresql.crt и %APPDATA%\postgresql\postgresql.key. РазмеÑение Ñайлов ÑеÑÑиÑикаÑов и закÑÑÑого клÑÑа можно пеÑеопÑеделиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿Ð°ÑамеÑÑов подклÑÑÐµÐ½Ð¸Ñ sslcert и sslkey либо пеÑеменнÑÑ
окÑÑÐ¶ÐµÐ½Ð¸Ñ PGSSLCERT и PGSSLKEY.
Ð ÑиÑÑемаÑ
Unix ÑазÑеÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñайла закÑÑÑого клÑÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð¿ÑеÑаÑÑ Ð»Ñбой доÑÑÑп к Ð½ÐµÐ¼Ñ Ð²Ñем и гÑÑппе; ÑÑого можно добиÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ chmod 0600 ~/.postgresql/postgresql.key. Ðозможен и дÑÑгой ваÑианÑ, когда ÑÑим Ñайлом Ð²Ð»Ð°Ð´ÐµÐµÑ root, а гÑÑппа Ð¸Ð¼ÐµÐµÑ Ð´Ð¾ÑÑÑп на ÑÑение (Ñо еÑÑÑ, маÑка ÑазÑеÑений 0640). ÐаннÑй ваÑÐ¸Ð°Ð½Ñ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½, когда Ñайлами ÑеÑÑиÑикаÑов и клÑÑей ÑпÑавлÑÐµÑ Ñама опеÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ ÑиÑÑема. Ð ÑÑом ÑлÑÑае полÑзоваÑелÑ, запÑÑкаÑÑий libpq, должен бÑÑÑ Ñленом гÑÑппÑ, имеÑÑей доÑÑÑп к ÑказаннÑм Ñайлам ÑеÑÑиÑикаÑа и клÑÑа. (Ð Microsoft Windows каÑалог %APPDATA%\postgresql ÑÑиÑаеÑÑÑ Ð·Ð°ÑиÑÑннÑм, поÑÑÐ¾Ð¼Ñ ÑазÑеÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñайлов не пÑовеÑÑÑÑÑÑ.)
ÐеÑвÑм ÑеÑÑиÑикаÑом в postgresql.crt должен бÑÑÑ ÑеÑÑиÑÐ¸ÐºÐ°Ñ ÐºÐ»Ð¸ÐµÐ½Ñа, Ñак как он должен ÑооÑвеÑÑÑвоваÑÑ Ð·Ð°ÐºÑÑÑÐ¾Ð¼Ñ ÐºÐ»ÑÑÑ ÐºÐ»Ð¸ÐµÐ½Ñа. ÐополниÑелÑно в ÑÑÐ¾Ñ Ñайл могÑÑ Ð±ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ Â«Ð¿ÑомежÑÑоÑнÑе» ÑеÑÑиÑикаÑÑ â ÑÑо Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð²ÑеÑ
пÑомежÑÑоÑнÑÑ
ÑеÑÑиÑикаÑов на ÑеÑвеÑе (Ñм. ssl_ca_file).
СеÑÑиÑÐ¸ÐºÐ°Ñ Ð¸ клÑÑ Ð¼Ð¾Ð³ÑÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð² ÑоÑмаÑе PEM или ASN.1 DER.
ÐлÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑоÑ
ÑанÑн в оÑкÑÑÑом виде или заÑиÑÑован лÑбÑм поддеÑживаемÑм OpenSSL алгоÑиÑмом, напÑÐ¸Ð¼ÐµÑ AES-128. ÐÑли клÑÑ Ñ
ÑаниÑÑÑ Ð·Ð°ÑиÑÑованнÑм, паÑÐ¾Ð»Ñ Ð´Ð»Ñ ÐµÐ³Ð¾ ÑаÑÑиÑÑовÑÐ²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð´Ð°Ð½ в паÑамеÑÑе подклÑÑÐµÐ½Ð¸Ñ sslpassword. ÐÑли же клÑÑ Ð·Ð°ÑиÑÑован, а паÑамеÑÑ sslpassword не задан или Ð¸Ð¼ÐµÐµÑ Ð¿ÑÑÑое знаÑение, паÑÐ¾Ð»Ñ Ð±ÑÐ´ÐµÑ Ð·Ð°Ð¿ÑоÑен инÑеÑакÑивно ÑÑедÑÑвами OpenSSL в пÑиглаÑении Enter PEM pass phrase: (ÐведиÑе паÑÐ¾Ð»Ñ Ð´Ð»Ñ PEM:) пÑи ÑÑловии налиÑÐ¸Ñ TTY. ÐÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÐµÑеопÑеделиÑÑ Ð¿ÑиглаÑение Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑа паÑÐ¾Ð»Ñ ÑеÑÑиÑикаÑа и обÑабоÑÐºÑ Ð¿Ð°ÑамеÑÑа sslpassword, ÑÑÑановив ÑобÑÑвеннÑÑ ÑÑнкÑиÑ-обÑабоÑÑик паÑÐ¾Ð»Ñ ÐºÐ»ÑÑа; Ñм. PQsetSSLKeyPassHook_OpenSSL.
Ðа инÑÑÑÑкÑиÑми по ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑеÑÑиÑикаÑов обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 17.9.5.
32.18.3. ÐаÑиÑа, обеÑпеÑÐ¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð² ÑазлиÑнÑÑ ÑежимаÑ
РазнÑе знаÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑа sslmode обеÑпеÑиваÑÑ ÑазнÑе ÑÑовни заÑиÑÑ. SSL позволÑÐµÑ Ð·Ð°ÑиÑиÑÑÑÑ Ð¾Ñ ÑледÑÑÑиÑ
Ñипов аÑак:
- ÐÑоÑлÑÑивание
ÐÑли ÑÑеÑÑÑ ÑÑоÑона Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоÑлÑÑиваÑÑ ÑеÑевой ÑÑаÑик Ð¼ÐµÐ¶Ð´Ñ ÐºÐ»Ð¸ÐµÐ½Ñом и ÑеÑвеÑом, она Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ ÐºÐ°Ðº инÑоÑмаÑÐ¸Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (вклÑÑÐ°Ñ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¸ паÑолÑ), Ñак и пеÑедаваемÑе даннÑе. ЧÑÐ¾Ð±Ñ Ð·Ð°ÑиÑиÑÑÑÑ Ð¾Ñ ÑÑого, SSL ÑиÑÑÑÐµÑ ÑÑаÑик.
- ÐоÑÑедник (MITM)
ÐÑли ÑÑеÑÑÑ ÑÑоÑона Ð¼Ð¾Ð¶ÐµÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе, пеÑедаваемÑе Ð¼ÐµÐ¶Ð´Ñ ÐºÐ»Ð¸ÐµÐ½Ñом и ÑеÑвеÑом, она Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедÑÑавиÑÑÑÑ ÑеÑвеÑом и, Ñаким обÑазом, ÑÐ¼Ð¾Ð¶ÐµÑ Ð²Ð¸Ð´ÐµÑÑ Ð¸ модиÑиÑиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе, даже еÑли они заÑиÑÑованÑ. ТÑеÑÑÑ ÑÑоÑона заÑем Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾ÑпÑоизводиÑÑ Ñ Ð°ÑакÑеÑиÑÑики ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸ даннÑе Ð´Ð»Ñ Ð¿Ð¾Ð´Ð»Ð¸Ð½Ð½Ð¾Ð³Ð¾ ÑеÑвеÑа, ÑÑо ÑÐ´ÐµÐ»Ð°ÐµÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñм обнаÑÑжение ÑÑой аÑаки. ÐекÑоÑами Ñакой аÑаки Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Â«Ð¾ÑÑавление» DNS и подмена адÑеÑов, в ÑезÑлÑÑаÑе Ñего ÐºÐ»Ð¸ÐµÐ½Ñ Ð±ÑÐ´ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ð½Ðµ к ÑÐ¾Ð¼Ñ ÑеÑвеÑÑ, к коÑоÑÐ¾Ð¼Ñ Ð½Ñжно. Также еÑÑÑ Ð½ÐµÑколÑко дÑÑÐ³Ð¸Ñ Ð²Ð°ÑианÑов ÑеализаÑии ÑÑой аÑаки. ÐÐ»Ñ Ð·Ð°ÑиÑÑ Ð² SSL пÑименÑеÑÑÑ Ð¿ÑовеÑка ÑеÑÑиÑикаÑов, в ÑезÑлÑÑаÑе коÑоÑой ÑеÑÐ²ÐµÑ Ð´Ð¾ÐºÐ°Ð·ÑÐ²Ð°ÐµÑ ÑÐ²Ð¾Ñ Ð¿Ð¾Ð´Ð»Ð¸Ð½Ð½Ð¾ÑÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ.
- ÐлиÑеÑвоÑение
ÐÑли ÑÑеÑÑÑ ÑÑоÑона Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедÑÑавлÑÑÑÑÑ Ð°Ð²ÑоÑизованнÑм клиенÑом, она Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоÑÑо обÑаÑаÑÑÑÑ Ðº даннÑм, к коÑоÑÑм не должна имеÑÑ Ð´Ð¾ÑÑÑпа. ÐбÑÑно ÑÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð²ÑледÑÑвие небезопаÑного ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°ÑолÑми. Ð SSL Ð´Ð»Ñ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ ÑÑой ÑгÑÐ¾Ð·Ñ Ð¸ÑполÑзÑÑÑÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑкие ÑеÑÑиÑикаÑÑ, гаÑанÑиÑÑÑÑие, ÑÑо к ÑеÑвеÑÑ Ð¼Ð¾Ð³ÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ ÑолÑко владелÑÑÑ Ð´ÐµÐ¹ÑÑвиÑелÑнÑÑ ÑеÑÑиÑикаÑов.
ЧÑÐ¾Ð±Ñ Ñоединение бÑло гаÑанÑиÑованно заÑиÑено SSL, меÑ
анизм SSL должен бÑÑÑ Ð½Ð°ÑÑÑоен на клиенÑе и на ÑеÑвеÑе, пÑежде Ñем бÑÐ´ÐµÑ ÑÑÑановлено Ñоединение. ÐÑли он наÑÑÑоен ÑолÑко на ÑеÑвеÑе, ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°ÑаÑÑ Ð¿ÐµÑедаваÑÑ Ð²Ð°Ð¶Ð½ÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ (напÑимеÑ, паÑоли), до Ñого как поймÑÑ, ÑÑо ÑеÑÐ²ÐµÑ ÑÑебÑÐµÑ Ð²ÑÑокого ÑÑÐ¾Ð²Ð½Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи. Ð libpq Ð´Ð»Ñ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑÑ
Ñоединений нÑжно задаÑÑ Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа sslmode знаÑение verify-full или verify-ca и пÑедоÑÑавиÑÑ ÑиÑÑеме коÑневой ÑеÑÑиÑÐ¸ÐºÐ°Ñ Ð´Ð»Ñ Ð¿ÑовеÑки. РкаÑеÑÑве аналогии можно пÑивеÑÑи иÑполÑзование адÑеÑа Ñ https Ð´Ð»Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñного пÑоÑмоÑÑа веб-ÑодеÑжимого.
Ðогда подлинноÑÑÑ ÑеÑвеÑа подÑвеÑждена, ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑ ÐºÐ¾Ð½ÑиденÑиалÑнÑе даннÑе. ÐÑо знаÑиÑ, ÑÑо до ÑÑого моменÑа клиенÑÑ Ð½Ðµ нÑжно знаÑÑ, пÑименÑÑÑÑÑ Ð»Ð¸ ÑеÑÑиÑикаÑÑ Ð´Ð»Ñ Ð°ÑÑенÑиÑикаÑии, Ñак ÑÑо наÑÑÑойка иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑеÑÑиÑикаÑов ÑолÑко на ÑÑоÑоне ÑеÑвеÑа не ÑгÑÐ¾Ð¶Ð°ÐµÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи.
ÐÑе ваÑианÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SSL подÑазÑмеваÑÑ Ð¸Ð·Ð´ÐµÑжки ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ обмена клÑÑами, ÑÑо поÑÐ¾Ð¶Ð´Ð°ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑÑ Ð²ÑбоÑа Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑоизводиÑелÑноÑÑÑÑ Ð¸ безопаÑноÑÑÑÑ. РТаблиÑе 32.1 опиÑÑваÑÑÑÑ ÑиÑки, Ð¾Ñ ÐºÐ¾ÑоÑÑÑ
заÑиÑаÑÑ ÑазлиÑнÑе ваÑианÑÑ sslmode, и пÑиводÑÑÑÑ ÑÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¾ÑноÑиÑелÑно заÑиÑÑ Ð¸ издеÑжек.
ТаблиÑа 32.1. ÐпиÑÐ°Ð½Ð¸Ñ Ñежимов SSL
sslmode | ÐаÑиÑа Ð¾Ñ Ð¿ÑоÑлÑÑÐ¸Ð²Ð°Ð½Ð¸Ñ | ÐаÑиÑа Ð¾Ñ MITM | УÑвеÑждение |
|---|---|---|---|
disable | ÐÐµÑ | ÐÐµÑ | Ðне не важна безопаÑноÑÑÑ Ð¸ Ñ Ð½Ðµ пÑÐ¸ÐµÐ¼Ð»Ñ Ð¸Ð·Ð´ÐµÑжки, ÑвÑзаннÑе Ñ ÑиÑÑованием. |
allow | Ðозможно | ÐÐµÑ | Ðне не важна безопаÑноÑÑÑ, но Ñ Ð¿ÑÐ¸ÐµÐ¼Ð»Ñ Ð¸Ð·Ð´ÐµÑжки, ÑвÑзаннÑе Ñ ÑиÑÑованием, еÑли на ÑÑом наÑÑÐ°Ð¸Ð²Ð°ÐµÑ ÑеÑвеÑ. |
prefer | Ðозможно | ÐÐµÑ | Ðне не важна безопаÑноÑÑÑ, но Ñ Ð¿ÑедпоÑиÑÐ°Ñ ÑиÑÑование (и пÑÐ¸ÐµÐ¼Ð»Ñ ÑвÑзаннÑе издеÑжки), еÑли ÑÑо поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑеÑвеÑ. |
require | Ðа | ÐÐµÑ | Я Ñ Ð¾ÑÑ, ÑÑÐ¾Ð±Ñ Ð¼Ð¾Ð¸ даннÑе ÑиÑÑовалиÑÑ, и Ñ Ð¿ÑÐ¸ÐµÐ¼Ð»Ñ ÑопÑÑÑÑвÑÑÑие издеÑжки. Я довеÑÑÑ ÑеÑи в Ñом, ÑÑо она обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑение к нÑÐ¶Ð½Ð¾Ð¼Ñ ÑеÑвеÑÑ. |
verify-ca | Ðа | ÐавиÑÐ¸Ñ Ð¾Ñ Ð¿Ð¾Ð»Ð¸Ñики ЦС | Я Ñ Ð¾ÑÑ, ÑÑÐ¾Ð±Ñ Ð¼Ð¾Ð¸ даннÑе ÑиÑÑовалиÑÑ, и Ñ Ð¿ÑÐ¸ÐµÐ¼Ð»Ñ ÑопÑÑÑÑвÑÑÑие издеÑжки. Ðне нÑжна ÑвеÑенноÑÑÑ Ð² Ñом, ÑÑо Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑаÑÑÑ Ðº довеÑÐµÐ½Ð½Ð¾Ð¼Ñ ÑеÑвеÑÑ. |
verify-full | Ðа | Ðа | Я Ñ Ð¾ÑÑ, ÑÑÐ¾Ð±Ñ Ð¼Ð¾Ð¸ даннÑе ÑиÑÑовалиÑÑ, и Ñ Ð¿ÑÐ¸ÐµÐ¼Ð»Ñ ÑопÑÑÑÑвÑÑÑие издеÑжки. Ðне нÑжна ÑвеÑенноÑÑÑ Ð² Ñом, ÑÑо Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑаÑÑÑ Ðº довеÑÐµÐ½Ð½Ð¾Ð¼Ñ ÑеÑвеÑÑ Ð¸ ÑÑо именно ÑказаннÑй мной ÑеÑвеÑ. |
РазлиÑие ваÑианÑов verify-ca и verify-full завиÑÐ¸Ñ Ð¾Ñ Ñ
аÑакÑеÑа коÑневого ЦС. ÐÑли иÑполÑзÑеÑÑÑ Ð¿ÑблиÑнÑй ЦС, Ñежим verify-ca допÑÑÐºÐ°ÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑение к ÑеÑвеÑÑ Ñ ÑеÑÑиÑикаÑом, коÑоÑÑй полÑÑил кÑо Ñгодно в ÑÑом ЦС. Ð Ñакой ÑиÑÑаÑии нÑжно вÑегда иÑполÑзоваÑÑ Ñежим verify-full. ÐÑли же иÑполÑзÑеÑÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑй ЦС или даже ÑамоподпиÑаннÑй ÑеÑÑиÑикаÑ, Ñежим verify-ca обÑÑно обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð´Ð¾ÑÑаÑоÑнÑÑ Ð·Ð°ÑиÑÑ.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð°ÑамеÑÑ sslmode Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение prefer. Ðак показано в ÑаблиÑе, оно неÑÑÑекÑивно Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи и Ð¼Ð¾Ð¶ÐµÑ ÑолÑко пÑивноÑиÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе издеÑжки. Ðно вÑбÑано по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ÑклÑÑиÑелÑно Ð´Ð»Ñ Ð¾Ð±ÑаÑной ÑовмеÑÑимоÑÑи и не ÑекомендÑеÑÑÑ Ð´Ð»Ñ Ð·Ð°ÑиÑÑннÑÑ
окÑÑжений.
32.18.4. ФайлÑ, иÑполÑзÑемÑе клиенÑом SSL
РТаблиÑе 32.2 пеÑеÑиÑÐ»ÐµÐ½Ñ ÑайлÑ, имеÑÑие оÑноÑение к наÑÑÑойке SSL на ÑÑоÑоне клиенÑа.
ТаблиÑа 32.2. ФайлÑ, иÑполÑзÑемÑе клиенÑом SSL/libpq
| Файл | СодеÑжимое | ÐазнаÑение |
|---|---|---|
~/.postgresql/postgresql.crt | ÑеÑÑиÑÐ¸ÐºÐ°Ñ ÐºÐ»Ð¸ÐµÐ½Ñа | пеÑедаÑÑÑÑ ÑеÑвеÑÑ |
~/.postgresql/postgresql.key | закÑÑÑÑй клÑÑ ÐºÐ»Ð¸ÐµÐ½Ñа | подÑвеÑÐ¶Ð´Ð°ÐµÑ ÐºÐ»Ð¸ÐµÐ½ÑÑкий ÑеÑÑиÑикаÑ, пеÑедаваемÑй владелÑÑем; не гаÑанÑиÑÑеÑ, ÑÑо Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ ÑеÑÑиÑикаÑа заÑлÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð´Ð¾Ð²ÐµÑÐ¸Ñ |
~/.postgresql/root.crt | ÑеÑÑиÑикаÑÑ Ð´Ð¾Ð²ÐµÑеннÑÑ Ð¦Ð¡ | позволÑÐµÑ Ð¿ÑовеÑиÑÑ, ÑÑо ÑеÑÑиÑÐ¸ÐºÐ°Ñ ÑеÑвеÑа подпиÑан довеÑеннÑм ÑенÑÑом ÑеÑÑиÑикаÑии |
~/.postgresql/root.crl | ÑеÑÑиÑикаÑÑ, оÑозваннÑе ÑенÑÑами ÑеÑÑиÑикаÑии | ÑеÑÑиÑÐ¸ÐºÐ°Ñ ÑеÑвеÑа должен оÑÑÑÑÑÑвоваÑÑ Ð² ÑÑом ÑпиÑке |
32.18.5. ÐниÑиализаÑÐ¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки SSL
ÐÑли ваÑе пÑиложение иниÑиализиÑÑÐµÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ libssl и/или libcrypto, и libpq ÑобÑана Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой SSL, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑзваÑÑ PQinitOpenSSL, ÑÑÐ¾Ð±Ñ ÑообÑиÑÑ libpq, ÑÑо библиоÑека libssl и/или libcrypto Ñже иниÑиализиÑÐ¾Ð²Ð°Ð½Ñ Ð²Ð°Ñим пÑиложением, ÑÑÐ¾Ð±Ñ libpq не пÑÑалаÑÑ ÐµÑÑ Ñаз иниÑиализиÑоваÑÑ Ð¸Ñ
. Ðднако в ÑÑом Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи пÑи иÑполÑзовании OpenSSL веÑÑии 1.1.0 или вÑÑе, в коÑоÑой ÑеÑена пÑоблема повÑоÑнÑÑ
иниÑиализаÑий.
PQinitOpenSSLÐозволÑÐµÑ Ð¿ÑиложениÑм вÑбÑаÑÑ, какие библиоÑеки безопаÑноÑÑи нÑжно иниÑиализиÑоваÑÑ.
void PQinitOpenSSL(int do_ssl, int do_crypto);
Ðогда паÑамеÑÑ
do_sslоÑлиÑен Ð¾Ñ Ð½ÑлÑ, libpq бÑÐ´ÐµÑ Ð¸Ð½Ð¸ÑиализиÑоваÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ OpenSSL пеÑед пеÑвÑм подклÑÑением к базе даннÑÑ . Ðогда паÑамеÑÑdo_cryptoне Ñавен нÑлÑ, бÑÐ´ÐµÑ Ð¸Ð½Ð¸ÑиализиÑоваÑÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñекаlibcrypto. Ðо ÑмолÑÐ°Ð½Ð¸Ñ (еÑли ÑÑнкÑиÑPQinitOpenSSLне вÑзÑваеÑÑÑ) иниÑиализиÑÑÑÑÑÑ Ð¾Ð±Ðµ библиоÑеки. ÐÑли поддеÑжка SSL не бÑла ÑкомпилиÑована, ÑÑа ÑÑнкÑÐ¸Ñ Ð¿ÑиÑÑÑÑÑвÑеÑ, но ниÑего не делаеÑ.ÐÑли ваÑе пÑиложение иÑполÑзÑÐµÑ Ð¸ иниÑиализиÑÑÐµÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ OpenSSL или ÐµÑ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°ÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑекÑ
libcrypto, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑзваÑÑ ÑÑÑ ÑÑнкÑиÑ, пеÑедав нÑли в ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ð¿Ð°ÑамеÑÑÐ°Ñ , пеÑед пеÑвÑм подклÑÑением к базе даннÑÑ . СобÑÑвенно иниÑиализаÑÐ¸Ñ Ñакже важно пÑоизвеÑÑи пеÑед ÑÑÑановлением подклÑÑениÑ.PQinitSSLÐозволÑÐµÑ Ð¿ÑиложениÑм вÑбÑаÑÑ, какие библиоÑеки безопаÑноÑÑи нÑжно иниÑиализиÑоваÑÑ.
void PQinitSSL(int do_ssl);
ÐÑа ÑÑнкÑÐ¸Ñ ÑавнознаÑна вÑзовÑ
PQinitOpenSSL(do_ssl, do_ssl). ÐÑиложениÑм доÑÑаÑоÑно иниÑиализиÑоваÑÑ Ð¸Ð»Ð¸ не иниÑиализиÑоваÑÑ Ð¾Ð±Ðµ библиоÑеки OpenSSL иlibcryptoодновÑеменно.ФÑнкÑиÑ
PQinitSSLÑÑÑеÑÑвÑÐµÑ Ñо вÑемÑн PostgreSQL 8.0, Ñогда какPQinitOpenSSLпоÑвилаÑÑ Ð² PostgreSQL 8.4, Ñак ÑÑоPQinitSSLÐ¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑедпоÑÑиÑелÑней Ð´Ð»Ñ Ð¿Ñиложений, коÑоÑÑм нÑжно ÑабоÑаÑÑ Ñ Ð±Ð¾Ð»ÐµÐµ ÑÑаÑÑми веÑÑиÑми libpq.