客服微信
本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。
前言
应用程序永远不应该访问模式所有者,无论是直接访问还是通过代理连接访问。你应该只以模式所有者的身份登录,因为你正在对模式对象进行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.
你仍然可以显式地锁定仅模式帐户以防止代理访问,但这将由管理员做出具体决定,而不是由于密码管理问题而意外发生。
在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