尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
SkillHub 安全扫描链路实战:Scanner 2.1.0 运行时、后端配置与失败语义全解析
人工智能AI AgentAI 技能后端前端【免费下载链接】skillhubSelf-hosted, open-source agent skill registry for enterprises. Publish version skill packages, govern with RBAC and audit logs, deploy on-premise with Docker or Kubernetes.项目地址https://gitcode.com/gh_mirrors/sk/skillhub点击查看免费下载本文基于 SkillHub 仓库中的 安全扫描后端运行指南完整拆解其围绕skill-scanner构建的后端安全扫描链路从发布流程中版本状态如何流转到SCANNING、local与upload两种运行模式的取舍、后端全部配置项与环境变量到 Redis Stream 下的重试与终态失败语义并逐条给出仓库内的源码与清单佐证帮助你在私有化环境中正确启用、验证和排障这条扫描链路。一、扫描链路的整体定位与发布流程集成SkillHub 当前支持的是一条backend-only纯后端的安全扫描链路扫描动作不经过前端发布publish流程在检测到扫描器启用后自动把新版本转入扫描状态扫描完成后落库审计结果再交回既有人工审核review工作流。Scanner 镜像锁定cisco-ai-skill-scanner2.1.0使用 glibc 基础 Linux 运行时发布镜像支持linux/amd64与linux/arm64两种架构。发布流程的七步流转如下publish 请求进入SkillPublishService若扫描器已启用版本状态进入SCANNING后端向 Redis Stream 投递一个ScanTaskScanTaskConsumer消费任务并调用skill-scanner扫描结果写入security_audit表版本转入PENDING_REVIEW若重试全部耗尽则进入SCAN_FAILED人工审核仍走既有的 review 工作流其中领域服务入口位于 SkillPublishService状态常量SCAN_FAILED、PENDING_REVIEW等均在其中定义。整条链路的调用关系可从 scanner/README.md 中的架构图确认SkillHub Backend ↓ SecurityScanService.triggerScan() ↓ Redis Stream (skillhub:scan:requests) ↓ ScanTaskConsumer ↓ SkillScannerAdapter ↓ SkillScannerService (HTTP Client) ↓ Cisco skill-scanner API需要注意的是前端不在本文范围内前端应通过专门的审计查询 API 获取审计详情而不是期望在既有 review 详情载荷里内嵌扫描数据。二、两种运行模式local 与 uploadSkillHub 后端支持两种调用 Scanner 的运行模式核心区别在于包体如何交给扫描器模式调用接口传递方式适用场景localPOST /scan传递文件系统路径本地开发且与 Scanner 共享文件系统uploadPOST /scan-upload上传包归档官方 Compose / Kubernetes / 任何服务拆分部署local 模式的前置条件local模式要求 SkillHub 与skill-scanner把同一目录挂载到同一路径并且 Scanner 侧必须允许该根目录——对标准路径需要设置SKILL_SCANNER_ALLOWED_ROOTS/tmp/skillhub-scans这个/tmp/skillhub-scans并非任意取值后端消费者 ScanTaskConsumer 中硬编码了SCAN_TEMP_DIR /tmp/skillhub-scans当任务携带bundleKey对象存储中的包时消费者会把包拉取到该目录下的临时.zip文件再交给扫描器并在任务结束/失败时清理该目录清理逻辑还包含路径前缀校验只删除该目录内部内容。upload 模式与官方部署官方 Compose 与 Kubernetes 部署统一使用upload模式。例如 compose.release.yml 中 server 容器固定注入SKILLHUB_SECURITY_SCANNER_ENABLED: ${SKILLHUB_SECURITY_SCANNER_ENABLED:-true} SKILLHUB_SECURITY_SCANNER_URL: http://skill-scanner:8000 SKILLHUB_SECURITY_SCANNER_MODE: upload后端适配层 SkillScannerAdapter 在发起扫描时会记录当前mode两条路径最终汇聚到同一个SecurityScanner抽象因此对上游业务代码而言模式切换是透明的。三、后端配置全量说明3.1 应用属性skillhub.security段默认值由 SkillScannerProperties 定义文档给出的完整配置示例如下注意enabled: false是关闭态示例skillhub: security: scanner: enabled: false base-url: http://localhost:8000 health-path: /health scan-path: /scan-upload mode: local connect-timeout-ms: 5000 read-timeout-ms: 900000 retry-max-attempts: 3 stream: key: skillhub:scan:requests group: skillhub-scanners reclaim-min-idle: PT16M max-unavailable-age: PT1H结合源码补充几个取值含义enabled属性类中默认值为true即不配置时扫描默认开启需显式置false关闭read-timeout-ms默认900000900 秒对应一次完整扫描的服务端读超时retry-max-attempts默认3与ScanTaskConsumer的默认maxRetryAttempts一致scan-path默认/scan-upload即官方部署默认走 upload 接口。application.yml 中该段全部由环境变量驱动且stream段还有几个文档未列举但实际生效的项带源码注释stream: # Keep temporary scanner outages recoverable, but do not retain Redis Pending entries forever. max-unavailable-age: ${SKILLHUB_SECURITY_STREAM_MAX_UNAVAILABLE_AGE:PT1H} key: ${SKILLHUB_SCAN_STREAM_KEY:skillhub:scan:requests} group: ${SKILLHUB_SCAN_STREAM_GROUP:skillhub-scanners} reclaim-enabled: ${SKILLHUB_SCAN_STREAM_RECLAIM_ENABLED:true} # Must exceed scanner read-timeout so an active task is not reclaimed prematurely. reclaim-min-idle: ${SKILLHUB_SCAN_STREAM_RECLAIM_MIN_IDLE:PT16M} reclaim-batch-size: ${SKILLHUB_SCAN_STREAM_RECLAIM_BATCH_SIZE:20} reclaim-interval: ${SKILLHUB_SCAN_STREAM_RECLAIM_INTERVAL:PT30S}注释明确了约束reclaim-min-idle必须大于 scanner 读超时否则一个仍在正常执行的扫描任务会被提前重新认领reclaim。这就是PT16M960 秒与 900 秒读超时之间的时序关系来源。3.2 关键环境变量后端侧重要环境变量均可通过 Spring 属性绑定覆盖上表默认值SKILLHUB_SECURITY_SCANNER_ENABLEDSKILLHUB_SECURITY_SCANNER_URLSKILLHUB_SECURITY_SCANNER_MODESKILLHUB_SECURITY_SCANNER_READ_TIMEOUTSKILLHUB_SCAN_STREAM_KEYSKILLHUB_SCAN_STREAM_GROUPSKILLHUB_SCAN_STREAM_RECLAIM_MIN_IDLESKILLHUB_SECURITY_STREAM_MAX_UNAVAILABLE_AGEScanner 侧可选环境变量SKILL_SCANNER_LLM_API_KEYSKILL_SCANNER_LLM_BASE_URLSKILL_SCANNER_LLM_MODELSKILLHUB_SCANNER_MAX_CONCURRENT_SCANS默认1SKILLHUB_SCANNER_HARD_TIMEOUT_SECONDS默认930SKILLHUB_SCANNER_MAX_UPLOAD_SIZE_BYTES默认110100480即 105 MiBScanner 端对这些变量的解析可在 skillhub_scanner_app.py 中直接确认例如并发上限_MAX_CONCURRENT_SCANS max(1, int(os.getenv(SKILLHUB_SCANNER_MAX_CONCURRENT_SCANS, 1)))与硬超时_HARD_TIMEOUT_SECONDS max(1, int(os.getenv(SKILLHUB_SCANNER_HARD_TIMEOUT_SECONDS, 930)))。LLM 三个变量缺失时Scanner 仍会以非 LLM 分析器运行因此最小部署可以不配置任何密钥。3.3 默认超时序的三层防线文档定义的默认超时顺序是这条链路稳定性的核心设计Server 读超时 900 秒read-timeout-ms: 900000——后端先放弃等待Scanner 硬超时 930 秒SKILLHUB_SCANNER_HARD_TIMEOUT_SECONDS——扫描器进程自杀Pending 消息回收 960 秒reclaim-min-idle: PT16M——Redis 侧最后兜底。硬超时会以退出码124结束 Scanner 进程Compose 或 Kubernetes 会将其重启同时对应的 Redis pending 任务按失败语义重试。三层超时逐级递增保证谁先发现超时谁负责清理避免出现任务悬挂。四、Kubernetes 部署要点当前仓库清单假设skillhub-server与skillhub-scanner是两个独立 Deployment二者不共享可写的包目录因此 Kubernetes 环境必须使用upload模式SKILLHUB_SECURITY_SCANNER_MODEupload SKILLHUB_SECURITY_SCANNER_URLhttp://skillhub-scanner:8000相关清单位于 deploy/k8s/base 目录scanner-deployment.yamlservices.yamlbackend-deployment.yamlconfigmap.yaml从源码结构看各清单的具体职责configmap.yaml 提供skill-scanner-enabled: true、skill-scanner-url: http://skillhub-scanner:8000、skill-scanner-mode: upload、skill-scanner-read-timeout: 900000以及skill-scanner-max-concurrent-scans: 1、skill-scanner-hard-timeout-seconds: 930、skill-scanner-max-upload-size-bytes: 110100480等键backend-deployment.yaml 通过configMapKeyRef把skill-scanner-*键映射为SKILLHUB_SECURITY_SCANNER_ENABLED/URL/MODE/READ_TIMEOUT与SKILLHUB_SCAN_STREAM_RECLAIM_MIN_IDLE环境变量scanner-deployment.yaml 将SKILL_SCANNER_LLM_*三个 LLM 变量声明为可选optional: true的 secret 引用并发/超时/上传大小三个运维参数走 ConfigMap就绪与存活探针均指向/healthreadiness 初始延迟 10 秒、liveness 初始延迟 20 秒。Scanner Service 默认是internal-only集群内部可见后端通过集群 DNSskillhub-scanner:8000访问不经过 Ingress 暴露。Helm 安装路径下charts/skillhub/templates/scanner-deployment.yaml 与 server-deployment.yaml 提供等价的变量注入。五、滚动升级到 Scanner 2.1.0Server 与 Scanner 的 HTTP 契约升级必须严格按以下顺序进行在旧 Scanner 仍在运行时先部署兼容版 Server排空并下线所有旧 Server 实例包括在途的扫描请求将 Scanner 升级到 2.1.0在恢复常规流量前验证/health与一次 upload 模式扫描。不要让旧版 Server 直接对接 Scanner 2.1.0。在任意扫描模式的混版滚动期间应保持 AI Defense 关闭SKILLHUB_SCANNER_USE_AI_DEFENSEfalse这也是默认值见 application.yml 中ai-defense: ${SKILLHUB_SCANNER_USE_AI_DEFENSE:false}。如果必须在旧 Scanner 下线前保持 AI Defense 启用应在旧 Scanner 的环境中用其自身版本支持的环境变量直接配置凭据。任何情况下都不要把 AI Defense 密钥放在 URL 查询参数或请求体中。仓库还提供了契约级自动化校验scripts/tests/scanner-2-1-contract-test.sh 用于回归验证 2.1.0 的接口契约滚动升级前可作为 CI 检查项参考。六、验证扫描服务与端到端检查6.1 验证 Scanner 服务本身仓库自带验证脚本 verify-scanner.shsh scripts/verify-scanner.sh http://localhost:8000 sh scripts/verify-scanner.sh http://localhost:8000 /path/to/skill.zip脚本内部按三步执行可直接阅读 scripts/verify-scanner.sh 确认健康检查GET /health失败立即退出分析器清单GET /analyzers不可用时降级为仅健康检查并告警上传冒烟测试提供样本包时执行POST /scan-upload-F file$SAMPLE_PACKAGE并校验响应中包含scan_id/scanId。6.2 启用功能后的后端检查清单发布一个测试包确认版本状态变为SCANNING确认security_audit表产生了新记录该表由 V35 迁移 创建后续经 V36、V38 与 V48 等迁移演进任务投递表则来自 V44 scan_task_outbox确认版本最终进入PENDING_REVIEW或SCAN_FAILED调用GET /api/v1/skills/{skillId}/versions/{versionId}/security-audit验证审计可查。七、审计查询 API 与响应语义审计数据的统一入口为 SecurityAuditControllerGET /api/v1/skills/{skillId}/versions/{versionId}/security-audit可选查询参数scannerType用于按扫描器类型过滤源码中对应findLatestActiveByVersionIdAndScannerType。响应为审计记录列表字段包括scanIdscannerTypeverdictisSafemaxSeverityfindingsCountfindingsscanDurationSecondsscannedAtcreatedAt源码中还额外返回failureReason字段对应 V48 迁移新增的列用于在终态失败时向运维与授权用户暴露失败原因。权限模型该接口的访问控制从 SecurityAuditController 的canViewAudit可以确认平台角色SUPER_ADMIN或SKILL_ADMIN直接放行所属 namespace 的ADMIN/OWNER放行其余用户走visibilityChecker.canAccess按 skill 可见性判断未认证principal null一律拒绝。此外同一路由下还挂载了POST .../security-audit/retry端点用于对失败扫描发起人工重试。isSafe 的精确语义isSafe: true表示扫描未发现高风险问题并不表示扫描没有产出任何 finding低严重度 finding 可能仍然存在findingsCount可能非零。因此 UI 将该状态渲染为No high-risk findings未发现高风险问题而不做无条件的安全保证。这一语义与后端策略默认值policy.fail-on-severity: high见 SkillScannerProperties 中Policy内部类preset默认balanced保持一致。八、失败语义从自动重试到可见的终态失败扫描任务的失败处理由通用消费者 AbstractStreamConsumer 提供骨架ScanTaskConsumer通过覆写钩子实现扫描专属语义。文档定义的行为逐条对应源码行为源码依据重试由AbstractStreamConsumer统一处理retryMessage()重新publishScanTask并带上递增的retryCount连接失败、HTTP 429、HTTP 5xx 保持 pending 等待自动恢复shouldDeferFailure()isScannerUnavailable(error) !hasUnavailableRecoveryExpired(payload)时挂起而非失败超过max-unavailable-age的不可用任务标记SCAN_FAILED、确认并移除shouldRetry()在恢复窗口过期后返回false进入markFailed()→processScanFailure()超时在 pending reclaim 时评估终态处理发生在约一个reclaim-min-idle加一个reclaim-interval之后reclaim 参数见 application.ymlmaxUnavailableAge默认PT1HScanTaskConsumer 中DEFAULT_MAX_UNAVAILABLE_AGE Duration.ofHours(1)终态失败在审计响应中保留失败原因finalFailureReason()区分扫描器未能在配置超时内恢复与重试耗尽两类文案落入failureReason其他终态失败在重试耗尽后把版本标记为SCAN_FAILEDmarkFailed()调用securityScanService.processScanFailure()扫描失败后仍会创建 review 任务避免包永远卡死保持既有人工审核路径完整几个值得注意的实现细节均来自 ScanTaskConsumer并发防重每个任务先取 Redisson 分布式锁skillhub:scan:processing:{taskId}拿不到锁时抛出ConcurrentScanInProgressException走重新入队路径防止 reclaim 出的重复消息在活跃扫描仍持有任务锁时把唯一的持久投递 ACK 掉幂等处理前经isTaskAlreadyProcessed(taskId)双重检查锁外一次、锁内一次已处理的任务直接跳过双来源取包payload 优先使用bundleKey从对象存储拉取到/tmp/skillhub-scans临时目录否则回退到skillPath直接路径二者皆缺时抛出IllegalStateException任务年龄判定createdAtMillis优先取消息字段缺失时从 Redis 消息 ID 前缀解析毫秒时间戳并容忍最多 5 分钟的时钟偏移MAX_CLOCK_SKEW。相关测试覆盖见 ScanTaskConsumerTest、ScanTaskConsumerPathSafetyTest验证临时路径清理安全边界与 SkillScannerAdapterTest。这套设计的效果是人工审核路径始终完整扫描器故障只是可见的延迟而不是静默的丢失——失败原因可查、重试可手动触发、超限任务有明确终态。附录快速排障对照表现象可能原因排查入口版本长期停在SCANNINGScanner 不可用任务被 defer 等待恢复检查/health、Redis pending 队列确认未超max-unavailable-age任务进入SCAN_FAILED且原因为did not recover before the configured timeoutScanner 持续不可用超过 1 小时恢复窗口恢复 Scanner 后调用 retry 端点扫描被提前 reclaimreclaim-min-idle小于读超时核对SKILLHUB_SCAN_STREAM_RECLAIM_MIN_IDLE≥ 读超时local模式 Scanner 拒绝扫描根目录未在允许列表设置SKILL_SCANNER_ALLOWED_ROOTS/tmp/skillhub-scans且两端挂载同一路径上传被拒包超过 105 MiB 默认上限调整SKILLHUB_SCANNER_MAX_UPLOAD_SIZE_BYTES赞分享人工智能AI AgentAI 技能后端前端【免费下载链接】skillhubSelf-hosted, open-source agent skill registry for enterprises. Publish version skill packages, govern with RBAC and audit logs, deploy on-premise with Docker or Kubernetes.项目地址https://gitcode.com/gh_mirrors/sk/skillhub点击查看免费下载相关推荐Mise 在 Windows 安装 Node.js 报拒绝访问怎么办三条排查路径Mise 在 Windows 安装 Node.js 报拒绝访问怎么办三条排查路径 在 Windows 上用 Mise 安装 Node.js 时如果命令停开发工具CLIRustFS Scanner 后台维护扫描循环架构解析、运行时控制与调优实战RustFS Scanner 后台维护扫描循环架构解析、运行时控制与调优实战 RustFS Scanner 是 RustFS开源、兼容 S3 的高性能对象存后端对象存储分布式存储Apache Ossie AI上下文实战指南instructions、synonyms与examples怎么写Apache Ossie AI上下文实战指南instructions、synonyms与examples怎么写 Apache Ossie 是跨行业推动的语义元后端数据建模数据集成创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

