活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

Oracle数据库安全防护与权限控制策略全解析从基础配置到高级应用保障企业数据安全防止信息泄露与恶意攻击提升系统防护能力

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-2 16:30:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

在当今数字化时代,数据已成为企业最宝贵的资产之一。Oracle数据库作为全球领先的关系型数据库管理系统,承载着大量关键业务数据,其安全性直接关系到企业的核心利益。随着网络攻击手段的不断升级和数据泄露事件的频发,构建完善的Oracle数据库安全防护体系已成为企业IT建设的重中之重。本文将从基础配置到高级应用,全面解析Oracle数据库的安全防护与权限控制策略,帮助企业构建坚实的数据安全防线,有效防止信息泄露与恶意攻击,全面提升系统防护能力。

Oracle数据库安全基础

安全架构概述

Oracle数据库采用多层次安全架构,从网络层、实例层到数据层提供全方位的安全保护。其安全架构主要包括以下几个核心组件:

1. 身份验证:确认用户身份的合法性
2. 授权控制:限制用户对数据库资源的访问
3. 数据加密:保护数据存储和传输的机密性
4. 审计跟踪:记录数据库活动,便于事后追溯
5. 数据完整性:确保数据不被非法篡改

基本安全配置

Oracle数据库安装后,许多默认账户(如SYS、SYSTEM)都有预设密码,这些是攻击者的首要目标。应立即修改这些默认密码:
  1. -- 修改SYS用户密码
  2. ALTER USER SYS IDENTIFIED BY "ComplexPassword123!";
  3. -- 修改SYSTEM用户密码
  4. ALTER USER SYSTEM IDENTIFIED BY "AnotherComplexPassword456@";
复制代码

Oracle安装时会创建多个默认账户,其中许多可能不需要使用。应禁用或删除这些账户以减少攻击面:
  1. -- 锁定并过期不需要的账户
  2. ALTER USER SCOTT ACCOUNT LOCK PASSWORD EXPIRE;
  3. ALTER USER HR ACCOUNT LOCK PASSWORD EXPIRE;
  4. -- 查看所有账户状态
  5. SELECT username, account_status FROM dba_users;
复制代码

