客服微信
本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。
代理用户和直接连接
识别代理用户
代理用户的授权
使用代理用户有两个主要原因。
某些DBA任务,如创建私有数据库链接或使用DBMS_JOB包设置作业,需要管理员以特定用户身份登录。如果管理员不知道密码,这可能会出现问题。
您有多个开发人员在共享模式中工作。让多人共享相同的凭据会带来安全风险。相反,您为每个人创建一个单独的代理用户,允许他们使用自己的凭据连接到模式所有者。如果用户离开一个项目,您只需锁定或删除他们的用户,并且他们不再具有对共享模式的访问权。
从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 |