SEPostgreSQL/Permissions

来自 PostgreSQL wiki
跳转至导航跳转至搜索

数据库 (pg_database)

创建

  • DAC
    • 检查所有者的createdb授权
    • 检查源数据库的所有权(如果不是模板)
    • 检查表空间(如果指定)的CREATE授权
  • SELinux
    • 检查默认安全标签上的db_database:{create};根据源数据库
    • (未来版本中表空间上的授权)
  • 上下文信息
    • 新数据库的名称
    • 源数据库的 oid
    • (表空间的 oid)

变更

  • DAC
    • 检查数据库的所有权
    • 检查用户的createdb授权(如果是 RENAME TO,OWNER TO)
    • 检查新所有者的成员资格(如果 OWNER TO)
    • 检查表空间(如果 SET TABLESPACE)的 CREATE 权限
  • SELinux
    • 检查 db_database:{setattr}
    • (未来版本中表空间上的授权)
  • 上下文信息
    • 事件类型和 oid
    • (如果是 SET TABLESPACE,则为表空间的 oid)

删除

  • DAC
    • 检查数据库的所有权
  • SELinux
    • 检查 db_database:{drop}
  • 上下文信息
    • 仅事件类型和 oid

连接

  • DAC
    • 在 CheckMyDatabase() 中检查数据库的 CONNECT 权限
  • SELinux
    • 检查 db_database:{access}
  • 上下文信息
    • 仅事件类型和 oid

模式 (pg_namespace)

创建

  • DAC
    • 检查在数据库上的 CREATE or CREATE_TEMP 权限
    • 检查所有者(如果持久模式)的成员资格
  • SELinux
    • 根据数据库在默认安全标签上检查 db_schema:{create}
  • 上下文信息
    • 新模式的名称

变更

  • DAC
    • 检查模式的 所有权
    • 检查数据库(如果 RENAME TO,OWNER TO)的 CREATE 权限
    • 检查新所有者的成员资格(如果 OWNER TO)
  • SELinux
    • 检查 db_schema:{setattr}
  • 上下文信息
    • 仅事件类型和 oid

删除

  • DAC
    • 检查模式的 所有权
  • SELinux
    • 检查 db_schema:{drop}
  • 上下文信息
    • 模式的 oid
    • 一个标志,表示是否 CASCADE 或 RESTRICT

搜索

  • DAC
    • 检查 USAGE 权限
  • SELinux
    • 检查 db_schema:{search}
  • 上下文信息
    • 仅事件类型和 oid

关系 (pg_class)

创建

  • DAC
    • 检查新关系命名空间的 CREATE 权限
    • 检查新关系表空间的 CREATE 权限(如果指定实际的 TABLESPACE)
    • 检查正在继承的表(如果指定 INHERITS)的 所有权
  • SELinux
    • 基于命名空间,检查关系默认安全标签上的 db_xxx:{create}
      • db_xxxdb_tabledb_sequence 还是 db_view,这取决于 relkind
    • 基于关系,检查列默认安全标签上的 db_column:{create}
    • 检查 db_schema:{add_name} 权限
    • (未来版本中表空间上的授权)
    • 检查正在继承的表(如果指定 INHERITS)的 db_table:{getattr} 权限
  • 上下文信息
    • 新关系的名称
    • 命名空间的 oid
    • (表空间的 oid)
    • relkind
    • TupleDesc(它提供关于列的信息)
  • 备忘录
    • 在我看来,应该将继承表的权限检查与创建检查的主要部分分开,因为 MergeAttributes() 获取对父表的 ShareUpdateExclusiveLock。如果我们不立即引发错误,没有权限的使用者可以不受权限限制地访问父表。