默认监听端口(1521)是攻击者常扫描的目标,修改为非标准端口可提高安全性:
  1. # 修改listener.ora文件
  2. LISTENER =
  3.   (DESCRIPTION_LIST =
  4.     (DESCRIPTION =
  5.       (ADDRESS = (PROTOCOL = TCP)(HOST = your_hostname)(PORT = 1522))
  6.       (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
  7.     )
  8.   )
复制代码

Oracle提供多种加密选项,包括透明数据加密(TDE)和列级加密:
  1. -- 创建钱包并设置密码
  2. ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "wallet_password";
  3. -- 加密表空间
  4. CREATE TABLESPACE secure_ts
  5. DATAFILE '/path/to/secure_ts.dbf' SIZE 100M
  6. ENCRYPTION USING 'AES256'
  7. DEFAULT STORAGE(ENCRYPT);
  8. -- 加密特定列
  9. CREATE TABLE employees (
  10.   emp_id NUMBER,
  11.   name VARCHAR2(50),
  12.   salary NUMBER ENCRYPT USING 'AES256',
  13.   ssn VARCHAR2(20) ENCRYPT USING 'AES256'
  14. );
复制代码

身份认证机制

用户管理

有效的用户管理是数据库安全的第一道防线。Oracle提供了灵活的用户管理机制:
  1. -- 创建新用户
  2. CREATE USER app_user
  3. IDENTIFIED BY "SecurePassword123!"
  4. DEFAULT TABLESPACE users
  5. TEMPORARY TABLESPACE temp
  6. QUOTA 100M ON users
  7. PASSWORD EXPIRE;
  8. -- 修改用户属性
  9. ALTER USER app_user
  10. QUOTA UNLIMITED ON users
  11. PROFILE app_profile;
  12. -- 删除用户
  13. DROP USER app_user CASCADE;
复制代码

密码策略

强密码策略可以有效防止暴力破解和字典攻击:
  1. -- 创建密码验证函数
  2. CREATE OR REPLACE FUNCTION verify_password
  3. (username VARCHAR2, password VARCHAR2, old_password VARCHAR2)
  4. RETURN BOOLEAN IS
  5. BEGIN
  6.   -- 密码长度至少10个字符
  7.   IF LENGTH(password) < 10 THEN
  8.     RETURN FALSE;
  9.   END IF;
  10.   
  11.   -- 密码必须包含数字
  12.   IF NOT REGEXP_LIKE(password, '[0-9]') THEN
  13.     RETURN FALSE;
  14.   END IF;
  15.   
  16.   -- 密码必须包含大写字母
  17.   IF NOT REGEXP_LIKE(password, '[A-Z]') THEN
  18.     RETURN FALSE;
  19.   END IF;
  20.   
  21.   -- 密码必须包含小写字母
  22.   IF NOT REGEXP_LIKE(password, '[a-z]') THEN
  23.     RETURN FALSE;
  24.   END IF;
  25.   
  26.   -- 密码必须包含特殊字符
  27.   IF NOT REGEXP_LIKE(password, '[^a-zA-Z0-9]') THEN
  28.     RETURN FALSE;
  29.   END IF;
  30.   
  31.   -- 密码不能与用户名相同
  32.   IF UPPER(password) = UPPER(username) THEN
  33.     RETURN FALSE;
  34.   END IF;
  35.   
  36.   RETURN TRUE;
  37. END;
  38. /
  39. -- 创建密码配置文件
  40. CREATE PROFILE secure_profile LIMIT
  41.   PASSWORD_LIFE_TIME 90
  42.   PASSWORD_GRACE_TIME 7
  43.   PASSWORD_REUSE_TIME 365
  44.   PASSWORD_REUSE_MAX 10
  45.   FAILED_LOGIN_ATTEMPTS 5
  46.   PASSWORD_LOCK_TIME 1
  47.   PASSWORD_VERIFY_FUNCTION verify_password;
  48. -- 将配置文件分配给用户
  49. ALTER USER app_user PROFILE secure_profile;
复制代码

多因素认证

Oracle支持多种认证方法,包括强认证和集成认证:
  1. -- 配置SSL认证
  2. -- 1. 创建钱包
  3. MKSTORE -wrl /path/to/wallet -create
  4. -- 2. 导入证书
  5. MKSTORE -wrl /path/to/wallet -importCertificate -trusted_cert -cert /path/to/certificate.crt
  6. -- 3. 配置SQLNET.ORA
  7. WALLET_LOCATION =
  8.   (SOURCE =
  9.     (METHOD = FILE)
  10.     (METHOD_DATA =
  11.       (DIRECTORY = /path/to/wallet)
  12.     )
  13.   )
  14. SQLNET.AUTHENTICATION_SERVICES = (BEQ, TCPS, NT)
  15. -- 4. 配置监听器使用SSL
  16. (DESCRIPTION =
  17.   (ADDRESS = (PROTOCOL = TCPS)(HOST = hostname)(PORT = 2484))
  18.   (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
  19. )
复制代码

权限控制系统

系统权限与对象权限

Oracle的权限系统分为系统权限和对象权限:
  1. -- 授予系统权限
  2. GRANT CREATE SESSION, CREATE TABLE TO app_user;
  3. -- 授予对象权限
  4. GRANT SELECT, INSERT, UPDATE ON hr.employees TO app_user;
  5. -- 授予带GRANT OPTION的权限
  6. GRANT SELECT ON hr.employees TO app_user WITH GRANT OPTION;
  7. -- 撤销权限
  8. REVOKE DELETE ON hr.employees FROM app_user;
复制代码

角色管理

角色是权限的集合,可以简化权限管理:
  1. -- 创建角色
  2. CREATE ROLE app_role;
  3. -- 为角色授予权限
  4. GRANT CREATE SESSION, CREATE TABLE TO app_role;
  5. GRANT SELECT, INSERT, UPDATE ON hr.employees TO app_role;
  6. -- 将角色授予用户
  7. GRANT app_role TO app_user;
  8. -- 设置默认角色
  9. ALTER USER app_user DEFAULT ROLE app_role;
  10. -- 启用或禁用角色
  11. SET ROLE app_role;
  12. SET ROLE ALL EXCEPT app_role;
复制代码

最小权限原则

实施最小权限原则可以显著降低安全风险:
  1. -- 创建只读角色
  2. CREATE ROLE read_only_role;
  3. GRANT SELECT ON hr.employees TO read_only_role;
  4. GRANT SELECT ON hr.departments TO read_only_role;
  5. -- 创建读写角色
  6. CREATE ROLE read_write_role;
  7. GRANT SELECT, INSERT, UPDATE ON hr.employees TO read_write_role;
  8. GRANT SELECT, INSERT, UPDATE ON hr.departments TO read_write_role;
  9. -- 根据职责分配角色
  10. GRANT read_only_role TO analyst_user;
  11. GRANT read_write_role TO manager_user;
  12. -- 使用视图限制数据访问
  13. CREATE VIEW employee_public_view AS
  14. SELECT emp_id, first_name, last_name, email, phone_number
  15. FROM hr.employees;
  16. GRANT SELECT ON employee_public_view TO read_only_role;
复制代码

数据加密技术

透明数据加密(TDE)

透明数据加密(TDE)可以在不修改应用程序的情况下加密数据:
  1. -- 配置TDE钱包
  2. ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "wallet_password";
  3. -- 加密表空间
  4. CREATE TABLESPACE encrypted_ts
  5. DATAFILE '/path/to/encrypted_ts.dbf' SIZE 100M
  6. ENCRYPTION USING 'AES256'
  7. DEFAULT STORAGE(ENCRYPT);
  8. -- 加密现有表空间
  9. ALTER TABLESPACE users ENCRYPT USING 'AES256';
  10. -- 加密特定列
  11. CREATE TABLE customer_data (
  12.   id NUMBER,
  13.   name VARCHAR2(100),
  14.   credit_card_number VARCHAR2(20) ENCRYPT USING 'AES256',
  15.   ssn VARCHAR2(11) ENCRYPT USING 'AES256'
  16. );
  17. -- 加密现有表的列
  18. ALTER TABLE customer_data MODIFY (email ENCRYPT USING 'AES256');
复制代码

列级加密

列级加密允许对敏感数据进行细粒度保护:
  1. -- 使用DBMS_CRYPTO包进行加密
  2. CREATE OR REPLACE FUNCTION encrypt_data(p_data IN VARCHAR2, p_key IN RAW)
  3. RETURN RAW IS
  4.   l_encrypted RAW(2000);
  5. BEGIN
  6.   l_encrypted := DBMS_CRYPTO.ENCRYPT(
  7.     src => UTL_I18N.STRING_TO_RAW(p_data, 'AL32UTF8'),
  8.     typ => DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,
  9.     key => p_key
  10.   );
  11.   RETURN l_encrypted;
  12. END;
  13. /
  14. CREATE OR REPLACE FUNCTION decrypt_data(p_encrypted_data IN RAW, p_key IN RAW)
  15. RETURN VARCHAR2 IS
  16.   l_decrypted RAW(2000);
  17. BEGIN
  18.   l_decrypted := DBMS_CRYPTO.DECRYPT(
  19.     src => p_encrypted_data,
  20.     typ => DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,
  21.     key => p_key
  22.   );
  23.   RETURN UTL_I18N.RAW_TO_CHAR(l_decrypted, 'AL32UTF8');
  24. END;
  25. /
  26. -- 使用加密函数
  27. DECLARE
  28.   l_key RAW(32) := UTL_I18N.STRING_TO_RAW('MySecretEncryptionKey123456789012', 'AL32UTF8');
  29.   l_encrypted RAW(2000);
  30.   l_decrypted VARCHAR2(2000);
  31. BEGIN
  32.   -- 加密数据
  33.   l_encrypted := encrypt_data('Sensitive Information', l_key);
  34.   
  35.   -- 存储加密数据
  36.   INSERT INTO sensitive_data (id, encrypted_value)
  37.   VALUES (1, l_encrypted);
  38.   
  39.   -- 检索并解密数据
  40.   SELECT decrypt_data(encrypted_value, l_key)
  41.   INTO l_decrypted
  42.   FROM sensitive_data
  43.   WHERE id = 1;
  44.   
  45.   DBMS_OUTPUT.PUT_LINE('Decrypted value: ' || l_decrypted);
  46. END;
  47. /
复制代码

表空间加密

表空间加密提供了一种保护整个数据库对象的方法:
  1. -- 创建加密的表空间
  2. CREATE TABLESPACE secure_data
  3. DATAFILE '/u01/oradata/orcl/secure_data01.dbf' SIZE 500M
  4. ENCRYPTION USING 'AES256'
  5. DEFAULT STORAGE(ENCRYPT);
  6. -- 将表移动到加密表空间
  7. ALTER TABLE hr.employees MOVE TABLESPACE secure_data;
  8. -- 将索引移动到加密表空间
  9. ALTER INDEX hr.emp_name_ix REBUILD TABLESPACE secure_data;
  10. -- 加密临时表空间
  11. CREATE TEMPORARY TABLESPACE temp_encrypted
  12. TEMPFILE '/u01/oradata/orcl/temp_encrypted01.dbf' SIZE 100M
  13. TABLESPACE GROUP ''
  14. ENCRYPTION USING 'AES256';
  15. -- 设置加密的临时表空间为默认
  16. ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_encrypted;
复制代码

网络安全配置

Oracle Net安全

Oracle Net是数据库与客户端之间的通信层,其安全配置至关重要:
  1. -- 配置SQLNET.ORA以限制访问
  2. # 在SQLNET.ORA文件中添加以下内容
  3. TCP.VALIDNODE_CHECKING = YES
  4. TCP.INVITED_NODES = (hostname1, hostname2, ip_address1, ip_address2)
  5. TCP.EXCLUDED_NODES = (blacklisted_ip1, blacklisted_ip2)
  6. -- 启用加密网络通信
  7. # 在SQLNET.ORA中添加
  8. SQLNET.ENCRYPTION_SERVER = REQUIRED
  9. SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)
  10. SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
  11. SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA1, SHA256, SHA384, SHA512)
