Welcome 微信登录

首页 / 数据库 / MySQL / ORA-28000 the account is locked错误模拟

错误信息如下:
OCI-Call Error sql code 28000,the account is locked
SQL> !oerr ora 28000
28000, 00000, "the account is locked"
// *Cause: The user has entered wrong password consequently for maximum
//         number of times specified by the user"s profile parameter
//         FAILED_LOGIN_ATTEMPTS, or the DBA has locked the account
// *Action:  Wait for PASSWORD_LOCK_TIME or contact DBA
Note:
FAILED_LOGIN_ATTEMPTS=10 尝试登陆失败的次数为10次,10次之后该用户将被锁定。
PASSWORD_LOCK_TIME=15  在尝试登陆指定的次数10后,该用户将被锁定15天
目标:将账户hjj从OPEN状态变为LOCKED。
下面进行模拟28000错误
1.查看当前环境
SQL> select username,account_status,profile from dba_users where username="HJJ";USERNAME                     ACCOUNT_STATUS                 PROFILE
------------------------------ -------------------------------- ------------------------------
HJJ                            OPEN                           DEFAULT
账户hjj是OPEN的
SQL> select * from dba_profiles;PROFILE                        RESOURCE_NAME                  RESOURCE LIMIT
------------------------------ ------------------------------ -------- ------------------------------
DEFAULT                        FAILED_LOGIN_ATTEMPTS          PASSWORD 10
DEFAULT                        PASSWORD_LOCK_TIME           PASSWORD UNLIMITED
默认是尝试登陆10次,之后账户一直被锁定。
为了测试,我们将FAILED_LOGIN_ATTEMPTS改为3
SQL> alter profile default limit FAILED_LOGIN_ATTEMPTS 3;Profile altered.
SQL> select * from dba_profiles where resource_name in("FAILED_LOGIN_ATTEMPTS") and profile="DEFAULT";PROFILE                        RESOURCE_NAME                  RESOURCE LIMIT
------------------------------ ------------------------------ -------- ------------------------------
DEFAULT                        FAILED_LOGIN_ATTEMPTS          PASSWORD 3
2.登陆测试
故意输错密码3次,看账户hjj会不会被锁定。
[Oracle@ora10g ~]$ sqlplus hjj/hjjSQL*Plus: Release 10.2.0.5.0 - Production on Mon Nov 3 21:36:00 2014Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
[oracle@ora10g ~]$ sqlplus hjj/hjjSQL*Plus: Release 10.2.0.5.0 - Production on Mon Nov 3 21:36:04 2014Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
[oracle@ora10g ~]$
[oracle@ora10g ~]$ sqlplus hjj/hjjSQL*Plus: Release 10.2.0.5.0 - Production on Mon Nov 3 21:36:08 2014Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon deniedSP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
再来查看账户状态
SQL> select username,account_status,profile from dba_users where username="HJJ";USERNAME                     ACCOUNT_STATUS                 PROFILE
------------------------------ -------------------------------- ------------------------------
HJJ                            LOCKED                         DEFAULT
可以看到账户被锁定了。
3.普通账户登陆,必须在数据库处于OPEN状态才能登陆,而sys用户在数据库关闭状态下也可以,使用OS认证。
测试账户hjj在数据库处于关闭状态,尝试登陆3次失败后会不会被锁定。先将用户解锁。
SQL> alter user hjj account unlock;User altered.SQL> select username,account_status,profile from dba_users where username="HJJ";USERNAME                     ACCOUNT_STATUS                 PROFILE
------------------------------ -------------------------------- ------------------------------
HJJ                            OPEN                           DEFAULT
[oracle@ora10g ~]$ sqlplus / as sysdbaSQL*Plus: Release 10.2.0.5.0 - Production on Mon Nov 3 21:42:43 2014Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit
[oracle@ora10g ~]$ sqlplus hjj/hjjSQL*Plus: Release 10.2.0.5.0 - Production on Mon Nov 3 21:44:18 2014Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux Error: 2: No such file or directory
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon deniedSP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
[oracle@ora10g ~]$ sqlplus hjj/hjjSQL*Plus: Release 10.2.0.5.0 - Production on Mon Nov 3 21:44:22 2014Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux Error: 2: No such file or directoryEnter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
[oracle@ora10g ~]$ sqlplus hjj/hjjSQL*Plus: Release 10.2.0.5.0 - Production on Mon Nov 3 21:44:24 2014Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux Error: 2: No such file or directory
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
[oracle@ora10g ~]$ sqlplus / as sysdbaSQL*Plus: Release 10.2.0.5.0 - Production on Mon Nov 3 21:44:33 2014Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.Connected to an idle instance.SQL> startup
ORACLE instance started.Total System Global Area  503316480 bytes
Fixed Size                  1274548 bytes
Variable Size           327159116 bytes
Database Buffers          171966464 bytes
Redo Buffers                2916352 bytes
Database mounted.
Database opened.
SQL> select username,account_status,profile from dba_users where username="HJJ";
USERNAME                     ACCOUNT_STATUS                 PROFILE
------------------------------ -------------------------------- ------------------------------
HJJ                            OPEN                           DEFAULT
这也就证明了数据库没有处于OPEN状态,普通用户无法登陆,登陆的时候要去dba_users查找用户是否存在,如果存在,判断用户名和密码是否正确;如果找不到该用户,就会提示用户不存在。
4.oracle如何记录用户的登陆次数
在dba_users的基表user$记录着用户的登陆次数,我们看看user$表的创建语法
[oracle@ora10g db_1]$ cd rdbms/admin/
[oracle@ora10g admin]$ ls -ltr sql.bsq
-rw-r--r-- 1 oracle oinstall 445473 Apr  2  2010 sql.bsq
create table user$                                           
( user#       number not null,                 
  name          varchar2("M_IDEN") not null,               
  type#       number not null,                     
  password      varchar2("M_IDEN"),                 
  datats#     number not null,
  tempts#     number not null,
  ctime       date not null,               
  ptime       date,                             
  exptime     date,                   
  ltime       date,                       
  resource$   number not null,                     
  audit$        varchar2("S_OPFL"),                 
  defrole     number not null,               
             
  defgrp#     number,                             
  defgrp_seq# number,             
  astatus     number default 0 not null,       
             
  lcount        number default 0 not null, ---失败登陆尝试次数。
  defschclass varchar2("M_IDEN"),             
  ext_username  varchar2("M_VCSZ"),                   
  spare1        number,
  spare2        number,
  spare3        number,
  spare4        varchar2(1000),
  spare5        varchar2(1000),
  spare6        date

SQL> select user#,name,ASTATUS,LCOUNT from user$ where name="HJJ";   USER# NAME                              ASTATUS   LCOUNT
---------- ------------------------------ ---------- ----------
        55 HJJ                                   0          0
LCOUNT就是记录用户登陆次数(失败和成功)
[oracle@ora10g ~]$ sqlplus hjj/hjjSQL*Plus: Release 10.2.0.5.0 - Production on Mon Nov 3 22:01:09 2014Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
SQL> /   USER# NAME                              ASTATUS   LCOUNT
---------- ------------------------------ ---------- ----------
        55 HJJ                                   0          1 --登陆一次
[oracle@ora10g ~]$ sqlplus hjj/oracleSQL*Plus: Release 10.2.0.5.0 - Production on Mon Nov 3 22:03:35 2014Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> /   USER# NAME                              ASTATUS   LCOUNT
---------- ------------------------------ ---------- ----------
        55 HJJ                                   0          0
只要在FAILED_LOGIN_ATTEMPTS指定的范围之内登陆成功一次,LCOUNT会重置为0。
如果失败登陆三次,观察LCOUNT的值和状态。
SQL> /   USER# NAME                              ASTATUS   LCOUNT
---------- ------------------------------ ---------- ----------
        55 HJJ                                   0          1SQL> /   USER# NAME                              ASTATUS   LCOUNT
---------- ------------------------------ ---------- ----------
        55 HJJ                                   0          2SQL> /   USER# NAME                              ASTATUS   LCOUNT
---------- ------------------------------ ---------- ----------
        55 HJJ                                   8          3
SQL> select username,account_status,profile from dba_users where username="HJJ";
USERNAME                     ACCOUNT_STATUS                 PROFILE
------------------------------ -------------------------------- ------------------------------
HJJ                            LOCKED                         DEFAULT
再次用正确的密码登陆
[oracle@ora10g admin]$ sqlplus hjj/oracleSQL*Plus: Release 10.2.0.5.0 - Production on Mon Nov 3 22:10:17 2014Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.ERROR:
ORA-28000: the account is locked5.总结
   普通用户登陆需要访问oracle相关视图,在user$.lcount记录着用户失败登陆的次数,如果lcount>=profile.FAILED_LOGIN_ATTEMPTS时,账户会自动被锁定,锁定的时间由PASSWORD_LOCK_TIME决定。配置profile中的参数主要了为了安全性考虑。更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址