海量 2 博客 profile

摘要:本文主要分为3个章节: 介绍Vastbase基于密码的身份认证机制,介绍密码相关配置参数,指出当前控制参数的局限性,提出PROFILE功能支持细粒度设置密码相关配置参数。 介绍Vastbase的PROFILE功能如何使用,包括管理PROFILE功能、管理PROFILE参数、管理用户PROFILE 介绍Vastbase身份认证流程与原理,介绍PROFILE功能的实现原理 目录 1 PROFILE 功能背景 1.1 身份认证机制 1.2 身份认证配置 1.3 身份认证优化 2 PROFILE 功能使用 2.1 PROFILE 简单示例 2.2 管理 PROFILE 功能 2.3 管理 PROFILE 参数 2.4 管理 用户 PROFILE 3 PROFILE 功能原理 3.1 身份认证元数据 3.2 身份认证流程 1 PROFILE 功能背景 1.1 身份认证机制 Vastbase身份认证模块,主要采用基于密码的认证机制,常用的密码操作包括: 创建密码 创建新用户时,需指定密码。语法示例如下: CREATE USER u1 PASSWORD 'u1.password'; Vastbase接收密码后,计算密码的哈希值,并将密码哈希值、密码创建时间等存储至系统表中。 使用密码 用户连接Vastbase时,需提供密码,使用vsql连接的命令如下: vsql -h {host} -p {port} -U u1 -W 'u1.password' -d vastbase -r Vastbase会与vsql进行身份认证交互,基于存储的密码哈希值,校验密码是否正确。同时,Vastbase还会进行其他检查,比如:密码是否过期、密码错误次数是否过多等。 修改密码 用户修改密码时,语法示例如下: ...

May 22, 2025 · 4 min · 684 words · Me

海量 2 用例 profile