复制代码

SSL/TLS配置

配置SSL/TLS可以保护数据在传输过程中的安全性:
  1. # 1. 创建钱包
  2. orapki wallet create -wallet /path/to/wallet -pwd WalletPassword123
  3. # 2. 生成证书请求
  4. orapki wallet create -wallet /path/to/wallet -pwd WalletPassword123 -dn "CN=hostname,O=organization,C=country" -keysize 2048
  5. # 3. 导入证书
  6. orapki wallet import -wallet /path/to/wallet -pwd WalletPassword123 -cert /path/to/certificate.crt
  7. # 4. 配置监听器
  8. # 在listener.ora中添加
  9. SSL_CLIENT_AUTHENTICATION = FALSE
  10. WALLET_LOCATION =
  11.   (SOURCE =
  12.     (METHOD = FILE)
  13.     (METHOD_DATA =
  14.       (DIRECTORY = /path/to/wallet)
  15.     )
  16.   )
  17. # 5. 配置TCPS协议
  18. (DESCRIPTION =
  19.   (ADDRESS = (PROTOCOL = TCPS)(HOST = hostname)(PORT = 2484))
  20. )
复制代码

防火墙设置

合理配置防火墙规则可以限制对数据库的访问:
  1. # 使用iptables配置Linux防火墙
  2. # 允许特定IP访问Oracle端口
  3. iptables -A INPUT -p tcp -s 192.168.1.100 --dport 1521 -j ACCEPT
  4. iptables -A INPUT -p tcp -s 192.168.1.101 --dport 1521 -j ACCEPT
  5. # 拒绝其他所有对Oracle端口的访问
  6. iptables -A INPUT -p tcp --dport 1521 -j DROP
  7. # 保存规则
  8. service iptables save
  9. # 使用Windows防火墙配置
  10. netsh advfirewall firewall add rule name="Oracle" dir=in action=allow protocol=TCP localport=1521 remoteip=192.168.1.100,192.168.1.101
复制代码

审计与监控

数据库审计

Oracle提供了强大的审计功能,可以跟踪数据库活动:
  1. -- 启用数据库审计
  2. ALTER SYSTEM SET audit_trail=db SCOPE=SPFILE;
  3. -- 重启数据库使设置生效
  4. SHUTDOWN IMMEDIATE;
  5. STARTUP;
  6. -- 审计特定操作
  7. AUDIT SELECT, INSERT, UPDATE, DELETE ON hr.employees BY ACCESS;
  8. -- 审计特定用户
  9. AUDIT SESSION BY app_user;
  10. -- 审计权限使用
  11. AUDIT SELECT ANY TABLE BY ACCESS;
  12. -- 查看审计记录
  13. SELECT username, action_name, obj_name, timestamp, priv_used
  14. FROM dba_audit_trail
  15. WHERE username = 'APP_USER';
  16. -- 清理审计记录
  17. DELETE FROM sys.aud$ WHERE timestamp < SYSDATE - 90;
