Skip to content

Oracle 用户认证管理

认证方式

密码认证

  • 概述:使用用户名和密码进行认证,是最基本的认证方式
  • 配置方法
    sql
    -- 创建使用密码认证的用户
    CREATE USER scott IDENTIFIED BY tiger;
    
    -- 修改用户密码
    ALTER USER scott IDENTIFIED BY new_password;
  • 适用场景:大多数数据库环境,特别是小型环境
  • 安全注意事项
    • 密码强度要求
    • 密码过期策略
    • 密码历史记录
    • 失败登录尝试限制

外部认证

  • 概述:使用操作系统或网络服务进行认证,无需在数据库中存储密码
  • 配置方法
    sql
    -- 创建使用外部认证的用户
    CREATE USER scott IDENTIFIED EXTERNALLY;
    
    -- 或使用操作系统认证前缀
    CREATE USER "OPS$SCOTT" IDENTIFIED EXTERNALLY;
  • 适用场景:大型企业环境,需要与企业认证系统集成
  • 安全注意事项
    • 确保操作系统认证安全
    • 适当配置 OS_AUTHENT_PREFIX 参数
    • 限制外部认证用户的权限

全局认证

  • 概述:使用 Oracle Internet Directory (OID) 等目录服务进行认证
  • 配置方法
    sql
    -- 创建使用全局认证的用户
    CREATE USER scott IDENTIFIED GLOBALLY AS 'CN=Scott,OU=Users,DC=example,DC=com';
  • 适用场景:企业级环境,需要集中管理用户身份
  • 安全注意事项
    • 确保目录服务安全
    • 配置适当的目录连接
    • 定期同步目录数据

证书认证

  • 概述:使用数字证书进行认证,提供最高级别的安全性
  • 配置方法
    sql
    -- 配置 SSL
    ALTER SYSTEM SET SSL_CIPHER_SUITES='SSL_RSA_WITH_AES_256_CBC_SHA' SCOPE=SPFILE;
    ALTER SYSTEM SET SSL_VERSION='1.2' SCOPE=SPFILE;
    
    -- 重启数据库
    SHUTDOWN IMMEDIATE;
    STARTUP;
  • 适用场景:对安全性要求极高的环境,如金融、医疗等
  • 安全注意事项
    • 确保证书颁发机构 (CA) 可信
    • 定期更新证书
    • 配置适当的 SSL 参数

密码策略管理

密码复杂度要求

  • 配置方法
    sql
    -- 启用密码验证函数
    @?/rdbms/admin/utlpwdmg.sql
    
    -- 查看密码验证设置
    SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_type = 'PASSWORD';
  • 推荐设置
    • 最小密码长度:至少 8 位
    • 密码复杂度:包含大小写字母、数字和特殊字符
    • 密码差异:与旧密码至少 3 个字符不同

密码过期策略

  • 配置方法
    sql
    -- 设置密码过期时间(天数)
    ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 90;
    
    -- 设置密码警告时间(天数)
    ALTER PROFILE DEFAULT LIMIT PASSWORD_WARNING 7;
    
    -- 设置密码宽限期(天数)
    ALTER PROFILE DEFAULT LIMIT PASSWORD_GRACE_TIME 3;
  • 推荐设置
    • 密码生命周期:90-180 天
    • 密码警告时间:7-14 天
    • 密码宽限期:3-7 天

密码历史记录

  • 配置方法
    sql
    -- 设置密码历史记录(保留的旧密码数量)
    ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_MAX 10;
    
    -- 设置密码重用时间(天数)
    ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_TIME 365;
  • 推荐设置
    • 密码重用最大次数:10-20 次
    • 密码重用时间:365 天

失败登录尝试限制

  • 配置方法
    sql
    -- 设置失败登录尝试次数
    ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 10;
    
    -- 设置账户锁定时间(天)
    ALTER PROFILE DEFAULT LIMIT PASSWORD_LOCK_TIME 1;
  • 推荐设置
    • 失败登录尝试次数:5-10 次
    • 账户锁定时间:1-2 天

认证配置参数

重要参数设置