1 CREATE/ALTER/DROP PROFILE 2 CREATE/ALTER USER .. PROFILE 3 验证profile生效 验证 failed_login_attempts 与 password_lock_time 验证 password_life_time 与 password_grace_time 验证 password_reuse_time 和 password_reuse_max 验证 idle_time 3 view CREATE PROFILE pro1 limit password_reuse_time 0.00002 password_reuse_max 10; -- 1.72s CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro1; ALTER USER u1 PASSWORD 'u1.pass2'; ALTER USER u1 PASSWORD 'u1.pass1'; -- error, interval < password_reuse_time \! sleep 2 ALTER USER u1 PASSWORD 'u1.pass1'; -- succeed, interval > password_reuse_time ALTER PROFILE pro1 LIMIT password_reuse_time 0.00005; -- 4.32s ALTER USER u1 PASSWORD 'u1.pass3'; ALTER USER u1 PASSWORD 'u1.pass4'; ALTER USER u1 PASSWORD 'u1.pass3'; -- error, interval < password_reuse_time \! sleep 5 ALTER USER u1 PASSWORD 'u1.pass3'; -- succeed, interval > password_reuse_time 1 CREATE/ALTER/DROP PROFILE -- check profile feature SHOW resource_limit; -- ================================ part 1 ================================ -- create profile CREATE PROFILE pro1; -- succeed: can set setting CREATE PROFILE pro2 LIMIT failed_login_attempts 10; -- succeed: can set more settings CREATE PROFILE pro3 LIMIT failed_login_attempts 10 password_lock_time 20 password_life_time 30 password_grace_time 40 password_reuse_time 50 password_reuse_max 60 idle_time 80; -- succeed: repeated settings are allowed CREATE PROFILE pro4 LIMIT password_life_time 10 password_life_time 20.2; -- succeed: setting value could be 'unlimited' CREATE PROFILE pro5 LIMIT failed_login_attempts unlimited password_lock_time 10 password_life_time unlimited; -- succeed: name max len is 64, name will be truncated CREATE PROFILE aaaaa111111111122222222223333333333444444444455555555556666666666; -- too long, max 64, wi -- truncated name: aaaaa1111111111222222222233333333334444444444555555555566666666 SELECT profile,count(*) FROM vb_profiles GROUP BY profile ORDER BY profile; SELECT * FROM vb_profiles WHERE profile = 'pro5' ORDER BY setname; -- error: profile name is invalid CREATE PROFILE 1; -- int CREATE PROFILE 1.1; -- numeric -- error: profile already exists CREATE PROFILE default LIMIT failed_login_attempts 10; CREATE PROFILE pro1 LIMIT failed_login_attempts 10; /* error: setting is invalid, supported settings: unit type min max ------------------------+---------+----------+---------+------------+---- failed_login_attempts | times | int | 1 | 2147483646 | 10 password_lock_time | days | double | 0.00001 | 24855 | 1 password_life_time | days | double | 0.00001 | 24855 | 180 password_grace_time | days | double | 0.00001 | 24855 | 7 password_reuse_time | days | double | 0.00001 | 24855 | 1 password_reuse_max | times | int | 1 | 2147483646 | 1 idle_time | minutes | double | 0.00001 | 2147483646 | 10 */ CREATE PROFILE epro2 LIMIT data_directory anyvalue; CREATE PROFILE epro3 LIMIT password_effect_time 10; CREATE PROFILE epro4 LIMIT 10 failed_login_attempts; -- error: setting lose value CREATE PROFILE epro5 LIMIT failed_login_attempts; CREATE PROFILE epro6 LIMIT failed_login_attempts 10 password_lock_time; -- error: setting value type is invalud CREATE PROFILE epro7 LIMIT failed_login_attempts 'iamstring'; CREATE PROFILE epro8 LIMIT failed_login_attempts 1.1; CREATE PROFILE epro9 LIMIT failed_login_attempts noint; CREATE PROFILE epro10 LIMIT failed_login_attempts default; -- error: setting value is out of limit CREATE PROFILE epro11 LIMIT failed_login_attempts 0; CREATE PROFILE epro12 LIMIT failed_login_attempts 1 password_lock_time 0; CREATE PROFILE epro13 LIMIT password_lock_time 24856; CREATE PROFILE epro14 LIMIT password_lock_time 0.000001; SELECT profile,count(*) FROM vb_profiles GROUP BY profile ORDER BY profile; DROP PROFILE pro1, pro2, pro3, pro4, pro5; DROP PROFILE aaaaa111111111122222222223333333333444444444455555555556666666666; -- ================================ part 2 ================================ -- alter profile CREATE PROFILE pro1; CREATE PROFILE pro2 LIMIT failed_login_attempts 100; CREATE PROFILE pro3 LIMIT password_lock_time 20; -- succeed: can set setting ALTER PROFILE pro1 LIMIT failed_login_attempts 1000; -- succeed: can set more settings ALTER PROFILE pro2 LIMIT failed_login_attempts 10 password_lock_time 20 password_life_time 30 password_grace_time 40 password_reuse_time 50 password_reuse_max 60 idle_time 80; -- succeed: setting value could be 'unlimited' ALTER PROFILE pro3 LIMIT failed_login_attempts unlimited password_lock_time 10 password_life_time unlimited; -- succeed: can alter default profile ALTER PROFILE default LIMIT failed_login_attempts 80 password_reuse_time 70.3; SELECT * FROM vb_profiles ORDER BY profile,setname; -- error: profile name is invalid ALTER PROFILE 1 LIMIT failed_login_attempts 10; -- int ALTER PROFILE 1.1 LIMIT failed_login_attempts 10; -- numeric ALTER PROFILE aaaaa111111111122222222223333333333444444444455555555556666666666 LIMIT failed_login_attempts 10; -- too long, max 64 -- error: repeated settings are not allowed ALTER PROFILE pro3 LIMIT password_reuse_time 10 password_reuse_time 20.2; -- error: profile doesn't exist ALTER PROFILE epro1 LIMIT failed_login_attempts 10; ALTER PROFILE epro2 LIMIT failed_login_attempts 10; /* error: setting is invalid */ ALTER PROFILE pro1 LIMIT data_directory anyvalue; ALTER PROFILE pro1 LIMIT password_effect_time 10; ALTER PROFILE pro1 LIMIT 10 failed_login_attempts; -- error: setting lose value ALTER PROFILE pro1 LIMIT failed_login_attempts; ALTER PROFILE pro1 LIMIT failed_login_attempts 10 password_lock_time; -- error: setting value type is invalud ALTER PROFILE pro1 LIMIT failed_login_attempts 'iamstring'; ALTER PROFILE pro1 LIMIT failed_login_attempts 1.1; ALTER PROFILE pro1 LIMIT failed_login_attempts noint; ALTER PROFILE pro1 LIMIT failed_login_attempts default; -- error: setting value is out of limit ALTER PROFILE pro1 LIMIT failed_login_attempts 0; ALTER PROFILE pro1 LIMIT failed_login_attempts 1 password_lock_time 0; ALTER PROFILE pro1 LIMIT password_lock_time 24856; ALTER PROFILE pro1 LIMIT password_lock_time 0.000001; DROP PROFILE pro1, pro2, pro3; -- ================================ part 3 ================================ -- drop profile CREATE PROFILE pro1; CREATE PROFILE pro2 LIMIT failed_login_attempts 100; CREATE PROFILE pro3 LIMIT password_lock_time 20; CREATE PROFILE pro4; CREATE PROFILE pro5; -- succeed: drop profile DROP PROFILE pro1; DROP PROFILE IF EXISTS pro1; DROP PROFILE IF EXISTS pro1, pro2, pro3; SELECT profile,count(*) FROM vb_profiles GROUP BY profile; -- error: profile doesn't exist DROP PROFILE pro0; DROP PROFILE pro1, pro4, pro5; -- error: default profile can't be dropped DROP PROFILE default; DROP PROFILE pro4, default; DROP PROFILE IF EXISTS pro4, pro5; 2 CREATE/ALTER USER .. PROFILE -- ================================ part 4 ================================ -- set profile for user SELECT * FROM vb_user_profiles; CREATE PROFILE pro1; CREATE PROFILE pro2; -- succeed: set profile for user CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro1; CREATE USER u2 PASSWORD 'u2.pass1' PROFILE pro1; CREATE USER u3 PASSWORD 'u3.pass1' PROFILE default; CREATE USER u4 PASSWORD 'u4.pass1'; -- error: profile doesn't exist CREATE USER eu1 PASSWORD 'u4.pass1' PROFILE pro1000; -- error: profile name invalid CREATE USER eu2 PASSWORD 'u4.pass1' PROFILE 1; CREATE USER eu3 PASSWORD 'u4.pass1' PROFILE; SELECT * FROM vb_user_profiles; DROP USER IF EXISTS u1, u2, u3, u4; -- catalog also changed SELECT * FROM vb_user_profiles; DROP PROFILE IF EXISTS pro1, pro2; -- ================================ part 5 ================================ -- alter user profile CREATE PROFILE pro1; CREATE PROFILE pro2; CREATE USER u1 PASSWORD 'u1.pass1'; CREATE USER u2 PASSWORD 'u2.pass1' PROFILE pro2; CREATE USER u3 PASSWORD 'u3.pass1' PROFILE default; -- succeed: alter user set profile ALTER USER u1 PROFILE pro1; ALTER USER u2 PROFILE default; ALTER USER u3 PROFILE pro1; -- error: profile doesn't exist ALTER USER u1 PROFILE pro1000; -- error: profile name invalid ALTER USER u1 PROFILE 1; ALTER USER u1 PROFILE; SELECT * FROM vb_user_profiles ORDER BY roloid; DROP USER IF EXISTS u1, u2, u3; DROP PROFILE IF EXISTS pro1, pro2; -- ================================ part 6 ================================ -- drop user and profile CREATE PROFILE pro1; CREATE PROFILE pro2; CREATE PROFILE pro3; CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro1; CREATE USER u2 PASSWORD 'u2.pass1' PROFILE pro2; -- succeed: drop user SELECT * FROM vb_user_profiles WHERE rolname = 'u1'; DROP USER u1; SELECT * FROM vb_user_profiles WHERE rolname = 'u1'; -- error: can't drop profile if any user are using it DROP PROFILE pro2; -- error: default profile can't be dropped DROP PROFILE default; DROP PROFILE pro3, default; DROP PROFILE default, pro3; SELECT * FROM vb_user_profiles ORDER BY roloid; DROP USER IF EXISTS u1, u2; DROP PROFILE IF EXISTS pro1, pro2, pro3; 3 验证profile生效 验证 failed_login_attempts 与 password_lock_time CREATE PROFILE pro1 LIMIT failed_login_attempts 3 password_lock_time 0.0001; CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro1; -- 运行登录失败3次,失败后锁定8秒 CREATE USER u2 PASSWORD 'u2.pass1'; -- 允许登录失败无数次 vsql -p 5432 -d postgres -U u1 -W "u1.error1" -c "SELECT 1;" vsql -p 5432 -d postgres -U u1 -W "u1.error1" -c "SELECT 1;" vsql -p 5432 -d postgres -U u1 -W "u1.error1" -c "SELECT 1;" vsql -p 5432 -d postgres -U u1 -W "u1.pass1" -c "SELECT 1;" -- sleep 8s vsql -p 5432 -d postgres -U u1 -W "u1.pass1" -c "SELECT 1;" -- u2 vsql -p 5432 -d postgres -U u2 -W "u2.error1" -c "SELECT 1;" vsql -p 5432 -d postgres -U u2 -W "u2.error1" -c "SELECT 1;" vsql -p 5432 -d postgres -U u2 -W "u2.error1" -c "SELECT 1;" vsql -p 5432 -d postgres -U u2 -W "u2.pass1" -c "SELECT 1;" -- sleep 8s vsql -p 5432 -d postgres -U u2 -W "u2.pass1" -c "SELECT 1;" vsql -p 5432 -d postgres -c "DROP USER u1,u2" 验证 password_life_time 与 password_grace_time CREATE PROFILE pro2 LIMIT password_life_time 0.0001 -- 8s password_grace_time 0.0001; CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro2; -- 密码有效期为8s,密码宽容期也为8s CREATE USER u2 PASSWORD 'u2.pass1'; -- 密码有效期无限制 \q vsql -p 5432 -d postgres -U u1 -W "u1.pass1" -c "SELECT 1;" -- sleep 8s vsql -p 5432 -d postgres -U u1 -W "u1.pass1" -c "SELECT 1;" -- sleep 8s vsql -p 5432 -d postgres -U u1 -W "u1.pass1" -c "SELECT 1;" vsql -p 5432 -d postgres -U u2 -W "u2.pass1" -c "SELECT 1;" -- sleep 8s vsql -p 5432 -d postgres -U u2 -W "u2.pass1" -c "SELECT 1;" -- sleep 8s vsql -p 5432 -d postgres -U u2 -W "u2.pass1" -c "SELECT 1;" 验证 password_reuse_time 和 password_reuse_max CREATE PROFILE pro3 LIMIT password_reuse_time 0.0001 -- 不能用过去8秒使用过的密码 password_reuse_max 100; -- 不能用过去100次使用过的 DROP USER IF EXISTS u1,u2; CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro3; ALTER USER u1 PASSWORD 'u1.pass2'; ALTER USER u1 PASSWORD 'u1.pass1'; SELECT pg_sleep(3); ALTER USER u1 PASSWORD 'u1.pass1'; SELECT pg_sleep(3); ALTER USER u1 PASSWORD 'u1.pass1'; SELECT pg_sleep(3); ALTER USER u1 PASSWORD 'u1.pass1'; CREATE USER u2 PASSWORD 'u2.pass1'; ALTER USER u2 PASSWORD 'u2.pass2'; ALTER USER u2 PASSWORD 'u2.pass1'; ALTER USER u2 PASSWORD 'u2.pass2'; ALTER USER u2 PASSWORD 'u2.pass1'; -- ----------------------------- CREATE PROFILE pro4 LIMIT password_reuse_max 2 -- 不能用过去2次使用过的 password_reuse_time 20; DROP USER IF EXISTS u1,u2; CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro4; ALTER USER u1 PASSWORD 'u1.pass2'; ALTER USER u1 PASSWORD 'u1.pass3'; ALTER USER u1 PASSWORD 'u1.pass4'; ALTER USER u1 PASSWORD 'u1.pass3'; -- error ALTER USER u1 PASSWORD 'u1.pass2'; -- ok 验证 idle_time CREATE PROFILE pro5 LIMIT idle_time 0.1; -- 6s DROP USER IF EXISTS u1,u2; CREATE USER u1 PASSWORD 'u1.pass1' PROFILE pro5; CREATE USER u2 PASSWORD 'u2.pass1'; \q vsql -p 5432 -d postgres -U u1 -W "u1.pass1" -r SELECT 1; -- 不用pg_sleep \! sleep 7 SELECT 1; \q vsql -p 5432 -d postgres -U u2 -W "u2.pass1" -r SELECT 1; -- 不用pg_sleep \! sleep 7 SELECT 1; 3 view CREATE OR REPLACE VIEW SYS.DBA_PROFILES AS SELECT profile "PROFILE", setname "RESOURCE_NAME", setkind "RESOURCE_TYPE", setval "LIMIT" FROM vb_profiles; 升级 审计 oid knl_u_misc_init AuthenticatedUserId = InvalidOid ResetStreamStatus AuthenticatedUserId = InvalidOid InitializeSessionUserId AuthenticatedUserId = SearchSysCache(rolname / useroid) InitializeSessionUserIdStandalone AuthenticatedUserId = BOOTSTRAP_SUPERUSERID SessionUserId CurrentUserId create_session_context # get_setting_from_guc_or_profile enable_session_sig_alarm # get_setting_from_guc_or_profile ReadCommand # get_setting_from_guc_or_profile enable_session_sig_alarm # get_setting_from_guc_or_profile disable_session_sig_alarm TpoolSchedulerMain CheckSessionTimeout # get_setting_from_guc_or_profile handle_sig_alarm CheckSessionTimeout # get_setting_from_guc_or_profile WaitMission # get_setting_from_guc_or_profile enable_session_sig_alarm

