Shield 是一个基于 Go 语言开发的综合性安全监控系统,提供实时的网络、系统、文件完整性和系统调用监控功能。
- 网络监控: 监控网络连接、端口扫描检测、异常连接分析
- SSH监控: SSH暴力破解检测、异常登录记录分析
- 系统监控: 特权进程监控、CPU和内存使用率Top10进程
- 文件完整性监控: 关键文件和目录的实时监控和完整性检查
- 系统调用监控: 异常系统调用检测、特权操作监控
- 网络流量监控: 可疑网络流量检测、带宽使用分析
- gRPC API: 提供高性能的gRPC接口
- 实时监控: 支持实时数据流推送
- 地理位置分析: 集成GeoIP数据库进行IP地理位置分析
- 数据持久化: 使用SQLite数据库存储监控数据
- 配置化管理: 支持YAML配置文件
- 模块化设计: 各监控模块可独立启用/禁用
Shield/
├── api/proto/ # gRPC协议定义文件
├── cmd/
│ ├── shield/ # 主程序
│ └── client/ # 客户端示例
├── config/ # 配置文件
├── internal/
│ ├── config/ # 配置管理
│ ├── database/ # 数据库操作
│ ├── geoip/ # GeoIP服务
│ ├── grpc/ # gRPC服务器
│ ├── models/ # 数据模型
│ └── monitors/ # 监控模块
└── Makefile # 构建脚本
- Go 1.21+
- Protocol Buffers 编译器 (protoc)
- Linux/Unix 系统(用于系统调用和文件监控)
# 安装 protobuf 工具
make install-protoc
# 安装 Go 依赖
go mod download# 生成 protobuf 代码
make proto
# 编译项目
make build- 复制配置文件模板:
cp config/config.yaml config/config.yaml.local-
编辑配置文件
config/config.yaml.local,根据需要调整监控参数。 -
下载 GeoIP 数据库(可选):
# 下载 GeoLite2 数据库到 data/ 目录
wget -O data/GeoLite2-City.mmdb.gz "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=YOUR_LICENSE_KEY&suffix=tar.gz"# 运行主程序
make run
# 或者直接运行编译后的二进制文件
./bin/shield -config config/config.yaml# 运行测试客户端
go run cmd/client/main.go# 服务器配置
server:
port: 9090
host: "0.0.0.0"
# 数据库配置
database:
path: "./data/shield.db"
retention_days: 30
# 监控模块配置
monitoring:
network:
enabled: true
interval: 60
ssh:
enabled: true
interval: 30
system:
enabled: true
interval: 60
# 文件完整性监控
file_integrity:
enabled: true
watch_paths:
- "/etc/passwd"
- "/etc/shadow"
- "/bin"
- "/sbin"
scan_interval: 3600
# 系统调用监控
syscall:
enabled: true
audit_log_paths:
- "/var/log/audit/audit.log"
suspicious_threshold: 100
# 网络流量监控
traffic:
enabled: true
bandwidth_threshold: 104857600 # 100MB/s
connection_threshold: 100Shield 提供以下主要 gRPC 接口:
GetNetworkEvents: 获取网络事件GetSSHEvents: 获取SSH事件GetSystemEvents: 获取系统事件GetFileEvents: 获取文件事件GetSyscallEvents: 获取系统调用事件GetTrafficEvents: 获取流量事件GetEventStats: 获取事件统计GetSystemStatus: 获取系统状态GetRealtimeData: 获取实时数据流
package main
import (
"context"
"log"
"google.golang.org/grpc"
pb "shield/api/proto"
)
func main() {
conn, err := grpc.Dial("localhost:9090", grpc.WithInsecure())
if err != nil {
log.Fatal(err)
}
defer conn.Close()
client := pb.NewShieldServiceClient(conn)
// 获取系统状态
resp, err := client.GetSystemStatus(context.Background(), &pb.GetSystemStatusRequest{})
if err != nil {
log.Fatal(err)
}
log.Printf("系统状态: %+v", resp)
}- 端口扫描检测
- 异常连接分析
- 高危地区IP连接
- 连接频率统计
- 暴力破解检测
- 异常登录时间
- 地理位置异常
- 登录失败统计
- 特权进程监控
- CPU使用率Top10
- 内存使用率Top10
- 系统负载监控
- 文件修改检测
- 文件创建/删除
- 权限变更监控
- 哈希值校验
- 可疑系统调用检测
- 特权操作监控
- 异常进程行为
- 系统调用频率分析
- 带宽使用监控
- 连接数统计
- 异常流量模式
- DDoS攻击检测
- 在
internal/monitors/目录下创建新的监控器文件 - 实现监控器接口:
type Monitor interface {
Start() error
Stop()
}- 在配置文件中添加相应配置项
- 在主程序中集成新的监控器
- 在
internal/models/中定义新的数据结构 - 在
internal/database/中添加相应的数据库操作 - 更新 protobuf 定义文件
- 重新生成 protobuf 代码
- 系统权限: 确保程序有足够权限读取系统日志和监控文件
- 资源配置: 根据监控规模调整数据库保留天数和检查间隔
- 网络安全: 配置防火墙规则,限制gRPC端口访问
- 日志轮转: 配置系统日志轮转,避免磁盘空间不足
- 监控告警: 集成外部告警系统,及时响应安全事件
- 数据库优化: 定期清理过期数据,创建适当索引
- 监控间隔: 根据系统负载调整监控检查间隔
- 内存管理: 监控程序内存使用,避免内存泄漏
- 并发控制: 合理设置监控协程数量
- 权限不足: 确保程序有读取系统日志的权限
- 端口占用: 检查gRPC端口是否被其他程序占用
- 数据库锁定: 确保数据库文件路径可写且无其他程序占用
- GeoIP数据库: 确保GeoIP数据库文件存在且可读
程序运行日志包含详细的错误信息和调试信息,可通过以下方式查看:
# 查看实时日志
tail -f /var/log/shield.log
# 搜索错误信息
grep "ERROR" /var/log/shield.log本项目采用 MIT 许可证,详见 LICENSE 文件。
欢迎提交 Issue 和 Pull Request 来改进项目。在提交代码前,请确保:
- 代码符合 Go 语言规范
- 添加必要的单元测试
- 更新相关文档
- 通过所有测试用例
如有问题或建议,请通过以下方式联系:
- 提交 GitHub Issue
- 发送邮件至项目维护者
注意: 本系统主要用于安全监控和分析,请确保在合法合规的前提下使用。