鉴于互联网公司越来越多的需求,各种自建以及第三方服务不断的被加入到公司的系统里。同时互联网公司的人员更替也是流水一般时刻不停,这时候对于员工的账户管理也就变成了一个非常有挑战的任务。这时候开源的账户统一管理产品就必须被用起来了。Openldap作为开源目录服务,也是大家首选的产品。优点很多,开源(免费用),用户量大(遇坑可以找出坑方法),功能强大,众多第三方的软件都加入了对openladp的支持。缺点呢,也不少,特别是数据结构难理解。
目前公司已经用上了openladp,搭建环境网上各种教程所以就不多说。目前有一个需求就是对员工的的账户生命周期进行控制,对员工的秘密复杂度进行加强。
- 目标
- 用户自助修改密码,密码包含3种不同字符,最低8位。
- 密码修改后,重新获得60天的生命周期,到期前15天通过mail&sms提醒修改。
- 到期了后不修改,直接系统替你重置一个随机密码。然后你就只能通过sms的形式来重置密码后登陆账户
实现方式
- 使用开源的第三方self-service-passwd来做密码重置,密码强度检测
- 使用mysql存储用户的信息,包括用户的密码生命周期
- 修改self-service-passwd 源代码,修改密码后执行sql,重置mysql的用户生命周期
- 服务器每天凌晨1点执行ldap新用户扫描,新用户加入录入mysql,给予60天密码生命,同时对于老用户密码生命减一。 对于用户生命周期15天用户发送sms&mail,对于生命为0用户,重置随机密码。
- 实现逻辑
1.目前openldap密码定时修改的任务是基于开源工具self-service-password,mysql存储用户密码lifetime,定时任务每天递减lifetime,定时获取openldap新加用户到mysql表中同时赋予60天的密码lifetime
2.当遇到用户密码剩余15天的lifetime时,发送邮件与sms短信提醒相应用户更改密码。用户可以在短信与邮件中点击链接自助修改密码
3.当用户修改密码后,会重置用户密码的lifetime(default=60)
4.密码lifetime 15天以内的用户会持续多天收到邮件短信提醒,系统在lifetime=0时 重置用户密码,用户此时只能在链接通过sms短信修改密码
5.mysql表中存在一个old_password 字段,用户存储用户上一次的密码,可以用来校验新老密码是否一致(未实现内容)
- mysql 表结构
id | increase | |
name | openldap提取用户名 | |
count_time | lifetime | 密码生命,每天减一 |
not_change | 不需要修改密码用户 | 离职用户,系统用户无需提醒改密 |
old_password | 用户上一次密码 | 校验用户新老密码的重复 |
- 功能脚本
- 密码lifetime重置脚本:/opt/reset_day.sh
#! /bin/bash
# This Script is used updating count_time in mysql_db
#数据库地址
host=127.0.0.1
#数据库用户
user=root
#数据库密码
passwd=110110
#更新用户天数
reset="use ldap;update ldap set count_time = $lifetime where name = '$1';" #此处的lifetime就是密码重置后的默认lifetime周期
mysql -u$user -p$passwd -N -e"${reset}"
- /opt/reset_day.sh 脚本触发在 /usr/share/self-service-password/lib/functions.inc.php的410行
2. 阿里云sms脚本 /usr/share/self-service-password/lib/sms.py
需要传人三个参数:
argv1:用户手机号
argv2:短信验证码
argv3:短信模版
3. 短信发送模块 /usr/share/self-service-password/lib/smsapi.inc.php
三个传入参数
$mobile:从openldap的信息中提取到的mobile号码,需提取录入到openladp里面
$message:系统随机生成的6位验证码
SMS_175538413 这个参数为阿里云短信模版
编写评论...