在上一篇文章中,我們聊到了什麼是 CI/CD,以及如何用 GitHub Actions 串接自動化流程。不過我們也提到一個關鍵問題:CI/CD 要怎麼樣安全地存取雲端服務?這就是今天的主題 —— IAM (Identity and Access Management) 與憑證管理。
在雲端的世界裡,權限控制非常重要:
因此,我們需要找到一個平衡點:只給 CI/CD 所需的最低限度權限(Principle of Least Privilege),同時透過安全的方式(像是 GitHub Secrets 或 AWS IAM Role)來管理憑證。
接下來,我們會先快速認識 IAM 的基本概念,然後再進入 CI/CD 中實際的應用。
在進入 CI/CD 的應用之前,我們先認識 AWS IAM 的重要元件。
下面這張圖可以幫助你快速掌握 IAM 的結構:
(圖片來源:Geeks for Geeks)
在 IAM 的世界裡,所有權限都是透過 Policy(策略)來描述的。
Policy 的本質就是一份 JSON 文件,裡面包含一個或多個 Statement(敘述)。
每個 Statement 就像是一條規則,描述「誰」能在「哪些資源」上「做什麼動作」。
主要欄位如下:
{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}
Effect:決定是 Allow(允許)還是 Deny(拒絕)(如果同時有兩份statement作用 Deny 會勝過 Allow )。
Action:指定可以呼叫的 API,例如 s3:PutObject(上傳一個物件到Bucket)、ec2:StartInstances(啟動一個EC2)。
Resource:指定能操作的 AWS 資源,用 ARN(Amazon Resource Name)表示。
一份完整的 Policy 可以包含多個 Statement,以下是同時允許 S3 Bucket 的物件上傳以及下載的 Policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
},
{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
這些 Policy 不會自己生效,必須綁定到某個 IAM 實體,例如:
**User(使用者) → 個別人員或應用程式帳號。
**Group(群組) → 一群使用者的集合,用來批次套用 Policy。
**Role(角色) → 提供臨時憑證給 AWS 資源或外部服務(例如我們會用到的 GitHub Actions)。
在 CI/CD Pipeline 中,我們不希望把「永久性的 Access Key」塞到 GitHub Repo,因為一旦洩漏,後果不堪設想。
這時候 IAM Role 就是最佳解:
今天專注在IAM的基本概念講解,希望大家在經過今天的文章有更加了解 IAM 所扮演的角色。在下一篇文章,我們就會專注於 如何為 CI/CD 建立合適的 IAM Role,並將它實際套用在 GitHub Actions Workflow 中。敬請期待囉!