提升Oracle用户密码安全性的策略
环境:Oracle11.2.0.4
客户需求:主要背景是数据库中有很多业务用户名,且由于部分用户缺乏安全意识,甚至直接将自己的密码设置为和用户名一样,目前客户期望密码设置不要过于简单,最起码别和用户名一致或相似就好。
1.官方解决方案
实际上Oracle提供有一个非常好用的安全校验函数,来提升用户密码的复杂性。这个在之前的文章《Oracle11g安全加固》中的“1.8.数据库密码安全性校验函数”章节就已经有了确切的解决方案,核心内容如下:
selectlimitfromdba_profileswhereprofile='DEFAULT'andresource_name='PASSWORD_VERIFY_FUNCTION'; prompt============================= prompt==8.数据库密码安全性校验函数 prompt============================= prompt执行创建安全性校验函数的脚本 @?/rdbms/admin/utlpwdmg.sql selectlimitfromdba_profileswhereprofile='DEFAULT'andresource_name='PASSWORD_VERIFY_FUNCTION';
2.删减版解决方案
上面这个自带的安全性校验函数对检查过于严苛,而客户目前的需求就只有一个,不允许密码和用户名完全一样或过于相似就可以了。于是乎,我就从这个脚本中找到这项需求,把其他暂时不需要的部分全部去掉。这样,就得到了如下的删减版脚本:
Rem Rem$Header:rdbms/admin/utlpwdmg1.sql/st_rdbms_11.2.0/12013/01/3101:34:11skayoorExp$ Rem Remutlpwdmg.sql Rem RemCopyright(c)2006,2013,Oracleand/oritsaffiliates. RemAllrightsreserved. Rem RemNAME Remutlpwdmg.sql-scriptforDefaultPasswordResourceLimits Rem RemDESCRIPTION RemThisisascriptforenablingthepasswordmanagementfeatures Rembysettingthedefaultpasswordresourcelimits. Rem RemNOTES RemThisfilecontainsafunctionforminimumcheckingofpassword Remcomplexity.Thisismoreofasamplefunctionthatthecustomer Remcanusetodevelopthefunctionforactualcomplexitychecksthatthe Remcustomerwantstomakeonthenewpassword. Rem RemMODIFIED(MM/DD/YY) Remskayoor01/17/13-Backportskayoor_bug-14671375frommain Remasurpur05/30/06-fix-5246666beefuppasswordcomplexitycheck Remnireland08/31/00-Improvecheckforusername=password.#1390553 Remnireland06/28/00-Fixnulloldpasswordtest.#1341892 Remasurpur04/17/97-Fixforbug479763 Remasurpur12/12/96-Changingthenameofpassword_verify_function Remasurpur05/30/96-Newscriptfordefaultpasswordmanagement Remasurpur05/30/96-Created Rem --Thisscriptsetsthedefaultpasswordresourceparameters --Thisscriptneedstoberuntoenablethepasswordfeatures. --Howeverthedefaultresourceparameterscanbechangedbased --ontheneed. --Adefaultpasswordcomplexityfunctionisalsoprovided. --Thisfunctionmakestheminimumcomplexitycheckslike --theminimumlengthofthepassword,passwordnotsameasthe --username,etc.Theusermayenhancethisfunctionaccordingto --theneed. --ThisfunctionmustbecreatedinSYSschema. --connectsys/assysdbabeforerunningthescript CREATEORREPLACEFUNCTIONverify_function_11G_WJZYY (usernamevarchar2, passwordvarchar2, old_passwordvarchar2) RETURNbooleanIS nboolean; minteger; differinteger; isdigitboolean; ischarboolean; ispunctboolean; db_namevarchar2(40); digitarrayvarchar2(20); punctarrayvarchar2(25); chararrayvarchar2(52); i_charvarchar2(10); simple_passwordvarchar2(10); reverse_uservarchar2(32); BEGIN digitarray:='0123456789'; chararray:='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; --Checkifthepasswordissameastheusernameorusername(1-100) IFNLS_LOWER(password)=NLS_LOWER(username)THEN raise_application_error(-20002,'Passwordsameasorsimilartouser'); ENDIF; FORiIN1..100LOOP i_char:=to_char(i); ifNLS_LOWER(username)||i_char=NLS_LOWER(password)THEN raise_application_error(-20005,'Passwordsameasorsimilartousername'); ENDIF; ENDLOOP; --Everythingisfine;returnTRUE; RETURN(TRUE); END; / GRANTEXECUTEONverify_function_11G_WJZYYTOPUBLIC; --ThisscriptaltersthedefaultparametersforPasswordManagement --ThismeansthatalltheusersonthesystemhavePasswordManagement --enabledandsettothefollowingvaluesunlessanotherprofileis --createdwithparametervaluessettodifferentvalueorUNLIMITED --iscreatedandassignedtotheuser. ALTERPROFILEDEFAULTLIMIT PASSWORD_LIFE_TIME180 PASSWORD_VERIFY_FUNCTIONverify_function_11G_WJZYY;
我们将这个脚本,遵守之前Oracle的命名方式,将其命名为utlpwdmg1.sql,放在同样的路径下。
这样,我们执行这个脚本就可以创建这个校验函数:
3.测试验证方案
将上面的删减版脚本进行测试并验证功能是否实现:
--执行脚本创建校验函数 @?/rdbms/admin/utlpwdmg1.sql --确认执行成功 selectlimitfromdba_profileswhereprofile='DEFAULT'andresource_name='PASSWORD_VERIFY_FUNCTION'; --将PASSWORD_LIFE_TIME修改为30(选做) ALTERPROFILEDEFAULTLIMITPASSWORD_LIFE_TIME30; --查询dba_profiles内容 select*fromdba_profilesorderby1; --查询用户状态和过期时间 selectUSERNAME,PASSWORD,ACCOUNT_STATUS,LOCK_DATE,EXPIRY_DATEfromdba_users;
测试用户密码不能与用户名相同或者相似,否则会修改失败:
--密码与用户名一样,修改失败: SYS@jyzhao1>alteruserjingyuidentifiedbyjingyu; alteruserjingyuidentifiedbyjingyu * ERRORatline1: ORA-28003:passwordverificationforthespecifiedpasswordfailed ORA-20002:Passwordsameasorsimilartouser --密码与用户名相似,修改失败: SYS@jyzhao1>alteruserjingyuidentifiedbyjingyu1; alteruserjingyuidentifiedbyjingyu1 * ERRORatline1: ORA-28003:passwordverificationforthespecifiedpasswordfailed ORA-20005:Passwordsameasorsimilartousername --密码与用户名不一致,修改成功: SYS@jyzhao1>alteruserjingyuidentifiedbyalfred; Useraltered.
4.用户最近一次的登录时间
11g默认开启了审计,从aud$表中可以查到用户最近登录的时间:
--查询数据库时区 selectproperty_valuefromdatabase_propertieswhereproperty_name='DBTIMEZONE'; --查询aud$表 selectMAX(to_char(a.ntimestamp#,'YYYY-MM-DDHH24:MI:SS'))last_login, u.username fromsys.aud$a,dba_usersu wherea.USERID(+)=u.username andu.user_id>90 groupbyu.username ORDERBY1;
结果示例:
SYS@jyzhao1>selectMAX(to_char(a.ntimestamp#,'YYYY-MM-DDHH24:MI:SS'))last_login, 2u.username 3fromsys.aud$a,dba_usersu 4wherea.USERID(+)=u.username 5andu.user_id>90 6groupbyu.username 7ORDERBY1; LAST_LOGINUSERNAME ------------------------------------------------- 2018-04-1707:16:46JINGYU TESTTESTTEST XS$NULL SYS@jyzhao1>
上述查询结果LAST_LOGIN为空的用户,就是在审计中没有记录到该用户的登录信息。
总结
以上所述是小编给大家介绍的提升Oracle用户密码安全性的策略,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!