設定強健的密碼政策是確保 AWS 帳戶安全的第一步。透過 AWS IAM,可以強制執行密碼長度、複雜度、有效期限等設定,並防止密碼重複使用。此外,使用 IAM Policy Simulator 可以預先驗證策略的實際效果,避免佈署後出現非預期行為。許可權邊界則提供更精細的許可權控制,讓開發人員在安全範圍內操作。最後,強烈建議啟用 MFA,透過雙重驗證機制提升帳戶安全性。
1.3 在您的AWS帳戶中強制執行IAM使用者密碼政策
特別鳴謝
特別感謝Gaurav Raje對本配方做出的貢獻。
問題
您的安全政策要求必須為AWS帳戶中的所有使用者強制執行密碼政策。密碼政策規定密碼最長有效期為90天,且密碼必須由至少32個字元組成,包括小寫和大寫字母、數字和符號。
解決方案
為您的AWS帳戶中的IAM使用者設定密碼政策。建立IAM群組、IAM使用者,並將使用者新增至群組,以驗證政策是否得到執行(參見圖1-5)。
如果您的組織有中央使用者目錄,我們建議使用身分聯合來使用AWS單一登入(SSO)存取您的AWS帳戶,而不是建立個別的IAM使用者和群組。聯合允許您使用已經維護使用者和群組的身分提供者(IdP)。AWS發布了一份,解釋了可用的聯合存取組態。即使您沒有可用的IdP,您也可以按照配方9.6為您的帳戶啟用AWS SSO(AWS SSO預設提供了一個目錄供您使用)。
步驟
- 使用AWS CLI設定IAM密碼政策,要求包含小寫和大寫字母、符號和數字。政策應規定最小長度為32個字元,最大密碼壽命為90天,且禁止重用密碼:
aws iam update-account-password-policy \ --minimum-password-length 32 \ --require-symbols \ --require-numbers \ --require-uppercase-characters \ --require-lowercase-characters \ --allow-users-to-change-password \ --max-password-age 90 \ --password-reuse-prevention true - 建立IAM群組:您應該會看到類別似以下的輸出:
aws iam create-group --group-name AWSCookbook103Group{ "Group": { "Path": "/", "GroupName": "AWSCookbook103Group", "GroupId": "<snip>", "Arn": "arn:aws:iam::111111111111:group/AWSCookbook103Group", ... } }
使用 AWS IAM 強制密碼政策與模擬測試 IAM 政策
強制密碼政策
AWS 允許管理員強制執行密碼政策,以確保使用者帳戶的安全性。透過設定密碼政策,可以避免使用者選擇弱密碼或不定期更換密碼,從而降低組織的安全風險。
步驟
設定密碼政策:
aws iam update-account-password-policy \ --minimum-password-length 32 \ --require-symbols \ --require-numbers \ --require-uppercase-characters \ --require-lowercase-characters \ --allow-users-to-change-password \ --max-password-age 90 \ --password-reuse-prevention 1建立 IAM 群組並附加 ReadOnlyAccess 政策:
aws iam create-group --group-name AWSCookbook103Group aws iam attach-group-policy --group-name AWSCookbook103Group \ --policy-arn arn:aws:iam::aws:policy/AWSBillingReadOnlyAccess建立 IAM 使用者並加入群組:
aws iam create-user --user-name awscookbook103user RANDOM_STRING=$(aws secretsmanager get-random-password \ --password-length 32 --require-each-included-type \ --output text \ --query RandomPassword) aws iam create-login-profile --user-name awscookbook103user \ --password $RANDOM_STRING aws iam add-user-to-group --group-name AWSCookbook103Group \ --user-name awscookbook103user
驗證檢查
驗證密碼政策是否生效:
aws iam get-account-password-policy
嘗試建立一個新使用者,並使用不符合密碼政策的密碼:
RANDOM_STRING2=$(aws secretsmanager get-random-password \
--password-length 16 --require-each-included-type \
--output text \
--query RandomPassword)
aws iam create-login-profile --user-name awscookbook103user2 \
--password $RANDOM_STRING2
此命令應該會失敗,並顯示類別似以下的錯誤訊息:
An error occurred (PasswordPolicyViolation) when calling the CreateLoginProfile operation: Password should have a minimum length of 32
使用 IAM Policy Simulator 測試 IAM 政策
問題
您有一個 IAM 政策,想要在使用前測試其有效性。
解決方案
將 IAM 政策附加到 IAM 角色,並使用 IAM Policy Simulator 模擬操作。
步驟
建立 assume-role-policy.json 檔案:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }建立 IAM 角色:
aws iam create-role --assume-role-policy-document \ file://assume-role-policy.json --role-name AWSCookbook104IamRole附加 AmazonEC2ReadOnlyAccess 政策到 IAM 角色:
aws iam attach-role-policy --role-name AWSCookbook104IamRole \ --policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
驗證檢查
模擬 ec2:CreateInternetGateway 操作:
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::$AWS_ACCOUNT_ARN:role/AWSCookbook104IamRole \
--action-names ec2:CreateInternetGateway
您應該會看到類別似以下的輸出(注意 EvalDecision):
{
"EvaluationResults": [
{
"EvalActionName": "ec2:CreateInternetGateway",
"EvalResourceName": "*",
"EvalDecision": "implicitDeny",
"MatchedStatements": [],
"MissingContextValues": []
}
]
}
多因素身份驗證(MFA)
強烈建議為 IAM 使用者啟用多因素身份驗證(MFA)。MFA 結合「你知道什麼」和「你擁有什麼」,可以為帳戶提供額外的安全保護。
重點整理
- 設定密碼政策以增強帳戶安全性。
- 使用 IAM Policy Simulator 測試 IAM 政策的有效性。
- 為 IAM 使用者啟用多因素身份驗證(MFA)以提高安全性。
使用 IAM Policy Simulator 測試 IAM 策略
在 AWS 中,IAM(Identity and Access Management)策略允許您定義對資源、使用者、群組和服務的管理許可權。正確地設定 IAM 策略對於確保 AWS 資源的安全至關重要。本篇文章將介紹如何使用 IAM Policy Simulator 測試 IAM 策略,以確保其正確性和安全性。
測試 IAM 策略
AWS 提供了 IAM Policy Simulator 工具,可以模擬 IAM 策略的效果,幫助您瞭解策略的實際作用。以下是一個範例,展示如何使用 AWS CLI 測試 IAM 策略。
測試 ec2:CreateInternetGateway 操作
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::$AWS_ACCOUNT_ARN:role/AWSCookbook104IamRole \
--action-names ec2:CreateInternetGateway
結果顯示,該操作被隱含拒絕(implicitDeny),因為 AmazonEC2ReadOnlyAccess 策略不允許建立(create)EC2 資源。
測試 ec2:DescribeInstances 操作
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::$AWS_ACCOUNT_ARN:role/AWSCookbook104IamRole \
--action-names ec2:DescribeInstances
結果顯示,該操作被允許(allowed),因為 AmazonEC2ReadOnlyAccess 策略允許對 EC2 服務進行唯讀操作。
使用 IAM Policy Simulator 的好處
- 模擬策略效果:IAM Policy Simulator 可以模擬身份型策略(identity-based policies)、IAM 許可權邊界(permissions boundaries)、AWS Organizations 服務控制策略(SCPs)和資源型策略(resource-based policies)的效果。
- 除錯和測試:透過模擬不同的操作和策略,可以除錯和測試 IAM 策略,確保其正確性和安全性。
- 建立自訂策略:AWS 提供了 AWS Policy Generator 工具,可以幫助您從零開始建立 IAM 策略。
使用許可權邊界委派 IAM 管理能力
在某些情況下,您可能需要授予團隊成員佈署 Lambda 函式和建立 IAM 角色的許可權,同時限制這些角色的有效許可權。為此,您可以建立一個許可權邊界策略,並將其套用到 IAM 角色上。
建立許可權邊界策略
首先,建立一個名為 boundary-template.json 的檔案,內容如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CreateLogGroup",
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:logs:*:AWS_ACCOUNT_ID:*"
},
{
"Sid": "CreateLogStreamandEvents",
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:AWS_ACCOUNT_ID:*"
},
{
"Sid": "DynamoDBPermissions",
"Effect": "Allow",
"Action": [
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem"
],
"Resource": "arn:aws:dynamodb:*:AWS_ACCOUNT_ID:table/AWSCookbook*"
},
{
"Sid": "S3Permissions",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::AWSCookbook*/*"
}
]
}
然後,使用 sed 命令替換 AWS_ACCOUNT_ID,並建立 boundary-policy.json 檔案。
sed -e "s|AWS_ACCOUNT_ID|${AWS_ACCOUNT_ID}|g" \
boundary-policy-template.json > boundary-policy.json
接著,建立許可權邊界策略:
aws iam create-policy --policy-name AWSCookbook105PB \
--policy-document file://boundary-policy.json
#### 內容解密:
- 建立許可權邊界策略:首先,我們需要建立一個 JSON 檔案來定義許可權邊界策略的內容。這個檔案指定了允許的操作和資源。
- 替換
AWS_ACCOUNT_ID:使用sed命令替換boundary-template.json中的AWS_ACCOUNT_ID為實際的 AWS 帳戶 ID,生成boundary-policy.json。 - 建立許可權邊界策略:使用 AWS CLI 建立許可權邊界策略,並將其與 IAM 角色相關聯。
使用許可權界限委派 IAM 管理功能
在 AWS 中,許可權界限(Permissions Boundaries)是一種用於限制 IAM 實體(例如使用者或角色)許可權的機制。本篇文章將介紹如何使用許可權界限委派 IAM 管理功能。
建立許可權界限政策
首先,我們需要建立一個許可權界限政策。這個政策將定義開發人員可以執行的操作。建立一個名為 policy-template.json 的檔案,內容如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyPBDelete",
"Effect": "Deny",
"Action": "iam:DeleteRolePermissionsBoundary",
"Resource": "*"
},
{
"Sid": "IAMRead",
"Effect": "Allow",
"Action": [
"iam:Get*",
"iam:List*"
],
"Resource": "*"
},
{
"Sid": "IAMPolicies",
"Effect": "Allow",
"Action": [
"iam:CreatePolicy",
"iam:DeletePolicy",
"iam:CreatePolicyVersion",
"iam:DeletePolicyVersion",
"iam:SetDefaultPolicyVersion"
],
"Resource": "arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSCookbook*"
},
{
"Sid": "IAMRolesWithBoundary",
"Effect": "Allow",
"Action": [
"iam:CreateRole",
"iam:DeleteRole",
"iam:PutRolePolicy",
"iam:DeleteRolePolicy",
"iam:AttachRolePolicy",
"iam:DetachRolePolicy"
],
"Resource": [
"arn:aws:iam::AWS_ACCOUNT_ID:role/AWSCookbook*"
],
"Condition": {
"StringEquals": {
"iam:PermissionsBoundary": "arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSCookbook105PB"
}
}
},
{
"Sid": "ServerlessFullAccess",
"Effect": "Allow",
"Action": [
"lambda:*",
"logs:*",
"dynamodb:*",
"s3:*"
],
"Resource": "*"
},
{
"Sid": "PassRole",
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::AWS_ACCOUNT_ID:role/AWSCookbook*",
"Condition": {
"StringLikeIfExists": {
"iam:PassedToService": "lambda.amazonaws.com"
}
}
},
{
"Sid": "ProtectPB",
"Effect": "Deny",
"Action": [
"iam:CreatePolicyVersion",
"iam:DeletePolicy",
"iam:DeletePolicyVersion",
"iam:SetDefaultPolicyVersion"
],
"Resource": [
"arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSCookbook105PB",
"arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSCookbook105Policy"
]
}
]
}
內容解密:
此 JSON 檔案定義了一個 IAM 政策,用於限制開發人員的許可權。主要內容包括:
- DenyPBDelete:拒絕刪除角色許可權界限的操作。
- IAMRead:允許對 IAM 資源的唯讀操作。
- IAMPolicies:允許建立和刪除 IAM 政策,但必須遵循特定的命名慣例。
- IAMRolesWithBoundary:允許建立和刪除 IAM 角色,但必須設定許可權界限。
- ServerlessFullAccess:允許對 Lambda、CloudWatch Logs、DynamoDB 和 S3 的完整操作。
- PassRole:允許將 IAM 角色傳遞給 Lambda 函式。
- ProtectPB:拒絕修改特定的許可權界限政策。
取代 AWS 帳戶 ID
使用 sed 命令取代 AWS_ACCOUNT_ID 為實際的 AWS 帳戶 ID:
sed -e "s|AWS_ACCOUNT_ID|${AWS_ACCOUNT_ID}|g" policy-template.json > policy.json
內容解密:
此命令使用 sed 工具,將 policy-template.json 檔案中的 AWS_ACCOUNT_ID 取代為環境變數 ${AWS_ACCOUNT_ID} 的值,並將結果輸出到 policy.json 檔案中。
建立 IAM 政策
使用以下命令建立 IAM 政策:
aws iam create-policy --policy-name AWSCookbook105Policy --policy-document file://policy.json
內容解密:
此命令使用 AWS CLI 建立一個名為 AWSCookbook105Policy 的 IAM 政策,政策檔案來自 policy.json 檔案。
將政策附加到角色
將剛才建立的政策附加到指定的 IAM 角色:
aws iam attach-role-policy --policy-arn arn:aws:iam::$AWS_ACCOUNT_ID:policy/AWSCookbook105Policy --role-name AWSCookbook105Role
內容解密:
此命令將 AWSCookbook105Policy 政策附加到名為 AWSCookbook105Role 的 IAM 角色。
測試和驗證
假設角色並測試其許可權:
creds=$(aws --output text sts assume-role --role-arn $ROLE_ARN --role-session-name "AWSCookbook105" | grep CREDENTIALS | cut -d " " -f2,4,5)
export AWS_ACCESS_KEY_ID=$(echo $creds | cut -d " " -f2)
export AWS_SECRET_ACCESS_KEY=$(echo $creds | cut -d " " -f4)
export AWS_SESSION_TOKEN=$(echo $creds | cut -d " " -f5)
內容解密:
此命令序列假設指定的 IAM 角色,並將臨時憑證匯出到環境變數中,以便進行後續的操作。
建立測試角色
建立一個測試用的 IAM 角色,並附加必要的政策:
TEST_ROLE_1=$(aws iam create-role --role-name AWSCookbook105test1 --assume-role-policy-document file://lambda-assume-role-policy.json --permissions-boundary arn:aws:iam::$AWS_ACCOUNT_ID:policy/AWSCookbook105PB --output text --query Role.Arn)
aws iam attach-role-policy --role-name AWSCookbook105test1 --policy-arn arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess
aws iam attach-role-policy --role-name AWSCookbook105test1 --policy-arn arn:aws:iam::aws:policy/CloudWatchFullAccess
內容解密:
此命令序列建立了一個名為 AWSCookbook105test1 的 IAM 角色,並設定了許可權界限。然後,將 AmazonDynamoDBFullAccess 和 CloudWatchFullAccess 政策附加到該角色。