<form id="fjn3d"></form>

<address id="fjn3d"></address>

            5.4.?強制訪問實例

            5.4.1. 行級訪問控制
            5.4.2. 列級訪問控制

            5.4.1.?行級訪問控制

            1. uxdb創建測試用戶:

              create user testuser1 password '1qaz!QAZ';
              create user testuser2 password '1qaz!QAZ';
            2. uxop創建策略并進行主體標記:

              select mac_create_policy('p1','1,2,3,4','s1,s2,s3,s4');

              該標記的等級依次為1,2,3,4。

              該標記的范圍為1~15(20+21+22+23)。

              分別對兩個用戶設置最大讀標記、最大寫標記、最小寫標記、默認會話標記和默認寫標記:

              select mac_set_user_label('testuser1', 'p1', '3:s1,s2,s3', '3:s1,s3', '2:s1','1:s1','3:s1,s3');
              select mac_set_user_label('testuser2', 'p1', '4:s1,s2,s3', '4:s1,s2', '4:s1,s2','2:s1','4:s1,s2');

              注意

              testuser1的最大讀標記'3:s1,s2,s3'中冒號前面的3表示等級為3,冒號后面的s1,s2,s3表示范圍為7(20+21+22);最大寫標記'3:s1,s3'中冒號前面的3表示等級為3,冒號后面的's1,s3'表示范圍為5(20+22)。其他標記和范圍也如此計算。結果如下表:

              表?5.2.?主體標記范圍(行級)

              測試用戶最大讀最大寫最小寫默認會話默認寫
              testuser13:73:52:11:13:5
              testsuer24:74:34:32:14:3

            3. uxop創建表并對表設置行標記:

              create table public.table_super (i int, k text);
              grant all on table_super to public ;

              對表設置行標記:

              select mac_apply_row_policy('public','table_super','p1');
            4. 插入數據并查看標記:

              testuser1執行:

              insert into table_super values(1,'wang');

              (根據行級標記規則,insert標記為默認寫標記,testuser1插入的數據標記為3:5)

              testuser2執行:

              insert into table_super values(2,'zhang');

              (根據行級標記規則,insert標記為默認寫標記,testuser2插入的數據標記為4:3)

              查看標記:

              select plcol,plcol_level,plcol_scope,* from table_super;
            5. testuser1用戶對表進行讀寫操作:

              select * from table_super;
              update table_super set k ='wang1' where i =1;
              select * from table_super;
            6. estuser2用戶對表進行讀寫操作:

              select * from table_super;
              update table_super set k ='zhang1';
              select * from table_super;

            從上述5和6的結果我們可以看到testuser1只對自己插入的數據有讀寫權限,testuser2對兩條數據都有讀權限,只對自己插入的數據有寫權限。分析:

            表?5.3.?分析表

            測試用戶ik標記(默認寫)最大讀最大寫最小寫
            testuser11wang3:53:73:52:1
            testuser22zhang4:34:74:34:3

            行級讀規則,max_read >= row_label

            行級寫規則,update: max_write >= row_label >= min_write

            testuser1插入的數據標記為3:5,testuser2插入的數據標記為4:3。

            testuser1最大讀(3:7)小于testuser2的標記(4:3),因此不能讀取testuser2插入的數據。

            testuser1最大寫(3:5)小于testuser2的標記(4:3),因此不能寫testuser2插入的數據。

            testuser2最大讀(4:7)大于testuser1的標記(3:5),因此可以讀取testuser1插入的數據。

            testuser2最大寫(4:3)不滿足大于等于testuser1的標記(3:5),且testuser2最小寫(4:3)也不滿足小于等于testuser1的標記(3:5),因此不能寫testuser1插入的數據。

            注意

            標記比較,等級和范圍同時大于等于才為大于等于。

            5.4.2.?列級訪問控制

            1. uxop創建策略和標記:

              創建策略:

              select mac_create_policy('p2','1,2,3,4','s1,s2,s3,s4');

              創建主體標記:

              select mac_set_user_label('uxop', 'p2', '3:s1,s2,s3', '3:s1,s3', '2:s1','1:s1','3:s1,s3');

              表?5.4.?主體標記范圍(列級)

              測試用戶最大讀最大寫最小寫默認會話默認寫
              uxop3:73:52:11:13:5

            2. uxop創建測試表并標記:

              create table public.test_column(a int ,b int,c int);
              insert into test_column values(1,2,3);
              insert into test_column values(10,20,30);
              insert into test_column values(100,200,300);

              列標記:

              select mac_set_column_label('public','test_column','b','p2','3:s1,s2,s3');

              標記列為b列,標記為3:7。

            3. uxop分別查詢未標記列a和標記列b:

              select a from test_column;
              select b from test_column;

              根據列級select: ?max_read >= column_label

              主體標記最大讀(3:7)等于列標記(3:7),可以訪問標記列b。

            4. uxop分別查詢未標記列a和標記列和b:

              update test_column set a = 1 where b=2;
              update test_column set b = 1 where c=3;

              根據列級update: max_write >= column_label >= min_write

              主體最大寫標記(3:5)小于列標記(3:7),所以不能更新標記列b。

            5. uxop分別插入未標記列c和標記列b:

              insert into test_column values(1,2,3);
              insert into test_column(c) values(66);

              根據列級insert: ?max_write >= column_label >= min_write

              主體最大寫標記(3:5)小于列標記(3:7),所以不能插入標記列b。

            6. uxop分別刪除數據:

              delete from test_column where b=2;

              根據列級delete: max_write >= column_label

              主體最大寫標記(3:5)小于列標記(3:7),所以不能刪除標記列b。

            91竞彩之家