aungphonemyint412-prog/HackingDetectingSystemOfUnauthorizedLoginDevices

GitHub: aungphonemyint412-prog/HackingDetectingSystemOfUnauthorizedLoginDevices

基于 Flask 的 Web 应用登录安全监控系统,通过规则引擎检测可疑登录行为并发送 Gmail 告警与 2FA 验证。

Stars: 0 | Forks: 0

# 黑客检测系统 (HDS) 这是一个 Flask Web 应用程序,用于监控用户登录、检测可疑活动,并通过 Gmail 向账户所有者发送警报。本项目作为毕业设计计算研究项目(Pearson BTEC HND Unit 16)开发。 ## 在线演示 **https://hacking-detection-system-production.up.railway.app** ## 功能 ### 认证 - **用户注册和登录** — 使用用户名/密码,并通过 Werkzeug 进行哈希处理 - **Google OAuth** — 通过 Google 登录或关联 Gmail 账户 - **双因素认证 (2FA)** — 将 OTP 验证码发送至电子邮件,每个账户均需验证 - **通过 OTP 忘记密码** — 通过 6 位数字电子邮件验证码进行自助密码重置 - **账户锁定** — 登录失败次数过多后自动锁定;30 分钟后自动解锁,或在重置密码后立即解锁 ### 可疑登录检测 (R1–R8) | 规则 | 触发条件 | |------|---------| | R1 | 出现未见过的 IP 地址 | | R2 | 出现新设备类型(PC / Mobile / Tablet) | | R3 | 出现新的浏览器系列 | | R4 | 出现新的操作系统 | | R5 | 在 00:00–04:59 UTC 期间登录 | | R6 | 在短时间内多次成功登录 | | R7 | **不可能的旅行** — 鉴于经过的时间,连续登录在地理上是不可能的(使用半正矢公式,阈值 >900 km/h) | | R8 | 通过 ip-api.com 检测到 **VPN / proxy / TOR 出口节点** | ### 安全警报和通知 - **可疑登录警报** — 当触发 R1–R8 中的任何规则时发送电子邮件,包括: - **风险评分 (0–100)** — 根据触发的规则计算,并带有颜色编码的徽章 - **安全建议** — 根据检测到的威胁提供量身定制的建议 - **“这是您吗?”按钮** — 确认登录合法(绿色)或拒绝并锁定账户(红色);链接在 48 小时后过期 - **登录通知** — 每次非可疑的成功登录都会发送一封常规通知邮件 - **密码已更改** — 每次更新密码时都会发送电子邮件通知 - **电子邮件地址已更改** — 向旧地址和新地址发送通知 - **2FA 已启用/禁用** — 关于更改的电子邮件确认 - **账户已锁定** — 触发暴力破解锁定时,发送带有解锁说明的电子邮件 ### 地理定位 - **所有电子邮件中的 IP 地理定位** — 每次警报和 OTP 电子邮件都会显示登录尝试的城市、地区、国家、设备、浏览器和操作系统 - **存储坐标** — 每次登录都会保存经纬度,用于检测不可能的旅行 (R7) - 由 ip-api.com 提供支持(免费,无需 API key) ### 仪表板与历史记录 - **登录历史记录** — 包含每次登录尝试的状态、位置、风险评分的完整分页日志 - **警报仪表板** — 查看所有安全警报,并跟踪已读/未读状态 - **攻击模拟面板** — 触发测试场景(新 IP、新设备、异常时间、暴力破解、测试电子邮件) - **登录统计图表** — 7 天的登录量和设备细分(Chart.js) ## 检测阈值 (config.py) | 设置 | 默认值 | 描述 | |---------|---------|-------------| | `MAX_FAILED_ATTEMPTS` | 3 | 触发暴力破解警报和锁定前的失败登录次数 | | `FAILED_ATTEMPT_WINDOW` | 30 min | 计算失败登录次数的时间窗口 | | `LOCKOUT_DURATION` | 30 min | 暴力破解后账户保持锁定的时间 | | `RAPID_LOGIN_COUNT` | 3 | 触发 R6 的成功登录次数 | | `RAPID_LOGIN_WINDOW` | 10 min | R6 检查的时间窗口 | | `UNUSUAL_HOUR_START` | 0 | 异常时间窗口的开始 (UTC) | | `UNUSUAL_HOUR_END` | 5 | 异常时间窗口的结束 (UTC) | | `IMPOSSIBLE_TRAVEL_SPEED` | 900 km/h | R7 不可能的旅行的速度阈值 | ## 技术栈 - **后端** — Python 3, Flask 3, Flask-SQLAlchemy, Flask-Login, Flask-Dance - **数据库** — SQLite(开发环境)— 在生产环境中将 `DATABASE_URL` 替换为 Postgres - **认证** — Werkzeug 密码哈希、Google OAuth 2.0、通过 Gmail SMTP 发送 OTP - **地理定位** — ip-api.com(免费,无需 API key;返回城市、地区、国家、纬度、经度、VPN 标志) - **前端** — Bootstrap 5, Chart.js, Font Awesome ## 项目结构 ``` ├── app.py # All routes and application logic ├── config.py # Configuration (reads from .env) ├── models.py # SQLAlchemy models ├── detection.py # Rule-based suspicious login engine (R1–R8) ├── email_alert.py # Gmail SMTP — all security notification emails ├── create_test_data.py # Seeds demo user and sample login history ├── requirements.txt ├── .env.example # Environment variable template ├── templates/ │ ├── base.html │ ├── login.html │ ├── register.html │ ├── forgot_password.html │ ├── verify_reset_otp.html │ ├── reset_password.html │ ├── verify_2fa.html │ ├── dashboard.html │ ├── login_history.html │ ├── alerts.html │ ├── profile.html │ └── testing.html └── tests/ └── test_app.py # 37 pytest tests ``` ## 设置 ### 1. 克隆并安装 ``` git clone https://github.com/aungphonemyint412-prog/HackingDetectingSystemOfUnauthorizedLoginDevices.git cd HackingDetectingSystemOfUnauthorizedLoginDevices pip install -r requirements.txt ``` ### 2. 配置环境 ``` cp .env.example .env ``` 编辑 `.env`: ``` SECRET_KEY=change-me-to-a-long-random-string # Gmail SMTP(2FA、alerts 和所有通知邮件必需) MAIL_USERNAME=your-gmail@gmail.com MAIL_PASSWORD=your-16-char-app-password # Gmail App Password, not your login password # Google OAuth(可选 — 启用“Sign in with Google”) GOOGLE_CLIENT_ID=your_google_client_id_here GOOGLE_CLIENT_SECRET=your_google_client_secret_here ``` **Gmail 应用密码:** 前往 [myaccount.google.com](https://myaccount.google.com) → 安全性 → 两步验证 → 应用密码。 **Google OAuth:** 在 [console.cloud.google.com](https://console.cloud.google.com) → APIs & Services → Credentials → OAuth 2.0 Client ID 创建凭据。将重定向 URI 设置为 `http://localhost:5000/login/google/authorized`。 ### 3. 运行 ``` python app.py ``` 访问 [http://localhost:5000](http://localhost:5000)。 ### 4. 演示数据(可选) ``` python create_test_data.py # 创建:demouser / Password123 ``` ## 运行测试 ``` python -m pytest tests/ -v ``` 包含 37 项测试,涵盖注册、登录、2FA、检测规则 R1–R6、暴力破解警报、访问控制和 API endpoint。每个测试都使用一个全新的内存 SQLite 数据库。 ## 安全流程 ### 忘记密码 1. 在登录页面点击 **忘记密码?** 2. 输入您注册的电子邮件地址 3. 检查您的收件箱以获取 6 位数字重置验证码(有效期为 10 分钟) 4. 输入验证码,然后设置您的新密码 5. 如果账户已被锁定,将自动解锁 ### “这是您吗?”警报响应 1. 检测到可疑登录 → 发送带有确认/拒绝按钮的警报电子邮件 2. **是的,这是我** → 登录被标记为已确认,无需其他操作 3. **不是,请保护我的账户** → 账户立即被锁定,并发送账户锁定电子邮件 4. 使用忘记密码功能重置密码并重新获得访问权限 ### 账户锁定 - 在 `FAILED_ATTEMPT_WINDOW` 分钟内出现 `MAX_FAILED_ATTEMPTS` 次失败登录后触发 - 账户会在 `LOCKOUT_DURATION` 分钟后自动解锁 - 可以通过完成密码重置立即解锁 ## 环境变量 | 变量 | 必填 | 描述 | |----------|----------|-------------| | `SECRET_KEY` | 是 | Flask session 签名密钥 | | `MAIL_USERNAME` | 是 | 用于发送所有安全电子邮件的 Gmail 地址 | | `MAIL_PASSWORD` | 是 | Gmail 应用密码(16 个字符) | | `GOOGLE_CLIENT_ID` | 否 | 启用 Google OAuth 登录 | | `GOOGLE_CLIENT_SECRET` | 否 | 启用 Google OAuth 登录 | | `DATABASE_URL` | 否 | 默认为 `sqlite:///hacking_detection.db` |
标签:Flask, 双因素认证, 安全告警, 异常登录检测, 测试用例, 逆向工具