【Oracle入门到删库跑路-13】高级特性:数据库安全

41 阅读4分钟

1.1 数据库安全概述

1.1.1 数据库安全的重要性

数据库安全是保护数据免受未授权访问、篡改和泄露的关键措施。随着数据价值的增加和监管要求的加强,数据库安全已成为企业IT战略的重要组成部分。

1.1.2 安全威胁类型

  • 内部威胁:员工滥用权限、误操作
  • 外部攻击:黑客入侵、SQL注入、恶意软件
  • 合规风险:违反数据保护法规(如GDPR、网络安全法)

1.2 用户认证与授权

1.2.1 用户账户管理

-- 创建用户
CREATE USER app_user IDENTIFIED BY password123
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA 100M ON users;

-- 修改用户密码
ALTER USER app_user IDENTIFIED BY newpassword456;

-- 锁定/解锁用户
ALTER USER app_user ACCOUNT LOCK;
ALTER USER app_user ACCOUNT UNLOCK;

-- 删除用户
DROP USER app_user CASCADE;

1.2.2 角色管理

-- 创建角色
CREATE ROLE app_role;

-- 授予权限给角色
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO app_role;

-- 将角色授予用户
GRANT app_role TO app_user;

-- 设置默认角色
ALTER USER app_user DEFAULT ROLE app_role;

1.2.3 权限管理

-- 系统权限
GRANT CREATE SESSION, CREATE TABLE TO app_user;
GRANT DBA TO app_user; -- 谨慎使用

-- 对象权限
GRANT SELECT, INSERT, UPDATE, DELETE ON employees TO app_user;
GRANT EXECUTE ON calculate_salary TO app_user;

-- 收回权限
REVOKE DELETE ON employees FROM app_user;

1.3 数据加密

1.3.1 透明数据加密(TDE)

-- 创建钱包目录
-- 在sqlnet.ora中配置钱包位置
ENCRYPTION_WALLET_LOCATION =
  (SOURCE=(METHOD=FILE)(METHOD_DATA=
    (DIRECTORY=/u01/app/oracle/admin/ORCL/wallet)))

-- 创建加密钱包
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/u01/app/oracle/admin/ORCL/wallet' IDENTIFIED BY wallet_password;

-- 打开钱包
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY wallet_password;

-- 设置主密钥
ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY wallet_password WITH BACKUP;

-- 创建加密表空间
CREATE TABLESPACE encrypted_ts
DATAFILE '/u01/app/oracle/oradata/ORCL/encrypted_ts.dbf' SIZE 100M
ENCRYPTION USING 'AES256'
DEFAULT STORAGE(ENCRYPT);

1.3.2 列级加密

-- 创建加密列
CREATE TABLE customer_data (
  id NUMBER PRIMARY KEY,
  name VARCHAR2(100),
  ssn VARCHAR2(20) ENCRYPT USING 'AES256' NO SALT,
  credit_card VARCHAR2(20) ENCRYPT USING 'AES256'
);

-- 插入加密数据
INSERT INTO customer_data VALUES (1, 'John Doe', '123-45-6789', '1234-5678-9012-3456');

1.4 审计与监控

1.4.1 统一审计

-- 创建审计策略
CREATE AUDIT POLICY emp_audit_policy
ACTIONS SELECT, INSERT, UPDATE, DELETE ON hr.employees;

-- 启用审计策略
AUDIT POLICY emp_audit_policy;

-- 查看审计记录
SELECT event_timestamp, dbusername, action_name, object_name, sql_text
FROM unified_audit_trail
WHERE policy_name = 'EMP_AUDIT_POLICY'
ORDER BY event_timestamp DESC;

1.4.2 传统审计

-- 启用审计
ALTER SYSTEM SET audit_trail=DB SCOPE=SPFILE;

-- 重启数据库后生效
SHUTDOWN IMMEDIATE;
STARTUP;

-- 审计特定操作
AUDIT SELECT TABLE, INSERT TABLE, UPDATE TABLE, DELETE TABLE BY app_user;

-- 查看审计记录
SELECT username, timestamp, owner, obj_name, action_name
FROM dba_audit_trail
WHERE username = 'APP_USER'
ORDER BY timestamp DESC;

1.5 网络安全

1.5.1 SSL/TLS配置

-- 配置SSL连接
-- 在sqlnet.ora中添加
WALLET_LOCATION =
  (SOURCE=(METHOD=FILE)(METHOD_DATA=
    (DIRECTORY=/u01/app/oracle/admin/ORCL/wallet)))

SSL_CLIENT_AUTHENTICATION=FALSE

-- 在listener.ora中配置SSL端点
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCPS)(HOST = localhost)(PORT = 2484))
    )
  )

1.5.2 网络访问控制

-- 配置防火墙规则
-- 在sqlnet.ora中配置访问控制
TCP.VALIDNODE_CHECKING = YES
TCP.INVITED_NODES = (192.168.1.10, 192.168.1.20)
TCP.EXCLUDED_NODES = (192.168.1.100)

1.6 数据库防火墙

1.6.1 SQL防护

-- 配置SQL防护规则
BEGIN
  DBMS_SQL_FIREWALL.CREATE_RULE(
    rule_name => 'prevent_drops',
    rule_type => DBMS_SQL_FIREWALL.RULE_TYPE_PREVENT,
    sql_text => 'DROP%',
    description => 'Prevent DROP statements'
  );
END;
/

-- 将规则应用于用户
BEGIN
  DBMS_SQL_FIREWALL.APPLY_RULE(
    rule_name => 'prevent_drops',
    user_name => 'APP_USER'
  );
END;
/

1.7 实践练习

练习1:配置用户权限和角色

  1. 创建一个新的应用用户
  2. 创建角色并分配适当权限
  3. 将角色授予用户
  4. 测试用户权限

练习2:配置透明数据加密

  1. 配置钱包位置
  2. 创建和打开加密钱包
  3. 创建加密表空间
  4. 验证数据加密

练习3:配置审计策略

  1. 创建统一审计策略
  2. 启用审计策略
  3. 执行一些操作触发审计
  4. 查询审计记录

1.8 总结

数据库安全是一个多层次、综合性的课题,涉及身份认证、权限管理、数据加密、审计监控等多个方面。通过合理配置和管理这些安全特性,可以有效保护数据库中的敏感数据,满足合规要求,并防范各种安全威胁。定期审查和更新安全策略是维护数据库安全的重要实践。