jopolko/security-dashboard
GitHub: jopolko/security-dashboard
一个基于 PHP 的轻量级安全仪表板,通过解析 SSH 登录失败日志并结合地理定位,在交互式地图上实时可视化服务器遭受的攻击来源与威胁趋势。
Stars: 0 | Forks: 0
# 安全威胁情报仪表板
一个现代化、专业的仪表板,用于实时可视化 SSH 登录尝试和安全威胁。
## 功能
- 🗺️ **全球攻击地图** - 在交互式世界地图上通过可变大小的节点可视化攻击来源
- 📊 **实时统计** - 跟踪总尝试次数、独立 IP、封禁 IP 和国家/地区分布
- 🎯 **热门国家/地区** - 通过动态条形图查看发起攻击最多的国家/地区
- 📝 **近期攻击** - 监控带有时间戳和位置的近期登录尝试
- 🎨 **专业设计** - 干净的奶油色/米色调色板与优雅的 UI 元素
- 🛡️ **Fail2ban 集成** - 支持永久封禁的实时 IP 封禁跟踪
- 📅 **滚动 7 天时间窗口** - 针对近期威胁的动态数据过滤
- 📱 **移动端响应式** - 全面适配各种屏幕尺寸和设备
## 设置
### 1. 授予日志访问权限
Web 服务器需要获取读取 auth.log 文件的权限:
```
# 选项 1:将 www-data 添加到 adm group(推荐)
sudo usermod -a -G adm www-data
# 选项 2:使用 cron job 创建可读副本
sudo cp /var/log/auth.log /var/www/html/security/auth.log
sudo chmod 644 /var/www/html/security/auth.log
# 添加到 crontab 以进行自动更新:
*/5 * * * * cp /var/log/auth.log /var/www/html/security/auth.log && chmod 644 /var/www/html/security/auth.log
```
### 2. 创建缓存目录
```
sudo mkdir -p /tmp/geo_cache
sudo chmod 777 /tmp/geo_cache
sudo chmod 777 /tmp
```
### 3. 访问仪表板
打开浏览器并导航至:
```
http://your-server-ip/security/
```
## 工作原理
### 后端 (`get_attacks.php`)
- 解析 `/var/log/auth.log` 获取失败的 SSH 登录尝试
- 提取 IP 地址和时间戳
- 使用 ip-api.com 提供的免费 IP 地理定位(无需 API key)
- 将结果缓存 5 分钟以提升性能
- 实施速率限制以遵守 API 限制(45 个请求/分钟)
### 前端 (`index.php`)
- 采用浅色专业主题的交互式 Leaflet.js 地图
- 带有实时更新的实时统计数据显示
- 具有平滑过渡效果的动态 UI 元素
- 页面加载时动态加载数据
- 完美适配移动端和桌面端的响应式设计
## 检测到的攻击模式
仪表板会检测以下身份验证失败模式:
- 密码错误尝试
- 无效用户登录尝试
- 连接重置
- 协议违规
- 断开的身份验证会话
## 性能
- **地理定位缓存**:每个 IP 的位置数据缓存 24 小时
- **实时数据**:每次请求都会重新解析攻击数据(无主缓存)
- **速率限制**:内置 API 调用之间的 1.5 秒延迟,以遵守限制(45 个请求/分钟)
- **优化**:按频率处理前 100 个发起攻击的 IP
- **7 天滚动窗口**:仅分析过去 7 天内的攻击
- **Gzip 压缩**:对响应数据进行压缩以加快传输速度
## 隐私与安全
- 仅监控**失败的**登录尝试(安全事件)
- 不跟踪成功的登录记录
- 所有数据均保留在您的服务器上
- 使用免费、公共的 IP 地理定位服务
- 本地缓存最大限度地减少了外部 API 调用
## 自定义
### 更新颜色
编辑 `index.php` 中的 CSS 变量:
- 背景:`--cream-bg: #FAF7F0`(奶油色)
- 主强调色:`--accent-primary: #B8956A`(暖棕色)
- 危险强调色:`--accent-danger: #C67B5C`(铁锈红)
- 主文本色:`--text-primary: #2C2416`(深棕色)
### 更改时间窗口
编辑 `get_attacks.php` 以调整滚动窗口(默认:7 天):
```
function parseAuthLog($logFile, $daysBack = 7) { // Change 7 to desired days
```
### 调整地理定位缓存
编辑 `get_attacks.php`(默认:24 小时):
```
if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < 86400) { // Change 86400 to desired seconds
```
## 故障排除
### 无数据显示
1. 检查 auth.log 是否可读:
sudo ls -la /var/log/auth.log
2. 验证 PHP 是否能访问该文件:
sudo -u www-data cat /var/log/auth.log
3. 检查 PHP 错误日志:
sudo tail -f /var/log/apache2/error.log
# 或
sudo tail -f /var/log/nginx/error.log
### 地图未加载
- 确保网络连接正常(需要 Leaflet.js 和地图瓦片)
- 检查浏览器控制台是否存在 JavaScript 错误
- 验证是否可访问 CDN 资源
### 地理定位失败
- 检查速率限制(ip-api.com 为 45 个请求/分钟)
- 验证网络连接状况
- 检查 `/tmp/geo_cache/` 权限
## 移动端优化
仪表板具有完全的响应式设计并针对移动设备进行了优化:
### 响应式断点
- **桌面端** (>1024px):带图例的完整并排布局
- **平板电脑** (768px-1024px):带全高地图的堆叠布局
- **移动设备** (480px-768px):紧凑的垂直布局,隐藏图例
- **小屏移动设备** (<480px):超紧凑设计,减小了文本尺寸
- **横屏模式**:地图与侧边栏并排的分割视图
### 移动端特性
✅ **触控优化**
- 更大的点击目标(无障碍访问最低要求 44px)
- 适用于触控的友好地图交互
- 禁用滚轮缩放(防止意外缩放)
- 更大的点击容错率(15px),更容易选中标记
✅ **自适应布局**
- 页头在移动端垂直堆叠
- 统计数据以水平行显示
- 全宽刷新按钮
- 地图在移动端调整为 300-350px 高度
- 面板和文本适度缩放
✅ **性能**
- 地图为移动端自动调整缩放级别(缩放级别 1 与 2)
- 移动端使用更细的滚动条(4px)
- 在小屏幕上隐藏图例以节省空间
- 在触控设备上禁用悬停效果
✅ **视觉反馈**
- 刷新按钮上的加载指示器
- 数据加载期间按钮透明度发生变化
- 平滑的动画与过渡效果
### 在移动端测试
1. **在移动端浏览器中打开**:http://your-server-ip/security/
2. **竖屏模式**:垂直滚动布局
3. **横屏模式**:并排视图
4. **双指缩放**:可在地图上使用
5. **点击标记**:查看攻击详情
## 浏览器兼容性
### 桌面端
- Chrome/Edge 90+
- Firefox 88+
- Safari 14+
### 移动端
- iOS Safari 14+
- Chrome Mobile 90+
- Samsung Internet 14+
- Firefox Mobile 88+
## 许可证
可免费用于安全监控和教育目的。
## 致谢
- 地图:Leaflet.js 及 CARTO Light 瓦片
- 地理定位:ip-api.com(免费层,45 个请求/分钟)
- 设计:采用专业奶油色调色板及现代 UI
- Fail2ban:用于永久 IP 封禁的集成
标签:Fail2ban, OpenVAS, PHP, SSH监控, 动态API解析, 威胁情报, 安全, 开发者工具, 数据可视化, 超时处理, 运维