Skip to content

Oracle 密码策略

密码策略的重要性

密码策略是数据库安全的第一道防线,直接影响:

  • 防止未授权访问
  • 保护敏感数据安全
  • 符合合规性要求
  • 减少安全漏洞风险
  • 维护系统整体安全性

密码复杂度要求

密码组成要求

  • 字符类型

    • 至少包含一个大写字母 (A-Z)
    • 至少包含一个小写字母 (a-z)
    • 至少包含一个数字 (0-9)
    • 至少包含一个特殊字符 (!@#$%^&*()_+-=[]{}|;:,.<>?)
  • 密码强度

    • 使用密码强度评估工具
    • 避免使用常见密码和字典词汇
    • 避免使用个人信息(如生日、姓名)
    • 避免使用连续字符或重复字符

Oracle 密码验证函数

  • 默认验证函数
sql
-- Oracle 11g 及以上版本默认验证函数
SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_VERIFY_FUNCTION';
  • 自定义验证函数
sql
CREATE OR REPLACE FUNCTION verify_password(
    username VARCHAR2,
    password VARCHAR2,
    old_password VARCHAR2
) RETURN BOOLEAN IS
BEGIN
    -- 密码长度检查
    IF LENGTH(password) < 8 THEN
        RETURN FALSE;
    END IF;
    
    -- 复杂度检查
    IF NOT REGEXP_LIKE(password, '[A-Z]') THEN
        RETURN FALSE;
    END IF;
    
    IF NOT REGEXP_LIKE(password, '[a-z]') THEN
        RETURN FALSE;
    END IF;
    
    IF NOT REGEXP_LIKE(password, '[0-9]') THEN
        RETURN FALSE;
    END IF;
    
    IF NOT REGEXP_LIKE(password, '[^a-zA-Z0-9]') THEN
        RETURN FALSE;
    END IF;
    
    RETURN TRUE;
END;
/

密码长度和过期策略

密码长度要求

  • 最小长度:建议至少 12 个字符
  • 推荐长度:16 个字符或更长
  • 最大长度:Oracle 11g 及以上版本支持最多 30 个字符

密码过期策略

  • 过期时间

    • 生产环境:90 天
    • 测试环境:180 天
    • 服务账户:根据安全策略设置
  • 过期警告

    • 过期前 7 天开始警告
    • 通过邮件或系统通知提醒
  • 密码重置

    • 过期后强制重置
    • 提供自助重置功能
    • 管理员协助重置流程

密码历史和重用限制

密码历史记录

  • 历史记录数量:建议保存至少 5 个历史密码
  • 查询密码历史
sql
SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_REUSE_TIME';
SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_REUSE_MAX';

密码重用限制

  • 时间限制:设置密码重用的最小时间间隔(如 365 天)
  • 次数限制:设置密码重用的最小更改次数(如 10 次)
  • 配置示例
sql
-- 180 天内不能重用密码
ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_TIME 180;

-- 至少更改 10 次后才能重用密码
ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_MAX 10;

账户锁定策略

登录失败限制

  • 失败尝试次数:建议设置为 3-5 次

  • 锁定时间

    • 临时锁定:30 分钟
    • 永久锁定:需要管理员解锁
  • 配置示例

sql
-- 3 次失败尝试后锁定
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 3;

-- 锁定 30 分钟
ALTER PROFILE DEFAULT LIMIT PASSWORD_LOCK_TIME 0.0208; -- 30 分钟(1/48 天)

账户解锁流程

  • 自助解锁

    • 通过邮件验证
    • 通过短信验证
    • 通过安全问题验证
  • 管理员解锁

    • 验证用户身份
    • 记录解锁操作
    • 检查异常登录模式
  • 解锁命令

sql
-- 解锁用户账户
ALTER USER username ACCOUNT UNLOCK;

密码加密和存储

密码加密算法

  • Oracle 11g

    • 默认使用 SHA-1 算法
    • 支持 DES 加密
  • Oracle 12c 及以上

    • 默认使用 SHA-256 算法
    • 支持更强的加密选项
    • 引入了密码版本控制

密码存储安全

  • 密码哈希存储

    • 不在数据库中存储明文密码
    • 使用单向哈希函数
    • 添加随机盐值增强安全性
  • 存储位置

    • 密码哈希存储在数据字典中
    • 权限严格控制,只有 SYS 可以访问
  • 密码文件安全

    • 保护 Oracle 密码文件 (orapw*)
    • 限制文件权限为 600
    • 定期备份密码文件

密码管理最佳实践

管理账户密码

  • SYS 和 SYSTEM 账户

    • 使用强密码
    • 定期更换密码
    • 限制登录权限
    • 启用审计
  • 服务账户

    • 使用专用服务账户
    • 密码由密钥管理系统管理
    • 定期轮换密码
    • 实施最小权限原则

密码策略实施

  • 配置文件管理

    • 创建不同级别的配置文件
    • 根据用户角色分配不同配置文件
    • 定期审查配置文件设置
  • 策略执行

    • 自动化密码策略执行
    • 定期审计密码合规性
    • 对不合规密码进行强制更改
  • 用户教育

    • 提供密码安全培训
    • 制定密码创建指南
    • 定期提醒密码安全最佳实践

常见密码问题和解决方案

密码遗忘

  • 症状:用户无法登录数据库
  • 原因:密码遗忘、密码过期
  • 解决方案
    • 实施自助密码重置
    • 管理员协助重置密码
    • 验证用户身份后重置

账户锁定

  • 症状:用户收到账户锁定错误
  • 原因:多次登录失败、安全策略触发
  • 解决方案
    • 等待自动解锁(如果配置)
    • 管理员手动解锁
    • 检查是否存在恶意登录尝试

密码复杂度验证失败

  • 症状:设置密码时出现复杂度错误
  • 原因:密码不符合复杂度要求
  • 解决方案
    • 提供密码复杂度要求提示
    • 使用密码生成工具创建强密码
    • 检查密码验证函数配置

密码过期管理

  • 症状:用户收到密码过期警告
  • 原因:密码达到过期时间
  • 解决方案
    • 提前通知用户密码即将过期
    • 提供密码重置流程
    • 对关键账户设置适当的过期时间

版本差异

Oracle 11g

  • 密码验证函数相对简单
  • 默认使用 SHA-1 加密
  • 密码长度最大为 30 字符
  • 基本的账户锁定功能

Oracle 12c

  • 引入了更强的密码验证函数
  • 默认使用 SHA-256 加密
  • 支持密码版本控制
  • 增强了账户锁定功能
  • 引入了统一审计功能

Oracle 19c/21c

  • 进一步增强了密码安全性
  • 支持更多密码策略选项
  • 改进了密码管理功能
  • 提供了更详细的密码安全审计

最佳实践

  • 密码复杂度:实施强密码复杂度要求
  • 密码长度:使用至少 12 个字符的密码
  • 过期策略:根据安全需求设置合理的过期时间
  • 账户锁定:实施登录失败锁定策略
  • 密码历史:限制密码重用
  • 加密存储:使用强加密算法存储密码
  • 定期审计:定期审查密码策略合规性
  • 用户教育:提供密码安全培训
  • 自动化管理:使用自动化工具管理密码
  • 紧急流程:建立密码紧急重置流程

常见问题(FAQ)

Q1: 如何查看当前密码策略设置?

A1: 可以使用以下 SQL 命令查看密码策略设置:

sql
SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_type = 'PASSWORD';

Q2: 如何为不同用户设置不同的密码策略?

A2: 可以创建不同的配置文件并分配给不同用户:

sql
-- 创建新的配置文件
CREATE PROFILE strong_password LIMIT
  PASSWORD_LENGTH 16
  PASSWORD_REUSE_TIME 365
  PASSWORD_REUSE_MAX 10
  FAILED_LOGIN_ATTEMPTS 3
  PASSWORD_LOCK_TIME 1
  PASSWORD_LIFE_TIME 90;

-- 分配配置文件给用户
ALTER USER username PROFILE strong_password;

Q3: 如何禁用密码过期策略?

A3: 可以通过以下命令禁用密码过期:

sql
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

注意:禁用密码过期可能不符合安全最佳实践,建议仅在特殊情况下使用。

Q4: 如何检测密码破解尝试?

A4: 可以通过以下方法检测密码破解尝试:

  • 启用审计功能记录登录失败
  • 监控数据库警报日志
  • 使用安全信息和事件管理 (SIEM) 系统
  • 定期分析登录失败模式

Q5: 如何安全地存储服务账户密码?

A5: 服务账户密码安全存储建议:

  • 使用企业密钥管理系统
  • 实施密码轮换自动化
  • 限制对密码的访问
  • 记录所有密码访问和使用
  • 定期审计服务账户使用情况