使用代理用户连接到其他数据库用户而不知道他们的密码。
- 为什么是代理?
- 代理用户和连接方式
- 识别代理用户
- 代理用户授权
- 密码重置(9iR2 之前)
为什么是代理?
使用代理用户有两个主要原因。
- 一些 DBA 任务,例如创建私有数据库链接或使用包设置作业
DBMS_JOB
,需要管理员以特定用户身份登录。如果管理员不知道密码,这可能会出现问题。 - 您有多个开发人员在共享模式中工作。让多人共享相同的凭据会带来安全风险。相反,您为每个人创建一个单独的代理用户,允许他们使用自己的凭据连接到架构所有者。如果用户离开项目,您只需锁定或删除他们的用户,他们就不再有权访问共享模式。
代理用户和连接方式
从 Oracle 9i 第 2 版开始,可以创建代理用户,允许我们通过不同的用户名/密码组合访问模式。这是通过GRANT CONNECT THROUGH
对目标用户使用子句来完成的。
创建一些测试用户。
-- Connect to a privileged user. conn sys/SysPassword1@//localhost:1521/pdb1 as sysdba --drop user schema_owner cascade; --drop user my_user_1 cascade; -- 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;复制
所有MY_USER_1
用户都与该用户建立代理连接SCHEMA_OWNER
。
alter user schema_owner grant connect through my_user_1;复制
我们现在可以SCHEMA_OWNER
使用代理用户的凭据连接到用户。
SQL> conn my_user_1[schema_owner]/MyPassword1@//localhost:1521/pdb1 SQL> show user USER is "SCHEMA_OWNER" SQL>复制
可以使用以下命令撤销代理身份验证。
alter user schema_owner revoke connect through my_user_1;复制
使用这种方法,管理员现在可以将他们的特权帐户设置为通过访问任何其他用户进行连接,从而允许他们以该用户的身份执行任务,而无需更改用户的密码。
我们可以对代理用户做很多其他的事情。这些对于通过中间层访问数据的开发人员可能有用,但对 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;复制
识别代理用户
可以使用PROXY_USERS
视图识别代理用户。
select * from proxy_users; PROXY CLIENT AUT FLAGS ------------------------------ ------------------------------ --- ----------------------------------- MY_USER_1 SCHEMA_OWNER NO PROXY MAY ACTIVATE ALL CLIENT ROLES SQL>复制
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';复制
代理用户详细信息是统一审计跟踪的一部分,因此您可以在审计记录中看到客户端和代理用户。
select dbusername, dbproxy_username from unified_audit_trail where dbproxy_username is not null; DBUSERNAME DBPROXY_USERNAME -------------------- -------------------- SCHEMA_OWNER MY_USER_1 SQL>复制
当作为代理用户连接时,该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 SQL>复制
代理用户授权
代理用户在考虑赠款时经常使人们感到困惑。请记住,代理用户是登录目标用户的另一种方式。登录后,您将以目标用户身份运行,因此所有授权都需要应用于该用户,而不是您的用户或代理用户。例如。
登录为 | 目标用户 | 申请补助金 |
---|---|---|
MY_USER_1 | MY_USER_1 | MY_USER_1 |
MY_USER_1[SCHEMA_OWNER] | SCHEMA_OWNER | SCHEMA_OWNER |
SCHEMA_OWNER | SCHEMA_OWNER | SCHEMA_OWNER |
密码重置(9iR2 之前)
在 Oracle 9i 第 2 版中引入代理用户之前,当 DBA 不知道密码时,他们通常会使用以下技巧以其他用户身份进行连接。请不要再这样做了,因为代理用户解决了这个问题。
一种解决方法是保存用户当前的密码哈希,更改密码,登录并执行任务,然后将密码更改回哈希值。
-- Get the current password hash. conn / as sysdba select password from dba_users where username = 'SCOTT'; PASSWORD ------------------------------ F894844C34402B67 1 row selected. SQL> -- Reset the password to a known value. alter user scott identified by DummyPassword1; -- use the known password to connect to the user and perform the task. conn scott/DummyPassword1; -- #### Do the task now. #### -- Reset the password using the hash. conn / as sysdba alter user scott identified by values 'F894844C34402B67';复制
在 11g 中,该PASSWORD
列已从DBA_USERS
视图中删除,但您仍然可以从USER$
表中检索它。
select password from sys.user$ where name = 'SCOTT'; PASSWORD ------------------------------ F894844C34402B67 1 row selected. SQL>复制
logon_as_user_orig.sql和logon_as_user.sql脚本可以更轻松地检索相关信息以执行这些操作。
这种方法可以正常工作,但确实意味着有一段时间密码不正确,这可能会影响尝试建立新连接的用户和应用程序服务器。
原文标题:Proxy User Authentication and Connect Through in Oracle Databases
原文链接:https://oracle-base.com/articles/misc/proxy-users-and-connect-through