变更

  • DAC
    • 检查关系的 所有权
    • 检查命名空间的 CREATE 权限,如果是 ALTER RENAME TO/SET SCHEMA/OWNER TO
    • 检查如果是 ALTER OWNER TO,新所有者的角色成员资格
    • 检查约束表/列的 PK/FK REFERENCES 权限,如果是添加 FK 约束
    • 检查表空间的 CREATE 权限,如果是 ALTER SET TABLESPACE
    • 检查父关系的 所有权,如果是 ALTER INHERIT
  • SELinux
    • 检查 db_xxx:{setattr}
    • 检查 db_column:{create}db_column:{drop},如果是 ADD/DROP COLUMN
    • 检查 db_column:{setattr},如果修改列
    • 检查 db_schema:{add_name remove_name},如果为 ALTER RENAME TO/SET SCHEMA
    • (未来版本中表空间上的授权)
    • 检查父表的 db_table:{getattr} ,如果为 ALTER INHERIT
  • 上下文信息
    • 要修改的表/列的 oid 和 subid
    • 新命名空间的 oid,如果为 ALTER SET SCHEMA
    • (新表空间的 oid,如果为 ALTER SET TABLESPACE)
    • 新名称(如果为 ALTER RENAME TO)
    • ColumnDef(如果为 ALTER ADD COLUMN)

删除

  • DAC
    • 检查命名空间或关系的所有权
  • SELinux
    • 检查 db_xxx:{drop}
    • 检查 db_schema:{remove_name}
  • 上下文信息
    • 关系的 oid
    • 一个标志,表示是否 CASCADE 或 RESTRICT

序列操作

  • DAC
    • 检查在 currval()/lastval() 上的 SELECTUSAGE 权限
    • 检查在 nextval() 上的 **USAGE** 或 **UPDATE** 权限
    • 检查在 setval() 上的 UPDATE 权限
  • SELinux
    • 检查在 currval()/lastval() 上的 db_sequence:{get_value}
    • 检查在 nextval() 上的 db_sequence:{next_value}
    • 检查在 setval() 上的 db_sequence:{set_value}
  • 上下文信息
    • 仅事件类型和 oid

函数 (pg_proc)