March 14, 2025 · 9 min · 1719 words · Me

海量 2 设计 profile

1 Oracle兼容性-支持profile功能 1.1 功能简述 本特性实现与oracle profile相同的功能,支持为不同用户设置7个不同的配置参数: failed_login_attempts password_lock_time password_life_time password_grace_time password_reuse_time password_reuse_max idle_time 简单使用示例如下: CREATE PROFILE pro1 LIMIT failed_login_attempts 10; CREATE USER u1 PASSWORD 'u1.pass1'; ALTER USER u1 PROFILE u1; 1.2 实现方案 一、元数据 本特性的关键实现为:对用户提供DDL接口,在内核中存储配置数据。因此,在介绍代码流程前,先介绍接口与元数据。 新增GUC参数resource_limit (与oracle参数名一致) 控制是否启用oracle profile功能。 如果该参数为on,以下5个guc参数则不再生效:[failed_login_attempts, password_lock_time, password_effect_time, password_reuse_time, password_reuse_max]。另外,对于已经过身份认证的连接,session_timeout也不再生效,相关功能均由profile中的用户级参数控制。 对于新安装的集群、旧版本升级的集群,该参数的值存在差异: 新安装:新安装的数据库,即3.0.8版本及之后,该guc参数值默认为on(初始值为off,由initdb自动设置为on) 升级:从3.0.8之前版本,升级到3.0.8版本时,在升级的过程中,该参数的值仍然是off,即升级上来默认不可用profile功能 SELECT * FROM pg_settings WHERE name = 'resource_limit'; -[ RECORD 1 ]------------------------------------------- name | resource_limit setting | on -- 默认为on (由initdb设置为on,从旧版本升级到新版本时,升级脚本会将该参数设置为off) unit | category | Ungrouped short_desc | Used to enable profile feature extra_desc | default on context | postmaster -- 需重启生效 vartype | bool source | default min_val | max_val | enumvals | boot_val | off reset_val | off sourcefile | sourceline | 修改6个GUC参数的生效条件 当GUC参数resource_limit取值为on时,以下6个GUC参数不再生效:[failed_login_attempts, password_lock_time, password_effect_time, password_reuse_time, password_reuse_max, session_timeout] ...

