让我们创建一个详细的指南,说明如何在 GitHub Actions 中安全地传递和使用密钥。
目录
一、密钥管理基础知识
1. 密钥类型
- Repository secrets (仓库密钥)
- Environment secrets (环境密钥)
- Organization secrets (组织密钥)
- Dependabot secrets (依赖机器人密钥)
2. 密钥存储位置
仓库设置 -> Secrets and variables -> Actions -> New repository secret
二、配置密钥的多种方法
1. 仓库级别密钥设置
YAML
name:UseRepositorySecreton:push:branches: [ main ]
jobs:deploy:runs-on:ubuntu-lateststeps:-name:Usesecretenv:API_TOKEN:${{secrets.API_TOKEN}}run:|
echo "Using API token for authentication"
# 使用 $API_TOKEN 进行操作
2. 环境密钥配置
YAML
name:EnvironmentSecretsDemoon:push:branches: [ main ]
jobs:deploy:runs-on:ubuntu-latestenvironment:production# 指定环境steps:-name:DeploytoProductionenv:PROD_SECRET:${{secrets.PROD_SECRET}}run:|echo"Deploying with production credentials"
3. 组织级别密钥
YAML
name:OrganizationSecretDemojobs:org-secret:runs-on:ubuntu-lateststeps:-name:UseOrgSecretenv:ORG_TOKEN:${{secrets.ORG_LEVEL_SECRET}}run:|echo"Using organization-wide secret"
三、最佳安全实践
1. 密钥加密存储
YAML
jobs:secure-job:runs-on:ubuntu-lateststeps:-name:Encryptsensitivedataenv:ENCRYPTION_KEY:${{secrets.ENCRYPTION_KEY}}run:|echo"sensitive_data"|opensslenc-aes-256-cbc-passpass:$ENCRYPTION_KEY
2. 密钥权限管理
YAML
jobs:restricted-job:runs-on:ubuntu-latestpermissions:contents:readsecrets:writesteps:-name:RestrictedOperationenv:SECRET_KEY:${{secrets.SECRET_KEY}}run:|# 执行受限操作
3. 密钥轮换策略
YAML
name:SecretRotationon:schedule:-cron:'0 0 1 * *'# 每月1号执行jobs:rotate-secrets:runs-on:ubuntu-lateststeps:-name:RotateAPIKeysenv:CURRENT_KEY:${{secrets.API_KEY}}run:|# 实现密钥轮换逻辑
四、实战案例
1. Docker 登录示例
YAML
name:DockerBuildandPushjobs:docker:runs-on:ubuntu-lateststeps:-name:LogintoDockerHubuses:docker/login-action@v3with:username:${{secrets.DOCKERHUB_USERNAME}}password:${{secrets.DOCKERHUB_TOKEN}}
2. AWS 认证示例
YAML
name:AWSDeploymentjobs:deploy:runs-on:ubuntu-lateststeps:-name:ConfigureAWSCredentialsuses:aws-actions/configure-aws-credentials@v4with:aws-access-key-id:${{secrets.AWS_ACCESS_KEY_ID}}aws-secret-access-key:${{secrets.AWS_SECRET_ACCESS_KEY}}aws-region:us-east-1
3. 数据库连接示例
YAML
name:DatabaseOperationsjobs:db-ops:runs-on:ubuntu-lateststeps:-name:ConnecttoDatabaseenv:DB_PASSWORD:${{secrets.DATABASE_PASSWORD}}DB_USER:${{secrets.DATABASE_USER}}run:|mysql-hhostname-u$DB_USER-p$DB_PASSWORD
五、常见问题与解决方案
1. 密钥显示问题
YAML
# 正确的做法:使用环境变量steps:-name:HandleSecretenv:MY_SECRET:${{secrets.MY_SECRET}}run:|
# 不要直接 echo 密钥
echo "Secret is being used"
2. 密钥权限问题
YAML
# 解决方案:添加明确的权限设置jobs:permission-job:runs-on:ubuntu-latestpermissions:contents:readsecrets:write
安全检查清单
- 避免在日志中打印密钥
- 使用最小权限原则
- 定期轮换密钥
- 为不同环境使用不同的密钥
- 启用密钥扫描警报
密钥管理最佳实践
- 命名约定
plaintext
环境_用途_类型
例如:PROD_AWS_KEY, DEV_API_TOKEN
- 密钥范围控制
YAML
jobs:restricted:environment:productionif:github.ref=='refs/heads/main'
- 审计和监控
YAML
-name:AuditSecretUsagerun:|echo"Secret accessed at $(date)">>audit.log
高级技巧
1. 动态密钥生成
YAML
jobs:generate:runs-on:ubuntu-lateststeps:-name:GenerateTokenid:tokenrun:|echo"token=$(openssl rand -hex 32)">>$GITHUB_OUTPUT
2. 密钥条件使用
YAML
if:${{env.ENVIRONMENT=='production'}}env:API_KEY:${{secrets.PROD_API_KEY}}
关键词
- GitHub Actions 密钥管理
- CI/CD 安全配置
- Actions secrets 配置
- 工作流密钥传递
- GitHub 自动化部署安全
- CI 密钥保护
- GitHub Actions 环境变量
- 持续集成安全实践
结语
合理使用密钥对于保持 GitHub Actions 工作流的安全性至关重要。通过遵循本文提供的最佳实践和安全建议,您可以确保工作流中的敏感信息得到良好保护。
[最后更新: 2025年1月]
#GitHub #GitHubActions #DevOps #Security #CI/CD #Automation #Development #CloudSecurity