Oracle用户,權限,角色以及登錄管理
1. sys和system用户的區別
system用户只能用normal身份登陸em。除非你對它授予了sysdba的系統權限或者syspoer系統權限。
sys用户具有“SYSDBA”或者“SYSOPER”權限,登陸em也只能用這兩個身份,不能用normal。
--
最重要的區別,存儲的數據的重要性不同
sys所有oracle的數據字典的基表和視圖都存放在sys用户中,這些基表和視圖對於oracle的運行是至關重要的,由數據庫自己維護,任何用户都不能手動更改。sys用户擁有dba,sysdba,sysoper等角色或權限,是oracle權限最高的用户。
system用户用於存放次一級的內部數據,如oracle的一些特性或工具的管理信息。system用户擁有普通dba角色權限。
“SYSOPER”權限,即數據庫操作員權限,權限包括:
打開數據庫服務器 關閉數據庫服務器
備份數據庫 恢復數據庫
日誌歸檔 會話限制
“SYSDBA”權限,即數據庫管理員權限,權限包括:
打開數據庫服務器 關閉數據庫服務器
備份數據庫 恢復數據庫
日誌歸檔 會話限制
管理功能 創建數據庫
normal 是普通用户,只有通過被sys授權之後才可以對數據庫進行操作
sysdba擁有最高的系統權限
sysoper主要用來啓動、關閉數據庫,sysoper 登陸後用户是 public
sysdba登陸後是sys,而且只能是SYS登錄sysdba.
[html] view plain copy
1. SQL> conn / as sysdba
2. 已連接。
3. SQL> grant sysoper to test;
4. 授權成功。
5. SQL> conn test/test as sysoper;
6. 已連接。
7. SQL> show user
8. USER 為"PUBLIC"
9. SQL> conn test/test as sysdba
10. 已連接。
11. SQL> show user
12. USER 為"SYS"
13. SQL>
|
系統權限 |
sysdba |
sysoper |
|
區別 |
Startup(啓動數據庫) |
startup |
|
Shutdown(關閉數據庫) |
shutdown |
|
|
alter database open/mount/backup |
alter database open/mount/backup |
|
|
改變字符集 |
none |
|
|
create database(創建數據庫) |
None不能創建數據庫 |
|
|
drop database(刪除數據庫) |
none |
|
|
create spfile |
create spfile |
|
|
alter database archivelog(歸檔日誌) |
alter database archivelog |
|
|
alter database recover(恢復數據庫) |
只能完全恢復,不能執行不完全恢復 |
|
|
擁有restricted session(會話限制)權限 |
擁有restricted session權限 |
|
|
可以讓用户作為sys用户連接 |
可以進行一些基本的操作,但不能查看用户數據 |
|
|
登錄之後用户是sys |
登錄之後用户是public |
system如果正常登錄,它其實就是一個普通的dba用户,但是如果以as sysdba登錄,其結果實際上它是作為sys用户登錄的,這一點類似Linux裏面的sudo的感覺,從登錄信息裏面我們可以看出來。因此在as sysdba連接數據庫後,創建的對象實際上都是生成在sys中的。其他用户也是一樣,如果 as sysdba登錄,也是作為sys用户登錄的,看以下實驗:
[html] view plain copy
1. SQL> create user strong identified by strong;
2. 用户已創建。
3. SQL> conn strong/strong@magick as sysdba;
4. 已連接。
5. SQL> show user;
6. USER 為 "SYS"
7. SQL> create table test(a int);
8. 表已創建。
9. SQL> select owner from dba_tables where table_name='test';
10. 未選定行 //因為創建表時oracle自動轉為大寫,所以用小寫查的時候是不存在的;
11. SQL> select owner from dba_tables where table_name='TEST';
12. OWNER
13. ------------------------------
14. SYS
3.dba和sysdba的區別
dba、sysdba這兩個系統角色有什麼區別呢
在説明這一點之前我需要説一下oracle服務的創建過程
·創建實例
·啓動實例
·創建數據庫(system表空間是必須的)
啓動過程
·實例啓動
·裝載數據庫
·打開數據庫
sysdba,是管理oracle實例的,它的存在不依賴於整個數據庫完全啓動,
只要實例啓動了,它就已經存在,以sysdba身份登陸,裝載數據庫、打開數據庫
只有數據庫打開了,或者説整個數據庫完全啓動後,dba角色才有了存在的基礎,dba只是個角色而已.
4.在查詢用户角色表的時候,沒有看到sysdba等角色,為什麼?
[html] view plain copy
1. sys@WENCHAOD> select role from dba_roles order by role
2. 2 ;
3.
4. ROLE
5. ------------------------------
6. ADM_PARALLEL_EXECUTE_TASK
7. APEX_ADMINISTRATOR_ROLE
8. AQ_ADMINISTRATOR_ROLE
9. AQ_USER_ROLE
10. AUTHENTICATEDUSER
11. CONNECT
12. CSW_USR_ROLE
13. CTXAPP
14. CWM_USER
15. DATAPUMP_EXP_FULL_DATABASE
16. DATAPUMP_IMP_FULL_DATABASE
17. DBA
18. DBFS_ROLE
19. DELETE_CATALOG_ROLE
20. EJBCLIENT
21. EXECUTE_CATALOG_ROLE
22. EXP_FULL_DATABASE
23. GATHER_SYSTEM_STATISTICS
24. GLOBAL_AQ_USER_ROLE
25. HS_ADMIN_EXECUTE_ROLE
26. HS_ADMIN_ROLE
27. HS_ADMIN_SELECT_ROLE
28. IMP_FULL_DATABASE
29. JAVADEBUGPRIV
30. JAVAIDPRIV
31. JAVASYSPRIV
32. JAVAUSERPRIV
33. JAVA_ADMIN
34. JAVA_DEPLOY
35. JMXSERVER
36. LOGSTDBY_ADMINISTRATOR
37. MGMT_USER
38. OEM_ADVISOR
39. OEM_MONITOR
40. OLAPI_TRACE_USER
41. OLAP_DBA
42. OLAP_USER
43. OLAP_XS_ADMIN
44. ORDADMIN
45. OWB$CLIENT
46. OWB_DESIGNCENTER_VIEW
47. OWB_USER
48. RECOVERY_CATALOG_OWNER
49. RESOURCE
50. SCHEDULER_ADMIN
51. SELECT_CATALOG_ROLE
52. SPATIAL_CSW_ADMIN
53. SPATIAL_WFS_ADMIN
54. WFS_USR_ROLE
55. WM_ADMIN_ROLE
56. XDBADMIN
57. XDB_SET_INVOKER
58. XDB_WEBSERVICES
59. XDB_WEBSERVICES_OVER_HTTP
60. XDB_WEBSERVICES_WITH_PUBLIC
61.
62. 55 rows selected.
63.
64. sys@WENCHAOD>
解釋:
dba是Oracle裏的一種對象,Role 和User一樣,是實實在在存在在Oracle裏的物理對象,而sysdba是指的一種概念上的操作對象,在Oracle數據裏並不存在。
所以説這兩個概念是完全不同的。dba是一種role對應的是對Oracle實例裏對象的操作權限的集合,而sysdba是概念上的role是一種登錄認證時的身份標識而已。
[html] view plain copy
1. --grant dba 和grant sysdba的差別
2. --dba是正真的role,所以grant後在dba_role_privs裏有記錄,而revoke後就沒有了
3.
4. SQL> grant dba to testuser;
5. SQL> select * from dba_role_privs where grantee
6. GRANTEE GRANTED_ROLE ADM DEF
7. —————————— —————————— — —
8. TESTUSER RESOURCE NO YES
9. TESTUSER CONNECT NO YES
10. TESTUSER DBA NO YES
11. SQL> revoke dba from testuser;
12. SQL> select * from dba_role_privs where grantee
13. GRANTEE GRANTED_ROLE ADM DEF
14. —————————— —————————— — —
15. TESTUSER RESOURCE NO YES
16. TESTUSER CONNECT NO YES
17.
18. --對於sysdba是不會出現這個情況的,因為他不是正真的role
19. SQL> grant sysdba to testuser;
20. SQL> select * from dba_role_privs where grantee
21. GRANTEE GRANTED_ROLE ADM DEF
22. —————————— —————————— — —
23. TESTUSER RESOURCE NO YES
24. TESTUSER CONNECT NO YES
那麼這個是sysdba是這麼記錄的叻,
我在一個文章和帖子裏對對sysdba的登錄有過詳細的敍述
對了,sysdba是登錄時候需要的他是和remote_login_passwordfile關聯的
我們可以查詢v$pwfile_users;
如下:
SQL> select * from v$pwfile_users;
USERNAME SYSDB SYSOP
—————————— —– —–
SYS TRUE TRUE
SYSTEM TRUE FALSE
TESTUSER TRUE FALSE
當你grant sysdba後,在這裏就多了一條
下面我們revoke一下,再來看
SQL> revoke sysdba from testuser;
SQL> select * from v$pwfile_users;
USERNAME SYSDB SYSOP
—————————— —– —–
SYS TRUE TRUE
SYSTEM TRUE FALSE
沒有叻。
所以在這裏dba和sysdba是根本不同概念了。
有關sysdba登錄的解釋可以查看帖子
5.Oracle數據庫登錄一些命令及解釋
1、啓動 oracle數據庫:
從root切換到oracle用户進入:
su - oracle
進入sqlplus環境,nolog參數表示不登錄:
sqlplus /nolog
以管理員模式登錄:
sqlplus / as sysdba
啓動數據庫
startup;
停止數據庫
shutdown immediate
遠程連接數據庫
sqlplus /nolog
conn sys/sys@ip:1521/orainstance as sysdba
也可以直接運行:
dbstart
#啓動數據庫的腳本
dbshut
#停止數據庫的腳本
2、數據庫監聽:
啓動監聽服務:
lsnrctl start
停止監聽服務:
lsnrctl stop
查看監聽狀態:
lsnrctl status
3、用户權限管理:
注:以下命令都需要DBA權限。
創建用户:
create user ittbank identified by 123456 ;
賦予用户的表空間權限:
alter user ittbank default tablespace ittbank;;
或者兩條命令合併為:
create user ittbank identified by 123456 default tablespace ittbank;
注:剛剛創建完的新用户是沒有任何權限的,甚至連登錄數據庫的權限都沒有。這時使用conn 用户名/密碼 會提示沒有權限。在新建一個用户之後還要對這個用户進行授權操作。當然是要使用有能力授權的用户,如sys、system。角色是指由系統權限集合。通常給某個用户授予權限時如果沒有角色存在的話,那麼需要一條一條的操作,角色的存在就是使得授權變得很方便。通常一個角色由多個系統權限組成。常用的角色有三個connect(7種權限)、dba、resource(在任何表空間建表)。
授予用户管理權限:
grant connect,resource,dba to ittbank ;
刪除用户
drop user“name”cascade;
注:cascade參數是級聯刪除該用户所有對象,經常遇到如用户有對象而未加此參數則用户刪不了的問題,所以習慣性的加此參數。“name”的引號有無都是一樣的。
修改用户密碼
password ittbank( 在用户已經連接的情況下 )或者
alter user ittbank identified by newpassword
注意:在給其他用户修改密碼時,需要具有DBA的權限或擁有alter user的系統權限。
查看當前用户的角色
select * from user_role_privs;
select * from session_privs;
查看當前用户的系統權限和表級權限
select * from user_sys_privs;
select * from user_tab_privs;
查詢用户表
select name from dba_users;
修改用户口令
alter user "name" identified by "password";
顯示當前用户
show user;
6.ORACLE用户權限管理筆記整理
select username from dba_users; 查詢系統所有用户
select * from dba_users where username = 'XXXX';查詢用户相關信息
select * from dba_roles; 查詢系統所有角色
DBA_ROLE_PRIVS 查詢某個用户具有的角色或者某個角色下的有哪些用户
select * from dba_role_privs wheregrantee ='SYS';
select * fromdba_role_privs where granted_role ='RESOURCE';
DBA_SYS_PRIVS 查詢某個用户具有的系統權限
select grantee,privilege from dba_sys_privs where grantee='XXXX';
ROLE_SYS_PRIVS顯示授予角色的系統權限
select* from role_sys_privs where role = 'RESOURCE';查詢RESOURCE角色相關的權限
ROLE_TAB_PRIVS顯示授予角色的表權限
管理用户、角色和權限的DBA視圖:
DBA_USERS 提供用户的信息
DBA_ROLES 顯示數據庫中所有角色
DBA_COL_PRIVS 顯示列級對象授權
DBA_ROLE_PRIVS 顯示用户及其角色
DBA_SYS_PRIVS 顯示被授予系統權限的用户
DBA_TAB_PRIVS 顯示用户及他們在表上的權限
ROLE_ROLE_PRIVS 顯示授予角色的角色
ROLE_SYS_PRIVS 顯示授予角色的系統權限
ROLE_TAB_PRIVS 顯示授予角色的表權限
SESSION_PRIVS 顯示允許用户使用的權限
SESSION_ROLES 顯示當前允許用户使用的角色
select * from session_privs;查詢用户本身擁有的權限
select * from user_role_privs;查詢用户本身擁有的角色
select * from dba_sys_privs where grantee='CONNECT'; 查詢角色所擁有的權限
select * from role_sys_privs where role='CONNECT';查詢角色所擁有的權限
7.權限講解
(
首先我應該分清權限和角色,大致講講
權限
oracle提供兩種權限(系統權限sys privileges和對象(實體)權限object privileges)
角色:是具有名稱的一組系統權限和對象權限的集合
)
一、權限分類:
系統權限:系統規定用户使用數據庫的權限。(系統權限是對用户而言)。
實體權限:某種權限用户對其它用户的表或視圖的存取權限。(是針對表或視圖而言的)。
二、系統權限管理:
1、系統權限分類:
DBA: 擁有全部特權,是系統最高權限,只有DBA才可以創建數據庫結構。
RESOURCE:擁有Resource權限的用户只可以創建實體,不可以創建數據庫結構。
CONNECT:擁有Connect權限的用户只可以登錄Oracle,不可以創建實體,不可以創建數據庫結構。
對於普通用户:授予connect, resource權限。
對於DBA管理用户:授予connect,resource, dba權限。
2、系統權限授權命令:
[系統權限只能由DBA用户授出:sys, system(最開始只能是這兩個用户)]
授權命令:SQL> grant connect, resource, dba to 用户名1 [,用户名2]...;
[普通用户通過授權可以具有與system相同的用户權限,但永遠不能達到與sys用户相同的權限,system用户的權限也可以被回收。]
例:
SQL> connect system/manager
SQL> Create user user50 identified by user50;
SQL> grant connect, resource to user50;
查詢用户擁有哪裏權限:
SQL> select * from dba_role_privs;
SQL> select * from dba_sys_privs;
SQL> select * from role_sys_privs;
刪除用户:SQL> drop user 用户名 cascade; //加上cascade則將用户連同其創建的東西全部刪除
3、系統權限傳遞:
增加WITH ADMIN OPTION選項,則得到的權限可以傳遞。
SQL> grant connect, resorce to qwith admin option; //可以傳遞所獲權限。
4、系統權限回收:系統權限只能由DBA用户回收
命令:SQL> Revoke connect, resource from user50;
説明:
1)如果使用WITH ADMIN OPTION為某個用户授予系統權限,那麼對於被這個用户授予相同權限的所有用户來説,取消該用户的系統權限並不會級聯取消這些用户的相同權限。
2)系統權限無級聯,即A授予B權限,B授予C權限,如果A收回B的權限,C的權限不受影響;系統權限可以跨用户回收,即A可以直接收回C用户的權限。
三、實體權限管理
1、實體權限分類:select, update, insert, alter, index, delete, all //all包括所有權限
execute //執行存儲過程權限
user01:
SQL> grant select, update, insert on product to user02;
SQL> grant all on product to user02;
user02:
SQL> select * from user01.product;
// 此時user02查user_tables,不包括user01.product這個表,但如果查all_tables則可以查到,因為他可以訪問。
2. 將表的操作權限授予全體用户:
SQL> grant all on product to public; // public表示是所有的用户,這裏的all權限不包括drop。
[實體權限數據字典]:
SQL> select owner, table_name from all_tables; // 用户可以查詢的表
SQL> select table_name from user_tables; // 用户創建的表
SQL> select grantor, table_schema, table_name, privilege from all_tab_privs; // 獲權可以存取的表(被授權的)
SQL> select grantee, owner, table_name, privilege from user_tab_privs; // 授出權限的表(授出的權限)
3. DBA用户可以操作全體用户的任意基表(無需授權,包括刪除):DBA用户:
SQL> Create table stud02.product(
id number(10),
name varchar2(20));
SQL> drop table stud02.emp;
SQL> create table stud02.employee
as
select * from scott.emp;
4. 實體權限傳遞(with grant option):user01:
SQL> grant select, update on product to user02 with grant option; // user02得到權限,並可以傳遞。
5. 實體權限回收:user01:
SQL>Revoke select, update on product from user02; //傳遞的權限將全部丟失。
説明
1)如果取消某個用户的對象權限,那麼對於這個用户使用WITH GRANT OPTION授予權限的用户來説,同樣還會取消這些用户的相同權限,也就是説取消授權時級聯的。
總結:
--查看用户系統權限
select * from dba_sys_privs;
select * from session_privs;
select * from user_sys_privs;
--查看用户對象權限
select * from dba_tab_privs;
select * from all_tab_privs;
select * from user_tab_privs;
8.Oracle 用户管理
一、創建用户的Profile文件
SQL> create profile student limit // student為資源文件名
FAILED_LOGIN_ATTEMPTS 3 //指定鎖定用户的登錄失敗次數
PASSWORD_LOCK_TIME 5 //指定用户被鎖定天數
PASSWORD_LIFE_TIME 30 //指定口令可用天數
二、創建用户SQL> Create User username
Identified by password
Default Tablespace tablespace
Temporary Tablespace tablespace
Profile profile
Quota integer/unlimited on tablespace;
例:
SQL> Create user acc01
identified by acc01 // 如果密碼是數字,請用雙引號括起來
default tablespace account
temporary tablespace temp
profile default
quota 50m on account;
SQL> grant connect, resource to acc01;
[*] 查詢用户缺省表空間、臨時表空間
SQL> select username, default_tablespace, temporary_tablespace from dba_users;
[*] 查詢系統資源文件名:
SQL> select * from dba_profiles;
資源文件類似表,一旦創建就會保存在數據庫中。
SQL> select username, profile, default_tablespace, temporary_tablespace from dba_users;
SQL> create profile common limit
failed_login_attempts 5
idle_time 5;
--指定用户資源文件給用户
SQL> Alter user acc01 profile common;
三、修改用户:SQL> Alter User 用户名
Identified 口令
Default Tablespace tablespace
Temporary Tablespace tablespace
Profile profile
Quota integer/unlimited on tablespace;
1、修改口令字:
SQL>Alter user acc01 identified by "12345";
2、修改用户缺省表空間:
SQL> Alter user acc01 default tablespace users;
3、修改用户臨時表空間
SQL> Alter user acc01 temporary tablespace temp_data;
4、強制用户修改口令字:
SQL> Alter user acc01 password expire;
5、將用户加鎖
SQL> Alter user acc01 account lock; // 加鎖
SQL> Alter user acc01 account unlock; // 解鎖
四、刪除用户SQL>drop user 用户名; //用户沒有建任何實體
SQL> drop user 用户名 CASCADE; // 將用户及其所建實體全部刪除
*1. 當前正連接的用户不得刪除。
五、監視用户:1、查詢用户會話信息:
SQL> select username, sid, serial#, machine from v$session;
2、刪除用户會話信息:
SQL> Alter system kill session 'sid, serial#';
3、查詢用户SQL語句:
SQL> select user_name, sql_text from v$open_cursor;
1.授權
grant <privilege1,privilege2,....> to <user_name> [with admin|grant option];
如果需要讓user_name同時擁有分配這些權限的權限可以添加:
With admin option: 可以分配系統權限。
With grant option: 可以分配對象權限。
2.授權撤銷
revoke <privilege1,privilege2,...> from <user_name>;
9.Oracle 角色管理
一、何為角色
角色。角色是一組權限的集合,將角色賦給一個用户,這個用户就擁有了這個角色中的所有權限。
二、系統預定義角色 預定義角色是在數據庫安裝後,系統自動創建的一些常用的角色。下介簡單的介紹一下這些預定角色。角色所包含的權限可以用以下語句查詢:
sql>select * from role_sys_privs where role='角色名';
1.CONNECT, RESOURCE, DBA
這些預定義角色主要是為了向後兼容。其主要是用於數據庫管理。oracle建議用户自己設計數據庫管理和安全的權限規劃,而不要簡單的使用這些預定角色。將來的版本中這些角色可能不會作為預定義角色。
2.DELETE_CATALOG_ROLE, EXECUTE_CATALOG_ROLE, SELECT_CATALOG_ROLE
這些角色主要用於訪問數據字典視圖和包。
3.EXP_FULL_DATABASE, IMP_FULL_DATABASE
這兩個角色用於數據導入導出工具的使用。
4.AQ_USER_ROLE, AQ_ADMINISTRATOR_ROLE
AQ:Advanced Query。這兩個角色用於oracle高級查詢功能。
5. SNMPAGENT
用於oracle enterprise manager和Intelligent Agent
6.RECOVERY_CATALOG_OWNER
用於創建擁有恢復庫的用户。關於恢復庫的信息,參考oracle文檔《Oracle9i User-Managed Backup and Recovery Guide》
7.HS_ADMIN_ROLE
A DBA using Oracle's heterogeneous services feature needs this role to access appropriate tables in the data dictionary.
三、管理角色
1.建一個角色
sql>create role role1;
2.授權給角色
sql>grant create any table,create procedure to role1;
3.授予角色給用户
sql>grant role1 to user1;
4.查看角色所包含的權限
sql>select * from role_sys_privs;
5.創建帶有口令以角色(在生效帶有口令的角色時必須提供口令)
sql>create role role1 identified by password1;
6.修改角色:是否需要口令
sql>alter role role1 not identified;
sql>alter role role1 identified by password1;
7.設置當前用户要生效的角色
(注:角色的生效是一個什麼概念呢?假設用户a有b1,b2,b3三個角色,那麼如果b1未生效,則b1所包含的權限對於a來講是不擁有的,只有角色生效了,角色內的權限才作用於用户,最大可生效角色數由參數MAX_ENABLED_ROLES設定;在用户登錄後,oracle將所有直接賦給用户的權限和用户默認角色中的權限賦給用户。)
sql>set role role1;//使role1生效
sql>set role role,role2;//使role1,role2生效
sql>set role role1 identified by password1;//使用帶有口令的role1生效
sql>set role all;//使用該用户的所有角色生效
sql>set role none;//設置所有角色失效
sql>set role all except role1;//除role1外的該用户的所有其它角色生效。
sql>select * from SESSION_ROLES;//查看當前用户的生效的角色。
8.修改指定用户,設置其默認角色
sql>alter user user1 default role role1;
sql>alter user user1 default role all except role1;
詳見oracle參考文檔
9.刪除角色
sql>drop role role1;
角色刪除後,原來擁用該角色的用户就不再擁有該角色了,相應的權限也就沒有了。
説明:
1)無法使用WITH GRANT OPTION為角色授予對象權限
2)可以使用WITH ADMIN OPTION 為角色授予系統權限,取消時不是級聯
10.sqlplus / as sysdba方式登錄
以sqlplus / as sysdba方式登錄時,採用的是操作系統驗證的方式,所以用户名/密碼輸與不輸入是一樣的?真的是這樣的嗎?
Oracle的用户信息一般來説是保存在數據字典裏的,所以常規用户在Oracle數據庫沒有啓動的時候是無法登陸的。但有兩類用户例外,這就是具有sysdba或者sysoper權限的用户。Oracle sysdba或者sysoper用户的登陸有兩種方式:一是通過OS認證,二是通過密碼文件驗證。
究竟使用哪一種驗證方式以及能否成功登陸取決於三個方面的因素:
1. sqlnet.ora中SQLNET.AUTHENTICATION_SERVICES的設置
2. 參數文件中REMOTE_LOGIN_PASSWORDFILE的設置
3. 密碼文件 PWD%sid%.ora
Oracle進行權限驗證的大致順序如下:
1. 根據SQLNET.AUTHENTICATION_SERVICES的值決定是進行os驗證還是密碼文件驗證。
2. 如果是os驗證,根據當前用户的用户組判斷是否具有sysdba權限。如果os驗證失敗,則進行密碼文件驗證。
2. 如果是密碼文件驗證,REMOTE_LOGIN_PASSWORDFILE的值以及密碼文件是否存在決定了驗證是否成功。
sqlnet.ora
windows中 sqlnet.ora文件為空時採用Oracle密碼文件驗證,Linux相反!
SQLNET.AUTHENTICATION_SERVICES= (NTS) 基於操作系統驗證;
SQLNET.AUTHENTICATION_SERVICES= (NONE) 基於Oracle密碼文件驗證
SQLNET.AUTHENTICATION_SERVICES= (NONE,NTS) 二者並存,注意是半角,否則不識別(windows)
默認情況下Unix/Linux下的sqlnet.ora文件是沒有SQLNET.AUTHENTICATION_SERVICES參數的,
此時是操作系統驗證和Oracle密碼驗證並存,加上SQLNET.AUTHENTICATION_SERVICES這個參
數後,不管SQLNET.AUTHENTICATION_SERVICES設置為NONE還是NTS還是(NONE,NTS),都是
基於Oracle密碼驗證。
設定sqlnet.authentication_services:
none:作用是不允許通過os系統用户登錄數據庫,需要提供用户名及密碼;
all:作用是允許所有的登錄方式;
nts:作用是windows的本地操作系統用户認證;
注:需要説明的是據試驗該用户名和密碼是指具有sysdba權限的用户;在linux上若用系統用户oracle登錄數據庫需要設定為all或是註銷該字段;
注:linux上默認是沒有該文件的,可以手動創建,參考$ORACLE_HOME/network/admin/samples/sqlnet.ora內容,並將之設定在$ORACLE_HOME/network/admin/目錄下。
如果是密碼文件驗證的話,需要確認密碼文件是否存在!即:
$ORACLE_HOME/dbs/下有沒有orapw$ORACLE_SID的文件
密碼文件是可以通過參數REMOTE_LOGIN_PASSWORDFILE開啓(EXCLUSIVE或者SHARED)或者是禁用(none)的
show parameter xxxxxxxxx--查看
alter system set remote_login_passwordfile = none scope=spfile;--修改
--查看具有sysdba或者sysoper權限的用户
select * from v$pwfile_users;
每次使用grant sysdba/sysoper授予新用户特殊權限或是alter user命令修改擁有sysdba/sysoper權限的用户密碼的時候,Oracle都會自動的同步密碼文件,這樣保證在數據庫沒有打開的情況擁有特殊權限的用户能正常的登陸數據庫以進行管理操作。
[html] view plain copy
1. SQL> show parameters remote_login_passwordfile;
2.
3. NAME TYPE VALUE
4. ------------------------------------ ----------- ------------------------------
5. remote_login_passwordfile string EXCLUSIVE
6. SQL> select * from v$pwfile_users;
7.
8. USERNAME SYSDB SYSOP SYSAS
9. ------------------------------ ----- ----- -----
10. SYS TRUE TRUE FALSE
11.
12. SQL> grant sysdba to hr
13. 2 ;
14.
15. Grant succeeded.
16.
17. SQL> select * from v$pwfile_users;
18.
19. USERNAME SYSDB SYSOP SYSAS
20. ------------------------------ ----- ----- -----
21. SYS TRUE TRUE FALSE
22. HR TRUE FALSE FALSE
23.
24. SQL>
密碼文件的重建
其中文件名和密碼是必需的。entries設置了密碼文件可包含的dba用户的最大數目。force定義了是否覆蓋當前文件。重建密碼文件會清除系統內除了sys用户以外所有sysdba用户的密碼。必須使用grant sysdba同步密碼文件。
命令orapwd
windows環境下的
oracle的操作系統認證(connect as sysdba)登錄方式
有一種oracle的登錄方式是操作系統驗證登錄方式,即常説的OS驗證登錄方式,在SQL server中也有這種方式。
有些朋友經常使用connect / as sysdba登錄,但不知道為什麼沒有提供用户名和密碼就得到了sysdba的權限。還認為這樣是不是不安全呢?
Oracle在常見的多用户操作系統上都可以進行OS認證方式來登錄。例如solaris,windows等等。
下面以常見的windows操作系統來説明看一下這個操作系統認證方式登錄的原理。如果你的機器可以使用connect / as sysdba獲取sysdba的權限,那麼下面的每一個過程你的機器上都會得到驗證,如果不能,按照下面的操作更改後,你也能以這種方式登錄。
- 在命令行下敲入compmgmt.msc 進入計算機管理
- 選擇本地用户和組—>組
- 看是不是有一個組的名字叫做ORA_DBA
- 雙擊改組可以看到裏面是不是有administrator用户
- 想一想你是不是以administrator用户登錄的呢?
- 再進入Oracle安裝目錄(即$ORACLE_HOME 一般是D:"oracle)"ora92"network"admin 找到sqlnet.ora文件看看裏面的是不是有SQLNET.AUTHENTICATION_SERVICES= (NTS)
- 如果這些都對的話,你就能已操作系統認證的方式(connect / as sysdba)來登錄Oracle
接下來的問題是,如果你的數據很重要,出於安全考慮,希望禁止這種操作系統認證的方式。那麼該怎麼做呢?
很簡單,找到在剛才的第6步驟中的sqlnet.ora文件,將SQLNET.AUTHENTICATION_SERVICES= (NTS)改為SQLNET.AUTHENTICATION_SERVICES=none即可。你再試一下看看會不會得到到如下結果:
ERROR:
ORA-01031: insufficient privileges
警告: 您不再連接到 ORACLE。
如果你的機器不能以系統認證的方式登錄,檢查以上幾個步驟,你總可以找到原因的。
11:sqlplus連接時的三種方式
SQLPlus 在連接時通常有三種方式
1. sqlplus / as sysdba
操作系統認證,不需要數據庫服務器啓動listener,也不需要數據庫服務器處於可用狀態。比如我們想要啓動數據庫就可以用這種方式進入
sqlplus,然後通過startup命令來啓動。
2. sqlplus username/password
連接本機數據庫,不需要數據庫服務器的listener進程,但是由於需要用户名密碼的認證,因此需要數據庫服務器處於可用狀態才行。
3. sqlplus usernaem/password@orcl
通過網絡連接,這是需要數據庫服務器的listener處於監聽狀態。此時建立一個連接的大致步驟如下
a. 查詢sqlnet.ora,看看名稱的解析方式,默認是TNSNAME
b. 查詢tnsnames.ora文件,從裏邊找orcl的記錄,並且找到數據庫服務器的主機名或者IP,端口和service_name
c. 如果服務器listener進程沒有問題的話,建立與listener進程的連接。
d. 根據不同的服務器模式如專用服務器模式或者共享服務器模式,listener採取接下去的動作。默認是專用服務器模式,沒有問題的話客户端
就連接上了數據庫的server process。
e. 這時連接已經建立,可以操作數據庫了。
|
系統權限 |
sysdba |
sysoper |
|
區別 |
Startup(啓動數據庫) |
startup |
|
Shutdown(關閉數據庫) |
shutdown |
|
|
alter database open/mount/backup |
alter database open/mount/backup |
|
|
改變字符集 |
none |
|
|
create database(創建數據庫) |
None不能創建數據庫 |
|
|
drop database(刪除數據庫) |
none |
|
|
create spfile |
create spfile |
|
|
alter database archivelog(歸檔日誌) |
alter database archivelog |
|
|
alter database recover(恢復數據庫) |
只能完全恢復,不能執行不完全恢復 |
|
|
擁有restricted session(會話限制)權限 |
擁有restricted session權限 |
|
|
可以讓用户作為sys用户連接 |
可以進行一些基本的操作,但不能查看用户數據 |
|
|
登錄之後用户是sys |
登錄之後用户是public |