复制代码

细粒度审计

细粒度审计(FGA)允许对特定条件下的数据访问进行审计:
  1. -- 添加FGA策略
  2. BEGIN
  3.   DBMS_FGA.ADD_POLICY(
  4.     object_schema   => 'HR',
  5.     object_name     => 'EMPLOYEES',
  6.     policy_name     => 'audit_high_salary_access',
  7.     audit_condition => 'SALARY > 100000',
  8.     audit_column    => 'SALARY',
  9.     enable          => TRUE
  10.   );
  11. END;
  12. /
  13. -- 查看FGA审计记录
  14. SELECT db_user, object_schema, object_name, policy_name, sql_text, timestamp
  15. FROM dba_fga_audit_trail;
  16. -- 禁用FGA策略
  17. BEGIN
  18.   DBMS_FGA.DISABLE_POLICY(
  19.     object_schema => 'HR',
  20.     object_name   => 'EMPLOYEES',
  21.     policy_name   => 'audit_high_salary_access'
  22.   );
  23. END;
  24. /
  25. -- 删除FGA策略
  26. BEGIN
  27.   DBMS_FGA.DROP_POLICY(
  28.     object_schema => 'HR',
  29.     object_name   => 'EMPLOYEES',
  30.     policy_name   => 'audit_high_salary_access'
  31.   );
  32. END;
  33. /
复制代码

实时监控技术

实时监控可以帮助及时发现异常活动:
  1. -- 创建监控表
  2. CREATE TABLE db_activity_monitor (
  3.   id NUMBER GENERATED ALWAYS AS IDENTITY,
  4.   username VARCHAR2(30),
  5.   osuser VARCHAR2(30),
  6.   machine VARCHAR2(64),
  7.   program VARCHAR2(48),
  8.   logon_time TIMESTAMP,
  9.   last_call_et NUMBER,
  10.   status VARCHAR2(8),
  11.   sql_text CLOB,
  12.   capture_time TIMESTAMP DEFAULT SYSTIMESTAMP
  13. );
  14. -- 创建监控存储过程
  15. CREATE OR REPLACE PROCEDURE capture_db_activity AS
  16. BEGIN
  17.   INSERT INTO db_activity_monitor (username, osuser, machine, program, logon_time, last_call_et, status, sql_text)
  18.   SELECT s.username, s.osuser, s.machine, s.program, s.logon_time, s.last_call_et, s.status, q.sql_text
  19.   FROM v$session s
  20.   LEFT JOIN v$sql q ON s.sql_id = q.sql_id
  21.   WHERE s.username IS NOT NULL
  22.   AND s.status = 'ACTIVE';
  23.   
  24.   COMMIT;
  25. END;
  26. /
  27. -- 创建定时任务
  28. BEGIN
  29.   DBMS_SCHEDULER.CREATE_JOB (
  30.     job_name        => 'db_activity_monitor_job',
  31.     job_type        => 'PLSQL_BLOCK',
  32.     job_action      => 'BEGIN capture_db_activity; END;',
  33.     start_date      => SYSTIMESTAMP,
  34.     repeat_interval => 'FREQ=HOURLY; INTERVAL=1',
  35.     enabled         => TRUE
  36.   );
  37. END;
  38. /
  39. -- 查看监控结果
  40. SELECT * FROM db_activity_monitor
  41. WHERE capture_time > SYSDATE - 1
  42. ORDER BY capture_time DESC;
复制代码

高级安全特性

数据库保险库

Oracle Database Vault提供额外的安全层,防止特权用户滥用权限:
  1. -- 安装Database Vault
  2. -- 1. 以SYSDBA身份登录
  3. sqlplus / as sysdba
  4. -- 2. 启用Database Vault
  5. ALTER SYSTEM SET db_vault_enable = TRUE SCOPE=SPFILE;
  6. -- 3. 重启数据库
  7. SHUTDOWN IMMEDIATE;
  8. STARTUP;
  9. -- 创建领域
  10. BEGIN
  11.   DVSYS.DBMS_MACADM.CREATE_REALM(
  12.     realm_name    => 'HR_Data_Realm',
  13.     description   => 'Realm to protect HR data',
  14.     enabled       => DBMS_MACUTL.G_YES,
  15.     audit_options => DBMS_MACUTL.G_REALM_AUDIT_FAIL + DBMS_MACUTL.G_REALM_AUDIT_SUCCESS
  16.   );
  17. END;
  18. /
  19. -- 将对象添加到领域
  20. BEGIN
  21.   DVSYS.DBMS_MACADM.ADD_OBJECT_TO_REALM(
  22.     realm_name   => 'HR_Data_Realm',
  23.     object_owner => 'HR',
  24.     object_name  => '%',
  25.     object_type  => 'TABLE'
  26.   );
  27. END;
  28. /
  29. -- 创建授权规则
  30. BEGIN
  31.   DVSYS.DBMS_MACADM.CREATE_AUTH(
  32.     realm_name    => 'HR_Data_Realm',
  33.     rule_set_name => 'Can_Access_HR_Data',
  34.     rule_name     => 'Is_HR_Manager',
  35.     enabled       => DBMS_MACUTL.G_YES
  36.   );
  37. END;
  38. /
  39. -- 创建规则
  40. BEGIN
  41.   DVSYS.DBMS_MACADM.CREATE_RULE(
  42.     rule_name    => 'Is_HR_Manager',
  43.     rule_expr    => 'DVSYS.DBMS_MACUTL.CHECK_FUNCTION(''HR_IS_MANAGER'') = ''Y''',
  44.     enabled      => DBMS_MACUTL.G_YES
  45.   );
  46. END;
  47. /
