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

客服微信

【Oracle OCP】19c中的schema-only用户

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

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


前言

应用程序永远不应该访问模式所有者,无论是直接访问还是通过代理连接访问。你应该只以模式所有者的身份登录,因为你正在对模式对象进行DDL更改。应用程序应该使用具有模式对象权限的单独用户登录。下面的文章将对此进行描述。


本文的其余部分将重点介绍在我们需要连接执行维护时,如何控制对模式所有者的访问。它不是关于如何为应用程序连接设置用户。

一、抛出一个问题


通常的做法是限制对模式所有者的直接访问,防止人们使用共享凭据访问它。相反,它们通过代理连接访问它来执行模式更改,从而允许你审计哪些用户执行了哪些任务。例如,我们使用以下命令创建一个名为SCHEMA_OWNER的模式所有者。

conn / as sysdba
alter session set container = pdb1;
--drop user schema_owner cascade;
create user schema_owner identified by secret_password
  quota unlimited on users;
  
grant create session, create table, create sequence, create view to schema_owner;


创建将用作代理用户的用户。

CREATE USER proxy_user IDENTIFIED BY my_password;
GRANT CREATE SESSION TO proxy_user;


然后,我们允许通过一个名为TIM的用户建立到SCHEMA_OWNER用户的代理连接。

alter user schema_owner grant connect through proxy_user;


现在,我们可以使用以下语法连接到模式所有者。

--conn proxy_user[schema_owner]/password@pdb1
conn proxy_user[schema_owner]/my_password@pdb1
Connected.
SQL> show user
USER is "SCHEMA_OWNER"


这可以正常工作,但是如果你知道密码,仍然可以创建到模式所有者的直接连接。此外,如果模式所有者由于多次失败的连接尝试而被锁定,或者密码过期导致前者,则代理连接将失败。我们可以通过显式锁定模式所有者来演示这一点。

-- Lock the user.
conn / as sysdba
alter session set container = pdb1;
alter user schema_owner account lock;
-- Test the proxy connection
conn proxy_user[schema_owner]/my_password@pdb1
ERROR:
ORA-28000: The account is locked.
Warning: You are no longer connected to ORACLE.
SQL>


这不是一个理想的情况。


二、仅模式帐户(解决方案)

为了解决这个问题,Oracle 18c引入了一个模式帐户。由于没有指定身份验证方法,因此不允许直接连接到用户,并且用户不受密码过期等密码管理的约束。只有模式的帐户可以使用NO AUTHENTICATION子句创建。

conn / as sysdba
alter session set container = pdb1;
drop user schema_owner cascade;
create user schema_owner no authentication
  quota unlimited on users;
  
grant create session, create table, create sequence, create view to schema_owner;


我们可以在不指定身份验证子句的情况下实现相同的功能。这在功能上等同于使用NO AUTHENTICATION子句。

drop user schema_owner cascade;
create user schema_owner
  quota unlimited on users;
  
grant create session, create table, create sequence, create view to schema_owner;


然后,我们允许通过一个名为TIM的用户与SCHEMA_OWNER用户建立代理连接,就像我们之前所做的那样。

ALTER USER schema_owner GRANT CONNECT THROUGH proxy_user;


现在,我们可以使用以下语法连接到模式所有者。

--conn proxy_user[schema_owner]/password@pdb1
conn proxy_user[schema_owner]/my_password@pdb1
Connected.
SQL>


不可能与模式所有者建立直接连接,除非随后使用ALTER USER命令添加身份验证方法。


DBA_USERS视图下的认证类型为NONE。

conn / as sysdba
alter session set container = pdb1;
column username format a30
column account_status format a20
select username,
       account_status,
       authentication_type
from   dba_users
where  username = 'SCHEMA_OWNER';
USERNAME             ACCOUNT_STATUS    AUTHENTICATION_TYPE
------------------------------ -------------------- ------------------------
SCHEMA_OWNER           OPEN         NONE


可以使用ALTER user命令将现有用户转换为仅模式用户。你可以使用以下查询来检查是否存在管理员权限。如果存在,则需要在发出alter user命令之前撤销它们。

select username,
       sysdba,
       sysoper,
       sysasm,
       sysbackup,
       sysdg,
       syskm
from   v$pwfile_users
where  username = 'SCHEMA_OWNER';
no rows selected


假设没有管理员权限,则只能使用以下命令将该帐户设置为模式。

alter user schema_owner no authentication;
User altered.


你仍然可以显式地锁定仅模式帐户以防止代理访问,但这将由管理员做出具体决定,而不是由于密码管理问题而意外发生。


19c Update

在Oracle 19c中,“无管理权限”限制已经取消,但文档仍然说限制是适当的(这里)。下面的例子演示了行为的变化。


Oracle 18c版本.

create user test_sysdba identified by test_sysdba;

grant create session, sysdba to test_sysdba ;

select username,
       sysdba,
       sysoper,
       sysasm,
       sysbackup,
       sysdg,
       syskm
from   v$pwfile_users
where  username = 'TEST_SYSDBA';
    USERNAME   SYSDBA   SYSOPER  SYSASM   SYSBACKUP  SYSDG   SYSKM
_________________ _________ __________ _________ ____________ ________ ________
TEST_SYSDBA  TRUE    FALSE    FALSE   FALSE     FALSE    FALSE


SQL>
alter user test_sysdba no authentication
Error report -
ORA-40367: An Administrative user cannot be altered to have no authentication
type.
40367. 00000 -  "An Administrative user cannot be altered to have no authentication type."
*Cause:    An attempt was made to alter an administrative user to have no
           authentication type.
*Action:   Revoke administrative privilege from the user
           before attempting to alter the user.
SQL>

Oracle 19c版本.


--drop user test_sysdba cascade;
create user test_sysdba identified by test_sysdba;
grant create session, sysdba to test_sysdba ;
select username,
       sysdba,
       sysoper,
       sysasm,
       sysbackup,
       sysdg,
       syskm
from   v$pwfile_users
where  username = 'TEST_SYSDBA';
    USERNAME   SYSDBA  SYSOPER  SYSASM   SYSBACKUP  SYSDG   SYSKM
_________________ _________ __________ _________ ____________ ________ ________
TEST_SYSDBA  TRUE    FALSE   FALSE   FALSE     FALSE   FALSE


SQL>alter user test_sysdba no authentication;
User TEST_SYSDBA altered