一、背景
近期进行了安全整改,对于启用了策略控制的用户来说可能会碰到账户经常被锁定。导致账户被锁定的原因很多,有的因为密码过期,有的是手动登陆失败达到指定的次数,有的是程序使用了错误的密码重连,也有可能是数据库被攻击。本文将带你定位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 7u 查看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 DEFAULTu 更改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_CONTROLu 接下来验证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 deniedu 查看是否有登录失败的记录
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 rowsselectedu 第三次使用错误密码登陆u01用户
SQL> conn u01/u001
ERROR:
ORA-01017:invalid username/password; logon deniedu 第四次输入正确密码后数据库提示变成了账户被锁定
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_CONTROLu 开启对u01用户的审计
SQL> audit session by u01 whenever notsuccessful;
Auditsucceeded.
u 再次使用用错误密码登录
SQL> conn u01/u001
ERROR:
ORA-01017:invalid username/password; logon deniedu 查看是哪个个用户,哪一个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:52u 可以看到登录用户的IP和登录时间已经被记录进来了,关闭审计。
SQL> noaudit session by u01;-–关闭掉对用户的审计
Noaudit succeeded.四、实验总结
oracle数据库的审计功能可以做到很细力度的审计,除了对用户的审计外,还可以对表,对DML语句甚至是对字段的开启审计功能。通过这些功能我们能及时发现数据库账户的安全情况。也及时定位导致账户锁定的原因。制定相应的因对方案。保障数据库的安全。在实际生产中应该根据用户性质,启用合适的限制策略。
本文介绍Oracle数据库中账户被锁定的原因及处理方法。通过实验演示如何使用Profile管理用户账户,包括设置密码策略、登录失败次数限制等,以及如何利用审计功能追踪锁定原因。
1467

被折叠的 条评论
为什么被折叠?



