关于 varlock
varlock 是一项安全技能,指导如何在 Claude Code 会话中使用 Varlock 管理环境变量。它强调通过脱敏验证和命令注入使用密钥,避免敏感值出现在输出、上下文或命令中。
主要功能
- 01脱敏验证环境变量
- 02基于 Schema 的类型与敏感性规则
- 03为命令注入密钥
- 04安全查看配置 Schema
- 05CI/CD 与 Docker 使用模式
适用场景
- 01验证项目环境配置
- 02运行需要密钥的脚本
- 03检查配置而不显示变量值
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ wrsmith108/ varlock-claude-skill --skill varlock安装后在 Claude Code 中输入/varlock确认已加载。
详细介绍
Varlock 安全技能
为 Claude Code 会话提供默认安全的环境变量管理。
仓库:https://github.com/dmno-dev/varlock 文档:https://varlock.dev
核心原则:绝不暴露密钥
使用 Claude 时,密钥绝不能出现在:
- 终端输出中
- Claude 的输入/输出上下文中
- 日志文件或跟踪记录中
- Git 提交或差异中
- 错误消息中
此技能可确保所有敏感数据都得到妥善保护。
关键:Claude 的安全规则
规则 1:绝不回显密钥
# ❌ NEVER DO THIS - exposes secret to Claude's context
echo $CLERK_SECRET_KEY
cat .env | grep SECRET
printenv | grep API
# ✅ DO THIS - validates without exposing
varlock load --quiet && echo "✓ Secrets validated"
规则 2:绝不直接读取 .env
# ❌ NEVER DO THIS - exposes all secrets
cat .env
less .env
Read tool on .env file
# ✅ DO THIS - read schema (safe) not values
cat .env.schema
varlock load # Shows masked values
规则 3:使用 Varlock 进行验证
# ❌ NEVER DO THIS - exposes secret in error
test -n "$API_KEY" && echo "Key: $API_KEY"
# ✅ DO THIS - Varlock validates and masks
varlock load
# Output shows: API_KEY 🔐sensitive └ ▒▒▒▒▒
规则 4:命令中绝不包含密钥
# ❌ NEVER DO THIS - secret in command history
curl -H "Authorization: Bearer sk_live_xxx" https://api.example.com
# ✅ DO THIS - use environment variable
curl -H "Authorization: Bearer $API_KEY" https://api.example.com
# Or better: varlock run -- curl ...
快速入门
安装
# Install Varlock CLI
curl -sSfL https://varlock.dev/install.sh | sh -s -- --force-no-brew
# Add to PATH (add to ~/.zshrc or ~/.bashrc)
export PATH="$HOME/.varlock/bin:$PATH"
# Verify
varlock --version
初始化项目
# Create .env.schema from existing .env
varlock init
# Or create manually
touch .env.schema
架构文件:.env.schema
架构定义了每个变量的类型、验证规则和敏感性。
基本结构
# Global defaults
# @defaultSensitive=true @defaultRequired=infer
# Application
# @type=enum(development,staging,production) @sensitive=false
NODE_ENV=development
# @type=port @sensitive=false
PORT=3000
# Database - SENSITIVE
# @type=url @required
DATABASE_URL=
# @type=string @required @sensitive
DATABASE_PASSWORD=
# API Keys - SENSITIVE
# @type=string(startsWith=sk_) @required @sensitive
STRIPE_SECRET_KEY=
# @type=string(startsWith=pk_) @sensitive=false
STRIPE_PUBLISHABLE_KEY=
安全注解
| 注解 | 效果 | 用途 |
|---|---|---|
@sensitive | 在所有输出中隐藏 | API 密钥、密码、令牌 |
@sensitive=false | 在日志中显示 | 公钥、非机密配置 |
@defaultSensitive=true | 默认将所有变量设为敏感 | 高安全性项目 |
类型注解
| 类型 | 验证内容 | 示例 |
|---|---|---|
string | 任意字符串 | @type=string |
string(startsWith=X) | 前缀验证 | @type=string(startsWith=sk_) |
string(contains=X) | 子字符串验证 | @type=string(contains=+clerk_test) |
url | 有效 URL | @type=url |
port | 1-65535 | @type=port |
boolean | true/false | @type=boolean |
enum(a,b,c) | 值之一 | @type=enum(dev,prod) |
Claude 可安全使用的命令
验证环境
# Check all variables (safe - masks sensitive values)
varlock load
# Quiet mode (no output on success)
varlock load --quiet
# Check specific environment
varlock load --env=production
使用密钥运行命令
# Inject validated env into command
varlock run -- npm start
varlock run -- node script.js
varlock run -- pytest
# Secrets are available to the command but never printed
检查架构(安全)
# Schema is safe to read - contains no values
cat .env.schema
# List expected variables
grep "^[A-Z]" .env.schema
常见模式
模式 1:操作前先验证
# Always validate environment first
varlock load --quiet || {
echo "❌ Environment validation failed"
exit 1
}
# Then proceed with operation
npm run build
模式 2:安全轮换密钥
# 1. Update secret in external source (1Password, AWS, etc.)
# 2. Update .env file manually (don't use Claude for this)
# 3. Validate new value works
varlock load
# 4. If using GitHub Secrets, sync (values not shown)
./scripts/update-github-secrets.sh
模式 3:CI/CD 集成
# GitHub Actions - secrets from GitHub Secrets
- name: Validate environment
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
API_KEY: ${{ secrets.API_KEY }}
run: varlock load --quiet
模式 4:Docker 集成
# Install Varlock in container
RUN curl -sSfL https://varlock.dev/install.sh | sh -s -- --force-no-brew \
&& ln -s /root/.varlock/bin/varlock /usr/local/bin/varlock
# Validate at container start
CMD ["varlock", "run", "--", "npm", "start"]
处理与密钥相关的任务
用户要求“检查 API 密钥是否已设置”时
# ✅ Safe approach
varlock load 2>&1 | grep "API_KEY"
# Shows: ✅ API_KEY 🔐sensitive └ ▒▒▒▒▒
# ❌ Never do
echo $API_KEY
用户要求“调试身份验证”时
# ✅ Safe approach - check presence and format
varlock load # Validates types and required fields
# Check if key has correct prefix (without showing value)
varlock load 2>&1 | grep -E "(CLERK|AUTH)"
# ❌ Never do
printenv | grep KEY
用户要求“更新密钥”时
Claude should respond:
"I cannot directly modify secrets for security reasons. Please:
1. Update the value in your .env file manually
2. Or update in your secrets manager (1Password, AWS, etc.)
3. Then run `varlock load` to validate
I can help you update the .env.schema if you need to add new variables."
用户要求“给我看看 .env 文件”时
Claude should respond:
"I won't read .env files directly as they contain secrets. Instead:
- Run `varlock load` to see masked values
- Run `cat .env.schema` to see the schema (safe)
- I can help you modify .env.schema if needed"
外部密钥来源
1Password 集成
# In .env.schema
# @type=string @sensitive
API_KEY=exec('op read "op://vault/item/field"')
AWS Secrets Manager
# In .env.schema
# @type=string @sensitive
DB_PASSWORD=exec('aws secretsmanager get-secret-value --secret-id prod/db')
特定环境的值
# In .env.schema
# @type=url
API_URL=env('API_URL_${NODE_ENV}', 'http://localhost:3000')
故障排除
“varlock: command not found”
# Check installation
ls ~/.varlock/bin/varlock
# Add to PATH
export PATH="$HOME/.varlock/bin:$PATH"
# Or use full path
~/.varlock/bin/varlock load
“Schema validation failed”
# Check which variables are missing/invalid
varlock load # Shows detailed errors
# Common fixes:
# - Add missing required variables to .env
# - Fix type mismatches (port must be number)
# - Check string prefixes match schema
“Sensitive value exposed in logs”
# 1. Rotate the exposed secret immediately
# 2. Check .env.schema has @sensitive annotation
# 3. Ensure using varlock commands, not echo/cat
# Add missing sensitivity:
# Before: API_KEY=
# After: # @type=string @sensitive
# API_KEY=
npm 脚本
将这些脚本添加到你的 package.json 中:
{
"scripts": {
"env:validate": "varlock load",
"env:check": "varlock load --quiet || echo 'Environment validation failed'",
"prestart": "varlock load --quiet",
"start": "varlock run -- node server.js"
}
}
新项目安全检查清单
- 安装 Varlock CLI
- 创建
.env.schema并定义所有变量 - 为所有密钥添加
@sensitive注解 - 在架构文件头部添加
@defaultSensitive=true - 将
.env添加到.gitignore - 将
.env.schema提交到版本控制 - 在 CI/CD 中添加
npm run env:validate - 编写密钥轮换流程文档
- 在 Claude 会话中绝不使用
cat .env或echo $SECRET
快速参考卡
| 任务 | 安全命令 |
|---|---|
| 验证所有环境变量 | varlock load |
| 静默验证 | varlock load --quiet |
| 使用环境变量运行 | varlock run -- <cmd> |
| 查看架构 | cat .env.schema |
| 检查特定变量 | varlock load | grep VAR_NAME |
| 切勿执行 | 原因 |
|---|---|
cat .env | 会暴露所有密钥 |
echo $SECRET | 会暴露在 Claude 上下文中 |
printenv | grep | 会暴露匹配的密钥 |
| 使用工具读取 .env | 密钥会进入 Claude 的上下文 |
| 在命令中硬编码 | 会留在 shell 历史记录中 |
与其他技能集成
Clerk 技能
- 测试用户密码设为
@sensitive - 测试邮箱设为
@sensitive=false(包含 +clerk_test,不是密钥) - 参见:
~/.claude/skills/clerk/SKILL.md
Docker 技能
- 挂载
.env文件,切勿将密钥复制到镜像中 - 使用
varlock run作为入口点 - 参见:
~/.claude/skills/docker/SKILL.md
最后更新:2025 年 12 月 22 日 为 Claude Code 提供默认安全的环境管理
评论
支持 Markdown