创建

  • DAC
    • 检查命名空间的 CREATE 权限
    • 检查语言的 USAGE 权限或超级用户的权限(取决于该语言是否受信任)
    • (如果给定了 LEAKPROOF,则检查超级用户的权限)
    • 如果替换,检查函数的所有权
  • SELinux
    • 根据命名空间,检查默认安全标签上的 db_procedure:{create}
    • 检查命名空间的 db_schema:{add_name}
    • 检查语言的 db_language:{implement}
    • (如果给定了 LEAKPROOF,则检查 db_procedure:{install}
    • 如果替换,检查 db_procedure:{drop}db_schema:{remove_name}
  • 上下文信息
    • 新函数的名称
    • 参数类型的 oid
    • 命名空间的 oid
    • 语言的 oid
    • (一个标志,告知是否为 LEAKPROOF)

变更

  • DAC
    • 检查过程的所有权
    • 如果为 RENAME TO/SET SCHEMA/OWNER TO,检查命名空间的 CREATE 权限
    • 检查如果是 ALTER OWNER TO,新所有者的角色成员资格
  • SELinux
    • 检查 db_procedure:{setattr}
    • 如果为 RENAME TO/SET SCHEMA,检查 db_schema:{add_name remove_name}
  • 上下文信息
    • 函数的 oid
    • 命名空间的 oid(如果为 SET SCHEMA)
    • 新函数名称(如果为 RENAME TO)

删除

  • DAC
    • 检查函数或命名空间的所有权
  • SELinux
    • 检查 db_procedure:{drop}
    • 检查 db_schema:{remove_name}
  • 上下文信息
    • 函数的 oid
    • 一个标志,表示是否 CASCADE 或 RESTRICT

执行

  • DAC
    • 检查 EXECUTE 权限
  • SELinux
    • 检查 db_procedure:{execute}
    • 如果为受信任的函数,检查 db_procedure:{entrypoint}process:{transition}
  • 上下文信息
    • 仅事件类型和 oid

语言 (pg_language)

创建

  • DAC
    • 如果 tmpldbacreate = true,检查超级用户的权限或数据库的所有权。
  • SELinux
    • 根据数据库,检查默认安全上下文中上的 db_language:{create}
    • 检查处理器、内联和转换器函数的 db_procedure:{install}
  • 上下文信息
    • 新语言的名称
    • 处理器、内联和转换器函数的 oid

变更

  • DAC
    • 检查语言的所有权
    • 如果为 ALTER OWNER TO,检查语言新所有者的成员身份
  • SELinux
    • 检查 db_language:{setattr}
  • 上下文信息
    • 仅事件类型和 oid

删除

  • DAC
    • 检查语言的所有权
  • SELinux
    • 检查语言的 db_language:{drop}
  • 上下文信息
    • 语言的 oid
    • 一个标志,表示是否 CASCADE 或 RESTRICT

聚集 (pg_aggregate)

创建

  • DAC
    • 检查命名空间的 CREATE 权限
    • 检查转置和最终函数的 EXECUTE 权限
  • SELinux
    • 根据命名空间,检查默认安全标签上的 db_procedure:{create}
    • 在转置和最终函数上检查 db_procedure:{install}
      • 可能没有必要,因为 db_procedure:{execute} 应该在运行时检查
  • 上下文信息
    • 新函数的名称
    • 命名空间的 oid
    • 转置和最终函数的 oid

变更

  • DAC
    • 检查聚集的 所有权
    • 检查命名空间的 CREATE 权限,如果 RENAME TO/SET SCHEMA
    • 检查新所有者的 成员资格,如果 OWNER TO
  • SELinux
    • 检查 db_procedure:{setattr}
    • 如果为 RENAME TO/SET SCHEMA,检查 db_schema:{add_name remove_name}
  • 上下文信息
    • 聚集的 oid
    • 命名空间的 oid(如果为 SET SCHEMA)

删除

  • DAC
    • 检查聚集或命名空间的所有权
  • SELinux
    • 检查 db_procedure:{drop}
    • 检查 db_schema:{remove_name}
  • 上下文信息
    • 聚集的 oid
    • 一个标志,表示是否 CASCADE 或 RESTRICT

类型/域 (pg_type)

创建

  • DAC
    • 检查 superuser 权限或命名空间的 CREATE 权限,取决于是否是基本类型。
    • 检查 type_in、type_out、type_recv、type_send、type_modin、type_modout 和 type_analyze 函数的所有权(如果是基本类型)。
  • SELinux
    • 检查插入元组到 pg_type 目录的权限,因为 selinux 目前没有类型的特定对象类。
    • 检查 db_schema:{add_name}
    • 在 type_in、type_out、type_recv、type_send、type_modin、type_modout 和 type_analyze 函数上检查 db_procedure:{install}
  • 上下文信息
    • 新类型名称
    • 命名空间的 oid
    • type_in、type_out、type_recv、type_send、type_modin、type_modout 和 type_analyze 函数的 oid

变更

  • DAC
    • 检查类型的 所有权
    • 检查命名空间的 CREATE 权限,如果是 ALTER RENAME TO/SET SCHEMA/OWNER TO
    • 检查新所有者的 成员资格,如果 ALTER OWNER TO
  • SELinux
    • 检查更新 pg_type 目录的权限(selinux 目前没有类型的特定对象类)
    • 检查 db_schema:{add_name remove_name},如果为 ALTER RENAME TO/SET SCHEMA
  • 上下文信息
    • 类型的 oid
    • 命名空间的 oid(如果为 SET SCHEMA)

删除

  • DAC
    • 检查类型或命名空间的所有权
  • SELinux
    • 检查从 pg_type 目录中删除元组的权限,因为 selinux 目前没有类型的特定对象类。
    • 检查 db_schema:{remove_name}
  • 上下文信息
    • 类型的 oid
    • 一个标志,表示是否 CASCADE 或 RESTRICT