一、背景
近期进行了安全整改,对于启用了策略控制的用户来说可能会碰到账户经常被锁定。导致账户被锁定的原因很多,有的因为密码过期,有的是手动登陆失败达到指定的次数,有的是程序使用了错误的密码重连,也有可能是数据库被攻击。本文将带你定位Oracle账户锁定原因及简单处理方法。
二、原理
不少同事提到相同的问题,上次给给位的脚本执行以后会不会对现有的用户有影响,对数据库有什么影响,会不会影响性能等。上次给各位的是一个profile脚本,这个profile是基于oracle自己的utlpwdmg.sql修改而成的。
那么什么是profile呢?我简单的画了一个图,如下图1所示,简单来讲profile是对用户账户的一个描述,这个描述定义了一个账户的属性如账户的的生命周期,登陆失败的次数,使用的密码校验方法,账户锁定时间等。Oracle账户的默认会有一个名称为default的profile。
图1
我们可以通过语句来查询默认的Profile有哪些属性。
1. SQL> select * from dba_profiles whereprofile='DEFAULT' and resource_type='PASSWORD';
2.
3. PROFILE RESOURCE_NAME RESOURCE LIMIT
4. --------------------------------------------- -------- --------------------
5. DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 10
6. DEFAULT PASSWORD_LIFE_TIME PASSWORD 180
7. DEFAULT PASSWORD_REUSE_TIME PASSWORD UNLIMITED
8. DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED
9. DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD NULL
10. DEFAULT PASSWORD_LOCK_TIME PASSWORD 1
11. DEFAULT PASSWORD_GRACE_TIME PASSWORD 7
新建的profile就如同在操作系统里新建了一个文件夹,如果不把文件放到这个文件夹里的话,这个文件夹就是空的。上次的Profile就是如此,为了更安全的管理数据库可以将部分维护用户放到这个文件夹中来。下表是建立profile时的一些属性。
参数名称 | 说明 | 默认值 | 建议值 |
PASSWORD_LIFE_TIME | 账户修改时间 | 180天 | 120天 |
PASSWORD_LOCK_TIME | 账户锁定时间 | 1天 | 30分钟 |
PASSWORD_REUSE_MAX | 最大可用次数 | Unlimited | Unlimited |
PASSWORD_REUSE_TIME | 密码重用天数 | Unlimited | Unlimited |
PASSWORD_GRACE_TIME | 延期天数 | 7 | 7 |
FAILED_LOGIN_ATTEMPTS | 登录失败次数 | 10 | 10 |
PASSWORD_VERIFY_FUNCTION | 密码校验方法 | Null | verify_function |
三、实验步骤
接下来我们简单的做一个实验帮助大家理解,Profile是如何工作,并且在用户账户被锁的如何快速定位账户锁定的原因。
u 首先创建一个u01用户
SQL> create user u01 identified by u01;
u 给用户必要的权限
SQL> grant connect,resource to u01;
u 建立名称为SAFE_CONTROL的profil为测试方便这里的密码失败次数为3
SQL>CREATE PROFILEsafe_control LIMIT PASSWORD_LIFE_TIME 120 PASSWORD_GRACE_TIME 7 PASSWORD_REUSE_TIMEUNLIMITED PASSWORD_REUSE_MAX UNLIMITED FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1 PASSWORD_VERIFY_FUNCTIONverify_function;
SQL> select * from dba_profiles whereprofile='SAFE_CONTROL' and resource_type='PASSWORD';--查看这个profile建立的相关属性
PROFILE RESOURCE_NAME RESOURCE LIMIT
--------------------------------------------- -------- --------------------
SAFE_CONTROL FAILED_LOGIN_ATTEMPTS PASSWORD 3
SAFE_CONTROL PASSWORD_LIFE_TIME PASSWORD 120
SAFE_CONTROL PASSWORD_REUSE_TIME PASSWORD UNLIMITED
SAFE_CONTROL PASSWORD_REUSE_MAX PASSWORD UNLIMITED
SAFE_CONTROL PASSWORD_VERIFY_FUNCTION PASSWORD VERIFY_FUNCTION
SAFE_CONTROL PASSWORD_LOCK_TIME PASSWORD 1
SAFE_CONTROL PASSWORD_GRACE_TIME PASSWORD 7
u 查看u01用户的账户属性,可以看到默认的profile系统自带的default
SQL> select username,account_status,expiry_date,profilefrom dba_users where username='U01';
USERNAME ACCOUNT_STATUS EXPIRY_DA PROFILE
--------------------------------- --------- ----------------------------
U01 OPEN 27-MAR-17 DEFAULT
SQL> select username,account_status,expiry_date,profilefrom dba_users where username='U01';
USERNAME ACCOUNT_STATUS EXPIRY_DA PROFILE
--------------------------------- --------- ----------------------------
U01 OPEN 27-MAR-17 DEFAULT
u 更改u01用户的profile
<pre name="code" class="sql">SQL> alter user u01 profile safe_control;--将用户的profile设置为safe_control
User altered.
SQL> select username,account_status,expiry_date,profilefrom dba_users where username='U01';--查看是否已修改
USERNAME ACCOUNT_STATUS EXPIRY_DA PROFILE
---------- -------------------- --------- ---------------
U01 OPEN 26-JAN-17 SAFE_CONTROL
u 接下来验证Profile是否生效,是用错误密码登陆两次
SQL> conn u01/u001
ERROR:
ORA-01017:invalid username/password; logon denied
Warning:You are no longer connected to ORACLE.
SQL> conn u01/u001
ERROR:
ORA-01017:invalid username/password; logon denied
u 查看是否有登录失败的记录
SQL> selectsessionid,userid,userhost,comment$text,spare1,to_char(ntimestamp#+1/3,'yyyy-mm-ddhh24:mi:ss') logint from sys.aud$ where userid='U01'and returncode=1017 orderby ntimestamp# desc;
–-在没有启用对u01用户审计的情况下无法对用户的登录状态进行审计。
no rowsselected
u 第三次使用错误密码登陆u01用户
SQL> conn u01/u001
ERROR:
ORA-01017:invalid username/password; logon denied
u 第四次输入正确密码后数据库提示变成了账户被锁定
SQL> conn u01/u01
ERROR:
ORA-28000: the account islocked
u 查看u01用户登陆失败次数
SQL> select lcount from sys.user$ wherename='U01';
LCOUNT
----------
3
–-得到的结果是我们设定FAILED_LOGIN_ATTEMPTS的值,此时账户已经被锁定。
u 发生锁定后首先对用户进行解锁
SQL>alter user u01 account unlock;--解锁用户账户
User altered.
SQL> select username,account_status,expiry_date,profilefrom dba_users where username='U01';--查看u01账户状态
USERNAME ACCOUNT_STATUS EXPIRY_DA PROFILE
--------- ------------- --------- ---------------
U01 OPEN 26-JAN-17 SAFE_CONTROL
u 开启对u01用户的审计
SQL> audit session by u01 whenever notsuccessful;
Auditsucceeded.
u 再次使用用错误密码登录
SQL> conn u01/u001
ERROR:
ORA-01017:invalid username/password; logon denied
u 查看是哪个个用户,哪一个IP导致的失败登陆
SQL> select sessionid,userid,userhost,comment$text,spare1,to_char(ntimestamp#+1/3,'yyyy-mm-dd hh24:mi:ss') logint from sys.aud$ where userid='U01'and returncode=1017 order by ntimestamp# desc;
SESSIONIDUSERID USERHOST COMMENT$TEXT SPARE1 LOGINT
------------------ ---------------------- ---------------------------- ----------------------------
720504 U01 oddpc.us.oracle.com Authenticated by: DATABASE oracle 2016-09-28 14:25:52
u 可以看到登录用户的IP和登录时间已经被记录进来了,关闭审计。
SQL> noaudit session by u01;-–关闭掉对用户的审计
Noaudit succeeded.
四、实验总结
oracle数据库的审计功能可以做到很细力度的审计,除了对用户的审计外,还可以对表,对DML语句甚至是对字段的开启审计功能。通过这些功能我们能及时发现数据库账户的安全情况。也及时定位导致账户锁定的原因。制定相应的因对方案。保障数据库的安全。在实际生产中应该根据用户性质,启用合适的限制策略。