March 6, 2025 · 6 min · 1256 words · Me

海量 2 设计 oracle profile

2 代码 新增试图 SELECT * FROM pg_user_settings; -- 新增视图 pg_user_settings SELECT rolname,profile FROM pg_authid WHERE rolcanlogin = true LEFT JOIN vb_profile ON rolname | setname | setting | settype | settype | setsource --------+-----------------------+----------+---------+-------------+---------------- u1 | password_effect_time | 90 | int | profile guc | pro1 | cluster guc | postgresql.conf 参数1: failed_login_attempts # opegauss使用1个内存中的hash表,存储密码失败次数 ClientAuthentication # 进行身份认证时,如果认证失败,则更新hash表中的失败次数值 UpdateFailCountToHashTable InitAccountLockHashTable hash_search # 如果失败次数超过GUC限制,则锁定账户 if failed_login_attempts: lockflag = True 参数2: password_lock_time 参数3: password_effect_time # 通过内置函数,主动查看密码剩余天数 gs_password_deadline GetCurrentUserId # 1 获取当前用户 GetUserCurrentPwdtime # 2 从系统表pg_auth_history中,获取密码创建时间passwordtime heap_open('pg_auth_history') systable_beginscan floor(u_sess->attr.attr_security.Password_effect_time) # 3 从guc参数password_effect_time中获取密码有效天数 # 计算步骤2和3中的时间,返回剩余过期天数 参数4: password_reuse_max AddAuthHistory systable_beginscan('pg_auth_history') # 1 从系统表pg_auth_history中,获取曾用过的密码rolpassword,获取生成密码的时间passwordtime systable_getnext_back # 倒着从系统表扫描,即先扫描不太古老的旧密码,再扫描更古老的旧密码 pg_sha256_encrypt # 使用旧密码的salt,加密新密码 if strncmp : # 比较新密码是否与旧密码相等 hasSame = True # 如果新旧密码相等,计算新旧密码间隔天数,与GUC参数password_reuse_time比较,判断是否满足密码重用时间限制 if now - pg_auth_history.passwordtime > 'password_reuse_time': isTimeSafe = True # 计算这是倒数第几个密码 changeTimes++ if changeTimes > 'password_reuse_max': isMaxSafe # 满足 password_reuse_time 和 password_reuse_max 中任意一个条件,都可以修改密码 # - 要么用好几次之前的密码(满足 password_reuse_max 条件) # - 要么用很旧之间使用的密码(满足 password_reuse_time 条件) if hasSame and not isTimeSafe and not isMaxSafe: # 报错 参数5: password_reuse_time

February 20, 2025 · 1 min · 159 words · Me

海量 2 需求 profile