参数名称推荐值说明
OS_AUTHENT_PREFIX"OPS$"操作系统认证前缀
REMOTE_OS_AUTHENTFALSE禁用远程操作系统认证
REMOTE_OS_ROLESFALSE禁用远程操作系统角色
SEC_CASE_SENSITIVE_LOGONTRUE启用密码大小写敏感
PASSWORD_VERIFY_FUNCTIONVERIFY_FUNCTION_11G密码验证函数
SQLNET.AUTHENTICATION_SERVICES(BEQ, TCPS)认证服务类型
SSL_VERSION1.2SSL 版本
SSL_CIPHER_SUITES适当的加密套件SSL 加密套件

参数配置示例

sql
-- 启用密码大小写敏感
ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = TRUE SCOPE=SPFILE;

-- 禁用远程操作系统认证
ALTER SYSTEM SET REMOTE_OS_AUTHENT = FALSE SCOPE=SPFILE;

-- 禁用远程操作系统角色
ALTER SYSTEM SET REMOTE_OS_ROLES = FALSE SCOPE=SPFILE;

sqlnet.ora 配置

-- 启用多种认证服务
SQLNET.AUTHENTICATION_SERVICES = (BEQ, TCPS)

-- 配置 SSL
SSL_VERSION = 1.2
SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_AES_128_CBC_SHA)

-- 配置证书位置
WALLET_LOCATION = 
  (SOURCE = 
    (METHOD = FILE) 
    (METHOD_DATA = 
      (DIRECTORY = /u01/app/oracle/wallet) 
    ) 
  )

认证审计

登录审计

  • 配置方法
    sql
    -- 启用审计
    AUDIT SESSION;
    
    -- 审计成功和失败的登录
    AUDIT SESSION BY ACCESS;
  • 查看审计记录
    sql
    -- 查看审计记录
    SELECT username, timestamp, action_name, returncode 
    FROM dba_audit_session 
    ORDER BY timestamp DESC;

认证事件监控

  • 使用 Enterprise Manager

    • 导航到 "安全" 选项卡
    • 点击 "审计设置"
    • 配置认证相关审计
  • 使用脚本监控

    sql
    -- 创建监控登录失败的脚本
    SELECT username, count(*) as failed_attempts
    FROM dba_audit_session
    WHERE action_name = 'LOGON'
    AND returncode != 0
    AND timestamp > SYSDATE - 1
    GROUP BY username
    HAVING count(*) > 5;

认证最佳实践

1. 密码管理

  • 实施强密码策略

    • 最小密码长度至少 12 位
    • 要求包含大小写字母、数字和特殊字符
    • 定期强制密码更改
    • 禁止重用最近使用的密码
  • 密码安全存储

    • 使用 Oracle 内置的密码哈希机制
    • 不在脚本或配置文件中硬编码密码
    • 使用 Oracle Wallet 存储密码

2. 认证方式选择

  • 根据环境选择合适的认证方式

    • 小型环境:密码认证
    • 中型环境:外部认证
    • 大型企业:目录服务认证
    • 高安全环境:证书认证
  • 混合认证策略

    • 管理员:使用强密码或证书认证
    • 应用程序:使用外部认证或钱包
    • 普通用户:使用密码认证

3. 账户管理

  • 定期审查用户账户

    • 禁用或删除未使用的账户
    • 审查特权账户的使用情况
    • 确保所有账户都有适当的认证方式
  • 锁定默认账户

    sql
    -- 锁定默认账户
    ALTER USER SYSTEM ACCOUNT LOCK;
    ALTER USER SYS ACCOUNT LOCK;
    -- 注意:SYS 和 SYSTEM 账户通常需要保持可用,应使用强密码保护

4. 网络安全

  • 加密网络连接

    • 使用 SSL/TLS 加密客户端连接
    • 配置适当的加密套件
    • 验证证书有效性
  • 限制网络访问

    • 使用防火墙限制数据库端口访问
    • 配置 sqlnet.ora 中的访问控制
    • 使用 VPN 进行远程访问

