دراسة حول تطبيق الأمان على مستوى الصفوف في PostgreSQL

استكمالا ل دراسة حول تنفيذ منطق الأعمال على مستوى الوظائف المخزنة في PostgreSQL и أساسا للحصول على إجابة مفصلة في تعليق.

تم وصف الجزء النظري جيدًا في الوثائق PostgreSQL - سياسات حماية الصفوف. وفيما يلي التنفيذ العملي للصغيرة مهمة عمل محددة - إخفاء البيانات المحذوفة. اسكتش مخصص للتنفيذ نمذجة الأدوار باستخدام RLS قدمت بشكل منفصل.

دراسة حول تطبيق الأمان على مستوى الصفوف في PostgreSQL

ولا جديد في المقال ، فلا معنى خفي ومعرفة سرية. مجرد رسم تخطيطي حول التنفيذ العملي لفكرة نظرية. إذا كان أي شخص مهتم ، واصل القراءة. إذا لم تكن مهتمًا ، فلا تضيع وقتك.

صياغة المشكلة

ودون التعمق في الموضوع، يمكن صياغة المشكلة باختصار على النحو التالي: يوجد جدول ينفذ كيان تجاري معين. يمكن حذف الصفوف الموجودة في الجدول، ولكن لا يمكن حذف الصفوف فعليًا، بل يجب أن تكون مخفية.

لأنه يقال: لا تحذف أي شيء، فقط أعد تسميته. الإنترنت يخزن كل شيء"

على طول الطريق، يُنصح بعدم إعادة كتابة الوظائف المخزنة الموجودة التي تعمل مع هذا الكيان.

لتنفيذ هذا المفهوم، يحتوي الجدول على السمة يتم حذف. ثم كل شيء بسيط - تحتاج إلى التأكد من أن العميل يمكنه رؤية الأسطر التي تحتوي على السمة فقط يتم حذف خطأ شنيع ما هي الآلية المستخدمة ل؟ الأمان على مستوى الصف.

تطبيق

قم بإنشاء دور ومخطط منفصلين

CREATE ROLE repos;
CREATE SCHEMA repos;

قم بإنشاء الجدول المستهدف

CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos

شغله أمان مستوى الصف

ALTER TABLE repos.file  ENABLE ROW LEVEL SECURITY ;
CREATE POLICY file_invisible_deleted  ON repos.file FOR ALL TO dba_role USING ( NOT is_deleted );
GRANT ALL ON TABLE repos.file to dba_role ;
GRANT USAGE ON SCHEMA repos TO dba_role ;

وظيفة الخدمة - حذف صف في الجدول

CREATE OR REPLACE repos.delete( curr_id repos.file.id%TYPE)
RETURNS integer AS $$
BEGIN
...
UPDATE repos.file
SET is_del = TRUE 
WHERE id = curr_id ; 
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

وظيفة عمل — حذف مستند

CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM  repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

النتائج

يقوم العميل بحذف المستند

SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );

بعد الحذف، لا يرى العميل المستند

SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)

ولكن في قاعدة البيانات، لا يتم حذف المستند، بل يتم تغيير السمة فقط is_del

psql -d my_db
SELECT  id, name , is_del FROM repos.file ;
id |  name  | is_del
--+---------+------------
 1 |  test_1 | t
(1 row)

وهو ما كان مطلوبا في بيان المشكلة.

مجموع

إذا كان الموضوع مثيرًا للاهتمام، فيمكنك في الدراسة التالية عرض مثال على تنفيذ نموذج قائم على الأدوار لفصل الوصول إلى البيانات باستخدام أمان مستوى الصف.

المصدر: www.habr.com

إضافة تعليق