安全与隐私保护
自动化系统处理大量敏感信息,安全至关重要。
🔐 核心安全原则
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: 磁盘加密
🚨 紧急联系
如果发现安全问题:
- 立即停止自动化系统
- 撤销可能泄露的密钥
- 审查日志找出影响范围
- 运行应急响应脚本
- 更新所有受影响的配置
记住: 安全不是一次性的,是持续的过程。定期审查和更新安全措施!