1 简介 1.1 目的 vastbase与oracle都支持设置运行参数: vastbase:支持设置集群级guc参数,例如,guc参数failed_login_attempts用于设置’用户密码错误多少次后锁定账户’,该参数对集群中所有用户(非初始用户)都有效。 oracle:也支持failed_login_attempts参数,但是oracle支持为不同用户设置不同的failed_login_attempts值。我们且将此类参数称为用户级参数。 与oracle相比,vastbase的guc参数功能存在2个差异: 作用范围:oracle支持设置用户级参数,vastbase大部分参数都是集群级guc参数 参数个数:23版本的oracle支持18个用户级参数,其中6个可在vastbase找到对应的guc参数 参数取值:vastbase中,6个guc参数的取值范围与oracle profile不同 本文主要介绍以下几点: oracle用户级参数的个数、设置方法 vastbase中对应集群级guc参数的个数、设置方法 vastbase新需求:尽量实现与oracle一致的用户级guc参数 本文档可指导开发者、测试者熟悉vastbase用户级guc配置参数特性 本文档的内容已被上传至tapd,tapd上,排版更好看,测试用例更方便复制。建议直接从tapd上查看本文档原文: https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007196 1.2 适用范围 vastbase 3.0.8及之后版本,vastbase用户级参数profile特性接口设计、使用指导等。 1.3 术语定义、首字母缩写词和缩略语 GUC:Grand Unifed Configuralion,postgresql和vastbase的配置参数 1.3 参考资料 原始需求: https://www.tapd.cn/60475194/prong/stories/view/1160475194001074627 tapd上本需求文档链接: https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007196 tapd上6个与密码相关的guc参数的使用参考: https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007200 oracle 23 profile语法以及相关参数: https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PROFILE.html mysql 8.0 create user语法以及相关参数: https://mysql.net.cn/doc/refman/8.0/en/create-user.html mysql 配置参数列表:https://mysql.net.cn/doc/refman/8.0/en/server-system-variable-reference.html vastbase g100 create user语法以及相关参数: https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/6a4766151e29496b9f88cd2d9dd3db2e 2 支持oracle用户级配置profile 2.1 功能简述 【需求来源】桂林银行 需求链接:https://www.tapd.cn/60475194/prong/stories/view/1160475194001074627 需求描述:桂林银行客户指出,目前对于数据库用户的管理方式不够便捷,无法像oracle profile方式为用户赋予一组安全策略。一些属性如密码有效期、密码过期天数、密码尝试次数等也只能全局设定,无法指定用户配置。- 需求范围:桂林银行使用的数据库兼容模式包括oracle和mysql两种兼容模式。 【需求背景】oracle 23的profile功能 通俗来讲,oracle的profle可理解为细粒度的配置参数。1个profile包含1组配置参数,不同用户可使用不同的profile。按上述例子,要单独控制某个用户的密码有效期,操作步骤如下: 创建用户 CREATE USER u1 IDENTIFIED BY "u1.1234"; 创建profile,同时设置用户级参数 此处,以设置密码有效期参数为例: CREATE PROFILE pro1 LIMIT FAILED_LOGIN_ATTEMPTS 10; 设置用户u1使用profile pro1 ...

February 19, 2025 · 11 min · 2197 words · Me

海量 4 需求 scram-sha256

深信服支持pg scram-sha256需求 需求目标 本需求的根本目标时,当vastbase server要求使用sha256算法进行身份认证时,postgresql client能与vastbase server建立连接。 该需求目前仅合入深信服分支 需求分析 身份认证的详细流程有点复杂,此处简要概述为2个阶段: 标识:新建用户时,server计算并存储密码哈希值 鉴别:用户登录时,server向client发送计算密码哈希值的关键信息,client计算并向server发送密码哈希值,server校验其是否符合存储的值 vastbase和postgresql对比,server计算密码哈希值的算法不同,server向client发送关键信息也不同。为解决pg-client能够连接vb-server的问题,需解决问题如下: vb-server计算并存储与pg-server一致的密码哈希值 vb-server向pg-client发送密码哈希值关键信息时,需要pg-server一致 postgreql的标识与鉴别机制,符合标准RFC-5802,涉及的算法与协议,本文统一称为scram-sha256。vastbase涉及的算法与协议,本文统一称为sha256。 需求实现 密码存储:新建用户时,修改存储用户密码的值 修改前:guc参数password_encrypt_type,取值1时,vb-server存储密码的[sha256, md5]值;取值为2时,存储密码的[sha256]值 SELECT rolpassword FORM pgauthid; -- 示例:长度为209 rolpassword -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- sha256af99537f242c661a88acea99ac626a2cf8fe196ac5671db6f02ed6818b420cf84e7ada61d66602c6eb5bf4ced40911d3f51865959784ebc3b0d385ca4c08f3398f05e16268fe9acc95a2d662bf5033b15d53abd1f835c1a3f1e96343a5cbf800ecdfecefade 修改后:guc参数password_encrypt_type,取值1时,vb-server存储密码的[sha256, md5, scram-sha256]值;取值为2时,存储密码的[sha256, scram-sha256]值 SELECT rolpassword FORM pgauthid; -- 示例:长度342 (新增长度:133) rolpassword -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- sha256af99537f242c661a88acea99ac626a2cf8fe196ac5671db6f02ed6818b420cf84e7ada61d66602c6eb5bf4ced40911d3f51865959784ebc3b0d385ca4c08f3398f05e16268fe9acc95a2d662bf5033b15d53abd1f835c1a3f1e963SCRAM-SHA-256$4096:sp5V1hrLKzLsS4HtQgqTuA==$QO/UVdrXxIypzBEGqEuIWe96A80elghFQs25ZbdPsLg=:J4lPXmXPANtTMOkaHokMjmM19K1Di7fU6WRWuZ5VmS0= 认证协议:用户登录时,修改向客户端发送的密码哈希值关键信息 修改前: # 身份认证协议 1. client <-> server : tcp connect 2. client --> server : send [消息类型:0, 协议版本:3.51,连接参数:user_name, databse, ...] 3. server --> client : send [消息类型:R, 哈希算法:10, 系统表存储的密码的算法:2, 计算密码哈希关键信息:salt,token,iteration] 4. client <-> server : # 省略3次交互 修改后: ...

April 3, 2025 · 6 min · 1256 words · Me

数据库安全 1 身份认证

