28.11. ÐезопаÑноÑÑÑ #
РолÑ, иÑполÑзÑÐµÐ¼Ð°Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ ÑепликаÑии, должна имеÑÑ Ð°ÑÑибÑÑ REPLICATION (или бÑÑÑ ÑÑпеÑполÑзоваÑелем). ÐÑли Ñ Ñоли оÑÑÑÑÑÑвÑÑÑ ÑвойÑÑва SUPERUSER и BYPASSRLS, пÑи ÑепликаÑии могÑÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ð¾Ð»Ð¸Ñики заÑиÑÑ ÑÑÑок, опÑеделÑннÑе на ÑÑоÑоне пÑбликаÑии. ÐÑли ÑÑа ÑÐ¾Ð»Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¾Ð²ÐµÑÑÑÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑÑам вÑеÑ
ÑаблиÑ, добавÑÑе в ÑÑÑÐ¾ÐºÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ options=-crow_security=off; еÑли Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ ÑаблиÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ Ð¿Ð¾Ð»Ð¸ÑÐ¸ÐºÑ Ð·Ð°ÑиÑÑ ÑÑÑок позже, пÑи Ñаком знаÑении паÑамеÑÑа ÑепликаÑÐ¸Ñ Ð¾ÑÑановиÑÑÑ, но полиÑика вÑполнÑÑÑÑÑ Ð½Ðµ бÑдеÑ. ÐоÑÑÑп Ð´Ð»Ñ ÑÑой Ñоли должен бÑÑÑ Ð½Ð°ÑÑÑоен в pg_hba.conf, и ÑÑа ÑÐ¾Ð»Ñ Ñакже должна имеÑÑ Ð°ÑÑибÑÑ LOGIN.
ЧÑÐ¾Ð±Ñ Ð¸Ð¼ÐµÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑкопиÑоваÑÑ Ð¸ÑÑ
однÑе даннÑе ÑаблиÑÑ, ÑолÑ, иÑполÑзÑÐµÐ¼Ð°Ñ Ð´Ð»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑепликаÑии, должна имеÑÑ Ð¿Ñаво SELECT в пÑбликÑемой ÑаблиÑе (или бÑÑÑ ÑÑпеÑполÑзоваÑелем).
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¿ÑбликаÑиÑ, полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ Ð¿Ñаво CREATE в базе даннÑÑ
.
ЧÑÐ¾Ð±Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ ÑаблиÑÑ Ð² пÑбликаÑиÑ, полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ Ð¿Ñава владелÑÑа Ð´Ð»Ñ ÑÑÐ¸Ñ ÑаблиÑ. ÐобавлÑÑÑ Ð² пÑбликаÑÐ¸Ñ Ð²Ñе ÑаблиÑÑ ÑÑ ÐµÐ¼Ñ Ð¼Ð¾Ð¶ÐµÑ ÑолÑко ÑÑпеÑполÑзоваÑелÑ. Также ÑолÑко ÑÑпеÑполÑзоваÑелÑм ÑазÑеÑено ÑоздаваÑÑ Ð¿ÑбликаÑии, пÑбликÑÑÑие вÑе ÑаблиÑÑ Ð¸Ð»Ð¸ вÑе ÑаблиÑÑ Ð² ÑÑ ÐµÐ¼Ðµ авÑомаÑиÑеÑки.
Ðа даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿Ñав Ð´Ð»Ñ Ð¿ÑбликаÑий неÑ. ÐÑÐ±Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñка (имеÑÑÐ°Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑениÑ) Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к лÑбой пÑбликаÑии. Таким обÑазом, еÑли Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑкÑÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ñ Ð¾Ð¿ÑеделÑннÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑиков, напÑимеÑ, иÑполÑзÑÑ ÑилÑÑÑÑ ÑÑÑок или ÑпиÑки ÑÑолбÑов или не добавлÑÑ Ð²ÑÑ ÑаблиÑÑ Ð² пÑбликаÑиÑ, имейÑе в видÑ, ÑÑо Ñа же инÑоÑмаÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ ÑаÑкÑÑваÑÑÑÑ Ð² дÑÑÐ³Ð¸Ñ Ð¿ÑбликаÑиÑÑ Ð² Ñой же базе даннÑÑ . РбÑдÑÑем в Postgres Pro могÑÑ Ð±ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ Ð¿Ñава Ð´Ð»Ñ Ð¿ÑбликаÑий, ÑÑÐ¾Ð±Ñ Ð¾Ð±ÐµÑпеÑиÑÑ Ð±Ð¾Ð»ÐµÐµ деÑалÑнÑй конÑÑÐ¾Ð»Ñ Ð´Ð¾ÑÑÑпа.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑкÑ, полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ Ð¿Ñава Ñоли pg_create_subscription, а Ñакже пÑава CREATE Ð´Ð»Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
.
ÐÑоÑеÑÑ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки на ÑÑовне ÑеанÑа бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ñ Ð¿Ñавами владелÑÑа подпиÑки. Ðднако пÑи вÑполнении опеÑаÑии вÑÑавки, изменениÑ, ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÑеÑÐµÐ½Ð¸Ñ Ð² конкÑеÑной ÑаблиÑе пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿ÐµÑеклÑÑение Ñоли на владелÑÑа ÑаблиÑÑ Ð¸ вÑÐ¿Ð¾Ð»Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ñ Ð¿Ñавами владелÑÑа ÑаблиÑÑ. ÐÑо ознаÑаеÑ, ÑÑо Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñки должен имеÑÑ Ð¿Ñаво SET ROLE Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñоли, коÑоÑой пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ ÑеплиÑиÑÑÐµÐ¼Ð°Ñ ÑаблиÑа.
ÐÑли подпиÑка ÑконÑигÑÑиÑована Ñ run_as_owner = true, пеÑеклÑÑение полÑзоваÑелей не пÑоизойдÑÑ. ÐмеÑÑо ÑÑого вÑе опеÑаÑии бÑдÑÑ Ð²ÑполнÑÑÑÑÑ Ñ Ð¿Ñавами владелÑÑа подпиÑки. Ð ÑÑом ÑлÑÑае владелÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñки нÑÐ¶Ð½Ñ ÑолÑко пÑава SELECT, INSERT, UPDATE и DELETE из Ñелевой ÑаблиÑÑ, но не SET ROLE Ð´Ð»Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑÑа ÑаблиÑÑ. Ðднако ÑÑо Ñакже ознаÑаеÑ, ÑÑо лÑбой полÑзоваÑелÑ, владеÑÑий ÑаблиÑей, в коÑоÑÑÑ ÑеплиÑиÑÑÑÑÑÑ Ð´Ð°Ð½Ð½Ñе, Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑ Ð¿ÑоизволÑнÑй код Ñ Ð¿Ñавами владелÑÑа подпиÑки. ÐапÑимеÑ, ÑÑо можно ÑделаÑÑ, добавив ÑÑÐ¸Ð³Ð³ÐµÑ Ðº одной из пÑинадлежаÑиÑ
ÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÑаблиÑ. ÐоÑколÑÐºÑ Ð¾Ð±ÑÑно нежелаÑелÑно позволÑÑÑ Ð¾Ð´Ð½Ð¾Ð¹ Ñоли Ñвободно пÑиÑваиваÑÑ Ð¿Ñава дÑÑгой, не ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ, кÑоме ÑлÑÑаев, когда безопаÑноÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелей в базе даннÑÑ
не вÑзÑÐ²Ð°ÐµÑ Ñомнений.
Ðа пÑбликÑÑÑем ÑеÑвеÑе пÑава пÑовеÑÑÑÑÑÑ ÑолÑко один Ñаз пÑи ÑÑÑановлении подклÑÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑепликаÑии и не пеÑепÑовеÑÑÑÑÑÑ Ð¿Ñи ÑÑении каждой запиÑи изменениÑ.
Ðа ÑÑоÑоне подпиÑки пÑава владелÑÑа подпиÑки пеÑепÑовеÑÑÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑанзакÑии, когда она пÑименÑеÑÑÑ. ÐÑли ÑабоÑий пÑоÑеÑÑ Ð¾ÑÑÑеÑÑвлÑÐµÑ Ð¿Ñименение ÑÑанзакÑии, когда в паÑаллелÑной ÑÑанзакÑии менÑеÑÑÑ Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñки, пÑименение ÑекÑÑей ÑÑанзакÑии пÑодолжаеÑÑÑ Ñ Ð¿Ñавами ÑÑаÑого владелÑÑа.