# 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 align="left")

最基礎的概念是每個 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 align="left")

## Policy Statement

* DynamoDB Table Read Only Access To Specific Columns
    

```xml
{
	"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 align="left")

### 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 align="left")

### Trust RelationShips

當遇到有兩個以上的 AWS account 彼此需要跨帳號存取資源時，需要在兩個 AWS account 設定彼此信任對方 account ，並且資源提供者需要建立 assume role 給存取者帳號，讓存取者透過該 assume role 俱備存取的 Policy

舉例如下圖： 假設 account1 有 Dynamodb 資源，需要讓 account2 中的某個 user 或是 app 存取

![image](https://hackmd.io/_uploads/Hkji3dUGC.png align="left")

則需要在 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 效果。
