# AWS IAM 關鍵概念 ## AWS IAM (Identity And Access Management) * 是一個用來管理 **Resources** 權限的 AWS 核心服務 * **Resources** 代表是在 AWS 使用者所建立已即可存取的任何 AWS 資源,比如 S3 Bucket or Object * 使用者會透過 Action 來描述對該資源執行的動作,比如 S3:CreateBucket * 會透過 Policy 來授權每個資源能執行的 **Action** ## Example ![image](https://hackmd.io/_uploads/HkmCiPIGC.png) 最基礎的概念是每個 user 會有對應的 Policy document 如上圖,如果這個 user 要可以建立 lambda function 則需要這個 user 有被 attach 有建立 lambda function resource 的 policy document 設定 **Note**: 每個 document 會在 Statement 項目內宣告針對每個 resource 執行某些 actions 的 effect , Effect 可以是 Allow 或 Deny Effect 預設是 Implicity Deny ,也就是預設是 Deny ,不宣告 Allow 則是 Deny 而如果針對特定 resources 直接宣告 Deny 則稱為 Explicity Deny ,顯示明定哪些資源要 Deny 存取 ## Access Key & Secret Access Key * **Secret** 能夠讓使用者與 AWS 互動 ![image](https://hackmd.io/_uploads/H1zBgdIzR.png) ## Policy Statement * DynamoDB Table Read Only Access To Specific Columns ```jsonld= { "Version": "2012-10-17", "Statement": [ { "Sid": "ReadOnlyAccess", "Effect": "Allow", "Action": [ "dynamodb:BatchGet", "dynamodb:GetItem", "dynamodb:Query", "dynamodb:Scan", ], "Resource": "arn:aws:dynamodb:*:*:table/MyTable", "Condition": { "ForAllValues:StringEquals": { "dynamodb:Attributes": [ "column-name-1", "column-name-2", "column-name-3" ] }, "StringEqualsIfExists": {"dynamobd:Select": "SPECIFIC_ATTRIBUTES"} } } ] } ``` ## 其他概念 ### Groups AWS 有 Groups 概念,可以讓 User 指定到某個 Group , 來讓該 Group 預設的 Policy 可以套用在該使用者。通常是為了方便管理。 ![image](https://hackmd.io/_uploads/ByDGHu8zR.png) ### Roles Role 的概念是用來給非使用者的執行身分權限的一種方式,比如說 lambda 要執行某個權限,可以 attach 所需要的 policy document 到那個 role 上,再把 lambda 指定為那個 role Role 的另一種特性是具有可變性,不一定是永久存在的。有一種概念是 assume role ,透過暫時性給定一個 role 給某些執行程式,比如說 gitlab runner 透過 OIDC 取得暫時發佈的 role ,執行完就撤銷該 role,能夠達到安全性上的考量。 ![image](https://hackmd.io/_uploads/ry0LKOUzC.png) ### Trust RelationShips 當遇到有兩個以上的 AWS account 彼此需要跨帳號存取資源時,需要在兩個 AWS account 設定彼此信任對方 account ,並且資源提供者需要建立 assume role 給存取者帳號,讓存取者透過該 assume role 俱備存取的 Policy 舉例如下圖: 假設 account1 有 Dynamodb 資源,需要讓 account2 中的某個 user 或是 app 存取 ![image](https://hackmd.io/_uploads/Hkji3dUGC.png) 則需要在 account1 設定信任 account 2, account 2 設定信任 account 1, 並且 account1 需要設定具有 dynamodb 存取 policy 的 assume role 給 account 2 的 user 或是 app ## 重要的點 * 要保護 **Root** account 這個 account 權限最大,儘可能不使用這個 account 去發佈 resource 這個 account 通常只適合用來做帳單管理,或是指派其他 user/role * Effect 權重:當同一個 resource 同時被兩個 Statement 指定,並且 Effect 各別為 'Deny' 與 'Allow',則以 'Deny' 為效果。 * 儘可能使用最小充分權限給每個 resource ,為了安全性考量。 * 可以透過 Policy Simulator 來模擬給定的 Policy Statement 效果。