# Scanner 配置说明

## 概述

本文档详细说明 SkillHub Scanner 的所有配置项，包括基础配置、分析器配置、策略配置和运维配置。

## 配置文件位置

- **开发环境**：`server/skillhub-app/src/main/resources/application-local.yml`
- **测试环境**：`server/skillhub-app/src/main/resources/application-test.yml`
- **生产环境**：`server/skillhub-app/src/main/resources/application.yml`
- **Kubernetes**：`deploy/k8s/configmap.yaml` 和 `deploy/k8s/secret.yaml`

## 完整配置示例

```yaml
skillhub:
  security:
    scanner:
      # 基础配置
      enabled: ${SKILLHUB_SECURITY_SCANNER_ENABLED:true}
      base-url: ${SKILLHUB_SECURITY_SCANNER_URL:http://localhost:8000}
      mode: ${SKILLHUB_SECURITY_SCANNER_MODE:local}

      # 分析器配置
      analyzers:
        behavioral: ${SKILLHUB_SCANNER_USE_BEHAVIORAL:false}
        llm: ${SKILLHUB_SCANNER_USE_LLM:false}
        llm-provider: ${SKILLHUB_SCANNER_LLM_PROVIDER:anthropic}
        llm-consensus-runs: ${SKILLHUB_SCANNER_LLM_CONSENSUS_RUNS:3}
        meta: ${SKILLHUB_SCANNER_USE_META:true}
        ai-defense: ${SKILLHUB_SCANNER_USE_AI_DEFENSE:false}
        ai-defense-api-key: ${SKILLHUB_SCANNER_AI_DEFENSE_API_KEY:}
        virus-total: ${SKILLHUB_SCANNER_USE_VIRUS_TOTAL:false}
        trigger: ${SKILLHUB_SCANNER_USE_TRIGGER:false}

      # 策略配置
      policy:
        preset: ${SKILLHUB_SCANNER_POLICY_PRESET:balanced}
        custom-policy-path: ${SKILLHUB_SCANNER_CUSTOM_POLICY_PATH:}
        fail-on-severity: ${SKILLHUB_SCANNER_FAIL_ON_SEVERITY:high}
```

## 配置项详解

### 1. 基础配置

#### `enabled`

- **类型**：Boolean
- **默认值**：`true`
- **环境变量**：`SKILLHUB_SECURITY_SCANNER_ENABLED`
- **说明**：是否启用安全扫描功能
- **影响**：
  - `true`：技能包发布时会触发安全扫描
  - `false`：仅允许 `PRIVATE` 技能跳过扫描；`PUBLIC` / `NAMESPACE_ONLY` 发布会失败并提示必须启用 Scanner

**示例**：

```yaml
# 仅本地私有技能调试：禁用扫描
enabled: false

# 公共或命名空间可见发布：启用扫描
enabled: true
```

---

#### `base-url`

- **类型**：String (URL)
- **默认值**：`http://localhost:8000`
- **环境变量**：`SKILLHUB_SECURITY_SCANNER_URL`
- **说明**：Scanner 服务的基础 URL
- **格式**：`http(s)://host:port`

**示例**：

```yaml
# 本地开发
base-url: http://localhost:8000

# Kubernetes 内部服务
base-url: http://skill-scanner:8000

# 外部服务
base-url: https://scanner.example.com
```

---

#### `mode`

- **类型**：String (Enum)
- **可选值**：`local` | `upload`
- **默认值**：`local`
- **环境变量**：`SKILLHUB_SECURITY_SCANNER_MODE`
- **说明**：扫描模式
  - `local`：Scanner 直接访问本地文件系统（适用于 Scanner 和 SkillHub 在同一主机）
  - `upload`：通过 HTTP 上传 ZIP 文件（适用于 Scanner 和 SkillHub 分离部署）

**示例**：

```yaml
# Docker Compose 环境（Scanner 独立容器，无共享发布目录）
mode: upload

# Kubernetes 环境（独立 Pod）
mode: upload
```

---

### 2. 分析器配置

#### `analyzers.behavioral`

- **类型**：Boolean
- **默认值**：`false`
- **环境变量**：`SKILLHUB_SCANNER_USE_BEHAVIORAL`
- **说明**：是否启用行为分析引擎
- **功能**：检测可疑的运行时行为（如文件系统访问、网络请求等）

---

#### `analyzers.llm`

- **类型**：Boolean
- **默认值**：`false`
- **环境变量**：`SKILLHUB_SCANNER_USE_LLM`
- **说明**：是否启用 LLM 分析引擎
- **功能**：使用大语言模型进行代码语义分析
- **依赖**：需要配置 `llm-provider`