Context-Mode设计范式:从参数地狱到有限模式收敛

Context-Mode设计范式:从参数地狱到有限模式收敛

1. 从“context-mode”这个词说起:它到底指什么第一次看到“context-mode”这个标题,很多人会愣一下——它不像“XX管理系统”“XX爬虫框架”那样一眼能看出用途,反而像某个库里的一个枚举值、一个配置项,或者某个编辑器里的一个开…

📅 2026/10/14 15:49:27
把编辑器装进终端提示符:tty7 幽灵建议、智能 Tab 补全与模糊历史搜索完全指南

把编辑器装进终端提示符:tty7 幽灵建议、智能 Tab 补全与模糊历史搜索完全指南

【免费下载链接】tty7 The terminal that outlives its window. Shells survive quitting the app, agents can drive other agents, and remote machines work the same way. Pure Rust, GPU-rendered. 项目地址: https://gitcode.com/gh_mirrors/tty/tty7 点击查看…

📅 2026/10/14 15:49:27
小白“晚到生”的第一篇博客

小白“晚到生”的第一篇博客

大家好!这是我的第一篇博客,先简单介绍下自己:我来自山西省长治市,现在就读于山西电子科技学院,是一名计算机科学与技术专业的专升本学生。说实话,比起一路读上来的同学,我的起点确实晚了一些。…

