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:配置用户权限和角色
- 创建一个新的应用用户
- 创建角色并分配适当权限
- 将角色授予用户
- 测试用户权限
练习2:配置透明数据加密
- 配置钱包位置
- 创建和打开加密钱包
- 创建加密表空间
- 验证数据加密
练习3:配置审计策略
- 创建统一审计策略
- 启用审计策略
- 执行一些操作触发审计
- 查询审计记录
1.8 总结
数据库安全是一个多层次、综合性的课题,涉及身份认证、权限管理、数据加密、审计监控等多个方面。通过合理配置和管理这些安全特性,可以有效保护数据库中的敏感数据,满足合规要求,并防范各种安全威胁。定期审查和更新安全策略是维护数据库安全的重要实践。