复制代码

数据脱敏

数据脱敏技术可以在不影响应用功能的情况下保护敏感数据:
  1. -- 创建脱敏策略
  2. BEGIN
  3.   DBMS_REDACT.ADD_POLICY(
  4.     object_schema   => 'HR',
  5.     object_name     => 'EMPLOYEES',
  6.     policy_name     => 'redact_employees_policy',
  7.     function_type   => DBMS_REDACT.PARTIAL,
  8.     expression      => '1=1',
  9.     enable          => TRUE
  10.   );
  11. END;
  12. /
  13. -- 添加脱敏列
  14. BEGIN
  15.   DBMS_REDACT.ALTER_POLICY(
  16.     object_schema   => 'HR',
  17.     object_name     => 'EMPLOYEES',
  18.     policy_name     => 'redact_employees_policy',
  19.     action          => DBMS_REDACT.ADD_COLUMN,
  20.     column_name     => 'SALARY',
  21.     function_type   => DBMS_REDACT.PARTIAL,
  22.     function_parameters => 'VVVVV,VVVV,VV,VV'
  23.   );
  24. END;
  25. /
  26. -- 添加脱敏列
  27. BEGIN
  28.   DBMS_REDACT.ALTER_POLICY(
  29.     object_schema   => 'HR',
  30.     object_name     => 'EMPLOYEES',
  31.     policy_name     => 'redact_employees_policy',
  32.     action          => DBMS_REDACT.ADD_COLUMN,
  33.     column_name     => 'SSN',
  34.     function_type   => DBMS_REDACT.PARTIAL,
  35.     function_parameters => 'XXX-XX-XXXX'
  36.   );
  37. END;
  38. /
  39. -- 测试脱敏效果
  40. -- 以普通用户身份查询
  41. SELECT salary, ssn FROM hr.employees WHERE ROWNUM < 5;
  42. -- 以特权用户身份查询(不受脱敏影响)
  43. SELECT salary, ssn FROM hr.employees WHERE ROWNUM < 5;
复制代码

高级安全选项

Oracle提供了多种高级安全选项,如数据加密和访问控制:
  1. -- 配置数据加密
  2. -- 1. 创建加密密钥
  3. CREATE TABLESPACE encrypted_ts
  4. DATAFILE '/u01/oradata/orcl/encrypted_ts.dbf' SIZE 100M
  5. ENCRYPTION USING 'AES256'
  6. DEFAULT STORAGE(ENCRYPT);
  7. -- 2. 创建加密表
  8. CREATE TABLE sensitive_data (
  9.   id NUMBER,
  10.   data VARCHAR2(4000) ENCRYPT USING 'AES256',
  11.   CONSTRAINT pk_sensitive_data PRIMARY KEY (id)
  12. ) TABLESPACE encrypted_ts;
  13. -- 3. 创建加密索引
  14. CREATE INDEX idx_sensitive_data ON sensitive_data(data) TABLESPACE encrypted_ts;
  15. -- 配置虚拟私有数据库(VPD)
  16. -- 1. 创建策略函数
  17. CREATE OR REPLACE FUNCTION hr_security_policy (p_schema IN VARCHAR2, p_table IN VARCHAR2)
  18. RETURN VARCHAR2 AS
  19. BEGIN
  20.   RETURN 'department_id = SYS_CONTEXT(''USERENV'', ''CURRENT_DEPARTMENT_ID'')';
  21. END;
  22. /
  23. -- 2. 添加策略
  24. BEGIN
  25.   DBMS_RLS.ADD_POLICY(
  26.     object_schema   => 'HR',
  27.     object_name     => 'EMPLOYEES',
  28.     policy_name     => 'hr_dept_policy',
  29.     function_schema => 'HR',
  30.     policy_function => 'hr_security_policy',
  31.     statement_types => 'SELECT, INSERT, UPDATE, DELETE'
  32.   );
  33. END;
  34. /
  35. -- 3. 设置上下文
  36. CREATE OR REPLACE CONTEXT hr_dept_ctx USING hr_dept_pkg;
  37. CREATE OR REPLACE PACKAGE hr_dept_pkg AS
  38.   PROCEDURE set_dept_id(p_dept_id NUMBER);
  39. END;
  40. /
  41. CREATE OR REPLACE PACKAGE BODY hr_dept_pkg AS
  42.   PROCEDURE set_dept_id(p_dept_id NUMBER) AS
  43.   BEGIN
  44.     DBMS_SESSION.SET_CONTEXT('hr_dept_ctx', 'CURRENT_DEPARTMENT_ID', p_dept_id);
  45.   END;
  46. END;
  47. /
复制代码

安全最佳实践

安全配置清单

以下是Oracle数据库安全配置的清单:

1. 账户管理修改所有默认密码禁用或删除不必要的账户实施强密码策略定期审查用户账户
2. 修改所有默认密码
3. 禁用或删除不必要的账户
4. 实施强密码策略
5. 定期审查用户账户
6. 权限控制实施最小权限原则使用角色简化权限管理定期审查权限分配限制PUBLIC角色的权限
7. 实施最小权限原则
8. 使用角色简化权限管理
9. 定期审查权限分配
10. 限制PUBLIC角色的权限
11. 数据加密启用透明数据加密对敏感列实施列级加密加密网络通信安全管理加密密钥
12. 启用透明数据加密
13. 对敏感列实施列级加密
14. 加密网络通信
15. 安全管理加密密钥
16. 网络安全修改默认监听端口限制网络访问启用SSL/TLS配置防火墙规则
17. 修改默认监听端口
18. 限制网络访问
19. 启用SSL/TLS
20. 配置防火墙规则
21. 审计与监控启用数据库审计实施细粒度审计定期审查审计日志实时监控异常活动
22. 启用数据库审计
23. 实施细粒度审计
24. 定期审查审计日志
25. 实时监控异常活动

