引言

安全不是事后修补的补丁,而是贯穿项目生命周期的工程实践。本文整理了 OpenClaw 项目的 13 项安全最佳实践,帮助你从依赖、构建、运行时、运维四个层面建立纵深防御。

一、依赖安全

1. 定期扫描依赖漏洞

# 使用 govulncheck(Go 官方工具)
go install golang.org/x/vuln/cmd/govulncheck@latest
govulncheck ./...

# 使用 snyk 扫描
snyk test

把扫描集成到 CI:

- name: Vuln scan
  run: govulncheck ./...

2. 锁定依赖版本

go mod tidy
git add go.sum

永远提交 go.sum,确保 CI/CD 与生产环境依赖一致。

3. 私有模块代理

go env -w GOPROXY=https://your-internal-proxy,direct
go env -w GOSUMDB=sum.golang.google.cn

二、代码安全

4. 输入校验

所有外部输入(HTTP、gRPC、插件参数)必须经过严格校验:

import "github.com/opencLaw/opencLaw/sdk/validator"

type CreateUserReq struct {
    Username string `json:"username" validate:"required,min=3,max=32,alphanum"`
    Email    string `json:"email"    validate:"required,email"`
    Age      int    `json:"age"      validate:"gte=0,lte=150"`
}

func (s *UserService) CreateUser(ctx context.Context, req *CreateUserReq) error {
    if err := validator.Struct(req); err != nil {
        return fmt.Errorf("invalid request: %w", err)
    }
    // ...
}

5. SQL 注入防护

永远使用参数化查询:

// ✅ 安全
db.Query("SELECT * FROM users WHERE id = $1", userID)

// ❌ 危险
db.Query(fmt.Sprintf("SELECT * FROM users WHERE id = %s", userID))

6. 密钥管理

// ❌ 不要硬编码
apiKey := "sk-1234567890abcdef"

// ✅ 从环境变量读取
apiKey := os.Getenv("OPENAI_API_KEY")
if apiKey == "" {
    return errors.New("OPENAI_API_KEY not set")
}

// ✅ 生产用 Vault / KMS
secret, err := vault.Read("secret/data/openclaw/openai_api_key")

三、运行时安全

7. 最小权限原则

# plugin.yaml
permissions:
  - network:api.openai.com
  - env:OPENAI_API_KEY
  - storage:/var/lib/openclaw/cache

OpenClaw Runtime 会强制限制插件权限,越权访问会立刻拒绝。

8. 资源配额

# config.yaml
plugin_limits:
  cpu: "500m"
  memory: "512Mi"
  network_egress: "100Mbps"
  execution_time: "30s"

防止单个插件耗尽资源。

9. 速率限制

import "golang.org/x/time/rate"

limiter := rate.NewLimiter(rate.Limit(100), 200) // 100 QPS, burst 200

func Handler(w http.ResponseWriter, r *http.Request) {
    if !limiter.Allow() {
        http.Error(w, "Too Many Requests", 429)
        return
    }
    // ...
}

四、运维安全

10. 镜像签名

# 用 cosign 签名
cosign sign --key cosign.key openclaw/opencLaw:1.0.0

# 部署时验证
cosign verify --key cosign.pub openclaw/opencLaw:1.0.0

11. 审计日志

# config.yaml
audit:
  enabled: true
  backend: elasticsearch
  dsn: "http://audit:9200"
  events:
    - plugin.install
    - plugin.uninstall
    - config.update
    - user.login
    - user.permission_change

12. HTTPS / TLS 1.3

# nginx 配置示例
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;

13. 定期渗透测试

建议每季度至少做一次渗透测试,重点关注:

  • 认证与授权链路
  • 输入校验完整性
  • 第三方依赖已知漏洞
  • 容器逃逸可能性

五、应急响应

漏洞披露流程

  1. 接收漏洞报告(security@yourdomain.com)
  2. 24h 内确认并分级
  3. 紧急漏洞:48h 内修复并发布
  4. 普通漏洞:下次发版修复
  5. 公开披露前给报告者 90 天窗口

安全公告订阅

总结

安全是一项持续投入的工程。建议把上面的清单做成团队 wiki 的 checklist,每个新项目发布前都过一遍。

延伸阅读