跳到主要内容

安全与隐私保护

自动化系统处理大量敏感信息,安全至关重要。

🔐 核心安全原则

1. 零信任原则

永远不要信任任何输入或环境

2. 最小权限原则

只授予必要的最小权限

3. 深度防御

多层安全措施,不依赖单点防护

4. 数据最小化

只收集和保存必要的数据

🔑 密钥和凭证管理

问题:API密钥泄露风险

❌ 危险做法

# 硬编码在脚本中
API_KEY="sk-1234567890abcdef"
OPENAI_KEY="sk-proj-xxxxx"

# 提交到Git
git add . && git commit -m "add script"

✅ 安全做法

方案1: 使用环境变量

# ~/.zshrc 或 ~/.bashrc
export ANTHROPIC_API_KEY="sk-xxx"
export OPENAI_API_KEY="sk-xxx"

# 使用时
claude-cli --api-key "$ANTHROPIC_API_KEY" "prompt"

方案2: 使用密钥管理工具

1Password CLI

# 安装
brew install --cask 1password-cli

# 存储密钥
op item create \
--category=login \
--title="Claude API Key" \
username=api_key \
password=sk-xxx

# 使用
API_KEY=$(op read "op://Private/Claude API Key/password")
claude-cli --api-key "$API_KEY" "prompt"

macOS Keychain

# 存储
security add-generic-password \
-a "$USER" \
-s "claude-api-key" \
-w "sk-xxx"

# 读取
API_KEY=$(security find-generic-password \
-a "$USER" \
-s "claude-api-key" \
-w)

专用密钥文件

# 创建加密配置
touch ~/.automation/secrets.env
chmod 600 ~/.automation/secrets.env # 只有所有者可读写

# 内容
ANTHROPIC_API_KEY=sk-xxx
OPENAI_API_KEY=sk-xxx
GITHUB_TOKEN=ghp_xxx

# .gitignore
echo "secrets.env" >> ~/.gitignore
echo ".env" >> ~/.gitignore

# 使用
source ~/.automation/secrets.env

Git防护检查清单

# .gitignore 必须包含
cat >> .gitignore << 'EOF'
# 密钥和配置
.env
.env.local
secrets.env
*.key
*.pem
credentials.json

# 日志可能包含敏感信息
*.log
logs/

# 缓存可能包含数据
.cache/
*.cache

# IDE配置可能包含路径
.vscode/settings.json
.idea/
EOF

# Git hooks: pre-commit检查
cat > .git/hooks/pre-commit << 'EOF'
#!/bin/bash

# 检查是否包含常见密钥模式
if git diff --cached | grep -iE "(api[_-]?key|secret|password|token).*(=|:).{8,}" > /dev/null; then
echo "❌ 检测到可能的密钥泄露!"
echo " 请检查暂存的改动"
git diff --cached | grep -iE "(api[_-]?key|secret|password|token)"
exit 1
fi

# 检查特定文件
FORBIDDEN_FILES=(
"secrets.env"
".env"
"credentials.json"
)

for file in "${FORBIDDEN_FILES[@]}"; do
if git diff --cached --name-only | grep -q "$file"; then
echo "❌ 禁止提交: $file"
exit 1
fi
done

echo "✅ Pre-commit checks passed"
EOF

chmod +x .git/hooks/pre-commit

🛡️ 数据安全

本地数据加密

#!/bin/bash
# encrypt-sensitive-data.sh

SENSITIVE_DIR="$HOME/.automation/sensitive"
ENCRYPTED_FILE="$HOME/.automation/sensitive.tar.gz.gpg"

# 加密
function encrypt_data() {
echo "🔐 Encrypting sensitive data..."

tar czf - "$SENSITIVE_DIR" | \
gpg --symmetric --cipher-algo AES256 \
--output "$ENCRYPTED_FILE"

echo "✅ Encrypted: $ENCRYPTED_FILE"
}

# 解密
function decrypt_data() {
echo "🔓 Decrypting..."

gpg --decrypt "$ENCRYPTED_FILE" | \
tar xzf -

echo "✅ Decrypted to: $SENSITIVE_DIR"
}

# 使用
case $1 in
encrypt) encrypt_data ;;
decrypt) decrypt_data ;;
*) echo "Usage: $0 {encrypt|decrypt}" ;;
esac

日志脱敏

function log_safe() {
local message=$1

# 脱敏处理
message=$(echo "$message" | sed -E 's/(api[_-]?key|token|password)[=:][^ ]*/\1=***REDACTED***/gi')
message=$(echo "$message" | sed -E 's/sk-[a-zA-Z0-9]{32,}/sk-***REDACTED***/g')

echo "[$(date)] $message" >> ~/.automation/audit.log
}

# 使用
log_safe "Calling API with token=sk-abc123xyz..."
# 输出: Calling API with token=sk-***REDACTED***

