Skip to content

安全概述

环境变量常存储敏感信息,安全处理至关重要。本文档概述 env 库的安全架构和核心特性。

安全架构

text
┌──────────────────────────────────────────────────────────────┐
│                           应用层                              │
├──────────────────────────────────────────────────────────────┤
│   SecureValue   │    掩码    │    清零    │   内存锁定        │
├──────────────────────────────────────────────────────────────┤
│                          Loader 层                            │
├──────────────────────────────────────────────────────────────┤
│     键验证      │   值验证   │   禁止键   │   大小限制         │
├──────────────────────────────────────────────────────────────┤
│                           解析层                              │
├──────────────────────────────────────────────────────────────┤
│    格式检测     │  展开检查  │       路径验证                  │
└──────────────────────────────────────────────────────────────┘

核心安全特性

特性说明文档
SecureValue敏感值内存保护、自动清零SecureValue API
禁止键防止修改系统关键变量常量与错误
敏感键检测自动识别敏感配置键,日志脱敏工具敏感数据脱敏
值验证检测控制字符、空字节等Config API
审计日志完整操作追踪组件工厂

SecureValue 简介

对于敏感数据,使用 GetSecure 而非 GetString

go
// 不推荐
password := env.GetString("DB_PASSWORD")

// 推荐
secret := env.GetSecure("DB_PASSWORD")
defer secret.Close()
password := secret.Reveal()  // 仅在需要明文时调用

核心功能:

  • 内存锁定 - 防止交换到磁盘(Linux/macOS/Windows/FreeBSD)
  • 自动清零 - Close() 时安全擦除内存
  • 掩码显示 - Masked() 用于日志输出
  • 线程安全 - 支持并发读取

完整 API

详见 SecureValue API

日志安全

SecureValue 保护的是内存中的敏感值,而日志、错误信息和调试输出同样容易泄露密钥。env 提供一组独立的脱敏工具函数,无需依赖 Loader 即可使用:

  • IsSensitiveKey 自动检测密码、密钥、令牌等敏感键名
  • MaskValue / MaskKey 对值和键名脱敏后再输出
  • SanitizeForLog 扫描日志字符串中的 key=value 模式并掩码
go
// 日志中安全输出配置,避免泄露明文
log.Printf("加载配置: %s", env.MaskValue("DB_PASSWORD", password))
// 输出: 加载配置: [MASKED:12 chars]

log.Printf("连接参数: %s", env.SanitizeForLog("user=admin password=s3cret"))
// 输出: 连接参数: user=admin [MASKED]

完整指南

脱敏工具的完整用法详见 敏感数据脱敏

键/值验证

键验证

默认键名规则:^[A-Za-z][A-Za-z0-9_]*$

  • 以字母开头
  • 只包含字母、数字、下划线
  • 长度不超过 MaxKeyLength

禁止键

内置禁止键防止修改系统关键变量:

类别示例风险
系统路径PATH, LD_LIBRARY_PATH命令/库劫持
动态链接LD_PRELOAD, DYLD_INSERT_LIBRARIES恶意库注入
ShellSHELL, IFS, BASH_ENVShell 劫持
语言运行时PYTHONPATH, NODE_PATH模块劫持

完整列表

查看 DefaultForbiddenKeys 获取完整禁止键列表。

值验证

启用值验证检测潜在危险:

go
cfg := env.ProductionConfig()
cfg.ValidateValues = true  // 检测控制字符、空字节等

文件安全基础

文件权限

bash
# 仅所有者可读写
chmod 600 .env

# 或更严格(只读)
chmod 400 .env

Git 忽略

bash
.env
.env.local
.env.*.local
*.pem
*.key

配置安全级别

预设用途特点
DevelopmentConfig()开发环境宽松限制、支持 YAML 语法
TestingConfig()测试环境覆盖已存在变量、测试隔离
ProductionConfig()生产环境严格验证 + 审计日志、不覆盖已存在变量
go
// 生产环境推荐配置
cfg := env.ProductionConfig()
cfg.RequiredKeys = []string{"DB_HOST", "API_KEY"}
cfg.AllowedKeys = []string{"APP_NAME", "PORT", "DB_HOST", "API_KEY"}

相关文档