---

#### `analyzers.llm-provider`

- **类型**：String (Enum)
- **可选值**：`anthropic` | `openai` | `azure`
- **默认值**：`anthropic`
- **环境变量**：`SKILLHUB_SCANNER_LLM_PROVIDER`
- **说明**：LLM 提供商
- **依赖**：需要在 Scanner 服务中配置对应的 API Key

**示例**：

```yaml
# 使用 Anthropic Claude
llm-provider: anthropic

# 使用 OpenAI GPT
llm-provider: openai

# 使用 Azure OpenAI
llm-provider: azure
```

---

#### `analyzers.llm-consensus-runs`

- **类型**：Integer
- **默认值**：`3`
- **范围**：`1-10`
- **环境变量**：`SKILLHUB_SCANNER_LLM_CONSENSUS_RUNS`
- **说明**：LLM 共识运行次数（多次运行取共识结果，提高准确性）
- **性能影响**：值越大，扫描时间越长，但准确性越高

---

#### `analyzers.meta`

- **类型**：Boolean
- **默认值**：`true`
- **环境变量**：`SKILLHUB_SCANNER_USE_META`
- **说明**：是否启用元数据分析引擎
- **功能**：检查 package.json、依赖版本、许可证等元数据

---

#### `analyzers.ai-defense`

- **类型**：Boolean
- **默认值**：`false`
- **环境变量**：`SKILLHUB_SCANNER_USE_AI_DEFENSE`
- **说明**：是否启用 AI Defense 引擎
- **功能**：使用 AI Defense API 进行高级威胁检测
- **依赖**：需要配置 `ai-defense-api-key`

---

#### `analyzers.ai-defense-api-key`

- **类型**：String (Secret)
- **默认值**：空字符串
- **环境变量**：`SKILLHUB_SCANNER_AI_DEFENSE_API_KEY`
- **说明**：AI Defense API Key
- **安全**：应通过 Kubernetes Secret 或环境变量注入，不要硬编码

---

#### `analyzers.virus-total`

- **类型**：Boolean
- **默认值**：`false`
- **环境变量**：`SKILLHUB_SCANNER_USE_VIRUS_TOTAL`
- **说明**：是否启用 VirusTotal 引擎
- **功能**：使用 VirusTotal API 检测已知恶意文件

---

#### `analyzers.trigger`

- **类型**：Boolean
- **默认值**：`false`
- **环境变量**：`SKILLHUB_SCANNER_USE_TRIGGER`
- **说明**：是否启用触发器分析引擎
- **功能**：检测可疑的触发器模式（如定时任务、事件监听等）

---

### 3. 策略配置

#### `policy.preset`

- **类型**：String (Enum)
- **可选值**：`strict` | `balanced` | `permissive`
- **默认值**：`balanced`
- **环境变量**：`SKILLHUB_SCANNER_POLICY_PRESET`
- **说明**：安全策略预设
  - `strict`：严格模式，任何可疑行为都会标记为不安全
  - `balanced`：平衡模式，只标记高风险行为
  - `permissive`：宽松模式，只标记明确的恶意行为

**示例**：

```yaml
# 生产环境：使用严格模式
preset: strict

# 开发环境：使用宽松模式
preset: permissive
```

---

#### `policy.custom-policy-path`

- **类型**：String (File Path)
- **默认值**：空字符串
- **环境变量**：`SKILLHUB_SCANNER_CUSTOM_POLICY_PATH`
- **说明**：自定义策略文件路径（覆盖 preset）
- **格式**：YAML 文件

**示例**：

```yaml
# 使用自定义策略
custom-policy-path: /etc/skillhub/scanner-policy.yaml
```

---

#### `policy.fail-on-severity`

- **类型**：String (Enum)
- **可选值**：`critical` | `high` | `medium` | `low`
- **默认值**：`high`
- **环境变量**：`SKILLHUB_SCANNER_FAIL_ON_SEVERITY`
- **说明**：扫描失败的严重级别门槛
  - `critical`：只有发现 critical 级别的问题才标记为不安全
  - `high`：发现 high 或 critical 级别的问题标记为不安全
  - `medium`：发现 medium、high 或 critical 级别的问题标记为不安全
  - `low`：发现任何级别的问题都标记为不安全

**示例**：

```yaml
# 生产环境：high 及以上标记为不安全
fail-on-severity: high

# 测试环境：只有 critical 标记为不安全
fail-on-severity: critical
```

---

## 环境变量配置

### Docker Compose

