
# 基于标签的强制访问控制检查
#### 前提条件
- 数据库正常运行，强制访问控制检查开关（enable_mac_check=on）打开。
- 执行操作的用户已具有所需要访问表的ACL权限。
 
#### 背景信息
基于安全标签的强制访问控制策略规则由系统内置设定，用户不能更改：
- 插入（INSERT）策略：只有主体安全标记等级小于等于客体安全标记等级且主体安全标记范围是客体安全标记范围的子集时才允许插入数据。
- 查询（SELECT）策略：只有主体安全标记等级大于等于客体安全标记等级且主体安全标记范围是客体安全标记范围的超集时才允许查询数据。
- 修改（UPDATE）和删除（DELETE）策略：只有主体安全标记等级等于客体安全标记等级且主体安全标记范围等于客体安全标记范围时才允许修改和删除数据。
- 若客体未标记，则强制访问控制策略对该客体不生效。
- 若主体未标记，则不能访问任意带有标记的客体。
 
#### 操作步骤
1. 授予用户user1和user2数据表tbl的SELECT和INSERT操作权限。 
   ```
   gaussdb=# GRANT SELECT,INSERT ON tbl TO user1,user2;
   ```
   
   
2. 用户user1登录数据库执行SELECT和INSERT操作，SELECT失败，INSERT成功，符合强制访问控制策略规则。 
   - 非透明多写特性
     ```
     gaussdb=> SELECT current_user;
      current_user
     --------------
      user1
     (1 row)
     gaussdb=> SELECT * FROM tbl;
     ERROR:  permission denied for relation tbl
     DETAIL:  N/A
     gaussdb=> INSERT INTO tbl VALUES (1);
     INSERT 0 1
     ```
     
   
   
   
   
3. 用户user2登录数据库执行SELECT和INSERT操作，SELECT成功，INSERT失败，符合强制访问控制策略规则。 
   - 非透明多写特性
     ```
     gaussdb=> SELECT current_user;
      current_user
     --------------
      user2
     (1 row)
     gaussdb=> SELECT * FROM tbl;
      fir
     -----
        1
     (1 row)
     gaussdb=> INSERT INTO tbl VALUES (1);
     ERROR:  permission denied for relation tbl  --非透明多写特性
     DETAIL:  N/A
     ```
     
   
   
   
   
 
