外观
Oracle 安全配置建议
安全配置的重要性
数据保护
安全配置是保护敏感数据的第一道防线,有效的安全配置可以防止未授权访问、数据泄露和恶意攻击,确保数据的机密性、完整性和可用性。
合规要求
许多行业法规和标准(如GDPR、HIPAA、PCI DSS等)要求企业实施适当的安全控制措施,安全配置是满足这些合规要求的基础。
风险缓解
合理的安全配置可以减少安全漏洞和攻击面,降低安全事件发生的风险,避免因安全事件导致的财务损失、法律责任和声誉损害。
业务连续性
安全配置不仅保护数据,还保护数据库服务的连续性,防止因安全事件导致的服务中断,确保业务的正常运行。
数据库安全基础
最小权限原则
权限分配
- 角色设计:根据工作职责设计最小必要权限的角色
- 权限审核:定期审核用户权限,移除不必要的权限
- 特权管理:严格控制DBA等特权用户的数量和权限
示例
sql
-- 创建具有最小权限的角色
CREATE ROLE app_user;
GRANT CREATE SESSION TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON app.orders TO app_user;
-- 分配角色给用户
GRANT app_user TO user1;
-- 定期审核权限
SELECT grantee, granted_role
FROM dba_role_privs
WHERE grantee NOT IN ('SYS', 'SYSTEM')
ORDER BY grantee;密码策略
密码复杂度
- 长度要求:设置最小密码长度(建议至少12位)
- 复杂度要求:要求包含大小写字母、数字和特殊字符
- 过期时间:设置密码过期时间(建议90天)
- 历史记录:禁止使用最近使用过的密码(建议至少5个历史密码)
配置示例
sql
-- 设置密码验证函数
ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 90
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME 365
PASSWORD_REUSE_MAX 5
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1
PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function;
-- 启用密码大小写区分
ALTER SYSTEM SET sec_case_sensitive_logon = TRUE SCOPE=SPFILE;
-- 需要重启数据库网络访问控制
监听器配置
- 访问控制:配置监听器访问控制列表
- 加密传输:启用监听器密码和网络加密
- 端口保护:使用非默认端口,配置防火墙规则
配置示例
sql
-- 配置监听器访问控制
-- 在listener.ora文件中添加
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
)
)
-- 配置监听器密码
LSNRCTL> CHANGE_PASSWORD
Old password:
New password: <输入新密码>
Reenter new password: <确认新密码>
LSNRCTL> SET PASSWORD <密码>
LSNRCTL> SAVE_CONFIG认证和授权配置
认证配置
强认证
- 密码认证:使用强密码策略
- 操作系统认证:限制操作系统认证的使用
- 网络认证:使用SSL/TLS进行网络认证
- 多因素认证:考虑实施多因素认证
配置示例
sql
-- 禁用远程操作系统认证
ALTER SYSTEM SET remote_os_authent = FALSE SCOPE=SPFILE;
-- 限制本地操作系统认证
ALTER SYSTEM SET os_authent_prefix = '' SCOPE=SPFILE;
-- 启用密码大小写区分
ALTER SYSTEM SET sec_case_sensitive_logon = TRUE SCOPE=SPFILE;
-- 需要重启数据库授权配置
角色管理
- 预定义角色:谨慎使用预定义角色(如DBA、SYSDBA)
- 自定义角色:根据业务需求创建自定义角色
- 权限继承:注意角色权限的继承关系
配置示例
sql
-- 创建自定义角色
CREATE ROLE read_only;
GRANT CREATE SESSION TO read_only;
GRANT SELECT ON app.employees TO read_only;
GRANT SELECT ON app.departments TO read_only;
-- 创建应用管理员角色
CREATE ROLE app_admin;
GRANT read_only TO app_admin;
GRANT INSERT, UPDATE, DELETE ON app.employees TO app_admin;
GRANT INSERT, UPDATE, DELETE ON app.departments TO app_admin;
-- 审核角色权限
SELECT role, privilege
FROM dba_sys_privs
WHERE role NOT IN ('CONNECT', 'RESOURCE')
ORDER BY role, privilege;特权用户管理
SYS和SYSTEM用户
- 密码管理:定期更改SYS和SYSTEM用户密码
- 权限限制:限制SYS和SYSTEM用户的使用
- 审计:对SYS和SYSTEM用户的操作进行审计
配置示例
sql
-- 更改SYS密码
ALTER USER SYS IDENTIFIED BY "new_secure_password";
-- 更改SYSTEM密码
ALTER USER SYSTEM IDENTIFIED BY "new_secure_password";
-- 审计SYS用户操作
AUDIT ALL BY SYS BY ACCESS;审计配置
统一审计
配置
- 启用统一审计:在Oracle 12c+中启用统一审计
- 审计策略:创建和应用适当的审计策略
- 审计存储:配置审计记录的存储和管理
配置示例
sql
-- 启用统一审计(Oracle 12c+)
ALTER SYSTEM SET audit_trail = 'DB,EXTENDED' SCOPE=SPFILE;
-- 需要重启数据库
-- 创建审计策略
CREATE AUDIT POLICY db_admin_actions
ACTIONS CREATE USER, ALTER USER, DROP USER,
CREATE ROLE, ALTER ROLE, DROP ROLE,
GRANT, REVOKE;
-- 启用审计策略
AUDIT POLICY db_admin_actions;
-- 查看审计记录
SELECT audit_type, event_timestamp, dbusername,
object_schema, object_name, action_name,
sql_text
FROM unified_audit_trail
ORDER BY event_timestamp DESC;细粒度审计
配置
- 敏感数据审计:对敏感数据的访问进行审计
- 条件审计:基于条件进行审计
- 列级审计:对特定列的访问进行审计
配置示例
sql
-- 创建细粒度审计策略
BEGIN
DBMS_FGA.ADD_POLICY(
object_schema => 'hr',
object_name => 'employees',
policy_name => 'audit_salary_access',
audit_condition => 'salary > 5000',
audit_column => 'salary',
handler_schema => NULL,
handler_module => NULL,
enable => TRUE,
statement_types => 'SELECT'
);
END;
/
-- 查看细粒度审计记录
SELECT object_schema, object_name, policy_name,
db_user, os_user, userhost,
to_char(timestamp, 'YYYY-MM-DD HH24:MI:SS') AS audit_time,
sql_text
FROM dba_fga_audit_trail
ORDER BY timestamp DESC;加密配置
透明数据加密 (TDE)
配置
- 表空间加密:对包含敏感数据的表空间进行加密
- 列加密:对特定敏感列进行加密
- 密钥管理:安全管理TDE主密钥
配置示例
sql
-- 启用TDE主密钥
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "password";
-- 创建加密表空间
CREATE TABLESPACE encrypted_ts
DATAFILE 'encrypted_ts.dbf' SIZE 100M
ENCRYPTION USING 'AES256' DEFAULT STORAGE (ENCRYPT);
-- 加密现有表
ALTER TABLE hr.employees ENCRYPT;
-- 导出TDE主密钥(用于备份)
ADMINISTER KEY MANAGEMENT EXPORT ENCRYPTION KEYS
TO 'tde_key_backup.key'
IDENTIFIED BY "password";网络加密
配置
- SSL/TLS:配置数据库和客户端之间的SSL/TLS加密
- 加密级别:设置适当的加密级别
- 证书管理:管理SSL证书
配置示例
sql
-- 在sqlnet.ora中配置网络加密
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256, SHA1)
-- 在listener.ora中配置
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/wallet)
)
)
-- 在tnsnames.ora中配置客户端
ORCL =
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCPS)
(HOST = dbserver)
(PORT = 2484)
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
(SECURITY =
(SSL_SERVER_CERT_DN = "CN=dbserver,OU=IT,O=Company,L=City,ST=State,C=Country")
)
)补丁和更新
补丁管理
补丁评估
- 安全公告:关注Oracle安全公告(CVE)
- 补丁分析:分析补丁对系统的影响
- 测试:在测试环境中测试补丁
补丁应用
- 计划:制定补丁应用计划,包括回滚策略
- 备份:在应用补丁前备份数据库
- 应用:按照Oracle文档应用补丁
- 验证:验证补丁应用成功
示例流程
- 下载补丁:从Oracle Support下载最新补丁
- 备份数据库:sql
RMAN> BACKUP DATABASE PLUS ARCHIVELOG; - 应用补丁:bash
# 应用PSU补丁 opatch apply /path/to/patch - 验证补丁:bash
opatch lsinventory - 运行后处理:sql
@?/rdbms/admin/catbundle.sql PSU APPLY
数据库版本管理
版本选择
- 长期支持版本:选择Oracle长期支持(LTS)版本
- 补丁级别:保持数据库在最新的补丁级别
- 生命周期:了解数据库版本的生命周期
版本升级
- 升级计划:制定详细的升级计划
- 测试:在测试环境中进行升级测试
- 回滚:准备回滚方案
- 验证:升级后验证系统功能
安全监控
数据库活动监控
监控工具
- Oracle Enterprise Manager:使用OEM监控数据库活动
- 审计日志分析:分析审计日志中的异常活动
- 第三方工具:使用专业的安全监控工具
监控内容
- 登录尝试:失败的登录尝试、异常的登录时间和位置
- 权限变更:用户权限的变更
- 数据访问:敏感数据的访问模式
- 配置变更:数据库配置的变更
异常检测
基于阈值的检测
- 登录尝试:设置失败登录尝试阈值
- 权限变更:监控权限变更频率
- 数据访问:监控数据访问量和模式
基于行为的检测
- 用户行为分析:建立用户正常行为基线
- 异常识别:识别偏离正常行为的活动
- 预警机制:设置预警机制,提前发现潜在风险
常见安全问题处理
未授权访问
症状
- 异常的登录尝试
- 未授权用户的数据库访问
- 敏感数据的异常访问模式
原因
- 弱密码:用户使用弱密码
- 权限过度:用户拥有过多权限
- 配置错误:安全配置不当
解决方案
- 立即响应:锁定可疑账户,终止未授权会话
- 审计:分析未授权访问的范围和影响
- 加强防护:sql
-- 锁定可疑账户 ALTER USER suspicious_user ACCOUNT LOCK; -- 终止未授权会话 ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE; -- 加强密码策略 ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 5;
权限滥用
症状
- 用户执行超出其职责的操作
- 特权用户的异常活动
- 权限的异常变更
原因
- 权限过度:用户拥有过多权限
- 角色滥用:不当使用特权角色
- 监控不足:缺乏对权限使用的监控
解决方案
- 撤销过度权限:sql
-- 撤销不必要的权限 REVOKE DBA FROM user_with_excess_privs; -- 审查角色权限 SELECT grantee, granted_role FROM dba_role_privs WHERE granted_role = 'DBA' AND grantee NOT IN ('SYS', 'SYSTEM'); - 实施最小权限:重新设计权限模型,实施最小权限原则
- 加强审计:对权限变更和使用进行审计
安全漏洞
症状
- 数据库被恶意攻击
- 异常的数据库行为
- 安全扫描工具发现漏洞
原因
- 未应用补丁:数据库未应用最新安全补丁
- 配置错误:安全配置不当
- 过时版本:使用过时的Oracle版本
解决方案
- 应用补丁:立即应用相关安全补丁
- 修复配置:修正安全配置错误
- 升级版本:考虑升级到更安全的版本
- 漏洞扫描:定期进行安全漏洞扫描
最佳实践
安全基线
建立安全基线
- 配置基线:建立数据库安全配置基线
- 审计基线:建立审计配置基线
- 监控基线:建立安全监控基线
定期评估
- 安全评估:定期进行数据库安全评估
- 合规检查:定期进行合规性检查
- 差距分析:分析当前配置与基线的差距
安全文档
文档内容
- 安全策略:制定数据库安全策略文档
- 配置文档:记录数据库安全配置
- 流程文档:记录安全相关流程
- 事件响应:制定安全事件响应计划
文档管理
- 版本控制:对安全文档进行版本控制
- 定期更新:定期更新安全文档
- 访问控制:控制对安全文档的访问
培训和意识
管理员培训
- 安全培训:对数据库管理员进行安全培训
- 技能认证:鼓励管理员获取安全相关认证
- 定期更新:定期更新培训内容
用户意识
- 安全意识:提高用户的安全意识
- 密码管理:培训用户正确管理密码
- 安全报告:鼓励用户报告安全问题
版本差异
Oracle 11g
安全特性
- TDE:支持表空间加密和列加密
- 细粒度审计:支持基于条件的审计
- 密码策略:基本的密码策略功能
- 网络加密:支持网络加密
限制
- 统一审计:不支持统一审计功能
- 高级安全功能:某些高级安全功能不可用
- 密码验证:密码验证功能相对简单
Oracle 12c及以上
增强功能
- 统一审计:提供统一的审计框架
- 多租户安全:支持多租户环境的安全管理
- 高级密码策略:增强的密码验证功能
- 特权分析:识别和管理过度特权
- 数据红色action:动态数据屏蔽功能
新特性
sql
-- Oracle 12c+ 特权分析
BEGIN
DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
name => 'priv_analysis',
description => 'Privilege analysis for application users',
type => DBMS_PRIVILEGE_CAPTURE.G_DATABASE
);
END;
/
-- 启用特权分析
BEGIN
DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE('priv_analysis');
END;
/
-- 分析结果
SELECT * FROM dba_prilege_capture;常见问题(FAQ)
Q1: 如何评估Oracle数据库的安全状态?
A1: 评估Oracle数据库安全状态的方法:
- 安全扫描:使用Oracle Database Security Assessment Tool (DBSAT)或第三方工具进行安全扫描
- 配置审查:审查数据库配置,确保符合安全最佳实践
- 权限审查:审查用户权限,确保实施最小权限原则
- 审计评估:评估审计配置,确保适当的审计覆盖
- 补丁检查:检查数据库补丁级别,确保应用最新安全补丁
- 漏洞评估:评估数据库是否存在已知漏洞
Q2: 如何保护Oracle数据库免受SQL注入攻击?
A2: 保护Oracle数据库免受SQL注入攻击的措施:
- 使用绑定变量:在应用程序中使用绑定变量,避免直接拼接SQL语句sql
-- 安全的做法 SELECT * FROM employees WHERE employee_id = :id; -- 不安全的做法 SELECT * FROM employees WHERE employee_id = ' || user_input || '; - 最小权限:限制应用程序用户的权限,只授予必要的权限
- 输入验证:在应用程序层面对用户输入进行验证和过滤
- 细粒度审计:对敏感表的访问进行审计
- 使用应用程序防火墙:考虑使用数据库应用程序防火墙(DBF)
Q3: 如何安全管理Oracle数据库的备份?
A3: 安全管理Oracle数据库备份的策略:
- 备份加密:sql
-- 使用RMAN备份加密 RMAN> CONFIGURE ENCRYPTION FOR DATABASE ON; RMAN> BACKUP DATABASE PLUS ARCHIVELOG; - 备份访问控制:限制对备份文件的访问
- 备份存储:将备份存储在安全的位置,考虑异地存储
- 备份验证:定期验证备份的完整性和可恢复性sql
RMAN> VALIDATE BACKUPSET ALL; - 备份轮换:实施备份轮换策略,确保备份的时效性
- 备份文档:记录备份策略和恢复流程
Q4: 如何处理Oracle数据库的安全事件?
A4: 处理Oracle数据库安全事件的流程:
- 事件响应团队:建立专门的安全事件响应团队
- 事件分类:根据事件的严重程度进行分类
- 遏制措施:立即采取措施遏制事件的影响sql
-- 锁定可疑账户 ALTER USER suspicious_user ACCOUNT LOCK; -- 终止可疑会话 ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE; - 证据收集:收集和保存事件相关的证据sql
-- 保存审计日志 CREATE TABLE audit_evidence AS SELECT * FROM unified_audit_trail WHERE event_timestamp > SYSTIMESTAMP - INTERVAL '24' HOUR; - 根本原因分析:分析事件的根本原因
- 修复措施:实施修复措施,防止类似事件再次发生
- 事件报告:根据法规要求报告安全事件
- 经验总结:总结事件处理经验,更新安全策略和流程
Q5: 如何确保Oracle数据库的合规性?
A5: 确保Oracle数据库合规性的方法:
- 法规识别:识别适用的法规和标准(如GDPR、HIPAA、PCI DSS等)
- 合规映射:将法规要求映射到具体的安全控制措施
- 技术控制:sql
-- 配置审计以满足PCI DSS要求 CREATE AUDIT POLICY pci_dss_audit ACTIONS SELECT, INSERT, UPDATE, DELETE ON payment.cards; AUDIT POLICY pci_dss_audit; -- 配置TDE以满足数据保护要求 ALTER TABLE payment.cards ENCRYPT; - 流程控制:建立符合法规要求的流程
- 文档管理:准备合规审计所需的文档
- 定期审计:定期进行内部和外部合规审计
- 持续监控:持续监控合规状态,及时调整控制措施
- 培训:对员工进行合规培训,提高合规意识
