本次测试目标
-
访问控制:
通过角色分离限制用户权限(如
HR_ROLE、FIN_ROLE)。 -
使用行级安全策略(RLS)实现数据隔离(例如,员工仅能查看本部门数据)。
认证增强:为特权用户启用多因素认证(密码+OTP)。
步骤 1:配置多因素认证(MFA)
1.1 启用Oracle多因素认证(需配置OTP服务,如Google Authenticator)
-- 创建特权用户`admin_mfa`并启用MFA CREATE USER admin_mfa IDENTIFIED BY "StrongPass123#" DEFAULT TABLESPACE users QUOTA UNLIMITED ON users; -- 配置OTP认证(需Oracle Advanced Security选件支持) BEGIN DBMS_MFA.ENABLE_OTP( username => 'ADMIN_MFA', issuer => 'CorporateDB' ); END; /
1.2 用户登录时需输入密码+OTP:
-- 连接示例(需在客户端支持OTP输入): CONNECT admin_mfa/StrongPass123#@db23c:1521/ORCL TOTP=654321
步骤 2:创建角色与用户,实施最小权限原则
2.1 创建角色并分配权限
-- 创建HR角色(仅允许访问员工表) CREATE ROLE hr_role; GRANT SELECT, UPDATE ON hr.employees TO hr_role; -- 创建财务角色(仅允许访问薪资表) CREATE ROLE fin_role; GRANT SELECT ON hr.salaries TO fin_role; -- 创建部门经理角色(允许查看本部门员工) CREATE ROLE dept_mgr_role; GRANT hr_role TO dept_mgr_role;
2.2 创建用户并分配角色
-- 创建HR用户 CREATE USER hr_analyst IDENTIFIED BY "Hr@Secure2023#" DEFAULT TABLESPACE users; GRANT CONNECT, hr_role TO hr_analyst; -- 创建财务用户 CREATE USER fin_clerk IDENTIFIED BY "Fin@Secure2023#" DEFAULT TABLESPACE users; GRANT CONNECT, fin_role TO fin_clerk; -- 创建部门经理用户(部门ID=100) CREATE USER mgr_100 IDENTIFIED BY "Mgr@Secure2023#" DEFAULT TABLESPACE users; GRANT CONNECT, dept_mgr_role TO mgr_100;
步骤 3:配置行级安全策略(RLS)
3.1 创建策略函数(限制部门经理仅能访问本部门数据)
-- 创建策略函数
CREATE OR REPLACE FUNCTION hr.dept_access_policy(
schema_name IN VARCHAR2,
table_name IN VARCHAR2
) RETURN VARCHAR2 AS
user_dept_id NUMBER;
BEGIN
-- 获取用户的部门ID(假设存储在`user_dept_mapping`表中)
SELECT dept_id INTO user_dept_id
FROM user_dept_mapping
WHERE username = SYS_CONTEXT('USERENV', 'SESSION_USER');
-- 返回WHERE条件(限制`department_id`等于用户部门ID)
RETURN 'department_id = ' || user_dept_id;
END;
/
3.2 添加行级安全策略到
employees表
BEGIN DBMS_RLS.ADD_POLICY( object_schema => 'hr', object_name => 'employees', policy_name => 'dept_policy', function_schema => 'hr', policy_function => 'dept_access_policy', statement_types => 'SELECT, UPDATE', update_check => TRUE ); END; /
3.3 初始化用户-部门映射表
-- 创建映射表
CREATE TABLE user_dept_mapping (
username VARCHAR2(30) PRIMARY KEY,
dept_id NUMBER
);
-- 插入部门经理的部门信息
INSERT INTO user_dept_mapping VALUES ('MGR_100', 100);
COMMIT;
步骤 4:验证访问控制效果
4.1 HR用户
hr_analyst查询所有员工
CONNECT hr_analyst/Hr@Secure2023# SELECT * FROM hr.employees; -- 成功(具有HR_ROLE权限) 4.2 部门经理mgr_100仅能访问本部门数据 CONNECT mgr_100/Mgr@Secure2023# SELECT * FROM hr.employees; -- 仅返回`department_id=100`的员工(RLS策略生效) 4.3 财务用户fin_clerk尝试访问员工表 CONNECT fin_clerk/Fin@Secure2023# SELECT * FROM hr.employees; -- 失败(ORA-00942: 表或视图不存在,因未授予权限)
步骤 5:配置密码策略与审计(可选)
5.1 设置密码复杂性策略
-- 启用密码复杂性函数 ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function; -- 密码策略规则(示例): -- 最小长度12,包含大小写字母、数字、特殊字符
5.2 审计特权操作
-- 创建审计策略(审计角色分配) CREATE AUDIT POLICY audit_role_grants ACTIONS GRANT, REVOKE; AUDIT POLICY audit_role_grants;
关键点说明
-
需依赖Oracle Advanced Security选件及OTP服务(如RADIUS、Google Authenticator)。
-
行级安全(RLS):
动态过滤数据,实现“数据隔离”(如按部门、地区)。
-
策略函数可根据用户属性(如部门、角色)动态生成过滤条件。
-
角色分离:
HR_ROLE和FIN_ROLE实现职责分离(SoD)。 -
用户仅拥有完成工作所需的最小权限。
多因素认证(MFA):
防止密码泄露导致的未授权访问。
