天天看點

一旦ORA-28000: the account is locked使用者鎖定故障排除

今天我的同僚們反映的問題,測試庫的變化password,并改變相關的應用程式中使用password後,其中一個仍然會出現在帳戶被鎖定,報告ORA-28000: the account is locked的錯誤。

檢查過程:

1. 檢視資源限制生效參數

SQL> show parameter resource

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

resource_limit                       boolean     FALSE

FALSE表示未啟動資源限制。

2. 檢視該使用者所用的PROFILE

SQL> select resource_name, limit from dba_profiles where profile='DEFAULT';

RESOURCE_NAME                    LIMIT

-------------------------------- ----------------------------------------

COMPOSITE_LIMIT                  UNLIMITED

SESSIONS_PER_USER                UNLIMITED

CPU_PER_SESSION                  UNLIMITED

CPU_PER_CALL                     UNLIMITED

LOGICAL_READS_PER_SESSION        UNLIMITED

LOGICAL_READS_PER_CALL           UNLIMITED

IDLE_TIME                        UNLIMITED

CONNECT_TIME                     UNLIMITED

PRIVATE_SGA                      UNLIMITED

FAILED_LOGIN_ATTEMPTS            10

PASSWORD_LIFE_TIME               UNLIMITED

PASSWORD_REUSE_TIME              UNLIMITED

PASSWORD_REUSE_MAX               UNLIMITED

PASSWORD_VERIFY_FUNCTION         NULL

PASSWORD_LOCK_TIME               1

PASSWORD_GRACE_TIME              7

當中FAILED_LOGIN_ATTEMPTS表示連續登陸失敗的次數。這裡表示連續登陸10次失敗則鎖定使用者。

3. 解除使用者鎖定ALTER USER pss3 ACCOUNT UNLOCK;後觀察現象

SQL> select name, lcount from user$ where name='PSS3';

NAME                               LCOUNT

------------------------------ ----------

PSS3                                   10

不到一分鐘,登陸失敗次數就到10次了。

初步結論:

可能有應用仍使用舊的password登陸。登陸失敗後反複嘗試,直到10次為止。

但問題就來了:

1. FAILED_LOGIN_ATTEMPTS設定為10次。但未啟動resource_limit。為什麼還受到10次的限制呢?

2. 怎麼知道還有哪些應用因為未改動password導緻ORA錯誤呢?

問題1:FAILED_LOGIN_ATTEMPTS設定為10次,但未啟動resource_limit,為什麼還受到10次的限制呢?

這篇MOS文章160528.1(Profile Limits (Resource Parameter(s)) Are Not Enforced / Do Not Work)文章說了一些:

After creating a new profile or altering an old one to limit the following profile resources there is no change: 

SESSIONS_PER_USER

CPU_PER_SESSION

CPU_PER_CALL

CONNECT_TIME

IDLE_TIME

LOGICAL_READS_PER_SESSION

COMPOSITE_LIMIT

PRIVATE_SGA

The resource usage limits are not enforced and the users that are assigned the profile continue to use resources beyond profile's limits.

CAUSE

The initialization parameter RESOURCE_LIMIT is set to FALSE (default).

因為未設定RESOURCE_LIMIT為TRUE。以上變量改動後不會生效。

這裡沒有提到FAILED_LOGIN_ATTEMPTS,換句話說,像FAILED_LOGIN_ATTEMPTS這些變量是不受RESOURCE_LIMIT參數限制的。再看FAILED_LOGIN_ATTEMPTS這樣的變量屬于使用者密碼管理方面的。像上面這些變量則屬于資源管理方面的,推測Oracle對于資源管理的限制則須要RESOURCE_LIMIT為TRUE,對于密碼管理方面的限制并不受RESOURCE_LIMIT的影響。

OCP教材中正好說了:“Profiles are a useful way of managing passwords and resources but can really only apply in an environment where every application user has their own database user account.”注意到這裡他将profile分成管理password和資源兩大類,盡管沒有明說,但結合以上兩段參考。以及上述實際碰到的問題。有理由相信密碼管理方面的限制并不受RESOURCE_LIMIT參數的影響。

問題2:怎麼知道還有哪些應用因為未改動password導緻ORA錯誤呢?

上面嘗試了UNLOCK賬戶後不到一分鐘LCOUNT登入失敗次數就到了10次,說明這段時間有應用頻繁重試password,進一步。假設我們能找到這段時間訪問庫的IP,再篩選可能的IP和password改動的應用,就可能找到“罪魁禍首”。

要想找到訪問庫的IP,能夠通過設定監聽日志。查找IP。

監聽器的日志類似于alert日志,文章中說日志預設路徑是$ORACLE_HOME/network/log/listener.log,但我用的11g。不知道是否改動過。并沒有找到這個檔案夾。至于怎麼找到的。接下來會說到。

依照@secooler的教程。開啟監聽器日志的方式有兩種:

1. 不須要重新啟動監聽器的情況下通過設定log_status參數為off來實作。

2. listener.ora檔案裡添加LOGGING_<listener_name>=OFF參數。然後重新啟動監聽器實作

能夠依據不同須要選擇不同的方式。

這裡我選擇第一種,運作lsnrctl後運作set log_status on,然後須要找到日志路徑:

ora11g@vm-kvm-ora$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 20-AUG-2014 11:56:27

Copyright (c) 1991, 2011, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

STATUS of the LISTENER

------------------------

Alias                     LISTENER

Version                 TNSLSNR for Linux: Version 11.2.0.3.0 - Production

Start Date             30-APR-2014 15:22:19

Uptime                 111 days 20 hr. 34 min. 8 sec

Trace Level            off

Security                ON: Local OS Authentication

SNMP                   OFF

Listener Parameter File   /oracle/ora11g/product/11.2.0/network/admin/listener.ora

Listener Log File         /oracle/ora11g/diag/tnslsnr/vm-kvm-ora/listener/alert/log.xml

這裡我們看到有個資訊Listener Log File,後面就是相應的日志路徑和日志檔案名稱。

11g中使用了log.xml這樣的xml格式記錄監聽日志。

内容類似于:

<txt>20-AUG-2014 10:07:30 * (CONNECT_DATA=(SERVICE_NAME=pss3)(CID=(PROGRAM=dcs_data_sync)(HOST=v490h4-tux-t)(USER=dcsopen))) * (ADDRESS=(PROTOCOL=tcp)(HOST=x.x.x.x)(PORT=37339)) * establish * pss3 * 0

</txt>

是以僅僅須要找到解鎖使用者後仍登入的IP,然後再篩可能的應用來選。

還有一個知識點,那是,FAILED_LOGIN_ATTEMPTS設定連續的登入失敗次數,或者登入失敗的累計數?

FAILED_LOGIN_ATTEMPTS表示連續登入失敗的次數。