5. 监控与响应

  • 监控认证事件

    • 配置审计以捕获所有认证事件
    • 使用 Enterprise Manager 监控登录活动
    • 设置失败登录尝试告警
  • 响应认证异常

    • 对多次失败登录尝试的账户进行调查
    • 及时处理可疑的认证活动
    • 定期审查认证日志

常见问题(FAQ)

Q1: 如何启用强密码策略?

A1: 可以通过以下步骤启用强密码策略:

  1. 运行 Oracle 提供的密码验证脚本:@?/rdbms/admin/utlpwdmg.sql
  2. 修改默认配置文件的密码相关设置:
    sql
    ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 90;
    ALTER PROFILE DEFAULT LIMIT PASSWORD_GRACE_TIME 7;
    ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 10;
    ALTER PROFILE DEFAULT LIMIT PASSWORD_LOCK_TIME 1;
    ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_MAX 10;
  3. 启用密码大小写敏感:
    sql
    ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = TRUE SCOPE=SPFILE;

Q2: 如何配置 SSL 认证?

A2: 配置 SSL 认证的步骤:

  1. 创建钱包并生成证书请求
  2. 获取 CA 签名的证书
  3. 配置数据库参数:
    sql
    ALTER SYSTEM SET SSL_CIPHER_SUITES='SSL_RSA_WITH_AES_256_CBC_SHA' SCOPE=SPFILE;
    ALTER SYSTEM SET SSL_VERSION='1.2' SCOPE=SPFILE;
  4. 配置 sqlnet.ora 文件:
    SQLNET.AUTHENTICATION_SERVICES = (BEQ, TCPS)
    WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /u01/app/oracle/wallet)))
  5. 重启数据库
  6. 创建使用证书认证的用户

Q3: 如何处理账户被锁定的情况?

A3: 处理账户锁定的步骤:

  1. 确认账户锁定原因:
    sql
    SELECT username, account_status, lock_date 
    FROM dba_users 
    WHERE username = 'SCOTT';
  2. 解锁账户:
    sql
    ALTER USER scott ACCOUNT UNLOCK;
  3. (可选)重置密码:
    sql
    ALTER USER scott IDENTIFIED BY new_password;
  4. 调查锁定原因,检查审计日志:
    sql
    SELECT username, timestamp, action_name, returncode 
    FROM dba_audit_session 
    WHERE username = 'SCOTT' 
    AND timestamp > SYSDATE - 1 
    ORDER BY timestamp DESC;

Q4: 如何与企业 LDAP 目录集成进行认证?

A4: 与企业 LDAP 目录集成的步骤:

  1. 配置 Oracle Internet Directory (OID) 或使用第三方 LDAP 目录
  2. 配置数据库参数:
    sql
    ALTER SYSTEM SET LDAP_DIRECTORY_ACCESS = 'PASSWORD' SCOPE=SPFILE;
    ALTER SYSTEM SET LDAP_DIRECTORY_SYSAUTH = 'YES' SCOPE=SPFILE;
  3. 配置 ldap.ora 文件:
    DIRECTORY_SERVERS = (ldap_server:389)
    DEFAULT_ADMIN_CONTEXT = "dc=example,dc=com"
    DIRECTORY_SERVER_TYPE = OID
  4. 创建使用全局认证的用户:
    sql
    CREATE USER scott IDENTIFIED GLOBALLY AS 'CN=Scott,OU=Users,DC=example,DC=com';

Q5: 如何监控和防止暴力破解攻击?

A5: 监控和防止暴力破解攻击的方法:

  1. 配置失败登录尝试限制:
    sql
    ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 5;
  2. 启用审计:
    sql
    AUDIT SESSION BY ACCESS;
  3. 创建监控脚本,定期检查失败登录尝试:
    sql
    SELECT username, count(*) as failed_attempts
    FROM dba_audit_session
    WHERE action_name = 'LOGON'
    AND returncode != 0
    AND timestamp > SYSDATE - 1/24
    GROUP BY username
    HAVING count(*) > 3;
  4. 设置告警机制,当检测到多次失败登录尝试时发送通知
  5. 考虑使用防火墙或入侵检测系统来监控网络级别的攻击