账户管理

• 修改所有默认密码
• 禁用或删除不必要的账户
• 实施强密码策略
• 定期审查用户账户

权限控制

• 实施最小权限原则
• 使用角色简化权限管理
• 定期审查权限分配
• 限制PUBLIC角色的权限

数据加密

• 启用透明数据加密
• 对敏感列实施列级加密
• 加密网络通信
• 安全管理加密密钥

网络安全

• 修改默认监听端口
• 限制网络访问
• 启用SSL/TLS
• 配置防火墙规则

审计与监控

• 启用数据库审计
• 实施细粒度审计
• 定期审查审计日志
• 实时监控异常活动

定期安全评估

定期进行安全评估可以帮助发现潜在的安全问题:
  1. -- 创建安全评估存储过程
  2. CREATE OR REPLACE PROCEDURE security_assessment AS
  3.   v_weak_password_count NUMBER;
  4.   v_excessive_privileges_count NUMBER;
  5.   v_public_privileges_count NUMBER;
  6.   v_unencrypted_tables_count NUMBER;
  7. BEGIN
  8.   -- 检查弱密码
  9.   SELECT COUNT(*) INTO v_weak_password_count
  10.   FROM dba_users
  11.   WHERE password_versions IS NULL OR LENGTH(password) < 10;
  12.   
  13.   -- 检查过度权限
  14.   SELECT COUNT(*) INTO v_excessive_privileges_count
  15.   FROM dba_tab_privs
  16.   WHERE grantee IN (SELECT username FROM dba_users WHERE account_status = 'OPEN')
  17.   AND privilege IN ('ALL', 'ALTER ANY TABLE', 'DROP ANY TABLE');
  18.   
  19.   -- 检查PUBLIC角色的权限
  20.   SELECT COUNT(*) INTO v_public_privileges_count
  21.   FROM dba_tab_privs
  22.   WHERE grantee = 'PUBLIC';
  23.   
  24.   -- 检查未加密的表
  25.   SELECT COUNT(*) INTO v_unencrypted_tables_count
  26.   FROM dba_tables t
  27.   WHERE NOT EXISTS (
  28.     SELECT 1 FROM dba_encrypted_columns ec
  29.     WHERE ec.owner = t.owner AND ec.table_name = t.table_name
  30.   );
  31.   
  32.   -- 输出评估结果
  33.   DBMS_OUTPUT.PUT_LINE('安全评估结果:');
  34.   DBMS_OUTPUT.PUT_LINE('弱密码账户数量: ' || v_weak_password_count);
  35.   DBMS_OUTPUT.PUT_LINE('拥有过度权限的用户数量: ' || v_excessive_privileges_count);
  36.   DBMS_OUTPUT.PUT_LINE('PUBLIC角色的权限数量: ' || v_public_privileges_count);
  37.   DBMS_OUTPUT.PUT_LINE('未加密的表数量: ' || v_unencrypted_tables_count);
  38.   
  39.   -- 生成建议
  40.   IF v_weak_password_count > 0 THEN
  41.     DBMS_OUTPUT.PUT_LINE('建议: 更改弱密码并实施强密码策略');
  42.   END IF;
  43.   
  44.   IF v_excessive_privileges_count > 0 THEN
  45.     DBMS_OUTPUT.PUT_LINE('建议: 审查并减少用户权限,实施最小权限原则');
  46.   END IF;
  47.   
  48.   IF v_public_privileges_count > 0 THEN
  49.     DBMS_OUTPUT.PUT_LINE('建议: 审查并减少PUBLIC角色的权限');
  50.   END IF;
  51.   
  52.   IF v_unencrypted_tables_count > 0 THEN
  53.     DBMS_OUTPUT.PUT_LINE('建议: 对敏感表实施加密');
  54.   END IF;
  55. END;
  56. /
  57. -- 执行安全评估
  58. SET SERVEROUTPUT ON;
  59. EXEC security_assessment;
复制代码

安全更新与补丁管理

定期应用安全补丁是保持数据库安全的关键:
  1. # 1. 检查当前数据库版本和补丁级别
  2. sqlplus / as sysdba
  3. SELECT * FROM v$version;
  4. # 2. 下载最新的补丁集
  5. # 访问Oracle支持网站(https://support.oracle.com)下载适用的补丁
  6. # 3. 准备应用补丁
  7. # 停止监听器
  8. lsnrctl stop
  9. # 停止数据库
  10. sqlplus / as sysdba
  11. SHUTDOWN IMMEDIATE;
  12. # 4. 应用补丁
  13. # 解压补丁文件
  14. cd /path/to/patch
  15. unzip p<number>_<platform>.zip
  16. # 运行OPatch工具
  17. cd <patch_number>
  18. $ORACLE_HOME/OPatch/opatch apply
  19. # 5. 启动数据库和监听器
  20. sqlplus / as sysdba
  21. STARTUP;
  22. lsnrctl start
  23. # 6. 验证补丁安装
  24. $ORACLE_HOME/OPatch/opatch lsinventory
  25. # 7. 运行数据字典更新
  26. sqlplus / as sysdba
  27. @?/rdbms/admin/catbundle.sql psu apply
  28. @?/rdbms/admin/utlrp.sql
复制代码

应急响应与恢复

安全事件响应