摘要:从5个方面,介绍PostgreSQL身份认证特性:背景、原理、使用、设计、实现 1 身份认证概述 1.1 非法访问风险 数据库进程 数据库运行时,本质是一个服务器进程,在特定的主机上,监听特定端口。应用如果知道IP和端口,都可与数据库进程建立TCP连接,并进行数据交互,包括发送SQL语句、接收查询结果等。 数据泄露风险 为避免非法用户访问数据库,构造特殊数据,造成数据损坏、数据泄露等问题,数据库接收应用建立TCP的请求,并成功建立TCP连接后,需先确认应用的身份是否合法,再接收应用的其他数据,比如接收SQL语句等。 1.2 身份认证机制 在信息系统中,身份认证是一种常见的机制,身份认证的概念较成熟,本文不详细介绍相关概念。身份认证分为标识与鉴别两个部分: 标识:用户向系统声明自己的身份,系统标识用户 鉴别:系统验证用户提供的信息,确认用户是否是已标识的用户 按照认证因素,可将身份认证划分为3类: 知识因素:用户知道某些秘密,比如口令、密码等 拥有因素:用户拥有某些实物,比如钥匙、证书、令牌等 生物因素:用户拥有某些特征,比如指纹、面部、虹膜、签名等 1.3 PostgrSQL的身份认证 PostgreSQL的认证方式有很多种,包括:密码认证、Ident认证、Peer认证、证书认证、LDAP认证等。本文仅介绍最常见的方案。 在大部分场景中,PostgreSQL采用以下2层认证机制: 主机认证: 标识:在PostgreSQL的配置文件中,配置IP白名单 鉴别:PostgreSQL与应用建立连接后,检查应用的IP是否在白名单内,判断应用是否合法 口令认证: 标识:PostgreSQL已存在的用户,创建新用户,为其设置用户信息,以及口令 备注:第一次安装PostgreSQL时,PostgreSQL要求用户创建初始用户 鉴别:在主机认证后,PostgreSQL先要求应用提供用户信息,再要求应用提供对应的口令,判断应用是否合法 2 身份认证的使用流程 2.1 基本流程 PostgreSQL中,从用户的角度观察,使用身份认证的流程可简单理解为: 用户:已存在的用户使用CRATE USER {username} .. PASSWORD {password} ..语法,创建新用户并设置口令 数据库:数据库先对口令进行哈希,再存储口令的哈希值,目前的版本中,默认哈希算法为sha256算法,用户可通过GUC参数配置哈希算法类型 用户:用户与数据建立连接,将{username}与{password}的哈希值发送给数据库,数据库比较用户发送的哈希值与系统表中的哈希值,判断{password}是否合法 具体实现中,第3步的验证过程较为复杂,RFC5 802协议提供了一套安全的交互流程。后文介绍内部实现的详细流程。 3 身份认证的实现 3.1 基于IP的身份认证 标识:访问者的IP 鉴别:数据库遍历IP白名单,判断访问者IP是否在白名单中,如果在,则认为访问者合法,允许与数据建立TCP连接。 PostmasterMain ServerLoop ConnCreate StreamConnection BackendStartup BackendRun PostgresMain InitPostgres PerformAuthentication ClientAuthentication hba_getauthmethod /* 从hba文件中,获取指定ip的认证方式 */ check_hba check_hostname check_ip /* 如果指定ip未获取到认证方式,则返回空 */ switch hba->auth_method: /* 根据ip采用不同的认证方式 */ case uaReject: case uaImplicitReject: case uaGSS: case uaSSPI: case uaPeer: ... case uaMD5: case uaPassword: case uaCert: case uaTrust: ... 3.2 基于证书的身份认证 创建主体的语法示例如下: ...

January 24, 2025 · 2 min · 229 words · Me

海量 8 需求 海康身份认证

本需求包含6个小需求: 身份认证:创建用户:CREATE/SET USER .. PASSWORD ..,密码可以只设置2类字符 身份认证:创建用户:CREATE/SET [角色] USER ..,角色支持指定SUPERUSER和NOSUPERUSER 身份认证:查看用户:SELECT .. FROM pg_user,普通用户可查询pg_user视图(仅pg兼容性) 身份认证:登录用户:SET ROLE new_user [PASSWORD ..],new_user是会话用户时,可以不指定PASSWORD 访问控制:Database权限:普通用户可访问template1数据库(仅pg兼容性) 访问控制:Schema权限:普通用户可在public下执行CREATE操作(仅pg兼容性) 描述 身份认证:创建用户 变更:用户密码可以只包含2类字符 -- password_polcy取值不同,密码需包含的字符种类数不同,为1时需3类,需2时需4类,为3时需2类 ALTER SYSTEM SET password_policy OT 3; -- 修改取值范围[0,2]为[0,3] CREATE USER u1 PASSWORD 'password1'; -- 此时,密码可以只含2类字符 ALTER USER old_user PASSWORd 'password1'; 身份认证:创建用户 变更:可以指定SUPERUSER角色 CREATE USER u1 SUPERUSER PASSWORD ..; -- 支持设置 SUPERUSER 角色 ALTER USER u1 NOSUPERUSER ..; -- 支持取消 SUPERUSER 角色 ALTER USER old_user SUPERUSER ..; 身份认证:查看用户 变更:普通用户可查询pg_user视图(仅pg兼容性) ...

June 30, 2025 · 7 min · 1446 words · Me

openGauss 身份认证 GUC参数

1 身份认证 身份认证 大部分数据库都支持基于口令的身份认证,以vastbase为例,身份认证的流程如下: 高权限用户创建新用户 CREATE USER u1 PASSWORD 'u1.pass1'; 数据库在pg_authid系统表中存储用户以及密码的哈希 SELECT oid, rolname, rolvalidbegin, rolpassword FROM pg_authid WHERE rolname = 'u1'; oid | rolname | rolvalidbegin | rolpassword -------+---------+---------------+-------------------------------------------------------------------------- 24576 | u1 | | sha2565e3b533ca5db32acdffdb6aea03395af163ac3cfdc9ddb....... 数据库在pg_auth_history系统表中存储密码创建时间 SELECT roloid, passwordtime FROM pg_auth_history; oid | passwordtime -------+------------------------------- 24576 | 2025-02-11 12:17:02.969642+08 新用户登录数据库 gsql -d postgres -U u1 -W 'u1.pass1' -r 数据库校验新用户信息:数据库接收用户建立连接的请求时,会进行一系列身份鉴别操作,包括:检查用户提供的密码与pg_authid中的值是否匹配,检查pg_auth_history中记录的密码生成日期与当前日期是否间隔较久等 ...

