在 AWS 環境中,取得 IAM 使用者 ARN 是常見的需求,透過 AWS STS 與 CLI,能快速取得使用者身份資訊,包含 UserId、Account 和 Arn。搭配 --query 與 --output 引數可精確擷取 ARN 並以純文字格式輸出,方便後續操作或指令碼整合。設定環境變數能簡化重複呼叫,而 --dry-run 標誌則可在正式執行前預覽操作結果,降低風險。此外,使用 sed 命令可有效管理範本檔案中的佔位符值,提升自動化效率。
除了基本操作,文章也涵蓋了安全議題。透過 AWS Secrets Manager 可生成高強度密碼,並建議使用此服務或 Systems Manager Parameter Store 管理敏感資訊,避免環境變數外洩。同時,文章也強調了最低許可權原則的重要性,建議使用 IAM Access Analyzer 分析 CloudTrail 日誌,生成符合實際需求的 IAM 政策,並搭配 IAM Policy Simulator 驗證策略有效性。最後,文章也簡述了 AWS CDK 的使用流程,包含初始化、佈署與 helper.py 指令碼的應用,提供更進階的基礎設施管理方式。
使用AWS STS取得IAM使用者ARN
在AWS中,取得當前IAM使用者或角色的Amazon Resource Name (ARN)是一項常見的操作。利用AWS Security Token Service (AWS STS),可以輕鬆地透過AWS CLI完成這項任務。
使用AWS CLI取得IAM使用者ARN
首先,您可以使用以下命令來取得當前IAM使用者或角色的詳細資訊:
aws sts get-caller-identity
執行此命令後,您應該會看到類別似以下的輸出:
{
"UserId": "EXAMPLE",
"Account": "111111111111",
"Arn": "arn:aws:iam::111111111111:user/UserName"
}
內容解密:
aws sts get-caller-identity:這條命令用於取得當前AWS CLI組態的使用者或角色的身份資訊。UserId:代表當前使用者或角色的唯一ID。Account:代表當前使用者或角色所屬的AWS帳戶ID。Arn:代表當前使用者或角色的ARN。
查詢ARN值
如果您只想取得ARN值,可以使用--query引數來指定查詢的欄位,並使用--output引數來指定輸出的格式。例如:
aws sts get-caller-identity --query Arn --output text
執行此命令後,您應該會看到類別似以下的輸出:
arn:aws:iam::111111111111:user/UserName
內容解密:
--query Arn:指定只查詢Arn欄位。--output text:指定輸出格式為純文字。
將ARN值設為環境變數
您可以將ARN值設為環境變數,以便在後續的操作中使用。利用命令替換(command substitution),可以實作這一點:
PRINCIPAL_ARN=$(aws sts get-caller-identity --query Arn --output text)
要檢查環境變數的值,可以使用echo命令:
echo $PRINCIPAL_ARN
執行此命令後,您應該會看到類別似以下的輸出:
arn:aws:iam::111111111111:user/UserName
內容解密:
PRINCIPAL_ARN=$(...):將命令的輸出結果指定給環境變數PRINCIPAL_ARN。echo $PRINCIPAL_ARN:輸出環境變數PRINCIPAL_ARN的值。
使用–dry-run標誌進行測試
在執行可能會修改資源的操作之前,使用--dry-run標誌是一個好習慣。例如:
aws ec2 create-vpc --dry-run --cidr-block 10.10.0.0/16
這可以讓您在不實際執行操作的情況下測試命令的有效性。
取代範本檔案中的值
在某些情況下,您需要根據自己的環境修改提供的範本檔案。例如,在建立AWS CodeDeploy組態時,您可能需要取代codedeploy-template.json檔案中的佔位符值。
使用sed命令取代值
如果您將需要的引數儲存為環境變數,可以使用sed命令來取代範本檔案中的佔位符值。例如:
sed -e "s/AWS_ACCOUNT_ID/${AWS_ACCOUNT_ID}/g" \
-e "s|PROD_LISTENER_ARN|${PROD_LISTENER_ARN}|g" \
-e "s|TEST_LISTENER_ARN|${TEST_LISTENER_ARN}|g" \
codedeploy-template.json > codedeploy.json
內容解密:
sed:一個用於文字操作的流編輯器命令。-e "s/舊值/新值/g":用於取代文字中的舊值。其中,g表示全域性替換。codedeploy-template.json:輸入的範本檔案。> codedeploy.json:將修改後的內容輸出到新的檔案中。
管理密碼和秘密
在某些步驟中,您可能需要建立密碼並臨時儲存為環境變數。務必在完成相關操作後清除這些環境變數。在生產環境中,建議使用AWS Secrets Manager或AWS Systems Manager Parameter Store來安全地管理密碼和秘密。
使用AWS Secrets Manager生成密碼
您可以使用AWS Secrets Manager透過AWS CLI生成符合特定要求的密碼。例如:
ADMIN_PASSWORD=$(aws secretsmanager get-random-password \
--exclude-punctuation \
--password-length 41 --require-each-included-type \
--output text \
--query RandomPassword)
內容解密:
aws secretsmanager get-random-password:用於生成隨機密碼的命令。--exclude-punctuation:排除特殊字元。--password-length 41:指定密碼長度為41個字元。--require-each-included-type:要求密碼包含至少一個大寫字母、一個小寫字母、一個數字和一個特殊字元(儘管這裡排除了特殊字元)。--output text和--query RandomPassword:指定輸出格式和查詢欄位。
生成隨機字尾
對於像Amazon S3這樣的全域服務,需要生成隨機字尾以確保資源名稱的唯一性。您可以使用AWS Secrets Manager生成隨機字串。例如:
RANDOM_STRING=$(aws secretsmanager get-random-password \
--exclude-punctuation --exclude-uppercase \
--password-length 6 --require-each-included-type \
--output text \
--query RandomPassword)
內容解密:
- 與上述生成密碼的命令類別似,但根據需要調整了引數,例如排除了大寫字母和特殊字元,指定了不同的密碼長度。
使用AWS Cloud Development Kit (CDK)
AWS CDK是一個開源框架,允許您使用程式語言定義雲端基礎設施。本文在某些章節中使用CDK來佈署一致的場景,以配合特定的問題陳述。
初始化CDK環境
首先,您需要安裝CDK並進行初始化。安裝CDK後,如果是第一次使用,需要進行引導(bootstrap)操作:
cdk bootstrap aws://$AWS_ACCOUNT_ID/$AWS_REGION
佈署CDK程式碼
您可以透過以下步驟佈署CDK程式碼:
- 切換到包含CDK專案的目錄。
- 建立虛擬環境(如果需要)。
- 安裝必要的依賴項。
- 執行
cdk deploy命令進行佈署。
例如:
cd 401-Creating-an-Aurora-Serverless-DB/cdk-AWS-Cookbook-401/
test -d .venv || python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip setuptools wheel
pip install -r requirements.txt
cdk deploy
內容解密:
cdk deploy:佈署CDK堆積疊。- 其他命令用於設定Python虛擬環境和安裝必要的Python包。
使用helper.py指令碼
在佈署CDK程式碼後,可以執行一個名為helper.py的Python指令碼,以從CloudFormation堆積疊輸出中設定本地變數,使後續步驟更容易執行。
執行指令碼後,您將看到可以複製並貼上到終端中的命令,以設定環境變數。
安全
1.0 簡介
根據IBM/Ponemon Institute的報告,2021年資料外洩的平均成本達到新的高峰——424萬美元。當你選擇在雲端執行應用程式時,你信任AWS提供一個安全的基礎設施來執行雲端服務,這樣你就可以專注於自己的創新和增值活動。
然而,雲端安全是您與AWS之間的共同責任。您負責組態諸如AWS Identity and Access Management(IAM)策略、Amazon EC2安全群組和根據主機的防火牆等專案。換句話說,構成AWS雲端的硬體和軟體平台的安全性是AWS的責任,而您在AWS帳戶中實施的軟體和組態的安全性則是您的責任。
當你在AWS中佈署雲端資源並套用組態時,瞭解維持安全環境所需的安全設定至關重要。本章的配方包括最佳實踐和針對安全性的使用案例。由於安全性是每個環節的一部分,你將結合本文其他章節和配方來使用這些安全性配方。例如,在連線到EC2例項時,你將看到整本文中使用的AWS Systems Manager Session Manager。這些基礎安全配方將為你在AWS上構建安全解決方案提供所需的工具。
除了本章的內容外,還有許多優秀的資源可供深入研究AWS上的安全性主題。在2019年AWS安全會議re:Inforce上發表的「The Fundamentals of AWS Cloud Security」提供了很好的概述。而在AWS re:Invent上發表的更進階的演講「Encryption: It Was the Best of Controls, It Was the Worst of Controls」則詳細探討了加密場景。
內容解密:
本段落主要闡述了雲端安全的重要性以及AWS與客戶之間的共同責任。文中提到了IBM/Ponemon Institute報告中的資料,強調了資料外洩的嚴重性。同時,也解釋了AWS與客戶在雲端安全方面的責任劃分,包括客戶需要負責組態的安全專案。最後,提到了本章內容的目的和相關資源,為讀者提供了進一步學習的方向。
此圖示展示了客戶與AWS在雲端安全方面的責任劃分。
內容解密:
此Plantuml圖表呈現了客戶與AWS之間的互動關係,以及雙方在雲端安全方面的責任劃分。其中,客戶負責組態安全專案,而AWS則提供雲端資源。圖表清晰地展示了安全責任的分工,有助於讀者理解雙方在維護雲端安全方面的作用。
建立與承擔 IAM 角色以進行開發者存取的安全最佳實踐
在 AWS 環境中,安全地管理存取許可權是至關重要的。AWS 提供了一份安全最佳實踐,所有的 AWS 帳戶持有者都應熟悉這些最佳實踐,以確保其 AWS 環境的安全。
工作站組態
在開始之前,您需要安裝一些必要的工具和組態環境變數。請按照「CLI 說明書的一般工作站設定步驟」驗證您的組態並設定所需的環境變數。然後,下載本章的程式碼儲存函式庫:
git clone https://github.com/AWSCookbook/Security
1.1 為開發者存取建立並承擔 IAM 角色
問題
為了避免一直使用管理員許可權,您需要在 AWS 帳戶中為開發用途建立一個 IAM 角色。
方案
建立一個 IAM 角色並附加 PowerUserAccess 策略,使其能夠被承擔。
步驟
建立
assume-role-policy-template.json檔案建立一個名為
assume-role-policy-template.json的檔案,內容如下:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "PRINCIPAL_ARN" }, "Action": "sts:AssumeRole" } ] }內容解密:
Version:指定策略的版本。Statement:定義策略的陳述。Effect:允許或拒絕存取。Principal:指定可以承擔該角色的身份。Action:允許承擔角色的操作。
檢索使用者的 ARN 並設定為變數
PRINCIPAL_ARN=$(aws sts get-caller-identity --query Arn --output text)內容解密:
aws sts get-caller-identity:取得目前呼叫者的身份資訊。--query Arn:查詢呼叫者的 ARN。--output text:以文字格式輸出結果。
使用
sed命令替換PRINCIPAL_ARNsed -e "s|PRINCIPAL_ARN|${PRINCIPAL_ARN}|g" assume-role-policy-template.json > assume-role-policy.json內容解密:
sed:用於文字替換的命令。-e:啟用擴充套件正規表示式。s|PRINCIPAL_ARN|${PRINCIPAL_ARN}|g:將PRINCIPAL_ARN替換為實際的 ARN。
建立角色並指定承擔角色策略檔案
ROLE_ARN=$(aws iam create-role --role-name AWSCookbook101Role --assume-role-policy-document file://assume-role-policy.json --output text --query Role.Arn)內容解密:
aws iam create-role:建立 IAM 角色。--role-name AWSCookbook101Role:指定角色名稱。--assume-role-policy-document file://assume-role-policy.json:指定承擔角色的策略檔案。
附加
PowerUserAccess策略到角色aws iam attach-role-policy --role-name AWSCookbook101Role --policy-arn arn:aws:iam::aws:policy/PowerUserAccess內容解密:
aws iam attach-role-policy:將策略附加到角色。--policy-arn:指定要附加的策略 ARN。
驗證承擔角色
aws sts assume-role --role-arn $ROLE_ARN --role-session-name AWSCookbook101內容解密:
aws sts assume-role:承擔指定的 IAM 角色。--role-arn $ROLE_ARN:指定要承擔的角色 ARN。--role-session-name AWSCookbook101:指定會話名稱。
清理
請按照本章程式碼儲存函式庫中的步驟進行清理。
討論
使用管理員許可權進行日常開發任務不是一個好的安全實踐。過多的許可權可能導致未授權的操作。使用 PowerUserAccess 策略是一個更好的替代方案。後續,您應該定義自己的客戶管理策略,以授予所需的特定操作。
挑戰
為每個 AWS 管理的職能政策(例如,帳單、資料函式倉管理員、網路等)建立額外的 IAM 角色。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title AWS STS IAM 使用者 ARN 取得
package "資料庫架構" {
package "應用層" {
component [連線池] as pool
component [ORM 框架] as orm
}
package "資料庫引擎" {
component [查詢解析器] as parser
component [優化器] as optimizer
component [執行引擎] as executor
}
package "儲存層" {
database [主資料庫] as master
database [讀取副本] as replica
database [快取層] as cache
}
}
pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中
master --> replica : 資料同步
note right of cache
Redis/Memcached
減少資料庫負載
end note
@enduml
此圖示展示了建立和承擔 IAM 角色的流程。先建立 IAM 角色,然後附加必要的策略,最後承擔該角色並驗證結果。
1.2 根據存取模式產生最低許可權IAM政策
問題
您希望為使用者實施最低許可權存取,縮小許可權範圍,使其僅能存取在AWS帳戶中所需的服務、資源和操作。
解決方案
使用IAM控制檯中的IAM存取分析器,根據AWS帳戶中的CloudTrail活動產生IAM政策,如圖1-2所示。
先決條件
- 為您的帳戶啟用CloudTrail日誌記錄至設定的S3儲存桶(參見配方9.3)
步驟
- 導航至IAM控制檯,選擇您要為其產生政策的IAM角色或IAM使用者。
- 在「許可權」標籤頁(檢視主體時的預設活動標籤頁)中,向下滾動至底部,展開「根據CloudTrail事件產生政策」部分,然後點選「產生政策」按鈕。
- 若要快速檢視AWS服務的存取情況,請點選「存取顧問」標籤頁,檢視服務清單和存取時間。雖然IAM存取顧問的功能不如存取分析器強大,但在稽核或疑難排解IAM主體時仍有幫助。
- 選擇要評估的CloudTrail事件的時間段,選取您的CloudTrail追蹤,選擇區域(或選擇「所有區域」),然後選擇「建立並使用新的服務角色」。IAM存取分析器將為所選服務建立一個角色,用於讀取您所選追蹤的存取許可權。最後,點選「產生政策」。請參見圖1-3的範例。
- 角色建立最多可能需要30秒。角色建立完成後,政策產生的時間將取決於CloudTrail追蹤中的活動量。
- 分析器完成後,向下滾動至許可權標籤頁底部,然後點選「檢視產生的政策」,如圖1-4所示。
- 點選「下一步」,您將看到根據IAM主體的活動產生的JSON格式政策。您可以在介面中編輯此政策,以新增額外的許可權。再次點選「下一步」,選擇名稱,然後您可以將此產生的政策佈署為IAM政策。
您應該在IAM控制檯中看到類別似以下的產生IAM政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"access-analyzer:ListPolicyGenerations",
"cloudtrail:DescribeTrails",
"cloudtrail:LookupEvents",
"iam:GetAccountPasswordPolicy",
"iam:GetAccountSummary",
"iam:GetServiceLastAccessedDetails",
"iam:ListAccountAliases",
"iam:ListGroups",
"iam:ListMFADevices",
"iam:ListUsers",
"s3:ListAllMyBuckets",
"sts:GetCallerIdentity"
],
"Resource": "*"
},
...
]
}
驗證檢查
建立新的IAM使用者或角色,並將新建立的IAM政策附加到它。執行政策允許的操作,以驗證政策允許您的IAM主體執行所需的操作。
討論
在為使用者和應用程式定義IAM政策時,您應該始終努力實施最低許可權原則。通常,您在開始時可能不知道需要哪些許可權。使用IAM存取分析器,您可以先在開發環境中授予使用者和應用程式較大的範圍,啟用CloudTrail日誌記錄(配方9.3),然後在具有代表性的時間視窗後執行IAM存取分析器(在存取分析器組態中選擇此時間段,如步驟3)。產生的政策將包含允許應用程式或使用者在所選時間段內正常工作的所有必要許可權,有助於實施最低許可權原則。
您還應該瞭解存取分析器支援的服務列表。
挑戰
使用IAM政策模擬器(參見配方1.4)對產生的政策進行驗證,以確保該政策包含您需要的存取許可權。