作者简介:樊宏伟,瑞蓝创数据库工程师
原创内容未经授权不得随意使用,转载请联系小编并注明来源
官方来源:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218720
适用范围:OceanBase V4.2.1 及以上企业版 Oracle 模式租户
一、功能概述
OceanBase 数据库通过 User Profile(用户配置文件)实现登录失败锁定功能,核心目的是防止暴力密码破解攻击,提升数据库安全性。
-
当用户连续登录失败次数达到阈值时,系统会自动锁定该用户 -
锁定时间可自定义,到期后自动解锁,也可由管理员手动提前解锁 -
所有策略基于 Profile 统一管理,可批量应用给多个用户
二、核心参数说明
Profile 通过4个密码相关参数管控登录与密码策略,前两项为登录锁定核心参数:
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
重要说明
-
用户未指定Profile时,默认继承 DEFAULT Profile; -
默认Profile全部参数为 UNLIMITED,无登录锁定、密码过期策略,生产环境必须修改; -
参数支持三种赋值:整数、 UNLIMITED(无限制)、DEFAULT(继承默认配置)。
三、标准操作步骤
步骤1. 前提条件
-
使用SYS等管理员账号登录Oracle模式租户; -
创建Profile需要 CREATE PROFILE系统权限; -
解锁账号需要 ALTER USER系统权限。
步骤2. 创建自定义登录锁定策略 Profile
-- 语法模板
CREATE PROFILE "profile_name"LIMIT
FAILED_LOGIN_ATTEMPTS {integer | UNLIMITED | DEFAULT}
PASSWORD_LOCK_TIME {integer | UNLIMITED | DEFAULT}
[PASSWORD_LIFE_TIME {integer | UNLIMITED | DEFAULT}]
[PASSWORD_GRACE_TIME {integer | UNLIMITED | DEFAULT}];
-- 示例1:连续失败5次,自动锁定1天
CREATE PROFILE "sec_profile_5_1"LIMIT
FAILED_LOGIN_ATTEMPTS5
PASSWORD_LOCK_TIME1;
-- 示例2:连续失败3次,永久锁定账号
CREATE PROFILE "sec_profile_3_perm"LIMIT
FAILED_LOGIN_ATTEMPTS3
PASSWORD_LOCK_TIMEUNLIMITED;
步骤3. 校验Profile配置
-- 查询全部密码类Profile配置
SELECT PROFILE, RESOURCE_NAME, LIMIT
FROM DBA_PROFILES
WHERE RESOURCE_TYPE = 'PASSWORD'
ORDER BY PROFILE, RESOURCE_NAME;
-- 单独查看指定Profile详情
SELECT * FROM DBA_PROFILES
WHERE PROFILE = 'SEC_PROFILE_5_1' AND RESOURCE_TYPE = 'PASSWORD';
步骤4. 将Profile绑定给业务用户
方式1:新建用户时直接指定Profile(推荐)
-- 语法模板
CREATEUSER"user_name"IDENTIFIEDBY"password" PROFILE "profile_name";
-- 实操示例
CREATEUSER"app_user"IDENTIFIEDBY"App@20240605" PROFILE "sec_profile_5_1";
-- 授予基础会话权限
GRANTCREATESESSION, CREATETABLETO"app_user";
方式2:给存量用户修改Profile
-- 语法模板
ALTER USER "user_name" PROFILE "profile_name";
-- 实操示例
ALTER USER "old_user" PROFILE "sec_profile_5_1";
> 注意:修改用户Profile仅对后续新会话生效,不影响已建立的长连接。
步骤5. 验证锁定策略生效
-
测试账号连续输入错误密码,达到次数阈值; -
再次登录抛出报错:
ERROR 5039 (01007): User locked
-
管理员查询失败登录记录:
SELECT USERHOST, FAILED_ATTEMPTS
FROM information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
步骤6. 解锁被锁定账号
方式1:自动解锁
等待 PASSWORD_LOCK_TIME 时长到期,账号自动恢复。
方式2:管理员手动解锁(紧急场景)
-- 语法模板
ALTER USER "user_name" ACCOUNT UNLOCK;
-- 示例
ALTER USER "app_user" ACCOUNT UNLOCK;
> 重要限制:已经锁定的账号,修改Profile参数无法自动解锁,必须执行上面语句。
步骤7. 修改已有Profile策略
-- 语法模板
ALTER PROFILE "profile_name"LIMIT
FAILED_LOGIN_ATTEMPTS {new_value}
PASSWORD_LOCK_TIME {new_value};
-- 示例:失败次数改为3次,锁定时长改为7天
ALTER PROFILE "sec_profile_5_1"LIMIT
FAILED_LOGIN_ATTEMPTS3
PASSWORD_LOCK_TIME7;
> 注意:修改Profile只对新会话生效,不会自动解锁已经锁定的用户。
四、生产环境最佳实践
1. 加固默认Profile
关闭无限制策略,统一基线:
ALTER PROFILE "DEFAULT" LIMIT
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LOCK_TIME 1
PASSWORD_LIFE_TIME 90
PASSWORD_GRACE_TIME 7;
2. 分级安全策略
-
管理员账号:连续失败3次,永久锁定 -
普通业务账号:连续失败5次,锁定1天 -
只读账号:连续失败10次,锁定30分钟
3. 定期安全审计
定时查询失败登录视图,及时发现暴力破解行为:
SELECT USERHOST, FAILED_ATTEMPTS
FROM information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
4. 权限最小化管控
严格收紧 ALTER USER 权限,仅少量运维管理员拥有账号解锁权限。
五、常见问题排查
问题1:账号已经锁定,修改Profile锁定时长,账号依旧无法自动解锁
原因:Profile配置变更只对未来生效,不处理已经锁定的存量账号
解决:执行 ALTER USER 用户名 ACCOUNT UNLOCK; 手动解锁
问题2:配置 FAILED_LOGIN_ATTEMPTS=5,输错6次才触发锁定
原因:失败计数从0开始,累计5次失败达到阈值,第6次登录才会返回账号锁定报错
问题3:DBA_PROFILES 中看到 PASSWORD_LOCK_TIME 值为 86400000000
原因:该数字是 UNLIMITED 在数据库内部的存储值,属于正常现象,无需处理
六、官方文档链接
-
CREATE PROFILE 语法:CREATE PROFILE https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222057
-
CREATE USER 语法:CREATE USER https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222061
-
MySQL模式登录失败策略:MySQL 模式通过租户级配置项 connection_control_failed_connections_threshold 来控 https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218724
-
Oracle模式登录失败策略:Oracle 模式利用 User Profile 实现用户锁定功能 https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218720
END
瑞蓝创 OceanBase OBCP V4 精英训练营
点击下方图片立即了解详情


▼ 点击「阅读原文」,了解更多产品技术文章


