云服务器内容精选

  • 创建加密表 登录数据库,创建加密表tde_test1,加密状态为开启,指定加密算法为AES_128_CTR: openGauss=# CREATE TABLE tde_test (a int, b text) with (enable_tde = on, encrypt_algo = 'AES_128_CTR'); 创建加密表tde_test2,加密状态为开启,不指定加密算法,则加密算法默认为AES_128_CTR: openGauss=# CREATE TABLE tde_test2 (a int, b text) with (enable_tde = on); 创建加密表tde_test3,加密状态为关闭,指定加密算法为SM4_CTR: openGauss=# CREATE TABLE tde_test3 (a int, b text) with (enable_tde = off, encrypt_algo = 'SM4_CTR');
  • 表级加密方案 允许用户在创建表时指定是否对表进行加密和使用的加密算法,加密算法支持AES_128_CTR和SM4_CTR两种算法,算法一旦指定不可更改。对于创建表时指定为加密的表,数据库会自动为该表申请创建 数据加密 密钥,并将加密算法、密钥密文和对应主密钥ID等参数使用"keyword=value"格式保存在pg_class系统表中的reloptions字段中。 对于加密表,允许用户切换表的加密状态,即将加密表切换为非加密表,或将非加密表切换为加密表。如果在创建表时未使能加密功能,后续无法再切换为加密表。 对于加密表,支持数据加密密钥轮转。密钥轮转后,使用旧密钥加密的数据仍使用旧密钥解密,新写入的数据使用新密钥加密。密钥轮转时不更换加密算法。 对于行存表,每次加解密的最小数据单元为一个8K大小的page页面,每次对page页面加密时会通过安全随机数接口生成IV值,并将IV值和密钥密文、主密钥ID等信息保存在页面中一起写入存储介质。对于加密表由于page页面中需要保存加密密钥信息,相比不加密时占用存储空间膨胀约2.5%。
  • 背景信息 当前版本主要实现对接华为云KMS服务,支持表级密钥存储,实现对行存表加密,规格约束如下: 支持heap存储行存表加密。 不支持物化视图加密,不支持ustore存储引擎加密。 不支持索引和Sequence加密,不支持xLog日志加密,不支持MOT内存表加密,不支持系统表加密。 用户在创建表时可以指定加密算法,加密算法一旦指定不可更改。如果创建表时设置enable_tde为on,但是不指定加密算法encrypt_algo,则默认使用AES_128_CTR加密算法。 如果在创建表时未开启加密功能或指定加密算法,后续无法再切换为加密表。 对于已分配加密密钥的表,切换表的加密和非加密状态,不会更换密钥和加密算法。 数据密钥轮转只有开启表加密功能时才支持轮转。 不支持单数据库实例跨region的多副本主备同步,不支持单数据库实例跨region的扩容,不支持跨region的备份恢复、数据库实例容灾和数据迁移场景。 混合云场景如果使用华为云KMS和管控面功能,则可以支持透明数据加密,其他KMS服务如果接口不兼容则无法支持。 加密表的查询性能比不加密时会有所劣化,对于性能有较高要求的情况下需谨慎开启加密功能。
  • 密钥管理机制 透明数据加密功能中数据的加密和解密都依赖于安全可靠的密钥管理机制。本功能采用三层密钥结构实现密钥管理机制,即根密钥(RK)、主密钥(CMK)和数据加密密钥(DEK)。主密钥由根密钥加密保护,数据加密密钥由主密钥加密保护。数据加密密钥用于对用户数据进行加密和解密,每个表对应一个数据加密密钥。根密钥和主密钥保存在KMS服务中,数据加密密钥通过向KMS服务申请创建,创建成功可同时返回密钥明文和密文。数据加密密钥明文在内存中会使用hash表进行缓存减少访问KMS频次以提升性能,密钥明文只存在内存中使用不会落盘,并且支持自动淘汰机制删除不常使用的密钥明文,只保存最近1天内使用的密钥明文。数据加密密钥密文保存在数据库中并落盘持久化。对用户表数据加解密时,如果内存中没有对应密钥明文则需向KMS申请对数据密钥解密后再使用。
  • 创建加密表 登录数据库,创建加密表tde_test1,加密状态为开启,指定加密算法为AES_128_CTR: CREATE TABLE tde_test (a int, b text) with (enable_tde = on, encrypt_algo = 'AES_128_CTR'); 创建加密表tde_test2,加密状态为开启,不指定加密算法,则加密算法默认为AES_128_CTR: CREATE TABLE tde_test2 (a int, b text) with (enable_tde = on); 创建加密表tde_test3,加密状态为关闭,指定加密算法为SM4_CTR: CREATE TABLE tde_test3 (a int, b text) with (enable_tde = off, encrypt_algo = 'SM4_CTR');
  • 背景信息 当前版本主要实现对接华为云KMS服务,支持表级密钥存储,实现对行存表加密,规格约束如下: 支持heap存储行存表加密。 不支持物化视图加密,不支持ustore存储引擎加密。 不支持索引和Sequence加密,不支持xLog日志加密,不支持MOT内存表加密,不支持系统表加密。 用户在创建表时可以指定加密算法,加密算法一旦指定不可更改。如果创建表时设置enable_tde为on,但是不指定加密算法encrypt_algo,则默认使用AES_128_CTR加密算法。 如果在创建表时未开启加密功能或指定加密算法,后续无法再切换为加密表。 对于已分配加密密钥的表,切换表的加密和非加密状态,不会更换密钥和加密算法。 数据密钥轮转只有开启表加密功能时才支持轮转。 不支持单集群跨region的多副本主备同步,不支持单集群跨region的扩容,不支持跨region的备份恢复、集群容灾和数据迁移场景。 加密表的查询性能比不加密时会有所劣化,对于性能有较高要求的情况下需谨慎开启加密功能。
  • 密钥管理机制 透明数据加密功能中数据的加密和解密都依赖于安全可靠的密钥管理机制。本功能采用三层密钥结构实现密钥管理机制,即根密钥(RK)、主密钥(CMK)和数据加密密钥(DEK)。主密钥由根密钥加密保护,数据加密密钥由主密钥加密保护。数据加密密钥用于对用户数据进行加密和解密,每个表对应一个数据加密密钥。根密钥和主密钥保存在KMS服务中,数据加密密钥通过向KMS服务申请创建,创建成功可同时返回密钥明文和密文。数据密钥明文在内存中会使用hash表进行缓存减少访问KMS频次以提升性能,密钥明文只存在内存中使用不会落盘,并且支持自动淘汰机制删除不常使用的密钥明文,只保存最近1天内使用的密钥明文。数据加密密钥密文保存在数据库中并落盘持久化。对用户表数据加解密时,如果内存中没有对应密钥明文则需向KMS申请对数据密钥解密后再使用。
  • 表级加密方案 允许用户在创建表时指定是否对表进行加密和使用的加密算法,加密算法支持AES_128_CTR和SM4_CTR两种算法,算法一旦指定不可更改。对于创建表时指定为加密的表,数据库会自动为该表申请创建数据加密密钥,并将加密算法、密钥密文和对应主密钥ID等参数使用"keyword=value"格式保存在pg_class系统表中的reloptions字段中。 对于加密表,允许用户切换表的加密状态,即将加密表切换为非加密表,或将非加密表切换为加密表。如果在创建表时未使能加密功能,后续无法再切换为加密表。 对于加密表,支持数据加密密钥轮转。密钥轮转后,使用旧密钥加密的数据仍使用旧密钥解密,新写入的数据使用新密钥加密。密钥轮转时不更换加密算法。 对于行存表,每次加解密的最小数据单元为一个8K大小的page页面,每次对page页面加密时会通过安全随机数接口生成IV值,并将IV值和密钥密文、主密钥ID等信息保存在页面中一起写入存储介质。对于加密表由于page页面中需要保存加密密钥信息,相比不加密时占用存储空间膨胀约2.5%。
  • 背景信息 当用户连接数达到上限后,无法建立新的连接。因此,当数据库管理员发现某用户无法连接到数据库时,需要查看是否连接数达到了上限。控制数据库连接的主要以下几种选项。 全局的最大连接数:由运行参数max_connections指定。 某用户的连接数:在创建用户时由CREATE ROLE命令的CONNECTION LIMIT connlimit子句直接设定,也可以在设定以后用ALTER ROLE的CONNECTION LIMIT connlimit子句修改。 某数据库的连接数:在创建数据库时,由CREATE DATABASE的CONNECTION LIMIT connlimit参数指定。 预留连接供gs_clean使用:需要预留连接给gs_clean工具进行残留事务清理,以免由于残留事务长期阻塞系统正常运行,对于有n个CN的集群环境,那么需要至少预留n个连接给各个CN上的gs_clean进行残留事务清理。
  • 操作步骤 连接数据库。 查看全局会话连接数限制。 1 2 3 4 5 postgres=# SHOW max_connections; max_connections ----------------- 800 (1 row) 其中800是最大会话连接数。 查看已使用的会话连接数。 具体命令请参见表1。 除了创建的时候用双引号引起的数据库和用户名称外,以下命令中用到的数据库名称和用户名称,其中包含的英文字母必须使用小写。 表1 查看会话连接数 描述 命令 查看指定用户的会话连接数上限。 执行如下命令查看连接到指定用户omm的会话连接数上限。其中-1表示没有对用户omm设置连接数的限制。 1 2 3 4 5 postgres=# SELECT ROLNAME,ROLCONNLIMIT FROM PG_ROLES WHERE ROLNAME='omm'; rolname | rolconnlimit ----------+-------------- omm | -1 (1 row) 查看指定用户已使用的会话连接数。 执行如下命令查看指定用户omm已使用的会话连接数。其中,1表示omm已使用的会话连接数。 1 2 3 4 5 6 postgres=# SELECT COUNT(*) FROM dv_sessions WHERE USERNAME='omm'; count ------- 1 (1 row) 查看指定数据库的会话连接数上限。 执行如下命令查看连接到指定数据库postgres的会话连接数上限。其中-1表示没有对数据库postgres设置连接数的限制。 1 2 3 4 5 6 postgres=# SELECT DATNAME,DATCONNLIMIT FROM PG_DATABASE WHERE DATNAME='postgres'; datname | datconnlimit ----------+-------------- postgres | -1 (1 row) 查看指定数据库已使用的会话连接数。 执行如下命令查看指定数据库postgres上已使用的会话连接数。其中,1表示数据库postgres上已使用的会话连接数。 1 2 3 4 5 postgres=# SELECT COUNT(*) FROM PG_STAT_ACTIVITY WHERE DATNAME='postgres'; count ------- 1 (1 row) 查看所有用户已使用会话连接数。 执行如下命令查看所有用户已使用的会话连接数。 1 2 3 4 5 postgres=# SELECT COUNT(*) FROM dv_sessions; count ------- 10 (1 row)
  • 背景信息 当用户连接数达到上限后,无法建立新的连接。因此,当数据库管理员发现某用户无法连接到数据库时,需要查看是否连接数达到了上限。控制数据库连接的主要以下几种选项。 全局的最大连接数:由运行参数max_connections指定。 某用户的连接数:在创建用户时由CREATE ROLE命令的CONNECTION LIMIT connlimit子句直接设定,也可以在设定以后用ALTER ROLE的CONNECTION LIMIT connlimit子句修改。 某数据库的连接数:在创建数据库时,由CREATE DATABASE的CONNECTION LIMIT connlimit参数指定。