临时文件安全

# ❌ 不安全
echo "sensitive data" > /tmp/data.txt

# ✅ 安全
TEMP_DIR=$(mktemp -d)
trap "rm -rf $TEMP_DIR" EXIT

echo "sensitive data" > "$TEMP_DIR/data.txt"
chmod 600 "$TEMP_DIR/data.txt"

# 使用完自动清理

🔒 网络安全

API调用安全

#!/bin/bash
# secure-api-call.sh

function call_api() {
local endpoint=$1
local data=$2

# 1. 验证endpoint
if [[ ! "$endpoint" =~ ^https:// ]]; then
echo "❌ 只允许HTTPS请求"
return 1
fi

# 2. 速率限制
local last_call=$(cat ~/.automation/last_api_call 2>/dev/null || echo 0)
local now=$(date +%s)
local diff=$((now - last_call))

if [ $diff -lt 1 ]; then
echo "⏳ 速率限制,请等待..."
sleep 1
fi

# 3. 超时控制
local response=$(curl -sS \
--max-time 30 \
--retry 3 \
--retry-delay 2 \
-H "Authorization: Bearer $API_KEY" \
-d "$data" \
"$endpoint")

# 4. 记录调用
echo "$now" > ~/.automation/last_api_call

# 5. 验证响应
if [ $? -ne 0 ]; then
echo "❌ API调用失败"
return 1
fi

echo "$response"
}

敏感命令审计

#!/bin/bash
# audit-log.sh

AUDIT_LOG="$HOME/.automation/audit.log"

function audit_command() {
local command=$1
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
local user=$USER
local pwd=$(pwd)

# 记录到审计日志
echo "[$timestamp] USER=$user PWD=$pwd CMD=$command" >> "$AUDIT_LOG"

# 敏感操作额外记录
if echo "$command" | grep -qE "(rm -rf|sudo|deploy|production)"; then
echo "[$timestamp] ⚠️ SENSITIVE: $command" >> "$AUDIT_LOG.critical"

# 发送通知
osascript -e "display notification \"Sensitive command executed: $command\" with title \"🚨 Security Alert\""
fi
}

# 包装敏感操作
function safe_deploy() {
audit_command "deploy $*"
# 实际部署逻辑
}

🔐 权限控制

脚本权限检查

#!/bin/bash
# check-permissions.sh

function check_script_security() {
local script=$1

# 检查所有者
local owner=$(stat -f "%Su" "$script")
if [ "$owner" != "$USER" ]; then
echo "⚠️ 脚本所有者不是当前用户: $owner"
return 1
fi

# 检查权限
local perms=$(stat -f "%Lp" "$script")
if [ "$perms" != "755" ] && [ "$perms" != "700" ]; then
echo "⚠️ 权限不安全: $perms"
echo "建议: chmod 755 $script"
return 1
fi

# 检查组写入权限
if [ $((perms & 020)) -ne 0 ]; then
echo "⚠️ 组有写入权限,不安全"
return 1
fi

# 检查其他用户写入权限
if [ $((perms & 002)) -ne 0 ]; then
echo "⚠️ 其他用户有写入权限,非常危险"
return 1
fi

echo "✅ 权限检查通过"
}

# 使用
check_script_security ~/.automation/scripts/deploy.sh

危险操作确认

function safe_delete() {
local target=$1

echo "⚠️ 即将删除: $target"
echo "内容预览:"
ls -la "$target" | head -10

read -p "确认删除? 输入 'DELETE' 继续: " confirm

if [ "$confirm" != "DELETE" ]; then
echo "❌ 取消操作"
return 1
fi

# 记录操作
audit_command "delete $target"

rm -rf "$target"
echo "✅ 已删除"
}

🕵️ 隐私保护

数据收集最小化

# ❌ 收集过多信息
function track_usage() {
log_data=$(cat << EOF
{
"user": "$USER",
"hostname": "$HOSTNAME",
"ip": "$(curl -s ifconfig.me)",
"location": "$(curl -s ipinfo.io/city)",
"files": $(ls ~ | wc -l),
"command": "$1"
}
EOF
)
send_to_analytics "$log_data"
}

# ✅ 只收集必要信息
function track_usage() {
log_data=$(cat << EOF
{
"command": "$1",
"timestamp": $(date +%s),
"success": true
}
EOF
)
# 本地存储,不上传
echo "$log_data" >> ~/.automation/usage.jsonl
}

清理历史记录

#!/bin/bash
# clean-history.sh

# 清理敏感Shell历史
function clean_shell_history() {
# 从历史中删除包含密钥的命令
sed -i.bak '/API_KEY\|password\|token\|secret/d' ~/.zsh_history
sed -i.bak '/API_KEY\|password\|token\|secret/d' ~/.bash_history

echo "✅ 清理了Shell历史"
}

# 清理日志
function clean_logs() {
find ~/.automation/logs -name "*.log" -mtime +30 -delete
echo "✅ 清理了30天前的日志"
}

# 清理缓存
function clean_cache() {
rm -rf ~/.automation/cache/*
echo "✅ 清理了缓存"
}

# 定期执行(添加到crontab)
# 0 2 * * 0 ~/.automation/scripts/clean-history.sh

🚨 安全事件响应

密钥泄露应急处理

#!/bin/bash
# key-rotation.sh

echo "🚨 密钥泄露应急处理"

# 1. 立即撤销旧密钥
echo "1️⃣ 撤销泄露的密钥..."
# 在各服务商控制台撤销

# 2. 生成新密钥
echo "2️⃣ 生成新密钥..."
# 在各服务商控制台生成

# 3. 更新配置
echo "3️⃣ 更新本地配置..."
read -p "输入新的API密钥: " NEW_KEY

security delete-generic-password -s "claude-api-key" 2>/dev/null
security add-generic-password \
-a "$USER" \
-s "claude-api-key" \
-w "$NEW_KEY"

# 4. 测试新密钥
echo "4️⃣ 测试新密钥..."
if claude-cli "test" >/dev/null 2>&1; then
echo "✅ 新密钥工作正常"
else
echo "❌ 新密钥测试失败"
exit 1
fi

# 5. 审计检查
echo "5️⃣ 检查其他可能的泄露..."
grep -r "sk-" ~/.automation/ 2>/dev/null | grep -v ".git"

echo "✅ 密钥轮换完成"

安全检查清单

#!/bin/bash
# security-audit.sh

echo "🔐 安全审计"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━"

# 检查1: 敏感文件权限
echo ""
echo "📁 文件权限检查"
SENSITIVE_FILES=(
"$HOME/.automation/secrets.env"
"$HOME/.ssh/id_rsa"
"$HOME/.gnupg"
)

for file in "${SENSITIVE_FILES[@]}"; do
if [ -e "$file" ]; then
perms=$(stat -f "%Lp" "$file")
if [ "$perms" != "600" ]; then
echo "⚠️ $file 权限不安全: $perms (应该是600)"
else
echo "✅ $file"
fi
fi
done

# 检查2: Git配置
echo ""
echo "🔍 Git检查"
if git config --global user.email | grep -q "private"; then
echo "✅ Git邮箱已隐私化"
else
echo "⚠️ 考虑使用GitHub提供的noreply邮箱"
fi

# 检查3: 密钥泄露
echo ""
echo "🔑 密钥泄露检查"
if grep -r "sk-[a-zA-Z0-9]\{32,\}" ~/.automation/ 2>/dev/null | grep -v ".git" | grep -v "audit.sh"; then
echo "❌ 发现可能的密钥泄露!"
else
echo "✅ 未发现明文密钥"
fi

# 检查4: 审计日志
echo ""
echo "📋 审计日志"
if [ -f ~/.automation/audit.log ]; then
echo "最近的敏感操作:"
tail -5 ~/.automation/audit.log
else
echo "⚠️ 未启用审计日志"
fi

# 检查5: 过期密钥
echo ""
echo "⏰ 密钥时效检查"
KEY_AGE=$(security find-generic-password -s "claude-api-key" -g 2>&1 | grep "mdat" | cut -d'"' -f4)
echo "API密钥最后修改: $KEY_AGE"
echo "💡 建议每3个月轮换一次密钥"

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "审计完成"

📋 安全检查清单

日常操作

  • API密钥从不硬编码
  • 敏感文件权限设置为600
  • .gitignore包含所有敏感文件
  • 定期清理日志和历史

脚本开发

  • 输入验证和清理
  • 错误信息不暴露敏感数据
  • 临时文件使用后删除
  • 审计关键操作

定期审查(每月)

  • 运行安全审计脚本
  • 检查异常日志条目
  • 更新依赖和工具
  • 审查权限设置

密钥管理(每季度)

  • 轮换API密钥
  • 审查权限范围
  • 测试密钥撤销流程
  • 备份加密数据

🛠️ 推荐工具

密钥管理

  • 1Password: 全平台密钥管理
  • Bitwarden: 开源替代方案
  • Keychain: macOS原生

安全扫描

  • git-secrets: 防止提交密钥
  • truffleHog: 检测历史中的密钥
  • detect-secrets: 代码扫描

加密

  • GPG: 文件加密
  • age: 现代加密工具
  • VeraCrypt: 磁盘加密

🚨 紧急联系

如果发现安全问题:

  1. 立即停止自动化系统
  2. 撤销可能泄露的密钥
  3. 审查日志找出影响范围
  4. 运行应急响应脚本
  5. 更新所有受影响的配置

记住: 安全不是一次性的,是持续的过程。定期审查和更新安全措施!