February 28, 2025 · 5 min · 864 words · Me

vastbase 身份认证

国策用例 4、配置客户端认证方式 hostssl all all 0.0.0.0/0 cert 1、生成国密证书 创建 CA 目录 cadir 并进入 mkdir cadir cd cadir copy 配置文件 openssl.cnf 到当前目录(不同环境,配置文件路径可能不一样) cp /etc/pki/tls/openssl.cnf . 开始搭建CA环境 mkdir ./demoCA ./demoCA/newcerts ./demoCA/private chmod 777 ./demoCA/private 创建serial文件,写入01 echo '01'>./demoCA/serial 创建文件index.txt touch ./demoCA/index.txt 修改openssl.cnf配置文件中CA_default的参数 dir = ./demoCA default_md = sha256 至此CA环境搭建完成 生成CA私钥 openssl ecparam -out demoCA/private/cakey.pem -name SM2 -genkey 生成根证书请求文件 openssl req -config openssl.cnf -key demoCA/private/cakey.pem -new -out cacert.req -subj /C=CN/ST=BJ/L=HaiDian/O=VAST/OU=SEC/CN=CLIENT 生成自签发根证书 生成根证书时,需要修改openssl.cnf文件,设置basicConstraints=CA:TRUE vi openssl.cnf 生成CA自签发根证书 openssl ca -config openssl.cnf -in cacert.req -keyfile demoCA/private/cakey.pem -selfsign -out demoCA/cacert.pem 生成服务器私钥文件server.key openssl ecparam -out server.key -name SM2 -genkey 生成服务器证书请求文件server.req openssl req -config openssl.cnf -key server.key -new -out server.req -subj /C=CN/ST=BJ/L=HaiDian/O=VAST/OU=SEC/CN=server 生成服务端/客户端证书时,修改openssl.cnf文件,设置basicConstraints=CA:FALSE vi openssl.cnf 对生成的服务器证书请求文件进行签发,签发后将生成正式的服务器证书server.crt openssl ca -config openssl.cnf -in server.req -out server.crt -days 3650 生成客户端私钥 openssl ecparam -out client.key -name SM2 -genkey 生成客户端证书请求文件 openssl req -config openssl.cnf -new -key client.key -out client.req -subj /C=CN/ST=BJ/L=HaiDian/O=VAST/OU=SEC/CN=client 对生成的客户端证书请求文件进行签发,签发后将生成正式的客户端证书client.crt openssl ca -config openssl.cnf -in client.req -out client.crt -days 3650 注:中间会产生交互,按照以下内容进行填写(需注意每个交互的common name填不一样的内容,如分别写:test1,test2,test3): Country Name (2 letter code) [AU]:CN State or Province Name (full name) [Some-State]:shanxi Locality Name (eg, city) []:xian Organization Name (eg, company) [Internet Widgits Pty Ltd]:Abc Organizational Unit Name (eg, section) []:hello --Common Name可以随意命名 Common Name (eg, YOUR name) []:world --Email可以选择性填写 Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: 1qaz!QAZ An optional company name []:world # --------------------------------------- https://gitee.com/opengauss/openGauss-server/pulls/3254 mkdir certs cp ../../tassl/tassl_demo/cert/openssl.cnf certs/ cd certs #CA openssl ecparam -genkey -name SM2 -out CA.key openssl req -config openssl.cnf -new -subj /C=CN/ST=BJ/L=HaiDian/O=YUNHEENMO/OU=MogDB/CN=FooCA -key CA.key -out CA.csr openssl x509 -sm3 -req -days 1500 -in CA.csr -extfile openssl.cnf -extensions v3_ca -signkey CA.key -out CA.crt #server openssl ecparam -genkey -name SM2 -out server.key openssl req -config openssl.cnf -new -subj /C=CN/ST=BJ/L=HaiDian/O=YUNHEENMO/OU=MogDB/CN=server -key server.key -out server.csr openssl x509 -sm3 -req -days 1500 -in server.csr -CA CA.crt -CAkey CA.key -extfile openssl.cnf -out server.crt -CAcreateserial #server_enc openssl ecparam -genkey -name SM2 -out server_enc.key openssl req -config openssl.cnf -new -subj /C=CN/ST=BJ/L=HaiDian/O=YUNHEENMO/OU=MogDB/CN=server -key server_enc.key -out server_enc.csr openssl x509 -sm3 -req -days 1500 -in server_enc.csr -CA CA.crt -CAkey CA.key -extfile openssl.cnf -out server_enc.crt -CAcreateserial #client openssl ecparam -genkey -name SM2 -out client.key openssl req -config openssl.cnf -new -subj /C=CN/ST=BJ/L=HaiDian/O=YUNHEENMO/OU=MogDB/CN=client -key client.key -out client.csr openssl x509 -sm3 -req -days 1500 -in client.csr -CA CA.crt -CAkey CA.key -extfile openssl.cnf -out client.crt -CAcreateserial #client_enc openssl ecparam -genkey -name SM2 -out client_enc.key openssl req -config openssl.cnf -new -subj /C=CN/ST=BJ/L=HaiDian/O=YUNHEENMO/OU=MogDB/CN=client -key client_enc.key -out client_enc.csr openssl x509 -sm3 -req -days 1500 -in client_enc.csr -CA CA.crt -CAkey CA.key -extfile openssl.cnf -out client_enc.crt -CAcreateserial #修改权限 chmod 0600 * #增加密码保护 openssl ec -sm4 -in server.key -out server.key -passout pass:123qweQWE gs_guc generate -S 123qweQWE -D ./ -o server openssl ec -sm4 -in server_enc.key -out server_enc.key -passout pass:234werWER gs_guc generate -S 234werWER -D ./ -o server_enc openssl ec -sm4 -in client.key -out client.key -passout pass:345ertERT gs_guc generate -S 345ertERT -D ./ -o client openssl ec -sm4 -in client_enc.key -out client_enc.key -passout pass:456rtyRTY gs_guc generate -S 456rtyRTY -D ./ -o client_enc chmod 0600 * #客户端: export CERT=`pwd` echo ' export CERT=`pwd` export PGSSLMODE=verify-ca export PGSSLTLCP=1 export PGSSLROOTCERT=$CERT/CA.crt export PGSSLKEY=$CERT/client.key export PGSSLCERT=$CERT/client.crt export PGSSLENCKEY=$CERT/client_enc.key export PGSSLENCCERT=$CERT/client_enc.crt ' > client_env source client_env #服务器: gs_guc set -D $GAUSSHOME/data -c "ssl=on" gs_guc set -D $GAUSSHOME/data -c "ssl_ciphers = 'ALL'" gs_guc set -D $GAUSSHOME/data -c "ssl_use_tlcp=on" gs_guc set -D $GAUSSHOME/data -c "ssl_ca_file = '$CERT/CA.crt'" gs_guc set -D $GAUSSHOME/data -c "ssl_key_file='$CERT/server.key'" gs_guc set -D $GAUSSHOME/data -c "ssl_cert_file='$CERT/server.crt'" gs_guc set -D $GAUSSHOME/data -c "ssl_enc_key_file='$CERT/server_enc.key'" gs_guc set -D $GAUSSHOME/data -c "ssl_enc_cert_file='$CERT/server_enc.crt'" 1、生成国密证书 # 创建 CA 目录 cadir 并进入 # copy 配置文件 openssl.cnf 到当前目录(不同环境,配置文件路径可能不一样) cp /etc/pki/tls/openssl.cnf . # 开始搭建CA环境 mkdir ./demoCA ./demoCA/newcerts ./demoCA/private chmod 777 ./demoCA/private # 创建serial文件,写入01 echo '01'>./demoCA/serial # 创建文件index.txt touch ./demoCA/index.txt # 至此CA环境搭建完成 # 生成CA私钥 openssl ecparam -out demoCA/private/cakey.pem -name SM2 -genkey # 生成根证书请求文件 openssl req -config openssl.cnf -key demoCA/private/cakey.pem -new -out cacert.req # 生成自签发根证书 # 生成根证书时,需要修改openssl.cnf文件,设置basicConstraints=CA:TRUE vi openssl.cnf # 生成CA自签发根证书 openssl ca -config openssl.cnf -in cacert.req -keyfile demoCA/private/cakey.pem -selfsign -out demoCA/cacert.pem # 生成服务器私钥文件server.key openssl ecparam -out server.key -name SM2 -genkey # 生成服务器证书请求文件server.req openssl req -config openssl.cnf -key server.key -new -out server.req # 生成服务端/客户端证书时,修改openssl.cnf文件,设置basicConstraints=CA:FALSE vi openssl.cnf # 对生成的服务器证书请求文件进行签发,签发后将生成正式的服务器证书server.crt openssl ca -config openssl.cnf -in server.req -out server.crt -days 3650 # 生成客户端私钥 openssl ecparam -out client.key -name SM2 -genkey # 生成客户端证书请求文件 openssl req -config openssl.cnf -new -key client.key -out client.req # 对生成的客户端证书请求文件进行签发,签发后将生成正式的客户端证书client.crt openssl ca -config openssl.cnf -in client.req -out client.crt -days 3650 # 注:中间会产生交互,按照以下内容进行填写(需注意每个交互的common name填不一样的内容,如分别写:test1,test2,test3): Country Name (2 letter code) [AU]:CN State or Province Name (full name) [Some-State]:shanxi Locality Name (eg, city) []:xian Organization Name (eg, company) [Internet Widgits Pty Ltd]:Abc Organizational Unit Name (eg, section) []:hello --Common Name可以随意命名 Common Name (eg, YOUR name) []:world --Email可以选择性填写 Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: 1qaz!QAZ An optional company name []:world 2、配置客户端文件 chmod 600 client.key chmod 600 client.crt chmod 600 ./demoCA/cacert.pem chmod 600 server.key chmod 600 server.crt 3、配置服务器端参数 cp server.crt server.key ./demoCA/cacert.pem $PGDATA cp client.crt client.key /home/vastbase/data/vastbase/ export PGSSLCERT="/home/vastbase/cadir/client.crt" export PGSSLKEY="/home/vastbase/cadir/client.key" export PGSSLMODE="verify-ca" export PGSSLROOTCERT="/home/vastbase/data/vastbase/cacert.pem" vi postgresql.conf ssl = on require_ssl = on ssl_cert_file = 'server.crt' ssl_key_file = 'server.key' ssl_ca_file = 'cacert.pem' ssl_crl_file = '' 4、配置客户端认证方式 vi pg_hba.conf hostssl all all 0.0.0.0/0 cert 5、重启数据库服务 vb_ctl restart vsql - vastbase -r --创建生成客户端证书时Common Name同名用户 create user test3 password'Test@123'; 1、客户端vsql连接到服务端 vsql -dvastbase -r -h IP -U test3 --预期 连接成功,提示SSL connection 1 需求背景 1.2 Oracle Profile功能 一、查看profile信息 设置sqlplus输出格式 ...

February 17, 2025 · 11 min · 2247 words · Me
心情不好的时候可以点一下 🐱
×
🤖 Doubao AI ×
Hi! 我是你的技术助手。关于代码、架构或 Bug,随时问我!🚀