[关闭]
@yufan 2016-01-19T17:45:24.000000Z 字数 1950 阅读 888

管理系统安全设计 1.0 —— 雨帆版

ApiSystem


一、需求场景

一个对外暴露的用户系统,不可避免地遇到被人攻击的情况,各种人不断拿着常见的弱密码字典去暴力破解用户信息。某些人,down下系统的数据库,也会尝试去破解密码。

所以,系统在无法预知环境安全的场景下,容易被人暴力破解成功。

二、开发需求

  1. 对于指定用户,能动态配置某个时间范围内,允许密码错几次。超过错误次数,锁定多久。
  2. 对于指定IP,能动态配置某个实践范围内,允许这个IP对应的用户密码错误几次,超过错误次数,整个IP的访问屏蔽多久。
  3. 用户主动请求超过错误次数限制时,需要页面提示,可通过重置密码方式解冻。
  4. 用户登录错误时,页面上能自动提示剩余可用错误次数。
  5. 所有用户和IP的错误配置不唯一,可以多个规则动态叠加,随时增删改。
  6. 用户和IP被锁定到指定时间后,能自动解除锁定,且系统宕机重启后,依旧能保证正常解锁。

三、执行流程

3.1、用户登录控制

icon_512x512.jpg-139kB

  1. 当用户登录时,首先判断状态,如果状态为正常,则执行正常登录流程。如果状态为临时冻结,则查看最后一次登录失败时间,如果达到解锁的时间点,则将状态置为正常,然后执行正常登录流程。
  2. 登录流程首先判断用户名密码,如果正常,则允以放行,删除错误记录表里面该用户的全部登录失败信息。如果密码错误,则往错误记录表内插入一条错误记录,然后判断这次错误后用户错误次数是否超限,如果超限,将用户状态临时锁定,返回锁定错误信息,提示用户重置密码或者等待解锁。如果用户未达到锁定上限,则提示用户还可错误的次数。

3.2、IP拦截控制

  1. 系统配置频度拦截器控制IP的访问,所有错误信息存储于Redis中。
  2. 按照配置的错误信息,当出现用户登录失败时,基于请求IP和配置的规则存储一个定长队列,允许错误次数为定长队列长度,队列元素失效时间为规则定义的时间范围。按照规则的数目,一个IP对应的定长队列可能有多个。当队列满时存储时第一个存入元素会弹出,此时认定为IP超频。于Redis中存储一张专门的IP黑名单表,Key为IP,有效时间为超频队列对于的规则的锁定时间。
  3. 每次登录访问前从Redis的黑名单表中查找是否有此请求IP,如果有,直接跳转到屏蔽页面。

四、系统设计

4.1、表的新增与修订

数据字典字段定义

简写 描述 中文
PK Primary Key 主键
FK Foreign Key 外键
AI auto-incremented, the seed and increment values are 1 unless specified. 自增,如无额外说明,均为1
Def default value 默认值
NN Not Null (Required) 非空(必须定义)
UC Unique Constraint 唯一约束
SLT Single Line of Text 单行文本
MLT Multiple Lines of Text 多行文本
PG Person or Group 用户或者群组
Y/N Yes/No (checkbox) – Yes/No 布尔值,单选框

1、用户表 USER 变更,基于现有用户表,新增一下字段

Field Name Data Type Constraints Comments
LAST_LOGIN_DATE DATETIME NN、Def(1900-01-01 00:00:00) 上一次成功登录的时间
USER_EMAIL VARCHAR(128) NN、UC 用户邮箱
USER_STATUS VARCHAR(32) NN、Def(AWAIT) 用户状态,分别为(AWAIT, ACTIVE, TEMP_FROZEN, FORBBIDEN, DELETED)

2、新增登录错误记录表 LOGIN_ERROR_LOG

Field Name Data Type Constraints Comments
ID INT(11) UNSIGNED PK、AI、NN 主键
USER_ID INT(11) UNSIGNED NN 用户的ID
ERROR_TIME DATETIME NN、Def(CURRENT_TIMESTAMP) 用户登录失败的时间戳

表索引CREATE INDEX IDX_USER_ID_ON_LOGIN_ERROR_LOG ON LOGIN_ERROR_LOG (USER_ID);

4.2、编码设计

  1. 封装邮件发送模块。
  2. 补充用户的注册和激活流程,添加邮箱激活操作。
  3. 用户登录模块完善。对于登录失败情况,如用户存在,记录数据库。所有情况,都于Redis中存储IP失败队列。
  4. 设计递归链式调用模型,对于错误的判断实现链式判断。
  5. 设计基于Redis的观察者模式,能动态观察到配置信息的变更,通知订阅方。
  6. 编写管理页面,能维护配置信息。
  7. 对于Redis的宕机异常,能Handle,不影响主要登录流程。
  8. 定义IpBlackListFilter,每次请求从Redis中读取可能存在的黑名单。

附、文件下载

用户登录流程.graffle未知大小

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注