实操Oracle 23C中认证和访问控制

来源:这里教程网 时间:2026-03-03 21:46:12 作者:

本次测试目标

      认证增强:为特权用户启用多因素认证(密码+OTP)。

    1. 访问控制

      通过角色分离限制用户权限(如 HR_ROLE、 FIN_ROLE)。

    2. 使用行级安全策略(RLS)实现数据隔离(例如,员工仅能查看本部门数据)。

步骤 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;

关键点说明

      多因素认证(MFA)

      防止密码泄露导致的未授权访问。

    1. 需依赖Oracle Advanced Security选件及OTP服务(如RADIUS、Google Authenticator)。

    2. 行级安全(RLS)

      动态过滤数据,实现“数据隔离”(如按部门、地区)。

    3. 策略函数可根据用户属性(如部门、角色)动态生成过滤条件。

    4. 角色分离

      HR_ROLE和 FIN_ROLE实现职责分离(SoD)。

    5. 用户仅拥有完成工作所需的最小权限。

相关推荐