ORACLE數據庫兩種安全驗證模式
1. 操作系統認證
我們可以將Linux的用戶加入到oinstall,dba組中,然后在Oracle本地登陸或者使用遠程登陸,可以作為sysdba登錄,在數據庫級不需要提供密碼(具體操作見附1)。
SQLPLUS / as SYSDBA
Linux默認支持操作系統認證,要關閉操作系統驗證,可以:
- 在$ORACLE_HOME/network/admin目錄下創建sqlnet.ora,添加:SQLNET.AUTHENTICATION_SERVICES = (NONE)。
- 取消用戶的dba和oinstall組。
2. 口令認證
Oracle的口令文件存放所有sysdba或者sysoper權限的用戶的口令,如果想以sysdba權限遠程連接數據庫,必須使用口令文件,否則不能連上。
使用口令文件的好處是即使數據庫不處於open狀態,依然可以通過口令文件驗證來連接數據庫。
安裝完oracle,口令文件中只存放了sys的口令。如果之后把sysdba權限授予了普通用戶,那么此時會把普通用戶的口令從數據庫中讀到口令文件中保存下來,這時要求數據庫處於open狀態。
重新建立口令文件
orapwd file=$ORACLE_HOME/dbs/orapw$ORACL_SID password=oracle force=y format=12 --format=12支持弱口令。
REMOTE_LOGIN_PASSWORDFILE參數
REMOTE_LOGIN_PASSWORDFILE參數增強系統的安全性,所謂提高安全性就是禁止以SYSDBA或SYSOPER特權用戶從客戶端登陸到數據庫系統中。
show parameter remote_login_passwordfile NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ remote_login_passwordfile string EXCLUSIVE
- EXCLUSIVE:允許客戶端以SYSDBA或SYSOPER權限登錄到數據庫實例中完成數據庫管理操作;
允許授予和回收SYSDBA或SYSOPER權限。(允許你在sys用戶下使用alter user sys identified by xxx;給sys用戶修改密碼的) - NONE:禁止客戶端以SYSDBA或SYSOPER權限登錄到數據庫實例中完成數據庫管理操作;
禁止授予和回收SYSDBA或SYSOPER權限。 - SHARED:允許客戶端以SYSDBA或SYSOPER權限登錄到數據庫實例中完成數據庫管理操作;
禁止授予和回收SYSDBA或SYSOPER權限。(不允許你在sys用戶下使用alter user sys identified by xxx;給sys用戶修改密碼的)
使用alter system命令更改,因為修改的是SPFILE,所以修改后,需要重新啟動數據庫才能看到效果。
SQL> alter system set remote_login_passwordfile=shared scope=spfile; System altered. SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down.
SQL> startup ORACLE instance started. SQL> show parameter remote_login_passwordfile NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ remote_login_passwordfile string SHARED
權限Privilege
- 系統權限:獲得訪問數據庫的權限 並且能執行特定DDL操作
- 對象權限:處理數據庫對象的內容 比如說SELECT UPDATE INSERT
系統權限
方案/模式(SCHEMA):對象的集合,例如表、視圖、序列和同義詞的集合,並且SCHEMA和USER是同名。
系統權限示例
-- CREATE SESSION 創建會話
-- CREATE TABLE 創建表
-- CREATE SEQUENCE 創建序列
-- CREATE VIEW 創建視圖
-- CREATE PROCEDURE 創建存儲過程
創建用戶: CREATE USER USER_NAME IDENTIFIED BY PASSWORD;
刪除用戶:DROP USER USER_NAME;
為用戶授予系統權限 GRANT 權限 TO USER.
為用戶取消系統權限 REVOKE 權限 FROM USER
--授權
GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE VIEW TO scott; Grant succeeded.
--取消授權 REVOKE CREATE SEQUENCE, CREATE VIEW FROM scott;
查看某個用戶當前的系統權限:(用戶名請使用大寫並在sys用戶下執行)
SELECT grantee, privilege FROM dba_sys_privs WHERE GRANTEE = 'SCOTT'; --scott要大寫 GRANT PRIVILEGE ----- ---------------------------------------- SCOTT CREATE TABLE SCOTT CREATE SESSION
對象權限
用戶在自己的SCHEMA中具有所有的對象的權限。用戶可以授權給任何其他用戶或角色。
不同類型的方案對象(SCHEMA)具有不同的對象權限。
對象權限特點:
- 對象權限會根據對象的不同而變化。
- 對象的所有者對其具有全部權限。
- 所有者可以將屬於他的對象權限授予其他用戶。
對象權限
對象權限授權實例
HR用戶賦予對象權限給SCOTT用戶
GRANT SELECT, UPDATE
ON employees
TO scott;
Grant succeeded.
查看用戶的對象權限
--查scott用戶權限,就在scott用戶下進行
COL grantee FOR a20 COL owner FOR a20 COL table_name FOR a20 COL privilege FOR a20 set lines 200 set pages 200 SELECT grantee, owner, table_name, privilege FROM user_tab_privs WHERE grantee='SCOTT'; GRANTE OWNER TABLE_NAME PRIVILEGE ------ -------------------- -------------------- -------------------- SCOTT HR EMPLOYEES SELECT SCOTT HR EMPLOYEES UPDATE
撤銷對象權限
CASCADE 如果要刪除通過REFERENCES權限對該對象實行的
CONSTRAINTS 任何引用完整性約束,則此項是必須的
REVOKE SELECT,UPDATE
ON employees
FROM scott;
Revoke succeeded.
WITH ADMIN OPTION(系統權限)
被授予該權限的用戶有權將某個他已有的系統權限授予其他用戶或角色。
他有兩個特點:
- 如果用戶使用WITH ADMIN OPTION為某個用戶授予系統權限,取消父用戶的系統權限並不會級聯取消子用戶的權限。
- 系統權限無級聯,即A授予B系統權限,B授予C系統權限,如果A收回B的系統權限,C的系統權限不受影響;系統權限可以跨用戶回收,即A可以直接收回C用戶的權限。
SYS:
GRANT CREATE SESSION TO LEO
WITH ADMIN OPTION;
LEO:
GRANT CREATE SESSION TO KEVIN;
REVOKE LEO的權限不影響Kevin的登陸。
Kevin無法給其他用戶授權CREATE SESSION,提示權限不夠。
WITH GRANT OPTION(對象權限)
授予該權限的用戶有權將對象權限授予其他用戶或角色。
如果取消父用戶的對象權限,那么對於這個用戶使用WITH GRANT OPTION授予權限的用戶來說,取消WITH GRANT OPTION授權是級聯的。
HR:
GRANT SELECT
ON EMPLOYEES
TO leo
WITH GRANT OPTION;
LEO:
GRANT SELECT
ON hr.employees
TO KEVIN;
--revoke leo的權限會同樣revoke掉kevin的權限。revoke后,kevin進行查詢會提示沒有表或者視圖
角色 ROLE
可以創建角色,並分配系統權限與對象權限,然后再將角色分配給用戶。
常見的預定義角色: CONNECT, RESOURCE, DBA等。
--創建角色 CREATE ROLE service_leader;
CREATE ROLE manager IDENTIFIED BY oracle;
--為角色分配系統權限 GRANT create session, create table, create view TO service_leader; --為角色分配對象權限 GRANT select ON hr.employees TO service_leader; --查看角色的系統權限 SELECT * FROM role_sys_privs WHERE role='SERVICE_LEADER'; --查看角色的對象權限 SELECT * FROM dba_tab_privs WHERE GRANTEE='SERVICE_LEADER';
--刪除角色
DROP ROLE service_leader;
--一個組可以授權給另外一個組
SQL> GRANT DBA TO service_leader;
Grant succeeded.
--SYSDBA和SYSOPER無法再被授權
SQL> GRANT SYSDBA TO service_leader;
ERROR at line 1:
ORA-01931: cannot grant SYSDBA to a role
SQL> GRANT SYSOPER TO service_leader;
ERROR at line 1:
ORA-01931: cannot grant SYSOPER to a role
DBLINK數據庫連接
允許本地用戶訪問遠程數據庫中的數據。服務器提前與遠程服務器建立鏈接。
第一種:私有數據庫連接(需要CREATE DATABAS LINK權限)
CREATE DATABASE LINK hr_19c CONNECT TO hr IDENTIFIED BY "hr" USING '192.168.16.66:1521/orcl';
注: hr/hr是遠程服務器的用戶名和密碼; 192.168.16.66是遠程的服務器;orcl是實例名
第二種:公共數據庫連接(需要CREATE PUBLIC DATABAS LINK權限)
CREATE PUBLIC DATABASE LINK hr_19c_P CONNECT TO hr IDENTIFIED BY "hr" USING '192.168.16.66:1521/orcl';
注: hr/hr是遠程服務器的用戶名和密碼; 192.168.16.66是遠程的服務器;orcl是實例名
--用戶需要有CREATE DATABASE LINK的權限或者CREATE PUBLIC DATABASE LINK的權限。
GRANT CREATE DATABASE LINK, CREATE PUBLIC DATABASE LINK TO hr;
--刪除建立的DATABASE LINK,用戶創建的私有dblink,只能在此用戶下刪除,sys看不到。
DROP DATABASE LINK hr_to_12c;
--刪除PUBLIC DATABASE LINK, 有DROP PUBLIC DATABASE LINK的用戶可以刪除其他人創建的PUBLIC DATABASE LINK.
DROP PUBLIC DATABASE LINK hr_to_12c_p;
附1:
1. 環境變量中添加下列語句(root)
vim /etc/profile
if [ $USER = "leo" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
source /etc/profile
useradd -g oinstall -G dba,oper leo
passwd leo
su - leo
vim .bash_profile
export EDITOR=vi
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_SID=orcl
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19c/db_1
export INVENTORY_LOCATION=/u01/oraInventory
export TNS_ADMIN=$ORACLE_HOME/network/admin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
export PATH=$ORACLE_HOME/bin:/bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:$PATH:$HOME/bin
umask 022
source .bash_profile
至此,leo用戶可以使用數據庫。