建立有效的安全事件响应流程可以减少安全事件的影响:
  1. -- 创建安全事件记录表
  2. CREATE TABLE security_incidents (
  3.   id NUMBER GENERATED ALWAYS AS IDENTITY,
  4.   incident_type VARCHAR2(50),
  5.   description VARCHAR2(4000),
  6.   severity NUMBER(1),
  7.   status VARCHAR2(20),
  8.   detected_by VARCHAR2(30),
  9.   detected_time TIMESTAMP,
  10.   assigned_to VARCHAR2(30),
  11.   resolution VARCHAR2(4000),
  12.   resolved_time TIMESTAMP,
  13.   created_time TIMESTAMP DEFAULT SYSTIMESTAMP,
  14.   updated_time TIMESTAMP DEFAULT SYSTIMESTAMP
  15. );
  16. -- 创建安全事件响应存储过程
  17. CREATE OR REPLACE PROCEDURE log_security_incident(
  18.   p_incident_type IN VARCHAR2,
  19.   p_description IN VARCHAR2,
  20.   p_severity IN NUMBER,
  21.   p_detected_by IN VARCHAR2
  22. ) AS
  23. BEGIN
  24.   INSERT INTO security_incidents (
  25.     incident_type,
  26.     description,
  27.     severity,
  28.     status,
  29.     detected_by,
  30.     detected_time
  31.   ) VALUES (
  32.     p_incident_type,
  33.     p_description,
  34.     p_severity,
  35.     'OPEN',
  36.     p_detected_by,
  37.     SYSTIMESTAMP
  38.   );
  39.   
  40.   COMMIT;
  41.   
  42.   -- 如果是高严重性事件,发送警报
  43.   IF p_severity >= 4 THEN
  44.     -- 这里可以添加发送邮件或短信的代码
  45.     DBMS_OUTPUT.PUT_LINE('高严重性安全事件警报: ' || p_description);
  46.   END IF;
  47. END;
  48. /
  49. -- 示例:记录可疑登录尝试
  50. BEGIN
  51.   log_security_incident(
  52.     '可疑登录尝试',
  53.     '用户' || SYS_CONTEXT('USERENV', 'SESSION_USER') ||
  54.     '从IP ' || SYS_CONTEXT('USERENV', 'IP_ADDRESS') ||
  55.     '在' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') ||
  56.     '进行了多次失败的登录尝试',
  57.     3,
  58.     'SYSTEM'
  59.   );
  60. END;
  61. /
复制代码

数据恢复策略

制定有效的数据恢复策略可以确保在安全事件后快速恢复:
  1. -- 创建恢复测试表
  2. CREATE TABLE recovery_test (
  3.   id NUMBER,
  4.   data VARCHAR2(100),
  5.   created_time TIMESTAMP DEFAULT SYSTIMESTAMP,
  6.   CONSTRAINT pk_recovery_test PRIMARY KEY (id)
  7. );
  8. -- 插入测试数据
  9. INSERT INTO recovery_test (id, data) VALUES (1, 'Test data 1');
  10. INSERT INTO recovery_test (id, data) VALUES (2, 'Test data 2');
  11. COMMIT;
  12. -- 创建恢复存储过程
  13. CREATE OR REPLACE PROCEDURE test_recovery AS
  14.   v_before_count NUMBER;
  15.   v_after_count NUMBER;
  16. BEGIN
  17.   -- 记录表中的行数
  18.   SELECT COUNT(*) INTO v_before_count FROM recovery_test;
  19.   DBMS_OUTPUT.PUT_LINE('恢复前表中的行数: ' || v_before_count);
  20.   
  21.   -- 模拟数据丢失
  22.   DELETE FROM recovery_test;
  23.   COMMIT;
  24.   
  25.   -- 验证数据已删除
  26.   SELECT COUNT(*) INTO v_after_count FROM recovery_test;
  27.   DBMS_OUTPUT.PUT_LINE('删除后表中的行数: ' || v_after_count);
  28.   
  29.   -- 使用闪回技术恢复数据
  30.   INSERT INTO recovery_test
  31.   SELECT * FROM recovery_test AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '1' MINUTE;
  32.   
  33.   -- 验证数据已恢复
  34.   SELECT COUNT(*) INTO v_after_count FROM recovery_test;
  35.   DBMS_OUTPUT.PUT_LINE('恢复后表中的行数: ' || v_after_count);
  36.   
  37.   COMMIT;
  38. END;
  39. /
  40. -- 执行恢复测试
  41. SET SERVEROUTPUT ON;
  42. EXEC test_recovery;
  43. -- 配置闪回数据库
  44. -- 1. 启用归档日志
  45. ALTER SYSTEM SET log_archive_dest_1='LOCATION=/path/to/archive' SCOPE=BOTH;
  46. ALTER SYSTEM SET log_archive_format='arch_%t_%s_%r.arc' SCOPE=SPFILE;
  47. SHUTDOWN IMMEDIATE;
  48. STARTUP MOUNT;
  49. ALTER DATABASE ARCHIVELOG;
  50. ALTER DATABASE OPEN;
  51. -- 2. 设置闪回恢复区
  52. ALTER SYSTEM SET db_recovery_file_dest='/path/to/flash_recovery_area' SCOPE=BOTH;
  53. ALTER SYSTEM SET db_recovery_file_dest_size=10G SCOPE=BOTH;
  54. -- 3. 启用闪回数据库
  55. ALTER SYSTEM SET db_flashback_retention_target=1440 SCOPE=BOTH; -- 24小时
  56. ALTER DATABASE FLASHBACK ON;
复制代码

业务连续性规划