📅 2026/10/14 15:49:27
MORE NEWS

更多资讯

📰

数据结构与算法分析Java版习题答案详解:从链表到图的备考攻略

简介:《数据结构与算法分析(Java语言描述)》(第三版)的配套习题答案文档,面向正在学习数据结构、Java 版算法分析与计算理论基础的本科学生及自学者。全文共 1 个 docx 文件,压缩包约 1.52MB&am…

📰

AR开发避坑指南:图像处理、位姿估计与SLAM如何撑起增强现实

拿着一张手机拍的照片,你想把一个3D咖啡杯放到桌面上。听起来只是“放上去”一个动作,但如果你真从零实现一次,会发现整个AR系统至少有八成时间在处理图像:找桌面、估计相机角度、算虚拟物体的透视关系、判断要不要让杯子被手挡住…

📰

GrantForge 2026.1.0 正式发布:开源统一权限管理平台,新增 HDFS、ZooKeeper、MySQL 权限控制与数据脱敏!

最近一直在持续开发和完善 GrantForge,今天正式发布 2026.1.0 版本! GrantForge 是一款基于 Spring Boot、Spring Security 和 Vue 3 构建的开源权限管理平台。 项目最初主要围绕 RBAC(基于角色的访问控制)展开,希望提…

📰

STM32F4 SPI+DMA+FATFS嵌入式SD卡稳定写入方案

简介:本资源是面向嵌入式开发初学者与进阶工程师的STM32F4平台SD卡文件系统实战项目,聚焦SPIDMA高效驱动MicroSD卡并集成FatFS实现标准文件操作,解决嵌入式设备中大容量、可靠存储与读写管理的核心痛点,适用于智能仪表、数据记录仪…

📰

rizzo-pii训练配方全公开:mmBERT微调74.5万行数据,单卡16GB两小时跑通0.3B PII检测模型

【免费下载链接】rizzo-pii Local-first privacy guard: anonymize your documents before sharing with LLMs. 项目地址: https://gitcode.com/gh_mirrors/ri/rizzo-pii 点击查看 免费下载 做本地隐私保护的 rizzo-pii 把它的 PII 检测模型训练配方完整公开了&…

📰

SQL窗口函数速查表:从排名到累计的实战避坑指南

简介:这份《SQL窗口函数速查表》PDF面向数据库管理员、数据分析师、数据科学家及开发人员,尤其适合希望提升复杂数据集查询能力的技术人员。内容按功能与用途分类,系统梳理窗口函数的基本概念、语法结构与参数说明,涵盖ROW_NUMBER…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