PG-数据库安全

安全等级

TCSEC(Trusted Computer System Evaluation Criteria)将计算机系统的安全划分为4个等级、7个级别。

四个大类:D,C,B和A,其中部门A具有最高的安全性。每个类都代表个人或组织对评估系统的信任度存在显着差异。此外,C,B和A分为一系列详细分级:C1,C2,B1,B2,B3和A1。总体上,TCSEC分级为:D、C1,C2,B1,B2,B3和A1。

分类

  • D:最小保护(“Minimal protection”)

    • 预留给那些已经过评估但未能满足更高分部要求的系统
  • C:自主保护(“Discretionary protection”)

    • C1 - 任意安全保护
      • 识别和认证
      • 分离用户和数据
      • 自主访问控制(DAC)能够以个人为基础实施访问限制
      • 所需的系统文档和用户手册
    • C2 - 受控访问保护
      • 更细致的DAC
      • 通过登录程序进行个人问责
      • 审计跟踪
      • 对象重用
      • 资源隔离
      • 举一个系统例子是HP-UX
  • B:强制性保护(“Mandatory protection”)

    • B1 - 标记的安全保护

      • 安全策略模型的非正式声明
      • 数据敏感标签
      • 对选定主题和对象的强制访问控制(MAC)
      • 标签出口能力
      • 一些发现的瑕疵必须被移除或以其他方式减轻(不确定)
      • 设计规范和验证
    • B2 - 结构化保护

      • 安全策略模型明确定义并正式记录
      • DAC和MAC强制执行扩展到所有主体和客体
      • 对隐蔽存储通道的出现和带宽进行分析
      • 仔细构建保护关键和非保护关键元素
      • 设计和实施可以实现更全面的测试和审查
      • 认证机制得到加强
      • 可信赖的设施管理提供管理员和运营商隔离
      • 强加严格的配置管理控制
      • 操作员和管理员角色是分开的。
      • 举一个系统例子是Multics
    • B3 - 安全域

      • 满足参考监视器要求
      • 结构化以排除对安全策略实施不重要的代码
      • 旨在降低复杂性的重要系统工程
      • 安全管理员角色定义
      • 审计与安全有关的事件
      • 自动即时入侵检测,通知和响应
      • 用于用户认证功能的TCB的可信路径
      • 可信系统恢复程序
      • 对隐蔽定时通道进行分析以确定发生情况和带宽
      • 这种系统的一个例子是XTS-300的前身XTS-300
  • A: 验证保护(“Verified protection”)

    • A1 - 已验证设计
      • 在功能上与B3相同
      • 正式的设计和验证技术,包括正式的顶级规范
      • 正式的管理和分配程序
      • A1级系统的例子有霍尼韦尔的SCOMP,Aesec的GEMSOS和波音的SNS服务器。两个未评估的产品是LOCK平台和取消的DEC VAX安全内核。
    • 超越A1
      • 系统架构表明参考监视器的自我保护和完整性要求已在可信计算库(TCB)中实施。
      • 安全测试会自动从正式的顶级规范或正式的低级规范中生成测试用例。
      • 形式规范和验证是在可行的情况下使用形式化验证方法将TCB验证到源代码级别的地方。
      • 可信设计环境是TCB设计在只有可信(清理)人员的受信任设施中的地方。

PG安全体系

image-20200914120410430

PostgreSQL先通过用户标识和认证来验证访问数据库的用户身份,判断是否为合法用户及是否具有权限访问数据库资源。然后通过基于角色的访问控制(Role Based Access Control, RBAC),并使用存取控制列表(ACL)方法控制访问请求和包含信息。

  • 用户标识和认证
    • 最外层的安全保护措施
  • 用户角色管理
    • 角色是权限的集合,管理员根据角色在系统中承担的职责分配具有不同权限的角色。
  • 数据库对象的访问控制

用户标识和认证

客户端认证过程

  • 客户端和服务端的Postmaster进程建立连接
  • 客户端发送请求信息到守护进程Postmaster
  • Postmaster根据请求信息检查配置文件pg_hba.conf是否允许该客户端进行连接,并把认证方式和必要信息发送到客户端
  • 客户端根据收到的不同认证方式,发送相应的认证信息给Postmaster
  • Postmaster调用认证模块对客户端送来的认证信息进行认证。若认证通过,初始化一个Postgres进程与客户端进行通信;否则拒绝继续会话,关闭连接。

image-20200914143345632

客户端配置文件

客户端认证所需的配置信息都存储在$PGDATA/pg_hba.conf文件。通过若干空格或制表符分割字段,文件内容格式如下:

local      DATABASE  USER  METHOD  [OPTIONS]
host       DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
hostssl    DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
hostnossl  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
字段说明
  • local:通过Unix套接字连接

  • host:通过TCP/IP进行连接

  • hostssl:通过TCP/IP使用SSL的连接

  • hostnossl:只匹配在TCP/IP上不使用SSL的连接

  • database:声明匹配的数据库名称。可以使用逗号分割多个数据库名称,也可以使用前缀@声明一个包含数据库名的文件。还可以使用以下预定义的值

    • all:匹配所有的数据库
    • sameuser:匹配和请求用户名同名的数据库
    • samerole:请求的用户必须是一个与数据库同名的角色中的成员
  • user:声明匹配的数据库用户

    • 可以指定一个用户名
    • 使用组名,需要在组名前添加前缀+
    • 使用all匹配所有用户
  • ADDRESS:指定匹配的主机集

    • 可以使用IP地址和网络掩码
    • 可以使用主机名
  • METHOD:连接时使用的认证方法

    • trust:无条件允许连接
    • reject:无条件地拒绝连接
    • md5:提供md5加密的口令进行认证
    • password:提供一个未加密的口令认证
    • scram-sha-256:
    • gss:
    • sspi:
    • ident:通过映射文件pg_ident.conf判断
    • peer:
    • pam:通过操作系统提供的热插拔认证模块服务(PAM)来认证
    • ldap:
    • radius:
    • cert:通过SSL客户端进行认证
  • OPTIONS:

客户端认证

image-20200914172838121

基于角色的权限管理

权限分类

  • 系统权限:规定用户使用数据库的权限(连接数据库、创建数据库、创建用户等)
  • 对象权限:在表、序列、函数等数据库对象上执行特殊动作的权限(SELECT、INSERT、UPDATE、DELETE、REFERENCES、TRIGGER、CREATE、CONNECT、TEMPORARY、EXECUTE和USAGE等

角色属性

角色属性:定义角色拥有的系统权限

  • LOGIN(登录):具有登录属性的角色才可以作为连接数据库的用户
  • SUPERUSER(超级用户):具有SUPERUSER属性的角色具有系统最高权限
  • CREATEDB(创建数据库):定义角色是否能创建数据库
  • CREATEROLE(创建角色):定义角色是否可以创建新角色
  • PASSWORD(口令):设置角色的口令
  • INHERIT(继承):定义一个角色是否继承它所属角色的权限
  • CONNECTION LIMIT(连接限制):声明角色可使用的并发连接数量

初始化时默认创建一个和操作系统用户同名的数据库超级用户(通常使用postgres用户)

角色属性系统表
  • pg_authid系统表可以查看角色的属性信息
                        Table "pg_catalog.pg_authid"
     Column     |           Type           | Collation | Nullable | desc 
----------------+--------------------------+-----------+----------+---------
 oid            | oid                      |           | not null | 
 rolname        | name                     |           | not null | 角色名称
 rolsuper       | boolean                  |           | not null | 是否超级用户
 rolinherit     | boolean                  |           | not null | 是否自动继承所属组角色的权限
 rolcreaterole  | boolean                  |           | not null | 是否创建新角色
 rolcreatedb    | boolean                  |           | not null | 是否创建数据库
 rolcanlogin    | boolean                  |           | not null | 是否可以登录
 rolreplication | boolean                  |           | not null | 是否用于复制
 rolbypassrls   | boolean                  |           | not null | 
 rolconnlimit   | integer                  |           | not null | 限制最大并发连接数(-1 无限制)
 rolpassword    | text                     | C         |          | 角色口令
 rolvaliduntil  | timestamp with time zone |           |          | 口令失效时间
Indexes:
    "pg_authid_oid_index" UNIQUE, btree (oid), tablespace "pg_global"
    "pg_authid_rolname_index" UNIQUE, btree (rolname), tablespace "pg_global"
Tablespace: "pg_global"

  • pg_roles视图提供了访问数据库角色信息

  • pg_auth_members系统表存储了角色之间的成员关系

对象访问控制

在PG中,建立安全的数据库连接是由用户标识和认证技术共同实现,而建立连接后的安全访问保护则是由基于角色的对象访问控制。

访问控制列表(ACL)

访问控制列表(Access Contron List, ACL)是对象权限管理和权限检查的基础,PG系统通过操作ACL实现对象的访问控制管理。每个对象都有ACL,他存储了此对象所有授权信息。

posted @ 2020-09-14 18:10  KuBee  阅读(579)  评论(0编辑  收藏  举报