54.3. ÐÑÑенÑиÑикаÑÐ¸Ñ SASL
SASL â ÑÑо инÑÑаÑÑÑÑкÑÑÑа аÑÑенÑиÑикаÑии Ð´Ð»Ñ Ð¿ÑоÑоколов, оÑиенÑиÑованнÑÑ Ð½Ð° ÑоединениÑ. Ðа даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ PostgreSQL ÑеализÑÐµÑ Ð´Ð²Ð° Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° SASL: SCRAM-SHA-256 и SCRAM-SHA-256-PLUS, а в бÑдÑÑем могÑÑ Ð¿Ð¾ÑвиÑÑÑÑ Ð¸ дÑÑгие. Ðалее опиÑÑваеÑÑÑ, как в пÑинÑипе оÑÑÑеÑÑвлÑеÑÑÑ Ð°ÑÑенÑиÑикаÑÐ¸Ñ SASL, а в ÑледÑÑÑем подÑазделе более подÑобно ÑаÑÑмаÑÑиваÑÑÑÑ SCRAM-SHA-256 и SCRAM-SHA-256-PLUS.
ÐоÑок ÑообÑений аÑÑенÑиÑикаÑии SASL
ЧÑÐ¾Ð±Ñ Ð½Ð°ÑаÑÑ Ð¾Ð±Ð¼ÐµÐ½ по ÑÑ ÐµÐ¼Ðµ аÑÑенÑиÑикаÑии SASL, ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ ÑообÑение AuthenticationSASL. Ðно ÑодеÑÐ¶Ð¸Ñ ÑпиÑок Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð² аÑÑенÑиÑикаÑии SASL, Ñ ÐºÐ¾ÑоÑÑми Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ ÑеÑвеÑ, в поÑÑдке пÑедпоÑÑений ÑеÑвеÑа.
ÐÐ»Ð¸ÐµÐ½Ñ Ð²ÑбиÑÐ°ÐµÑ Ð¾Ð´Ð¸Ð½ из поддеÑживаемÑÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð² из ÑпиÑка и пеÑедаÑÑ ÑеÑвеÑÑ ÑообÑение SASLInitialResponse. ÐÑо ÑообÑение ÑодеÑÐ¶Ð¸Ñ Ð¸Ð¼Ñ Ð²ÑбÑанного Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° и Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Â«ÐаÑалÑнÑй оÑÐ²ÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñа», еÑли ÑÑо иÑполÑзÑÐµÑ Ð²ÑбÑаннÑй Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼.
Ðа ÑÑим ÑледÑÐµÑ Ð¾Ð´Ð½Ð¾ или неÑколÑÐºÐ¸Ñ ÑообÑений вÑзова Ñо ÑÑоÑÐ¾Ð½Ñ ÑеÑвеÑа и оÑвеÑов Ñо ÑÑоÑÐ¾Ð½Ñ ÐºÐ»Ð¸ÐµÐ½Ñа. ÐÑе вÑÐ·Ð¾Ð²Ñ ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ Ð² ÑообÑениÑÑ AuthenticationSASLContinue, а ÐºÐ»Ð¸ÐµÐ½Ñ Ð¾ÑвеÑÐ°ÐµÑ Ð½Ð° Ð½Ð¸Ñ ÑообÑениÑми SASLResponse. ЧаÑÑнÑе деÑали ÑообÑений завиÑÑÑ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑного Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð°.
ÐаконеÑ, когда обмен аÑÑенÑиÑикаÑионной инÑоÑмаÑией заканÑиваеÑÑÑ ÑÑпеÑно, ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ ÑообÑение AuthenticationSASLFinal и ÑÑÐ°Ð·Ñ Ð·Ð° ним ÑообÑение AuthenticationOk. Ð ÑообÑении AuthenticationSASLFinal пеÑедаÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе даннÑе Ð¾Ñ ÑеÑвеÑа клиенÑÑ, ÑодеÑжимое коÑоÑÑÑ Ð¾Ð¿ÑеделÑеÑÑÑ Ð²ÑбÑаннÑм Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð¼ аÑÑенÑиÑикаÑии. ÐÑли Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ аÑÑенÑиÑикаÑии не ÑÑебÑÐµÑ Ð¿ÐµÑедаваÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе даннÑе в завеÑÑение обмена, ÑообÑение AuthenticationSASLFinal опÑÑкаеÑÑÑ.
Ð ÑлÑÑае оÑибки ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑеÑваÑÑ Ð¿ÑоÑеÑÑ Ð°ÑÑенÑиÑикаÑии на лÑбом ÑÑапе и пеÑедаÑÑ ÑообÑение ErrorMessage.
54.3.1. ÐÑÑенÑиÑикаÑÐ¸Ñ SCRAM-SHA-256
Ðа даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ Ð´Ð²Ð° меÑ
анизма SASL: SCRAM-SHA-256 и его ваÑиаÑÐ¸Ñ Ñо ÑвÑзÑванием каналов, SCRAM-SHA-256-PLUS. Ðни подÑобно опиÑÑваÑÑÑÑ Ð² RFC 7677 и RFC 5802.
Ðогда в Postgres Pro задейÑÑвÑеÑÑÑ SCRAM-SHA-256, ÑеÑÐ²ÐµÑ Ð¸Ð³Ð½Ð¾ÑиÑÑÐµÑ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ, коÑоÑое ÐºÐ»Ð¸ÐµÐ½Ñ Ð¿ÐµÑедаÑÑ Ð² client-first-message. ÐмеÑÑо ÑÑого иÑполÑзÑеÑÑÑ Ð¸Ð¼Ñ, пеÑеданное Ñанее в ÑÑаÑÑовом ÑообÑении. СоглаÑно ÑпеÑиÑикаÑии SCRAM, Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ Ð² UTF-8, но Postgres Pro поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑазнÑе кодиÑовки Ñимволов, и знаÑиÑ, Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Postgres Pro не вÑегда бÑÐ´ÐµÑ Ð¿ÑедÑÑавимо в UTF-8.
Ð ÑпеÑиÑикаÑии SCRAM говоÑиÑÑÑ, ÑÑо паÑÐ¾Ð»Ñ Ñакже должен пеÑедаваÑÑÑÑ Ð² UTF-8 и обÑабаÑÑваÑÑÑÑ Ð°Ð»Ð³Ð¾ÑиÑмом SASLprep. Ðднако Postgres Pro не ÑÑебÑеÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð°ÑÐ¾Ð»Ñ Ð¿ÑедÑÑавлÑлÑÑ Ð² UTF-8. Ðогда ÑÑÑанавливаеÑÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ, он обÑабаÑÑваеÑÑÑ Ð°Ð»Ð³Ð¾ÑиÑмом SASLprep как паÑÐ¾Ð»Ñ Ð² UTF-8, вне завиÑимоÑÑи Ð¾Ñ ÑакÑиÑеÑкой кодиÑовки. Ðднако еÑли он пÑедÑÑавлен недопÑÑÑимой Ð´Ð»Ñ UTF-8 поÑледоваÑелÑноÑÑÑÑ Ð±Ð°Ð¹Ñов либо ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñии байÑов UTF-8, коÑоÑÑе не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð°Ð»Ð³Ð¾ÑиÑм SASLprep, ÑÑо не бÑÐ´ÐµÑ ÑÑиÑаÑÑÑÑ Ð¾Ñибкой â пÑи аÑÑенÑиÑикаÑии бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ñй паÑолÑ, без обÑабоÑки SASLprep. ÐÑо позволÑÐµÑ Ð½Ð¾ÑмализоваÑÑ Ð¿Ð°Ñоли, пÑедÑÑавленнÑе в UTF-8, и пÑи ÑÑом иÑполÑзоваÑÑ Ð¿Ð°Ñоли не в UTF-8, а Ñакже не ÑÑебÑеÑ, ÑÑÐ¾Ð±Ñ ÑиÑÑема знала, в какой кодиÑовке задан паÑолÑ.
СвÑзÑвание каналов поддеÑживаеÑÑÑ Ð² Postgres Pro пÑи ÑбоÑке Ñ Ð¸ÑполÑзованием SSL. ÐÐ»Ñ SCRAM Ñо ÑвÑзÑванием каналов в каÑеÑÑве имени меÑ
анизма SASL вÑбÑано SCRAM-SHA-256-PLUS. Postgres Pro иÑполÑзÑÐµÑ Ñип ÑвÑзÑÐ²Ð°Ð½Ð¸Ñ tls-server-end-point.
Ð SCRAM без ÑвÑзÑÐ²Ð°Ð½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð¾Ð² ÑеÑÐ²ÐµÑ Ð²ÑбиÑÐ°ÐµÑ ÑлÑÑайное ÑиÑло, коÑоÑое пеÑедаÑÑÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð´Ð»Ñ ÑмеÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ñ Ð²Ð²ÐµÐ´ÑннÑм полÑзоваÑелем паÑолем и полÑÑÐµÐ½Ð¸Ñ Ð¿ÐµÑедаваемого в оÑÐ²ÐµÑ Ñ ÐµÑа. ХоÑÑ ÑÑо пÑепÑÑÑÑвÑÐµÑ Ð¿Ð¾Ð²ÑоÑÐ½Ð¾Ð¼Ñ Ð²Ð¾ÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¿Ð°ÑÐ¾Ð»Ñ Ð² поÑледÑÑÑем ÑеанÑе, подделÑнÑй ÑеÑÐ²ÐµÑ Ð¼ÐµÐ¶Ð´Ñ Ð½Ð°ÑÑоÑÑим ÑеÑвеÑом и клиенÑом Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑозÑаÑно пеÑедаÑÑ ÑлÑÑайное ÑиÑло ÑеÑвеÑа и заÑем ÑÑпеÑно пÑойÑи аÑÑенÑиÑикаÑиÑ.
SCRAM Ñо ÑвÑзÑванием каналов позволÑÐµÑ Ð¿ÑедоÑвÑаÑиÑÑ Ñакие аÑаки поÑÑедника, подмеÑÐ¸Ð²Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑ ÑеÑÑиÑикаÑа ÑеÑвеÑа в пеÑедаваемÑй Ñ ÐµÑ Ð¿Ð°ÑолÑ. ХоÑÑ Ð¿Ð¾Ð´Ð´ÐµÐ»ÑнÑй ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð²ÑоÑиÑÑ Ð¿ÐµÑедаÑÑ ÑеÑÑиÑикаÑа наÑÑоÑÑего ÑеÑвеÑа, Ñ Ð½ÐµÐ³Ð¾ не бÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпа к закÑÑÑÐ¾Ð¼Ñ ÐºÐ»ÑÑÑ, ÑооÑвеÑÑÑвÑÑÑÐµÐ¼Ñ ÑÑÐ¾Ð¼Ñ ÑеÑÑиÑикаÑÑ, поÑÑÐ¾Ð¼Ñ Ð¾Ð½ не ÑÐ¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´ÑвеÑдиÑÑ, ÑÑо ÑвлÑеÑÑÑ ÐµÐ³Ð¾ владелÑÑем, и, как ÑледÑÑвие, ÑÑÑановиÑÑ SSL-Ñоединение.
ÐÑимеÑ
СеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ ÑообÑение AuthenticationSASL. Ðно ÑодеÑÐ¶Ð¸Ñ ÑпиÑок Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð² аÑÑенÑиÑикаÑии SASL, Ñ ÐºÐ¾ÑоÑÑми Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ ÑеÑвеÑ. ÐÑÐ¾Ñ ÑпиÑок бÑÐ´ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ
SCRAM-SHA-256-PLUSиSCRAM-SHA-256, еÑли ÑеÑÐ²ÐµÑ ÑобÑан Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой SSL, а инаÑе â ÑолÑко поÑледнее знаÑение.ÐÐ»Ð¸ÐµÐ½Ñ Ð² оÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ ÑообÑение SASLInitialResponse, инÑоÑмиÑÑÑÑее о вÑбÑанном Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ðµ,
SCRAM-SHA-256илиSCRAM-SHA-256-PLUS. (ÐÐ»Ð¸ÐµÐ½Ñ Ð²Ð¾Ð»ÐµÐ½ вÑбÑаÑÑ Ð»Ñбой Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼, но Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑей безопаÑноÑÑи ÑледÑÐµÑ Ð²ÑбиÑаÑÑ Ð²Ð°ÑиаÑÐ¸Ñ Ñо ÑвÑзÑванием каналов, еÑли он ÑÑо поддеÑживаеÑ.) Рполе «ÐаÑалÑнÑй оÑÐ²ÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñа» ÑÑо ÑообÑение ÑодеÑÐ¶Ð¸Ñ Ð´Ð°Ð½Ð½Ñе SCRAMclient-first-message. Ðclient-first-messageÑодеÑжиÑÑÑ Ñип ÑвÑзÑÐ²Ð°Ð½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð¾Ð², вÑбÑаннÑй клиенÑом.СеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ ÑообÑение AuthenticationSASLContinue, ÑодеÑжаÑее даннÑе SCRAM
server-first-message.ÐÐ»Ð¸ÐµÐ½Ñ Ð¿ÐµÑедаÑÑ ÑообÑение SASLResponse, ÑодеÑжаÑее даннÑе SCRAM
client-final-message.СеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ ÑообÑение AuthenticationSASLFinal, ÑодеÑжаÑее даннÑе SCRAM
server-final-message, и ÑÑÐ°Ð·Ñ Ð·Ð° ним ÑообÑение AuthenticationOk.