

# AWS IoT 政策過度寬鬆
<a name="audit-chk-iot-policy-permissive"></a>

AWS IoT 政策提供的許可太寬鬆或不受限制。它授與許可給一組廣泛的裝置傳送或接收 MQTT 訊息，或授與許可給一組廣泛的裝置存取或修改影子和任務執行資料。

一般來說，裝置政策應授與其相關聯資源的存取許可，並且其他裝置不允許存取或是極少。在某些例外狀況下，使用萬用字元 (例如，「\*」) 來指定資源的政策已視為太寬鬆或不受限制。

此檢查會以 `IOT_POLICY_OVERLY_PERMISSIVE_CHECK` 出現在 CLI 和 API 中。

嚴重性：**關鍵**

## 詳細資訊
<a name="audit-chk-iot-policy-permissive-details"></a>

當此檢查發現不合規的 AWS IoT 政策時，將會傳回下列原因代碼：
+ ALLOWS\_BROAD\_ACCESS\_TO\_IOT\_DATA\_PLANE\_ACTIONS

## 為什麼它很重要
<a name="audit-chk-iot-policy-permissive-why-it-matters"></a>

憑證、Amazon Cognito 身分或物件群組使用過度寬鬆的政策，如果遭入侵會影響您的整個帳戶。攻擊者可以使用這類廣泛存取來讀取或修改您的所有裝置的影子、任務或任務執行。或者，攻擊者可以使用入侵的憑證連接到惡意裝置或啟動 DDOS 對您的網路進行攻擊。

## 如何修正它
<a name="audit-chk-iot-policy-permissive-how-to-fix"></a>

遵循以下步驟以修正任何附加到物件、物件群組或其他實體不合規的政策：

1. 使用 [CreatePolicyVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_CreatePolicyVersion.html) 來建立合規的新政策版本。將 `setAsDefault` 旗標設為 true。(這可讓此新版本適用於使用該政策的所有實體。)

1. 使用 [ ListTargetsForPolicy](https://docs.aws.amazon.com/iot/latest/apireference/API_ListTargetsForPolicy.html) 取得政策所附加至的目標清單 (憑證、物件群組)，以及判斷那些裝置包含在群組中或使用憑證來連接。

1. 驗證所有相關的裝置可以連接到 AWS IoT。如果裝置無法連接，則復原到預設政策之前的版本，使用 [ SetPolicyVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_SetPolicyVersion.html) 將預設政策還原為先前版本，修訂政策，然後重試。

您可以使用緩解動作：
+ 套用 `REPLACE_DEFAULT_POLICY_VERSION` 緩解行動到稽核結果來產生此變更。
+ 如果您要實作自訂回應以回應 Amazon SNS 訊息，套用 `PUBLISH_FINDINGS_TO_SNS` 緩解動作。

如需更多詳細資訊，請參閱 [緩解動作](dd-mitigation-actions.md)。

使用 [AWS IoT Core 政策變數](https://docs.aws.amazon.com/iot/latest/developerguide/iot-policy-variables.html)以動態參考您政策中的 AWS IoT 資源。

## MQTT 許可
<a name="audit-chk-iot-policy-permissive-mqtt-permissions"></a>

會透過 AWS IoT 訊息代理程式傳送 MQTT 訊息，並裝置會使用該訊息來執行許多動作，包括存取和修改影子狀態和任務執行狀態。與裝置連接、發佈或訂閱 MQTT 訊息許可的政策，應該對特定資源加以限制這些動作如下所示：

**連線**  
+ 不合規：

  ```
  arn:aws:iot:{{region}}:{{account-id}}:client/*
  ```

  萬用字元 \* 可讓任何裝置連接到 AWS IoT。

  ```
  arn:aws:iot:{{region}}:{{account-id}}:client/${iot:ClientId}
  ```

  除非 `iot:Connection.Thing.IsAttached` 在條件索引鍵中設定為 true，這相當於先前範例中的萬用字元 \*。
+ 合規：

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "iot:Connect"
        ],
        "Resource": [
          "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
        ]
      }
    ]
  }
  ```

------

  資源規範包含與連接所用的裝置名稱相符的變數。條件陳述式會檢查 MQTT 用戶端所用的憑證是否與連接到具有所用名稱的物件相符，進一步限制許可。

**發布**  
+ 不合規：

  ```
  arn:aws:iot:{{region}}:{{account-id}}:topic/$aws/things/*/shadow/update
  ```

  這可讓裝置更新任何裝置 (\* = 所有裝置) 的影子。

  ```
  arn:aws:iot:{{region}}:{{account-id}}:topic/$aws/things/*
  ```

  這可讓裝置讀取、更新或刪除任何裝置 (\* = 所有裝置) 的影子。
+ 合規：

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "iot:Publish"
              ],
              "Resource": [
                  "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*"
              ]
          }
      ]
  }
  ```

------

  資源規格包含萬用字元，但只符合任何影子相關主題物件名稱連線的裝置。

**訂閱**  
+ 不合規：

  ```
  arn:aws:iot:{{region}}:{{account-id}}:topicfilter/$aws/things/*
  ```

  這可讓裝置為所有裝置訂閱保留影子或任務主題。

  ```
  arn:aws:iot:{{region}}:{{account-id}}:topicfilter/$aws/things/*
  ```

  前述範例相同，但使用 \# 萬用字元。

  ```
  arn:aws:iot:{{region}}:{{account-id}}:topicfilter/$aws/things/+/shadow/update
  ```

  這可讓裝置看到任何裝置 (\+ = 所有裝置) 的影子更新。
+ 合規：

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "iot:Subscribe"
              ],
              "Resource": [
                  "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*",
                  "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/jobs/*"
              ]
          }
      ]
  }
  ```

------

  資源規格包含萬用字元，但只會針對物件名稱用於連線的裝置，比對任何影子相關主體與任何任務相關主題。

**接收**  
+ 合規：

  ```
  arn:aws:iot:{{region}}:{{account-id}}:topic/$aws/things/*
  ```

  這是合規的，因為裝置只能從已訂閱許可的主題接收訊息。

## 影子和任務許可
<a name="shadow-job-permissions"></a>

授與裝置執行 API 動作的許可以存取或修改裝置影子或任務執行資料的政策，應該於特定的資源限制這些動作。以下是 API 動作：
+ `DeleteThingShadow`
+ `GetThingShadow`
+ `UpdateThingShadow`
+ `DescribeJobExecution`
+ `GetPendingJobExecutions`
+ `StartNextPendingJobExecution`
+ `UpdateJobExecution`

**範例**
+ 不合規：

  ```
  arn:aws:iot:{{region}}:{{account-id}}:thing/*
  ```

  這可讓裝置在任何物件上執行指定的動作。
+ 合規：

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [ 
            "iot:DeleteThingShadow",
            "iot:GetThingShadow",
            "iot:UpdateThingShadow",
            "iotjobsdata:DescribeJobExecution",
            "iotjobsdata:GetPendingJobExecutions",
            "iotjobsdata:StartNextPendingJobExecution",
            "iotjobsdata:UpdateJobExecution"
        ],
        "Resource": [
          "arn:aws:iot:us-east-1:123456789012:thing/MyThing1",
          "arn:aws:iot:us-east-1:123456789012:thing/MyThing2"
        ]
      }
    ]
  }
  ```

------

  這可讓裝置僅在兩個物件上執行指定的動作。