點選▲關註 “資料和雲” 給公眾號標星置頂
更多精彩 第一時間直達
老張拉呱:thomas zhang,甲骨文雲平臺事業部資深技術顧問,2008年加入甲骨文公司資料庫諮詢部門,10+年甲骨文解決方案諮詢支援經驗,資深系統工程師、Oracle OCM認證專家,具有豐富的Cloud /IT專案經驗。目前主要負責甲骨文中國北方區(醫院/衛生、交通、製造、教育、政府、證券、媒體、金融、零售等行業)客戶的資料庫、中介軟體、IaaS/PaaS、整合系統等相關技術解決方案諮詢工作。
簽名:我為人人,人人為我,三人行,必有我師。
新浪微博: http://weibo.com/tomszrp
從 Database 18c 開始,可以建立 Schema Only Account(可以擁有物件、許可權/角色,但不允許直接連線的 Schema),不過可以透過 single session proxy 的方式連線訪問。
這種型別的 account 設計既是為了滿足 Oracle-provided schemas 同時也適用於客戶應用設計的需要,建立使用者的時候不需要指定密碼或授權方式。除非使用 ALTER USER 陳述句分配身份驗證方法,否則無法對 Schema Only Account 進行身份驗證。DBA_USERS_WITH_DEFPWD資料字典檢視中不再包含Schema Only Account 資訊。
從19c開始,大部分Oracle-providedschemas,除了SYS,SYSTEM以及Sample Schema User Accounts(比如HR)都是Schema Only Account。也就是說,這些帳戶都是在沒有密碼的情況下建立的,好處是管理員無需週期性的維護這些密碼,同時也降低了攻擊者使用預設密碼侵入這些帳戶的安全風險。我們可以透過dba_users資料字典的authentication_type欄位來判斷,如果是NONE,表示該account是Schema Only的。當然了,當我們確實有需要的時候,可以為這些帳戶分配密碼,但是為了更好的安全性,Oracle 建議您使用完畢後將它們再設定為Schema Only。
•關於Schema Only Account的一些說明:
1)可以是 administrator 和 non-administratoraccounts
2)這種account只能在data base instance中建立,不支援 ASM instance
3)可以授予 system privileges (比如CREATE ANY TABLE)和管理員角色(比如DBA)
4)可以建立物件比如tables 、procedures等(根據所授許可權決定)
5)可以配置透過 single session proxy的方式連線訪問
6)不能透過 data base link 使用
tips:18c中Schema Only Account不能擁有SYSDBA,SYSOPER, SYSBACKUP, SYSKM, SYSASM, SYSRAC, SYSDG這些管理許可權,19c中取消了這一限制。
下麵是在18.3和19.2綜合體驗的一個筆記,希望能給大家一點啟發,後面大部分都是指令碼,介紹性的話語很少,我想大家應該能看明白。
1)建立一個Schema-Only Account
CDB$ROOT@SYS>conn sys/Alpha2019#@pdb1 as sysdba;
Connected.
PDB1@SYS>CREATE USER study NO AUTHENTICATION;
User created.
PDB1@SYS>CREATE USER toms IDENTIFIED BY toms default tablespace users;
User created.
PDB1@SYS>SELECT username, password, password_versions, account_status, authentication_type
FROM dba_users
WHERE username in (‘STUDY’,’TOMS’);
CREATE USER “STUDY” NO AUTHENTICATION
DEFAULT TABLESPACE “USERS”
TEMPORARY TABLESPACE “TEMP”
PDB1@SYS>
2)AUTHENTICATION 和 NO AUTHENTICATION之間的轉換
透過如下命令可以很容易的在Schema Only Account和Normal Account之間轉換:
ALTER USER … IDENTIFIED BY …;
ALTER USER … NO AUTHENTICATION;
說明:18c的時候Schema only accounts可以被授予所有的normal database roles和privileges,但不能是administrative privileges(比如SYSDBA, SYSOPER, SYSRAC等),否則會遇到類似如下的錯誤:
CDB$ROOT@cdb1>grant sysdba to study;
grant sysdba to study
*
ERROR at line 1:
ORA-40366: Administrative privilege cannot be granted to this user.
但19.2中是可以的,比如
CDB$ROOT@demo>grant sysdba to study;
Grant succeeded.
CDB$ROOT@demo>
PDB1@SYS>ALTER USER study IDENTIFIED BY study quota unlimited on users;
User altered.
PDB1@SYS>grant create session, create table to study;
Grant succeeded.
PDB1@SYS>conn study/study@pdb1
Connected.
PDB1@STUDY>
PDB1@STUDY>create table a (no int);
Table created.
PDB1@STUDY>create table b (str varchar2(32));
Table created.
PDB1@STUDY>conn sys/Alpha2019#@pdb1 as sysdba
Connected.
PDB1@SYS>grant sysdba to study;
Grant succeeded.
註意:在18c測試的時候,會遇到類似如下錯誤,所以必須先透過V$PWFILE_USERS 檢視找到那些administrative privileges並收回。
PDB1@pdb1>ALTER USER study no authentication;
ALTER USER study no authentication
*
ERROR at line 1:
ORA-40367: An Administrative user cannot be altered to have no authentication type.
CDB$ROOT@cdb1>revoke sysdba from study;
Revoke succeeded.
CDB$ROOT@cdb1>ALTER USER study no authentication;
User altered.
CDB$ROOT@cdb1>
說明:19c(19.2)測試中,是支援administrative privileges的,所以可以直接ALTER USER study no authentication;
這個時候,study使用者就不能直接連線訪問了,因為已經切換為Schema Only Account了 ,示例如下:
PDB1@pdb1>conn study/study@pdb1
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
PDB1@>
3)透過single session proxy方式訪問
我這裡用之前建立的toms使用者來做proxy user,下麵先在toms使用者下建立個測試表
PDB1@SYS>conn sys/Alpha2019#@pdb1 as sysdba
Connected.
PDB1@SYS>grant connect, resource to toms;
Grant succeeded.
PDB1@SYS>conn toms/toms@pdb1
Connected.
PDB1@TOMS>create table test (no int );
Table created.
PDB1@TOMS>
設定study(Scheam Only Account)透過toms代理連線(簡單示例,詳細語法參見相關手冊)
PDB1@TOMS>conn sys/Alpha2019#@pdb1 as sysdba
Connected.
PDB1@SYS>ALTER USER study GRANT CONNECT through toms;
User altered.
連線測試
PDB1@SYS>CONNECT toms[study]/toms@pdb1
Connected.
PDB1@STUDY>show user
USER is “STUDY”
PDB1@STUDY>SELECT sys_context(‘USERENV’,’SESSION_USER’) AS session_user,
sys_context(‘USERENV’,’SESSION_SCHEMA’) AS session_schema,
sys_context(‘USERENV’,’PROXY_USER’) AS proxy_id,
USER
FROM dual;
SESSION_USER SESSION_SCHEMA PROXY_ID USER
————— —————— ———– ————
STUDY STUDY TOMS STUDY
PDB1@STUDY>select table_name from tabs; ##看到的是study使用者下的物件
TABLE_NAME
—————–
B
A
PDB1@STUDY>insert into a values(1);
1 row created.
PDB1@STUDY>commit;
Commit complete.
PDB1@STUDY>select * from a;
NO
———-
1
PDB1@STUDY>
4)回收single session proxy訪問設定
PDB1@STUDY>conn sys/Alpha2019#@pdb1 as sysdba
Connected.
PDB1@SYS>select * from proxy_users;
PROXY CLIENT AUT FLAGS
—— ———- ——- ————————————-
TOMS STUDY NO PROXY MAY ACTIVATE ALL CLIENT ROLES
PDB1@SYS>ALTER USER study revoke CONNECT through toms;
User altered.
PDB1@SYS>select * from proxy_users;
no rows selected
PDB1@SYS>CONNECT toms[study]/toms@pdb1
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
PDB1@>
好了,本小節的簡單示例就到這裡,希望能給大家起到一點簡單的引導示範作用,不當之處,請以實際環境和當前檔案說明為準。