zoukankan      html  css  js  c++  java
  • Oracle OS 认证

    Oracle OS 认证, 口令文件

    1、os认证
    oracle安装之后默认情况下是启用了os认证的,这里提到的os认证是指服务器端os认证。os认证的意思把登录数据库的用户和口令校验放在了操作系统一级。如果以安装oracle时的用户登录os,那么此时在登录oracle数据库时不需要任何验证,如:
    SQL> connect /as sysdba
    已连接。
    SQL> connect sys/aaa@dmt as sysdba
    已连接。
    SQL> connect sys/bbb as sysdba
    已连接。
    SQL> connect aaa/bbb as sysdba
    已连接。
    SQL> show user
    USER 为 "SYS"
    SQL>
    不论输入什么用户(哪怕这个用户如aaa在数据库中根本不存在),只要以sysdba权限连接数据库,都可以连接上,并且连接用户是sys,这样很方便,有时候,如果忘记了数据库的密码,而又想登录数据库,可以通过这种方式,前提是在数据库服务器上;但是方便的同时也带来了一些安全隐患,于是很多人想屏蔽os认证,在win下只要把oracle_home/NETWORK/admin/sqlnet.ora中的SQLNET.AUTHENTICATION_SERVICES= (nts)nts改成none或者注释掉这句话(在前面加上#),就可以屏蔽os功能,要想以sys用户连上数据库必须输入正确的sys口令,如:
    SQL> connect /as sysdba
    ERROR:
    ORA-01031: 权限不足
    SQL> connect sys/aaa as sysdba
    ERROR:
    ORA-01017: 用户名/口令无效; 登录被拒绝
    SQL> connect aaa/bbb as sysdba
    ERROR:
    ORA-01031: 权限不足
    SQL> connect sys/system as sysdba
    已连接。
    SQL>
    或者可以把oracle的安装用户从组ora_dba中删除掉,当然也可以直接把ora_dba这个组也删除,都可以屏蔽os功能。在unix/linux下也可以在文件sqlnet.ora中增加SQLNET.AUTHENTICATION_SERVICES=(none)以及删除dba(groupdel dba)组或者把oracle用户从dba组中删除都可以屏蔽os认证。利用这两种方法屏蔽os功能似乎总有些让人不放心,或者说不能让人完全信服,因为毕竟系统管理员还是可以创建ora_dba or dba组以及修改sqlnet.ora文件,如何彻底屏蔽os功能?让它"永世不得翻身"呢?我没有这方面的经验,大家可以补充!
    2、口令文件
    oracle的口令文件的作用是存放所有以sysdba或者sysoper权限连接数据库的用户的口令,如果想以sysdba权限远程连接数据库,必须使用口令文件,否则不能连上,由于sys用户在连接数据库时必须以sysdba or sysoper方式,也就是说sys用户要想连接数据库必须使用口令文件,因此我认为在数据库中存放sys用户的口令其实没有任何意义!使用口令文件的好处是即使数据库不处于open状态,依然可以通过口令文件验证来连接数据库。开始安装完oracle,没有给普通用户授予sysdba权限,口令文件中只存放了sys的口令,如果之后把sysdba权限授予了普通用户,那么此时会把普通用户的口令从数据库中读到口令文件中保存下来,当然这时必须要求数据库处于open状态。如:
    SQL> grant sysdba to test;
    授权成功。
    SQL> connect test/aaa@orcl as sysdba
    ERROR:
    ORA-01017: 用户名/口令无效; 登录被拒绝
    警告: 您不再连接到 ORACLE。
    SQL> connect test/test@orcl as sysdba
    已连接。
    SQL> alter database close;
    数据库已更改。
    SQL> grant sysdba, sysoper to test;
    grant sysdba, sysoper to test
    *
    第 1 行出现错误:
    ORA-01109: 数据库未打开
    到底有几个用户被授予了sysdba或者sysoper权限,可以通过查询如下v$pwfile_users获得,v$pwfile_users的信息就是源于口令文件的(This view lists users who have been granted SYSDBA and SYSOPER privileges as derived from the password file.)
    SQL> select * from v$pwfile_users;
    USERNAME SYSDB SYSOP
    ------------------------------ ----- -----
    SYS TRUE TRUE
    TEST TRUE FALSE
    到底可以有几个用户被授予sysdba或者sysoper权限,是由创建口令文件时指定的entries数决定的,准确的说还不完全是,最终还和os block的大小有关,如果entries指定了5,一个os block可以存放8个用户的口令,那么可以由8个用户被授予sysdba或者sysoper。
    下面看一个简单的测试:
    SQL> declare
    2 v_string varchar2(100);
    3 begin
    4 for i in 1..100 loop
    5 v_string := 'create user test'||i||' identified by test'||i;
    6 execute immediate v_string ;
    7 end loop;
    8 end;
    9 /
    PL/SQL 过程已成功完成。
    SQL> select count(*) from dba_users where username like '%TEST%';
    COUNT(*)
    ----------
    101
    这里之所以是101,是因为之前已经创建过test用户
    SQL> declare
    2 v_string varchar2(100);
    3 begin
    4 for i in 1..100 loop
    5 v_string := 'grant sysdba to test'||i;
    6 execute immediate v_string ;
    7 end loop ;
    8 end ;
    9 /
    declare
    *
    第 1 行出现错误:
    ORA-01996: GRANT 失败: 口令文件 '' 已满
    ORA-06512: 在 line 6
    SQL> select * from v$pwfile_users;
    USERNAME SYSDB SYSOP
    ------------------------------ ----- -----
    SYS TRUE TRUE
    TEST1 TRUE FALSE
    TEST2 TRUE FALSE
    TEST3 TRUE FALSE
    TEST4 TRUE FALSE
    TEST5 TRUE FALSE
    TEST6 TRUE FALSE
    TEST7 TRUE FALSE
    TEST8 TRUE FALSE
    已选择9行。
    SQL>
    可以清楚的看到v$pwfile_users里面并不是创建口令文件时指定的entries=5而是9条记录,意味着9个用户的口令占用了一个os block,其实也可能是多个os block,总之这些block都是满的,但是观察口令文件,还是占了2k,这是我解释不清的地方。通过os命令发现;每个簇字节数4096;这里其实就是os block 大小实际上是4k,但是口令文件占用了2k,根本没有用满一个os block,不知道何故,也是我的疑惑 (
    This parameter specifies the number of entries that you require the password file to accept. This number corresponds to the number of distinct users allowed to connect to the database as SYSDBA or SYSOPER. The actual number of allowable entries can be higher than the number of users, because the ORAPWD utility continues to assign password entries until an operating system block is filled. For example, if your operating system block size is 512 bytes, it holds four password entries. The number of password entries allocated is always a multiple of four.

    win下查看os block大小
    C:\WINDOWS\system32>fsutil fsinfo ntfsinfo e:
    NTFS 卷序列号 : 0x12afb454f6e54b31
    版本 : 3.1
    区数量 : 0x00000000040270d0
    簇总数 : 0x0000000000804e1a
    可用簇 : 0x00000000000b8d41
    保留总数 : 0x0000000000000000
    每个扇区字节数 : 512
    每个簇字节数 : 4096
    每个 FileRecord 段的字节数 : 1024
    每个 FileRecord 段的簇数 : 0

  • 相关阅读:
    UCOS内核
    ##API(七)————日期操作类(二)
    ##Webstrom打开显示老长一段英文This lincense GY4D6P7914 has been cancelled.,就是打不开怎么解决
    ##API(六)————日期操作类(一)
    ##API(五)————StringBuffer类和StringBuilder类(重要)
    ##API(四)————String类的常用方法
    ##API(三)————Math类
    ##API(二)————包装类
    ##API的简介
    ##API(一)————枚举
  • 原文地址:https://www.cnblogs.com/czjie/p/2247603.html
Copyright © 2011-2022 走看看