陈老师:1415968548 郑老师:2735197625 乐老师:354331153
客服热线:
19941464235/19906632509(微信同号)

客服微信

【Oracle OCP】19c中的代理用户proxy user

作者:炎燚小寶
发布时间:2023-12-19 09:26
浏览量:755

本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。


大纲



一、为什么使用代理?


使用代理用户有两个主要原因。



二、代理用户和直通连接

从Oracle 9i Release 2开始,已经可以创建代理用户,允许我们通过不同的用户名/密码组合访问模式。这是通过在目标用户上使用GRANT CONNECT THROUGH子句来完成的。

2.1、创建测试用户

conn / as sysdba
-- Create SCHEMA_OWNER.
create user schema_owner identified by SecretPassword1;
grant create session to schema_owner;
-- Create proxy user.
create user my_user_1 identified by MyPassword1;
grant create session to my_user_1;


2.2、所有MY_USER_1用户建立到SCHEMA_OWNER用户的代理连接。

alter user schema_owner grant connect through my_user_1;


2.3、我们可以使用代理用户的凭据连接到SCHEMA_OWNER用户。

SQL> conn my_user_1[schema_owner]@pdb2
SQL> show user
USER is "SCHEMA_OWNER"
SQL>


2.4、可以使用以下命令撤销代理认证。

alter user schema_owner revoke connect through my_user_1;


    使用这种方法,管理员现在可以设置他们的特权帐户,使其可以通过访问访问任何其他用户,从而允许他们以该用户的身份执行任务,而不必更改用户的密码。



2.5、我们还可以对代理用户做很多其他的事情。这对于通过中间层访问数据的开发人员可能很有用,但对于dba可能不太有用。

-- Normal proxy.
alter user schema_owner grant connect through my_user_1;

-- Limit privileges to a specific role granted to the destination user.
alter user schema_owner grant connect through my_user_1 with role test_role;

-- Force authentication for authenticated roles.
alter user schema_owner grant connect through my_user_1 with role test_role authentication required;

-- Disable a specific role from the destination user.
alter user schema_owner grant connect through my_user_1 with role all except test_role;

-- Disable all roles from the destination user.
alter user schema_owner grant connect through my_user_1 with no roles;



这里以指定用户权限为例举例

1)创建业务帐号并授权
SYS@pdb2> CREATE USER apps IDENTIFIED BY oracle;
User created.

SYS@pdb2> grant connect,resource to apps;
Grant succeeded.

2)创建proxy用户
SYS@pdb2> CREATE USER appuser IDENTIFIED BY appuser;
User created.

3) appuser用户建立到app用户的代理连接
SYS@pdb2> ALTER USER apps GRANT CONNECT THROUGH appuser WITH ROLE connect;
User altered.

4)新开窗口,通过proxy用户连接数据库
[oracle@database ~]$ sqlplus appuser[apps]/appuser@pdb2

#当前用户显示是apps
APPS@pdb2> show user
USER is "APPS"

#无创建表的权限
APPS@pdb2> create table t1(id int);
create table t1(id int)
*
ERROR at line 1:
ORA-01031: insufficient privileges

#查看用户的系统权限
APPS@pdb2> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
SET CONTAINER

#查看用户的roles
APPS@pdb2> select * from session_roles;
ROLE
--------------------------------------------------------------------------------
CONNECT

5)再新开窗口,通过自身用户连接数据库
[oracle@database ~]$ sqlplus apps/oracle@pdb2
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jul 21 09:52:24 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
Last Successful login time: Fri Jul 21 2023 08:41:54 -07:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Session altered.

APPS@pdb2> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
SET CONTAINER
10 rows selected.

APPS@pdb2> select * from session_roles;
ROLE
--------------------------------------------------------------------------------
CONNECT
RESOURCE
SODA_APP
PLUSTRACE
APPS@pdb2>
APPS@pdb2>

APPS@pdb2> select * from session_roles;
ROLE
--------------------------------------------------------------------------------
CONNECT
RESOURCE
SODA_APP
PLUSTRACE


    总结:proxy用户可以在不知道核心业务帐号密码的情况下,通过部分授权登录到数据库,执行业务操作。


三、识别代理用户


可以使用PROXY_USERS视图识别代理用户。

select * from proxy_users;
PROXY               CLIENT             AUT FLAGS
------------------------------ ------------------------------ --- -----------------------------------
MY_USER_1            SCHEMA_OWNER          NO  PROXY MAY ACTIVATE ALL CLIENT ROLES


     V$SESSION视图只在USERNAME列中报告目标用户,因此我们无法看到哪些用户是直接连接,哪些用户是代理连接。加入V$SESSION_CONNECT_INFO视图使我们能够访问AUTHENITCATION_TYPE列,其中包含代理连接的值“PROXY”。这样我们就可以只查询使用代理身份验证的会话。查看proxy_sessions.sql脚本。

select s.sid, s.serial#, s.username, s.osuser, sci.authentication_type
from   v$session s,
       v$session_connect_info sci
where  s.sid = sci.sid
and    s.serial# = sci.serial#
and    sci.authentication_type = 'PROXY';



  代理用户详细信息是统一审计跟踪的一部分,因此您可以在审计记录中同时看到客户端和代理用户。


此视图仅在启用统一审计的Oracle数据库中填充
select dbusername,
       dbproxy_username
from   unified_audit_trail
where  dbproxy_username is not null;
DBUSERNAME       DBPROXY_USERNAME
-------------------- --------------------
SCHEMA_OWNER      MY_USER_1



当作为代理用户连接时,SYS_CONTEXT函数允许您访问以下参数。


column session_user format a20
column session_schema format a20
column current_schema format a20
column proxy_user format a20
select sys_context('userenv','session_user') as session_user,
       sys_context('userenv','session_schema') as session_schema,
       sys_context('userenv','current_schema') as current_schema,
       sys_context('userenv','proxy_user') as proxy_user
from   dual;
SESSION_USER     SESSION_SCHEMA    CURRENT_SCHEMA    PROXY_USER
-------------------- -------------------- -------------------- --------------------
SCHEMA_OWNER     SCHEMA_OWNER     SCHEMA_OWNER     MY_USER_1


四、代理用户的授权

    当我们考虑授权时,代理用户经常会让他们感到困惑。请记住,代理用户是登录到目标用户的另一种方式。登录后,您将作为目标用户运行,因此所有授权都需要应用于该用户,而不是您的用户或代理用户。例如

logged In As Destination User Apply Grants To
MY_USER_1 MY_USER_1 MY_USER_1
MY_USER_1[SCHEMA_OWNER] SCHEMA_OWNER SCHEMA_OWNER
SCHEMA_OWNER SCHEMA_OWNER SCHEMA_OWNER