LarsLaskowski/DockerUpdateGuard

GitHub: LarsLaskowski/DockerUpdateGuard

一款 Docker 容器运维追踪工具,通过比对运行中容器与 registry 元数据来揭示更新状态、漏洞风险和基础镜像依赖关系。

Stars: 0 | Forks: 0

# DockerUpdateGuard DockerUpdateGuard 是一个 Web 应用程序,用于追踪 Docker 中实际运行的内容,将其与 registry 元数据进行比较,并展示哪些地方需要注意更新、漏洞以及共享的基础镜像依赖。 它是为那些不满足于仅仅知道“存在更新的 tag”的团队而设计的。该应用程序维护一个已观察镜像和运行中容器的清单,将它们与 registry 的 tag 和 digest 相关联,采样 CPU、内存和网络使用情况,并保留扫描历史记录,以便审查更新决策而不是凭猜测。 ## 该应用程序有助于 - 发现已配置的 Docker 实例及其上当前运行的容器 - 检测运行中的容器是最新的、落后于较新版本,还是需要人工审查 - 当 `latest` 等别名 tag 与语义版本 tag 共享相同的 digest 时,将它们解析并匹配 - 随时间追踪 Docker 实例和运行中容器的资源使用情况 - 将运行中的容器与已观察的镜像和共享基础镜像进行关联 - 刷新镜像的漏洞数据 - 保留历史扫描结果以供审计和故障排除 ## 主要 UI 区域 - **Dashboard**:当前清单的汇总视图 - **Observed Images**:从 Docker Hub 账户数据中发现的仓库和 tag - **Runtime Containers**:具有更新和漏洞状态的实时工作负载清单 - **Docker Instances**:已配置的引擎及其使用历史 - **Shared Base Images**:已观察镜像中基础镜像的重用情况 - **Scan History**:近期的后台活动及其结果 ## 运行时要求 DockerUpdateGuard 需要: - 一个 PostgreSQL 数据库 - 访问一个或多个 Docker Engine endpoint - 可选的 Docker Hub 凭据,用于经过身份验证的 registry 访问 - 每个 Docker 实例可选的 Portainer 访问权限 - 用于遥测数据导出的可选 OTLP endpoint - 启用基于 Trivy 的漏洞扫描时,可选的 Trivy 服务器 应用程序在启动时会自动应用 EF Core 迁移。 ## 运行应用程序 ### 本地开发 使用仓库根目录中的解决方案文件: ``` dotnet restore DockerUpdateGuard.slnx reihitsu-format ./ dotnet build DockerUpdateGuard.slnx -c Release --no-restore dotnet test src\Tests\**\*.csproj -c Release --no-build --logger trx --collect:"XPlat Code Coverage" ``` ### Docker 镜像 容器镜像默认监听 `8080` 端口。 在 Linux 上使用本地 Docker socket 的示例: ``` docker run -d \ --name dockerupdateguard \ -p 8080:8080 \ --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \ -v /path/to/appsettings.json:/app/appsettings.json:ro \ networlddev/dockerupdateguard:latest ``` 当 DockerUpdateGuard 在 Linux 容器内运行,并且需要通过 Unix socket 检查宿主机 Docker Engine 时,必须满足两个条件: 1. `/var/run/docker.sock` 必须挂载到容器中 2. 在 appsettings.json 中,相应的 Docker 实例 BaseUrl 必须设置为 `unix:///var/run/docker.sock` 如果缺少这两个设置中的任何一个,应用程序将无法连接到宿主机引擎。 ## 配置模型 DockerUpdateGuard 使用标准的 ASP.NET Core 配置绑定,并在容器部署时优先使用配置文件: - `appsettings.json` - `appsettings.{Environment}.json` - 命令行参数 - ASP.NET Core 支持的密钥存储 例如: - JSON 键:`DockerUpdateGuard:Scanning:RuntimeImageUpdateScanIntervalMinutes` ## 配置参考 ### 连接和主机设置 | 键 | 默认值 | 必需 | 描述 | | --- | --- | --- | --- | | `ConnectionStrings:DockerUpdateGuard` | 无 | 是* | 当未设置 `DockerUpdateGuard:ConnectionString` 时使用的命名 PostgreSQL 连接字符串 | | `DockerUpdateGuard:ConnectionString` | 无 | 是* | 内联 PostgreSQL 连接字符串 | | `DockerUpdateGuard:ConnectionStringName` | `DockerUpdateGuard` | 否 | 要解析的 `ConnectionStrings` 条目名称 | | `DockerUpdateGuard:DisplayVersion` | 程序集版本 | 否 | UI 页脚中显示的版本字符串;Docker 镜像会自动设置此项 | \* 必须至少配置 `DockerUpdateGuard:ConnectionString` 或 `ConnectionStrings:{ConnectionStringName}` 中的一个。 ### `DockerUpdateGuard:DockerHub` | 键 | 默认值 | 必需 | 描述 | | --- | --- | --- | --- | | `Registry` | `docker.io` | 是 | 由 Docker Hub 集成处理的 registry 主机 | | `UserName` | 无 | 否 | 用于经过身份验证的 API 请求的 Docker Hub 用户名 | | `Pat` | 无 | 否 | Docker Hub 个人访问令牌 | | `RequestTimeoutSeconds` | `30` | 否 | 对外 Docker Hub 和 OCI registry 请求的超时时间 | | `MaxParallelRequests` | `4` | 否 | registry 操作的最大逻辑请求并发数 | ### `DockerUpdateGuard:Vulnerabilities` | 键 | 默认值 | 必需 | 描述 | | --- | --- | --- | --- | | `Enabled` | `false` | 否 | 启用漏洞刷新 | | `Provider` | `None` | 启用时必需 | 支持的值:`None`, `DockerScout`, `Trivy` | | `TrivyBaseUrl` | 无 | `Trivy` 必需 | Trivy 服务器的 Base URL | | `RequestTimeoutSeconds` | `30` | 否 | 漏洞提供程序请求的超时时间 | ### `DockerUpdateGuard:Scanning` | 键 | 默认值 | 描述 | | --- | --- | --- | | `DiscoveryIntervalMinutes` | `15` | 已配置 Docker 实例的同步间隔 | | `DockerHubAccountDiscoveryIntervalMinutes` | `60` | 刷新 Docker Hub 账户镜像清单的间隔 | | `OwnImageBaseScanIntervalMinutes` | `60` | 解析已观察镜像基础镜像链的间隔 | | `DockerHubRequestLimitWindowHours` | `6` | 计划内 Docker Hub 刷新的配额窗口大小 | | `DockerHubRequestLimitPerWindow` | `200` | 每个配额窗口计划内的 Docker Hub 请求预算 | | `DockerHubReservedManualRequestsPerWindow` | `40` | 为手动扫描和临时活动保留的请求预算 | | `RuntimeImageUpdateScanIntervalMinutes` | `30` | 刷新运行中容器状态和更新状态的间隔 | | `ResourceStatisticsIntervalMinutes` | `5` | 采样 CPU、内存和网络使用情况的间隔 | | `VulnerabilityRefreshIntervalMinutes` | `180` | 刷新漏洞信息的间隔 | | `CleanupIntervalMinutes` | `720` | 清理旧扫描数据的间隔 | | `RetryCount` | `2` | 瞬时后台故障的重试次数 | | `RetainScanRunsDays` | `30` | 已完成的扫描历史的保留期 | ### `DockerUpdateGuard:DockerInstances[]` 每个条目描述一个 Docker Engine endpoint。 | 键 | 默认值 | 必需 | 描述 | | --- | --- | --- | --- | | `Name` | 无 | 是 | Docker 实例的显示名称 | | `BaseUrl` | 无 | 是 | Docker endpoint URI;验证允许 `http`, `https`, `tcp`, `unix` 和 `npipe` | | `Enabled` | `true` | 否 | 启用或禁用此 Docker 实例 | | `UseTls` | `false` | 否 | 对于 `tcp://` endpoint,将连接升级为 HTTPS | | `SkipCertificateValidation` | `false` | 否 | 跳过 TLS endpoint 的服务器证书验证。**不安全:** 禁用 TLS 身份验证并使连接面临中间人攻击风险;在运行时只要其处于活动状态就会记录警告。仅对带有自签名证书的受信任 endpoint 使用。 | | `CertificatePath` | 无 | 否 | 用于 TLS 安全引擎访问的可选客户端证书路径 | | `RequestTimeoutSeconds` | `15` | 否 | Docker Engine 请求的超时时间 | 推荐的 Linux socket 配置: | 键 | 示例值 | | --- | --- | | `DockerUpdateGuard:DockerInstances[0]:Name` | `Local Docker` | | `DockerUpdateGuard:DockerInstances[0]:BaseUrl` | `unix:///var/run/docker.sock` | | `DockerUpdateGuard:DockerInstances[0]:Enabled` | `true` | ### `DockerUpdateGuard:DockerInstances[].Portainer` Portainer 设置是可选的,仅在需要提供基于 Portainer 的操作时才需要。 | 键 | 默认值 | 必需 | 描述 | | --- | --- | --- | --- | | `Enabled` | `false` | 否 | 为 Docker 实例启用 Portainer 集成 | | `BaseUrl` | 无 | 启用时必需 | 绝对 `https` Portainer URL(强烈建议);参见 `AllowInsecureHttp` | | `AllowInsecureHttp` | `false` | 否 | 允许为 `BaseUrl` 使用明文 `http`;凭据将以未加密方式传输——仅在 localhost 或受信任的专用网络上使用 | | `Username` | 无 | 条件必需 | Portainer 登录的用户名 | | `Password` | 无 | 条件必需 | Portainer 登录的密码 | | `ApiToken` | 无 | 条件必需 | Portainer API token;优先于用户名/密码 | | `EndpointId` | 无 | 否 | 显式 Portainer endpoint ID;省略时自动发现 | | `RequestTimeoutSeconds` | `15` | 否 | Portainer 请求的超时时间 | 启用 Portainer 时,必须配置以下其中一项: - `ApiToken`,或者 - `Username` 和 `Password` ### 遥测 | 键 | 默认值 | 必需 | 描述 | | --- | --- | --- | --- | | `ServiceName` | `DockerUpdateGuard` | 启用遥测时必需 | 遥测资源中使用的服务名称 | | `OtlpEndpoint` | 无 | 否 | 绝对 `http` 或 `https` OTLP endpoint | | `Instance` | 无 | 否 | 逻辑部署实例名称 | | `EnableLogging` | `true` | 否 | 启用 OpenTelemetry 日志导出 | | `EnableMetrics` | `true` | 否 | 启用 OpenTelemetry 指标导出 | | `EnableTracing` | `true` | 否 | 启用 OpenTelemetry 追踪导出 | 如果所有三个遥测开关均为 `false`,则遥测实际上已被禁用。 ## 配置示例 ### JSON ``` { "ConnectionStrings": { "DockerUpdateGuard": "Host=postgres;Port=5432;Database=dockerupdateguard;Username=dockerupdateguard;Password=change-me" }, "DockerUpdateGuard": { "ConnectionStringName": "DockerUpdateGuard", "DockerHub": { "Registry": "docker.io", "UserName": "dockerupdateguard", "Pat": "change-me", "RequestTimeoutSeconds": 30, "MaxParallelRequests": 4 }, "Vulnerabilities": { "Enabled": true, "Provider": "Trivy", "TrivyBaseUrl": "http://trivy:4954", "RequestTimeoutSeconds": 30 }, "Scanning": { "DiscoveryIntervalMinutes": 5, "DockerHubAccountDiscoveryIntervalMinutes": 15, "OwnImageBaseScanIntervalMinutes": 30, "DockerHubRequestLimitWindowHours": 6, "DockerHubRequestLimitPerWindow": 200, "DockerHubReservedManualRequestsPerWindow": 40, "RuntimeImageUpdateScanIntervalMinutes": 10, "ResourceStatisticsIntervalMinutes": 5, "VulnerabilityRefreshIntervalMinutes": 60, "CleanupIntervalMinutes": 720, "RetryCount": 1, "RetainScanRunsDays": 14 }, "DockerInstances": [ { "Name": "Local Docker", "BaseUrl": "unix:///var/run/docker.sock", "Enabled": true, "UseTls": false, "SkipCertificateValidation": false, "RequestTimeoutSeconds": 15, "Portainer": { "Enabled": false, "BaseUrl": "https://portainer.local", "EndpointId": "1", "RequestTimeoutSeconds": 15 } } ] }, "Telemetry": { "ServiceName": "DockerUpdateGuard", "Instance": "Production", "OtlpEndpoint": "http://otel-collector:4317", "EnableLogging": true, "EnableMetrics": true, "EnableTracing": true } } ``` ### 容器部署配置 建议将 appsettings.json 挂载到容器中,而不是使用环境变量。例如: - 将您的配置文件挂载到容器的内容根目录,例如:`-v /path/to/appsettings.json:/app/appsettings.json:ro` 有关确切的键和结构,请参见上面的 JSON 示例。 ## 基于 Docker 部署的注意事项 - 容器默认监听 8080 端口 - 镜像根据镜像构建参数设置 `DockerUpdateGuard:DisplayVersion` - 对于 Linux 宿主机监控,请绑定挂载 `/var/run/docker.sock` - 对于受 TLS 保护的远程引擎,如果使用了 `CertificatePath`,还需挂载客户端证书文件 - 应用程序需要对已配置的 registry、可选的 Portainer endpoint、可选的 Trivy 服务器和可选的 OTLP collector 进行出站网络访问 ## 许可证 本仓库根据 LICENSE.md 中描述的专有条款进行分发。有关完整的许可证文本,请参见 LICENSE.md。
标签:Docker, 占用监测, 安全防御评估, 测试用例, 用户代理, 请求拦截, 资产管理, 资源监控, 运维监控, 镜像更新