```yaml
# docker-compose.yml
services:
  skillhub-backend:
    environment:
      - SKILLHUB_SECURITY_SCANNER_ENABLED=true
      - SKILLHUB_SECURITY_SCANNER_URL=http://skill-scanner:8000
      - SKILLHUB_SECURITY_SCANNER_MODE=upload
      - SKILLHUB_SCANNER_USE_BEHAVIORAL=false
      - SKILLHUB_SCANNER_USE_LLM=false
      - SKILLHUB_SCANNER_USE_META=true
      - SKILLHUB_SCANNER_POLICY_PRESET=balanced
      - SKILLHUB_SCANNER_FAIL_ON_SEVERITY=high
```

### Kubernetes ConfigMap

```yaml
# deploy/k8s/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: skillhub-config
data:
  SKILLHUB_SECURITY_SCANNER_ENABLED: "true"
  SKILLHUB_SECURITY_SCANNER_URL: "http://skill-scanner:8000"
  SKILLHUB_SECURITY_SCANNER_MODE: "upload"
  SKILLHUB_SCANNER_USE_BEHAVIORAL: "false"
  SKILLHUB_SCANNER_USE_LLM: "false"
  SKILLHUB_SCANNER_USE_META: "true"
  SKILLHUB_SCANNER_POLICY_PRESET: "balanced"
  SKILLHUB_SCANNER_FAIL_ON_SEVERITY: "high"
```

### Kubernetes Secret

```yaml
# deploy/k8s/secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: skillhub-secrets
type: Opaque
stringData:
  SKILLHUB_SCANNER_AI_DEFENSE_API_KEY: "your-api-key-here"
```

---

## 配置最佳实践

### 1. 开发环境配置

```yaml
skillhub:
  security:
    scanner:
      enabled: true  # 默认启用；PUBLIC/NAMESPACE_ONLY 发布依赖扫描
      base-url: http://localhost:8000
      mode: upload
      analyzers:
        meta: true  # 只启用元数据分析
      policy:
        preset: permissive  # 使用宽松策略
        fail-on-severity: critical
```

### 2. 测试环境配置

```yaml
skillhub:
  security:
    scanner:
      enabled: true  # 测试环境启用扫描
      base-url: http://skill-scanner:8000
      mode: upload
      analyzers:
        behavioral: true
        meta: true
        llm: false  # LLM 分析较慢，测试环境可选
      policy:
        preset: balanced
        fail-on-severity: high
```

### 3. 生产环境配置

```yaml
skillhub:
  security:
    scanner:
      enabled: true  # 生产环境必须启用扫描
      base-url: http://skill-scanner:8000
      mode: upload  # 使用上传模式，更安全
      analyzers:
        behavioral: true
        llm: true  # 启用 LLM 分析，提高准确性
        llm-provider: anthropic
        llm-consensus-runs: 3
        meta: true
        ai-defense: true  # 启用高级威胁检测
        virus-total: true
        trigger: true
      policy:
        preset: strict  # 使用严格策略
        fail-on-severity: high
```

---

## 性能调优

### 扫描速度 vs 准确性

| 配置 | 扫描时间 | 准确性 | 适用场景 |
|-----|---------|-------|---------|
| 只启用 meta | ~5 秒 | 低 | 开发环境 |
| meta + behavioral | ~15 秒 | 中 | 测试环境 |
| meta + behavioral + llm | ~60 秒 | 高 | 生产环境 |
| 全部启用 | ~120 秒 | 最高 | 高安全要求 |

### 推荐配置

```yaml
# 快速扫描（开发环境）
analyzers:
  meta: true

# 标准扫描（测试环境）
analyzers:
  behavioral: true
  meta: true

# 深度扫描（生产环境）
analyzers:
  behavioral: true
  llm: true
  meta: true
  ai-defense: true
```

---

## 故障排查

### 问题 1：Scanner 连接失败

**检查配置**：

```bash
# 检查 base-url 是否正确
curl -f $SKILLHUB_SECURITY_SCANNER_URL/health

# 检查网络连通性
ping skill-scanner
```

### 问题 2：扫描超时

**调整配置**：

```yaml
# 减少 LLM 共识运行次数
analyzers:
  llm-consensus-runs: 1  # 从 3 降到 1

# 或禁用 LLM 分析
analyzers:
  llm: false
```

### 问题 3：扫描失败率高

**调整策略**：

```yaml
# 降低严重级别门槛
policy:
  fail-on-severity: critical  # 从 high 改为 critical

# 或使用宽松策略
policy:
  preset: permissive  # 从 strict 改为 permissive
```

---

## 相关文档

- [故障影响分析](./failure-impact-analysis.md)
- [运维监控指南](./monitoring-guide.md)
- [改进建议](./improvement-recommendations.md)
- [Scanner 服务文档](../README.md)
