怎麼確認真的是唯讀?
我們把授權內容用透明的方式呈現:您可以在加入前的「唯讀角色」頁面直接看到 CloudFormation 建立的角色權限內容。
1. 身份驗證 - 這個角色「只允許被誰使用」?
請檢查 JSON 中的 CrossAccountRole 區段:
Principal: {"AWS": {"Ref": "EliteIamRole"}}→ 含義:代表「只有勤英科技指定的 IAM Role(EliteIamRole)可以來扮演(Assume)這個角色」。其他人(就算知道 Role ARN)都不能直接使用。Action: "sts:AssumeRole"→ 含義:代表「只允許透過 AssumeRole 取得暫時性憑證」,不會建立/發放永久金鑰(Access Key)。Condition: sts:ExternalId == EliteExternalID→ 含義:這是 External ID 防護。防止第三方冒用、或混淆代理人問題(Confused Deputy Problem)。 即使有人知道 Role ARN,也不能隨便 Assume,必須帶正確 External ID 才能通過。
這個 Role 不是誰都能使用,且有 External ID 保護。
2. 權限驗證 - 這個角色「能做什麼?不能做什麼?」
我們的權限設定分為兩層,您可以逐一審查:
第一層:AWS Managed Policy:ReadOnlyAccess, SecurityAudit
ReadOnlyAccess, SecurityAuditManagedPolicyArns": ["arn:aws:iam::aws:policy/ReadOnlyAccess","arn:aws:iam::aws:policy/SecurityAudit"]
我們使用「 AWS 官方的 ReadOnlyAccess 與 SecurityAudit」,這代表角色權限以「讀取/列出/描述」為主,此權限可以檢查您的設定與資源狀態,用於成本優化/資安/合規快篩,且不包含 「Start/Stop/Modify/Delete」 這類寫入變更行為。
第二層:Inline Policy:ExplicitDenySensitiveAccess
ExplicitDenySensitiveAccess雖然我們已經使用 ReadOnlyAccess 與 SecurityAudit,但為確保您的資料安全,我們加了第二層防護:「禁止 Role 取得以下重要服務的權限」。
"Effect": "Deny":代表禁止以下功能"lambda:GetFunction":取得 Lambda 函數的設定與程式碼位置"lambda:GetFunctionCodeSigningConfig":取得 Lambda 程式碼簽章設定資訊"s3:GetObject":下載 S3 物件內容"s3:GetObjectVersion":下載指定版本的 S3 物件"s3:GetObjectTorrent":以 BitTorrent 方式下載 S3 物件"secretsmanager:GetSecretValue":讀取 Secrets Manager 中的內容"secretsmanager:BatchGetSecretValue":批次讀取多個Secrets Manager中的內容"ssm:GetParameter":讀取單一 Parameter Store 參數"ssm:GetParameters":讀取多個 Parameter Store 參數"ssm:GetParametersByPath":依路徑批次讀取參數"ssm:StartSession":透過 Session Manager 建立遠端連線"ssm:ResumeSession":恢復既有的 Session Manager 連線"ssm:SendCommand":透過 SSM 對主機下遠端指令"ssm:GetCommandInvocation":查看指令執行結果"ssm:ListCommandInvocations":列出指令執行紀錄"ssm:TerminateSession":終止 Session Manager 連線"kms:Decrypt":使用 KMS 金鑰解密資料"logs:GetLogEvents":讀取 CloudWatch Logs 日誌內容"logs:FilterLogEvents":依條件搜尋日誌內容"logs:StartQuery":啟動 Logs Insights 查詢"logs:GetQueryResults":取得查詢結果"logs:StopQuery":停止日誌查詢"ecr:GetDownloadUrlForLayer":取得 ECR 映像層下載網址"ecr:BatchGetImage":批次取得容器映像"sqs:ReceiveMessage":從 SQS 佇列接收訊息"sqs:DeleteMessage":刪除佇列中的訊息"sqs:ChangeMessageVisibility":修改訊息隱藏時間"codecommit:GitPull":從 CodeCommit 下載程式碼(git pull)"codecommit:GetBlob":取得儲存庫中的 blob 內容"codecommit:GetFile":取得單一檔案內容"codecommit:GetFolder":取得資料夾內容"codecommit:GetDifferences":取得程式碼差異"cloudformation:GetTemplate":下載 CloudFormation 範本"rds:DownloadDBLogFilePortion":下載部分 RDS 資料庫日誌"rds:DownloadCompleteDBLogFile":下載完整 RDS 資料庫日誌
限制這些較容易暴露敏感資訊的權限。
3. 為什麼一定要用 CloudFormation 建 Stack?
CloudFormation 的優點是「可稽核、可追溯、可撤銷」:
結構固定: 權限結構固定,不靠人工手動點來點去,大幅降低配置錯誤風險。
變更記錄: 任何修改都有 AWS 官方的變更記錄 (Log)。
一鍵撤銷: 若未來要停止服務,只需直接刪除該 Stack,就能把授權整包移除。
Last updated