业务连续性规划确保在发生安全事件时业务能够持续运行:
  1. -- 创建数据保护配置表
  2. CREATE TABLE data_protection_config (
  3.   config_id NUMBER GENERATED ALWAYS AS IDENTITY,
  4.   config_name VARCHAR2(50),
  5.   config_value VARCHAR2(100),
  6.   description VARCHAR2(4000),
  7.   last_updated TIMESTAMP DEFAULT SYSTIMESTAMP,
  8.   CONSTRAINT pk_data_protection_config PRIMARY KEY (config_id)
  9. );
  10. -- 插入配置数据
  11. INSERT INTO data_protection_config (config_name, config_value, description) VALUES
  12. ('RPO', '15 minutes', '恢复点目标:数据丢失的最大可接受时间'),
  13. ('RTO', '1 hour', '恢复时间目标:恢复服务的最大可接受时间'),
  14. ('BACKUP_FREQUENCY', 'DAILY', '备份频率'),
  15. ('BACKUP_RETENTION', '30 days', '备份保留期'),
  16. ('DR_SITE', 'ENABLED', '灾难恢复站点状态'),
  17. ('FAILOVER_TEST_FREQUENCY', 'QUARTERLY', '故障转移测试频率');
  18. -- 创建业务连续性检查存储过程
  19. CREATE OR REPLACE PROCEDURE check_business_continuity AS
  20.   v_last_backup_date DATE;
  21.   v_days_since_backup NUMBER;
  22.   v_rpo_minutes NUMBER;
  23.   v_rto_hours NUMBER;
  24. BEGIN
  25.   -- 获取配置值
  26.   SELECT TO_NUMBER(config_value) INTO v_rpo_minutes
  27.   FROM data_protection_config
  28.   WHERE config_name = 'RPO';
  29.   
  30.   SELECT TO_NUMBER(config_value) INTO v_rto_hours
  31.   FROM data_protection_config
  32.   WHERE config_name = 'RTO';
  33.   
  34.   -- 检查最后一次备份
  35.   SELECT MAX(completion_time) INTO v_last_backup_date
  36.   FROM v$backup_piece
  37.   WHERE status = 'A';
  38.   
  39.   v_days_since_backup := SYSDATE - v_last_backup_date;
  40.   
  41.   DBMS_OUTPUT.PUT_LINE('业务连续性检查结果:');
  42.   DBMS_OUTPUT.PUT_LINE('恢复点目标(RPO): ' || v_rpo_minutes || ' 分钟');
  43.   DBMS_OUTPUT.PUT_LINE('恢复时间目标(RTO): ' || v_rto_hours || ' 小时');
  44.   DBMS_OUTPUT.PUT_LINE('最后一次备份日期: ' || TO_CHAR(v_last_backup_date, 'YYYY-MM-DD HH24:MI:SS'));
  45.   DBMS_OUTPUT.PUT_LINE('距离上次备份天数: ' || v_days_since_backup);
  46.   
  47.   -- 检查是否符合RPO
  48.   IF v_days_since_backup * 24 * 60 > v_rpo_minutes THEN
  49.     DBMS_OUTPUT.PUT_LINE('警告: 备份频率不符合RPO要求');
  50.   ELSE
  51.     DBMS_OUTPUT.PUT_LINE('备份频率符合RPO要求');
  52.   END IF;
  53.   
  54.   -- 检查灾难恢复配置
  55.   IF (SELECT config_value FROM data_protection_config WHERE config_name = 'DR_SITE') = 'ENABLED' THEN
  56.     DBMS_OUTPUT.PUT_LINE('灾难恢复站点: 已启用');
  57.    
  58.     -- 这里可以添加检查Data Guard配置的代码
  59.     -- 例如检查主备库同步状态
  60.   ELSE
  61.     DBMS_OUTPUT.PUT_LINE('灾难恢复站点: 未启用');
  62.   END IF;
  63. END;
  64. /
  65. -- 执行业务连续性检查
  66. SET SERVEROUTPUT ON;
  67. EXEC check_business_continuity;
复制代码

结论与展望

Oracle数据库安全防护与权限控制是一个复杂而持续的过程,需要从基础配置到高级应用全方位考虑。通过本文介绍的各种策略和技术,企业可以构建起强大的数据安全防线,有效防止信息泄露与恶意攻击,全面提升系统防护能力。

随着技术的发展,Oracle数据库安全也在不断演进。未来,我们可以预见以下趋势:

1. 人工智能与机器学习:AI技术将被更多地应用于异常检测和威胁预测,实现更智能的安全防护。
2. 零信任架构:传统的边界安全模型将逐渐被零信任架构取代,每次访问都需要严格的身份验证和授权。
3. 自动化安全运维:安全配置、监控和响应将更加自动化,减少人为错误,提高响应速度。
4. 云原生安全:随着数据库向云端迁移,云原生安全解决方案将成为主流,提供更灵活、更可扩展的安全防护。
5. 合规性要求提高:随着数据保护法规的日益严格,数据库安全将更加注重合规性,提供更完善的审计和报告功能。

人工智能与机器学习:AI技术将被更多地应用于异常检测和威胁预测,实现更智能的安全防护。

零信任架构:传统的边界安全模型将逐渐被零信任架构取代,每次访问都需要严格的身份验证和授权。

自动化安全运维:安全配置、监控和响应将更加自动化,减少人为错误,提高响应速度。

云原生安全:随着数据库向云端迁移,云原生安全解决方案将成为主流,提供更灵活、更可扩展的安全防护。

合规性要求提高:随着数据保护法规的日益严格,数据库安全将更加注重合规性,提供更完善的审计和报告功能。

企业应当持续关注这些发展趋势,不断更新和完善自身的数据库安全策略,以应对不断变化的安全挑战。只有将安全视为一个持续的过程,而非一次性的项目,才能真正保障企业数据的安全,为业务发展提供坚实的支撑。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则