今天发现生产库一个数据库用户在帐号没有过期的情况下被异常锁住了,推测是用户连续多次输错了密码,然后我们通过查找aud$ 视图
找到了锁住该用户的罪魁祸首。下面简要记录一下查找方法。
我们在测试库上做如下测试:
1、数据库必须打开审计功能,
SQL> show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/app/oracle/admin/orcl/adump
audit_sys_operations boolean FALSE
audit_syslog_level string
audit_trail string DB
2、创建一个用户并授权
create user hujian identified by hujian default tablespace users ;*/
grant connect ,resource to hujian ;
正常连接一次 用户 hujian
sqlplus hujian/hujian
3、sys 用户 sysdba 角色登录进去(只有sys用户才能查看aud$)
select sessionid,userid,userhost,terminal,returncode
from aud$ ;
sessionid userid userhost terminal returncode
---------- -------- ------- -------- --------
1 2888022 HUJIAN node01 pts/3 0
我们发现正常 登录 returncode 为0
4、非正常登录多次,直到用户锁住
sessionid userid userhost terminal returncode
---------- -------- ------- -------- --------
6 2888025 HUJIAN node01 pts/3 1017
7 2888026 HUJIAN node01 pts/3 1017
8 2888027 HUJIAN node01 pts/3 1017
....
我们看到 ,密码错误时,returncode 是1017 ,实际上,1017 就是ORA-1017
ERROR:
ORA-01017: invalid username/password; logon denied
5、用户锁住后再输入正确的用户名和密码
登录的时候提示:
ERROR:
ORA-28000: the account is locked
此时再查看aud$
sessionid userid userhost terminal returncode
---------- -------- ------- -------- --------
16 2888035 HUJIAN node01 pts/3 28000
由此 ,我们可以看到,只要找到那个连续连接数据库用户,并return 1017 的家伙就好。
做完这个实验后,我们想测试一把用户锁住之后的影响。
1、在hujian 下面创建一张表,并授予其它用户查询权限
SQL> create table t_test1 (id number(5),vname varchar2(50) );
Table created.
SQL> insert into t_test1 values(1,'hj');
1 row created.
SQL> commit ;
Commit complete.
SQL> select * from t_test1;
ID VNAME
---------- --------------------------------------------------
1 hj
SQL> grant select on t_test1 to mlx ;
Grant succeeded.
2、使用mlx 用户进行查询
SQL> select * from hujian.t_test1 ;
ID VNAME
---------- --------------------------------------------------
1 hj
正常查询
3、锁住hujian用户,再使用mlx 查询
SQL> alter user hujian account lock ;
User altered.
---mlx 下chax
SQL> select * from hujian.t_test1 ;
ID VNAME
---------- --------------------------------------------------
1 hj
发现已经连接上的mlx 能继续查询hujian下面的表。
将session 断开,再连接上mlx ,发现同样可以通过该用户查询hujian下有权限的表
4、测试hujian锁住,对于已经连接进行hujian用户的会话的影响
在锁住hujian用户之前,开一个窗口登录进hujian,这时候,hujian肯定可以正常查询
然后我们通过sys用户锁住hujian
SQL> alter user hujian account lock ;
User altered.
此时再通过之前连接进去的会话进行查询,发现一样可以查询
SQL> select * from hujian.t_test1 ;
ID VNAME
---------- --------------------------------------------------
1 hj
由此可见,一个用户被锁住,对已经连接进去的会话是没有影响的,只是不再允许后续继续连接
该用户。