安全的凭据管理
在自动化 Terraform 流水线中,采用最佳实践安全地管理云服务提供商凭据和敏感数据。
安全的凭据管理 是 CoddyKit 上的免费 Terraform Infrastructure as Code 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Terraform Infrastructure as Code 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Terraform Infrastructure as Code 课程共包含 4 节课。
保护 CI/CD 中的凭据
使用 Terraform 在 CI/CD 流水线中自动化基础设施时,流水线需要访问云服务提供商的账户。安全地管理这些凭据,对于防止未经授权的访问和数据泄露至关重要。
您可以把它想象成给机器人一把进入您房子的钥匙。您需要确保只有正确的机器人拥有正确的钥匙,并且这些钥匙受到保护。
避免硬编码机密信息
一种常见错误是将 API 密钥或密码等敏感信息直接嵌入 Terraform 配置文件或 CI/CD 脚本中。这称为硬编码。
- 安全风险:机密信息会成为源代码历史记录的一部分(例如 Git)。
- 暴露风险:任何有权访问代码库的人都可以看到这些信息。
- 维护问题:更改机密信息需要修改代码并重新部署。
环境变量(基础用法)
对于本地开发或基础场景,环境变量是一种无需硬编码即可提供凭据的简单方式。您可以在运行 Terraform 之前,在 Shell 中设置这些变量。
虽然这比硬编码更好,但对于共享 CI/CD 流水线来说仍不理想,因为如果处理不当,机密信息仍可能显示在日志或进程列表中。
export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="abcdef..."
terraform planCI/CD 平台的机密信息管理器
现代 CI/CD 平台提供内置的机密信息管理功能。您可以将敏感数据安全地存储在平台内部,使其与代码库分离。
流水线运行时,这些机密信息会作为环境变量或文件注入构建环境,但不会暴露在日志中,也不会存储在代码库中。
GitHub Actions 机密信息示例
GitHub Actions 为代码库机密信息提供了专门的区域。您可以通过Settings > Secrets and variables > Actions > New repository secret 添加这些信息。
然后,您可以在工作流文件中使用 secrets 上下文引用这些机密信息。它们会在日志中自动屏蔽。
name: Deploy Infra
on: [push]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Terraform Init
run: terraform init用于流水线的云 IAM 角色
CI/CD 身份验证最安全的方法,是使用云服务提供商提供的身份与访问管理(IAM)角色或服务账户。
CI/CD 流水线不会使用长期有效的访问密钥,而是使用具有特定权限的临时角色,通常会利用OpenID Connect (OIDC)建立信任关系。这样完全无需存储静态凭据。
AWS IAM 角色与 OIDC 示例
对于 AWS,您可以配置一个 IAM Role,让 GitHub Actions 工作流直接使用 OIDC 来承担该角色。这意味着任何地方都不会存储 AWS 访问密钥!
您需要为该角色定义信任策略,允许 GitHub 的 OIDC 提供商根据特定条件(例如代码库、分支)承担该角色。
resource "aws_iam_role" "github_actions_role" {
name = "github-actions-oidc-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Principal = {
Federated = "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com"
}
Action = "sts:AssumeRoleWithWebIdentity"
Condition = {
StringEquals = {
"token.actions.githubusercontent.com:aud" : "sts.amazonaws.com"
}
StringLike = {
"token.actions.githubusercontent.com:sub" : "repo:your-org/your-repo:*"
}
}
}
]
})
}Terraform 敏感输出
有时,Terraform 输出可能包含敏感数据,例如数据库密码或私钥。您应将这些输出标记为 sensitive。
将输出标记为敏感后,Terraform 在显示 CLI 输出和状态文件时会隐藏其值,从而帮助防止意外暴露。
output "database_password" {
value = aws_db_instance.main.password
description = "The database root password."
sensitive = true
}安全凭据检查
对于 CI/CD 流水线向云服务提供商进行身份验证,同时无需存储长期有效的静态凭据,通常认为哪种方法最安全?
回顾:保护凭据
您已经学会了在 Terraform CI/CD 流水线中管理敏感数据的关键策略:
- 避免硬编码:绝不要将机密信息直接嵌入代码中。
- 利用 CI/CD 机密信息:对于静态凭据,请使用平台专用的机密信息管理器。
- 采用 IAM 角色/OIDC:为了实现最高级别的安全性,请使用云服务提供商的 IAM 角色和 OIDC 来承担临时权限,而无需存储密钥。
- 标记敏感输出:保护 Terraform 输出所暴露的敏感数据。
这些实践对于维护稳健且安全的基础设施至关重要。
常见问题解答
「安全的凭据管理」课时是免费的吗?
是的 — 「安全的凭据管理」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Terraform Infrastructure as Code 课程的其余内容,请升级到 CoddyKit PRO。 Terraform Infrastructure as Code 课程共包含 4 节课。
「安全的凭据管理」这节课中我会学到什么?
在自动化 Terraform 流水线中,采用最佳实践安全地管理云服务提供商凭据和敏感数据。 你通过在浏览器中直接运行的动手代码来练习 Terraform Infrastructure as Code,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Terraform Infrastructure as Code 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Terraform Infrastructure as Code 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「安全的凭据管理」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Terraform Infrastructure as Code 课中编写并运行代码吗?
能。每节 Terraform Infrastructure as Code 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。