安全函数
安全函数
- gs_encrypt(encryptstr, keystr, cryptotype, cryptomode, hashmethod)
描述:采用cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法,以keystr为密钥对encryptstr字符串进行加密,返回加密后的字符串。支持的cryptotype:aes128, aes192, aes256, sm4。支持的cryptomode:cbc。支持的hashmethod:sha256, sha384, sha512, sm3。支持的加密数据类型:目前数据库支持的数值类型,字符类型,二进制类型中的RAW,日期/时间类型中的DATE、TIMESTAMP、SMALLDATETIME。keystr的长度范围与加密算法相关,为1~KeyLen字节。当cryptotype为aes128和sm4时,KeyLen为16,aes192时KeyLen为24,aes256时KeyLen为32。
返回值类型:text
返回值长度:至少为 4*[(maclen + 56)/3] 字节,不超过 4*[(Len + maclen + 56)/3] 字节,其中Len为加密前数据长度(单位为字节),maclen为HMAC值的长度,当hashmethod为sha256和sm3时maclen为32,sha384时maclen为48,sha512时maclen为64。即当hashmethod为sha256和sm3时,返回值长度至少为120字节,不超过4*[(Len + 88)/3] 字节;当hashmethod为sha384时,返回值长度至少为140字节,不超过4*[(Len + 104)/3] 字节;当hashmethod为sha512时,返回值长度至少为160字节,不超过4*[(Len + 120)/3] 字节;
示例:
1 2 3 4 5
SELECT gs_encrypt('GaussDB(DWS)', '1234', 'aes128', 'cbc', 'sha256'); gs_encrypt -------------------------------------------------------------------------------------------------------------------------- AAAAAAAAAACcFjDcCSbop7D87sOa2nxTFrkE9RJQGK34ypgrOPsFJIqggI8tl+eMDcQYT3po98wPCC7VBfhv7mdBy7IVnzdrp0rdMrD6/zTl8w0v9/s2OA== (1 row)
- 该函数8.1.1及以上集群版本支持。
- 由于该函数的执行过程需要传入解密口令,为了安全起见,gsql工具不会将该函数记录入执行历史。即无法在gsql里通过上下翻页功能找到该函数的执行历史。
- 在同一张数据表中,加密函数ge_encrypt与gs_encrypt_aes128不要混合使用。
- gs_decrypt(decryptstr, keystr,cryptotype, cryptomode, hashmethod)
描述:采用cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法,以keystr为密钥对decryptstr字符串进行解密,返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。keystr不得为空。
返回值类型:text
示例:
1 2 3 4 5
SELECT gs_decrypt('AAAAAAAAAACcFjDcCSbop7D87sOa2nxTFrkE9RJQGK34ypgrOPsFJIqggI8tl+eMDcQYT3po98wPCC7VBfhv7mdBy7IVnzdrp0rdMrD6/zTl8w0v9/s2OA==', '1234', 'aes128', 'cbc', 'sha256'); gs_decrypt -------------- GaussDB(DWS) (1 row)
- 该函数8.1.1及以上集群版本支持。
- 由于该函数的执行过程需要传入解密口令,为了安全起见,gsql工具不会将该函数记录入执行历史。即无法在gsql里通过上下翻页功能找到该函数的执行历史。
- 此函数需要结合gs_encrypt加密函数共同使用,且加密算法和HMAC算法要保证一致。
- gs_encrypt_aes128(encryptstr,keystr)
描述:以keystr为密钥对encryptstr字符串进行加密,返回加密后的字符串。keystr的长度范围为1~16字节。支持的加密数据类型:目前数据库支持的数值类型,字符类型,二进制类型中的RAW,日期/时间类型中的DATE、TIMESTAMP、SMALLDATETIME。
返回值类型:text
返回值长度:至少为92字节,不超过 4*[(Len+68)/3] 字节,其中Len为加密前数据长度(单位为字节)。
示例:
1 2 3 4 5 6
SELECT gs_encrypt_aes128('MPPDB','1234'); gs_encrypt_aes128 ------------------------------------------------------------------------------------- gwditQLQG8NhFw4OuoKhhQJoXojhFlYkjeG0aYdSCtLCnIUgkNwvYI04KbuhmcGZp8jWizBdR1vU9CspjuzI0lbz12A= (1 row)
- 由于该函数的执行过程需要传入解密口令,为了安全起见,gsql工具不会将该函数记录入执行历史。即无法在gsql里通过上下翻页功能找到该函数的执行历史。
- 在同一张数据表中,加密函数gs_encrypt_aes128与ge_encrypt不要混合使用。
- gs_decrypt_aes128(decryptstr,keystr)
描述:以keystr为密钥对decryptstr字符串进行解密,返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。keystr不得为空。
返回值类型:text
示例:
1 2 3 4 5
SELECT gs_decrypt_aes128('gwditQLQG8NhFw4OuoKhhQJoXojhFlYkjeG0aYdSCtLCnIUgkNwvYI04KbuhmcGZp8jWizBdR1vU9CspjuzI0lbz12A=','1234'); gs_decrypt_aes128 ------------------- MPPDB (1 row)
- 由于该函数的执行过程需要传入解密口令,为了安全起见,gsql工具不会将该函数记录入执行历史。即无法在gsql里通过上下翻页功能找到该函数的执行历史。
- 此函数需要结合gs_encrypt_aes128加密函数共同使用。
- gs_password_deadline()
描述:显示当前帐户密码离过期还距离多少天。密码过期后提示用户修改密码。与GUC参数password_effect_time相关。
返回值类型:interval
示例:
1 2 3 4 5
SELECT gs_password_deadline(); gs_password_deadline ------------------------- 83 days 17:44:32.196094 (1 row)
- gs_password_expiration()
描述:显示当前帐户密码离过期还距离多少天。密码过期后用户无法登录数据库。与创建用户的DDL语句PASSWORD EXPIRATION period相关。
返回值类型:interval
示例:
1 2 3 4 5
SELECT gs_password_expiration(); gs_password_expiration ------------------------- 29 days 23:59:49.731482 (1 row)
- gs_hash(hashstr, hashmethod)
描述:以hashmethod算法对hashstr字符串进行信息摘要,返回信息摘要字符串。支持的hashmethod:sha256, sha384, sha512, sm3。该函数8.1.1及以上集群版本支持。
返回值类型:text
返回值长度:sha256和sm3返回64字节,sha384返回96字节,sha512返回128字节。
示例:
1 2 3 4 5
SELECT gs_hash('GaussDB(DWS)', 'sha256'); gs_hash -------------------------------------------------------------------------------------------------- e59069daa6541ae20af7c747662702c731b26b8abd7a788f4d15611aa0db608efdbb5587ba90789a983f85dd51766609 (1 row)
- login_audit_messages(flag boolean)
返回值类型:元组
示例:
- 查看上一次登录认证通过的日期、时间和IP等信息。
1 2 3 4 5
SELECT * FROM login_audit_messages(true); username | database | logintime | type | result | client_conninfo ------------+----------+------------------------+---------------+--------+-------------------- dbadmin | postgres | 2017-06-02 15:28:34+08 | login_success | ok | gsql@[local] (1 row)
- 查看上一次登录认证失败的日期、时间和IP等信息。
1 2 3 4
SELECT * FROM login_audit_messages(false) ORDER BY logintime desc limit 1; username | database | logintime | type | result | client_conninfo ------------+----------+------------------------+--------------+--------+------------------------- (0 rows)
- 查看自从最后一次认证通过以来失败的尝试次数、日期和时间。
1 2 3 4
SELECT * FROM login_audit_messages(false); username | database | logintime | type | result | client_conninfo ------------+----------+------------------------+--------------+--------+------------------------- (0 rows)
- 查看上一次登录认证通过的日期、时间和IP等信息。
- login_audit_messages_pid(flag boolean)
描述:查看登录用户的登录信息。与login_audit_messages的区别在于结果基于当前backendid向前查找。所以不会因为同一用户的后续登录,而影响本次登录的查询结果。也就是查询不到该用户后续登录的信息。
返回值类型:元组
示例:
- 查看上一次登录认证通过的日期、时间和IP等信息。
1 2 3 4 5
SELECT * FROM login_audit_messages_pid(true); username | database | logintime | type | result | client_conninfo | backendid ------------+----------+------------------------+---------------+--------+-------------------- dbadmin | gaussdb | 2017-06-02 15:28:34+08 | login_success | ok | gsql@[local] | 140311900702464 (1 row)
- 查看上一次登录认证失败的日期、时间和IP等信息。
1 2 3 4
SELECT * FROM login_audit_messages_pid(false) ORDER BY logintime desc limit 1; username | database | logintime | type | result | client_conninfo | backendid ------------+----------+------------------------+--------------+--------+------------------------- (0 rows)
- 查看自从最后一次认证通过以来失败的尝试次数、日期和时间。
1 2 3 4
SELECT * FROM login_audit_messages_pid(false); username | database | logintime | type | result | client_conninfo | backendid ------------+----------+------------------------+--------------+--------+------------------------- (0 rows)
- 查看上一次登录认证通过的日期、时间和IP等信息。
- inet_server_addr()
返回值类型:inet
示例:
1 2 3 4 5
SELECT inet_server_addr(); inet_server_addr ------------------ 10.10.0.13 (1 row)
- 上面是以客户端在10.10.0.50上,服务器端在10.10.0.13上为例。
- 如果是通过本地连接,使用此接口显示为空。
- inet_client_addr()
返回值类型:inet
示例:
1 2 3 4 5
SELECT inet_client_addr(); inet_client_addr ------------------ 10.10.0.50 (1 row)
- 上面是以客户端在10.10.0.50上,服务器端在10.10.0.13上为例。
- 如果是通过本地连接,使用此接口显示为空。
- pg_query_audit()
返回值类型:SETOF record
函数返回字段如下:
名称
类型
描述
begintime
timestamp with time zone
操作的执行开始时间
endtime
timestamp with time zone
操作的执行结束时间
operation_type
text
操作类型
audit_type
text
审计类型
result
text
操作结果
username
text
执行操作的用户名
database
text
数据库名称
client_conninfo
text
客户端连接信息
object_name
text
操作对象名称
command_text
text
操作的执行命令。8.1.1之前的低版本集群该字段的审计内容包含在detail_info中。
detail_info
text
执行操作详细信息
transaction_xid
text
事务ID
query_id
text
查询ID
node_name
text
节点名称
thread_id
text
线程ID
local_port
text
本地端口
remote_port
text
远端端口
函数使用方法及示例请参考查看审计结果。
- pgxc_query_audit()
返回值类型:record
函数返回字段同pg_query_audit函数。
函数使用方法及示例请参考《开发指南》中“查看审计结果”章节。
- pg_delete_audit()
描述:删除指定时间段的审计日志。
返回值类型:void基于数据库安全考虑,不提供删除指定时间段的审计日志的函数接口,调用该函数将直接报“ERROR: For security purposes, it is not allowed to manually delete audit logs”。