暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 数据库中的代理用户身份验证和连接,不知道密码连接到其他数据库用户

原创 小小亮 2022-10-14
1730

使用代理用户连接到其他数据库用户而不知道他们的密码。

  • 为什么是代理?
  • 代理用户和连接方式
  • 识别代理用户
  • 代理用户授权
  • 密码重置(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_1MY_USER_1MY_USER_1
MY_USER_1[SCHEMA_OWNER]SCHEMA_OWNERSCHEMA_OWNER
SCHEMA_OWNERSCHEMA_OWNERSCHEMA_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.sqllogon_as_user.sql脚本可以更轻松地检索相关信息以执行这些操作。

这种方法可以正常工作,但确实意味着有一段时间密码不正确,这可能会影响尝试建立新连接的用户和应用程序服务器。



原文标题:Proxy User Authentication and Connect Through in Oracle Databases

原文链接:https://oracle-base.com/articles/misc/proxy-users-and-connect-through

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论