

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 准备安全性
<a name="preparing-security"></a>

本节讨论 Software Package Catal AWS IoT Device Management og 的主要安全要求。

## 基于资源的身份验证
<a name="resource-based-authorization"></a>

在更新实例集中的软件时，软件包目录使用基于资源的授权来提高安全性。这意味着您必须创建一个 AWS Identity and Access Management (IAM) 策略，该策略授予对软件包和软件包版本执行`create``read``update``delete`、、和`list`操作的权限，并在该`Resources`部分中引用要部署的特定软件包和软件包版本。您也需要这些权限，以便更新[预留命名影子](https://docs.aws.amazon.com/iot/latest/developerguide/preparing-to-use-software-package-catalog.html#reserved-named-shadow)。您可以通过为每个实体包括 Amazon 资源名称（ARN）来引用软件包和程序包版本。

**注意**  
如果您打算让策略授予软件包版本 API 调用的权限（例如[CreatePackageVersion[UpdatePackageVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdatePackageVersion.html)](https://docs.aws.amazon.com/iot/latest/apireference/API_CreatePackageVersion.html)、、[DeletePackageVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_DeletePackageVersion.html)），则需要在策略 ARNs 中*同时*包含软件包和软件包版本。如果您打算通过策略授予软件包 API 调用（例如[CreatePackage[UpdatePackage](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdatePackage.html)](https://docs.aws.amazon.com/iot/latest/apireference/API_CreatePackage.html)、和 [DeletePackage](https://docs.aws.amazon.com/iot/latest/apireference/API_DeletePackage.html)）的权限，则必须在策略中仅包含软件包 ARN。

按 ARNs 如下方式构造软件包和软件包版本：
+ 软件包：`arn:aws:iot:<region>:<accountID>:package/<packageName>/package`
+ 程序包版本：`arn:aws:iot:<region>:<accountID>:package/<packageName>/version/<versionName>`

**注意**  
您还可以此策略中包含其它相关权限。例如，您可以为 `job`、`thinggroup` 和 `jobtemplate` 加入一个 ARN。有关更多信息以及策略选项的完整列表，请参阅使用[AWS IoT 任务保护用户和设备](https://docs.aws.amazon.com/iot/latest/developerguide/iot-jobs-security.html)。

例如，如果您的软件包和程序包版本命名如下：
+ AWS IoT 东西：`myThing`
+ 软件包名称：`samplePackage`
+ 版本 `1.0.0`

该策略可能类似于以下示例：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:createPackage",
                "iot:createPackageVersion",
                "iot:updatePackage",
                "iot:updatePackageVersion"
            ],
            "Resource": [
               "arn:aws:iot:us-east-1:111122223333:package/samplePackage",
               "arn:aws:iot:us-east-1:111122223333:package/samplePackage/version/1.0.0"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:GetThingShadow",
                "iot:UpdateThingShadow"
            ],
            "Resource": "arn:aws:iot:us-east-1:111122223333:thing/myThing/$package"
        }
    ]
}
```

## AWS IoT 部署包版本的 Job 权限
<a name="job-rights-deploy-versions"></a>

出于安全考虑，您务必授予部署软件包和程序包版本的权限，并指定允许部署的特定软件包和程序包版本。为此，您需要创建 IAM 角色和策略，以授予使用程序包版本部署任务的权限。该策略必须将目标程序包版本指定为资源。

**IAM 策略**

IAM 策略授予创建任务的权限，此任务包括在 `Resource` 部分中指定的软件包和版本。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:CreateJob",
                "iot:CreateJobTemplate"
            ],
            "Resource":[
                "arn:aws:iot:*:111122223333:job/<jobId>",
                "arn:aws:iot:*:111122223333:thing/<thingName>/$package",
                "arn:aws:iot:*:111122223333:thinggroup/<thingGroupName>",
                "arn:aws:iot:*:111122223333:jobtemplate/<jobTemplateName>",
                "arn:aws:iot:*:111122223333:package/<packageName>/version/<versionName>"
            ]
        }
    ]
}
```

**注意**  
如果要部署卸载软件包和程序包版本的任务，则必须授权其中程序包版本为 `$null` 的 ARN，如下所示：

```
arn:aws:iot:<regionCode>:111122223333:package/<packageName>/version/$null
```

## AWS IoT 更新保留的名为 shadow 的 Job 权限
<a name="job-rights-update-reserved-named-shadow"></a>

要允许任务在任务成功完成时更新事物的预留名称影子，您必须创建 IAM 角色和策略。有两种方法可以在 AWS IoT 控制台中执行此操作。第一种是在控制台中创建软件包时。如果您看到**为软件包管理启用依赖项**对话框，则可以选择使用现有角色或创建新角色。或者，在 AWS IoT 控制台中，选择**设置**，选择**管理索引**，然后选择**管理设备软件包和版本的索引**。

**注意**  
如果您选择在 AWS IoT 任务成功完成时让 Job 服务更新预留的名为 shadow，则 API 调用将计入您的 Dev **ice Shadow 和注册表操作**，并且可能会产生费用。有关更多信息，请参阅[AWS IoT Core 定价](https://aws.amazon.com/iot-core/pricing/)。

使用**创建角色**选项时，所生成角色的名称以 `aws-iot-role-update-shadows` 开头并包含以下策略：

**设置角色**

**Permissions**  
权限策略授予查询和更新事物影子的权限。资源 ARN 中的 `$package` 参数以预留命名影子为目标。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iot:DescribeEndpoint",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:GetThingShadow",
                "iot:UpdateThingShadow"
            ],
            "Resource": [
            "arn:aws:iot:us-east-1:111122223333:thing/<thingName>/$package"
            ]
        }
    ]
}
```

**信任关系**  
除了权限策略外，该角色还需要与 AWS IoT Core 建立信任关系，以便实体可以代入该角色并更新预留命名影子。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "iot.amazonaws.com"
        },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

**设置用户策略**

**iam：PassRole 权限**  
最后，在调用 [ UpdatePackageConfiguration](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdatePackageConfiguration.html)API 操作 AWS IoT Core 时，您必须拥有将角色传递给的权限。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole",
                "iot:UpdatePackageConfiguration"
            ],
            "Resource": "arn:aws:iam::111122223333:role/<roleName>"
        }
    ]
}
```

## AWS IoT 从 Amazon S3 下载的任务权限
<a name="job-rights-download-job-document"></a>

任务文件保存在 Amazon S3 中。当你通过 AWS IoT Jobs 调度时，你会参考这个文件。您必须向 AWS IoT Jobs 提供下载文件的权限 (`s3:GetObject`)。您还必须在 Amazon S3 和 AWS IoT 任务之间建立信任关系。有关创建这些策略的说明，请参阅[管理作业 URLs](https://docs.aws.amazon.com/iot/latest/developerguide/create-manage-jobs.html)中的[预签名](https://docs.aws.amazon.com/iot/latest/developerguide/create-manage-jobs.html#create-manage-jobs-presigned-URLs)。

## 更新程序包版本的软件物料清单的权限
<a name="job-rights-update-sbom"></a>

要更新处于`Draft`、`Published`或`Deprecated`生命周期状态的软件包版本的软件物料清单，您需要一个 AWS Identity and Access Management 角色和策略来在 Amazon S3 中查找新的软件物料清单并在中更新软件包版本 AWS IoT Core。

首先，您需要将更新的软件物料清单放置在受版本控制的 Amazon S3 存储桶中，并在包含 `sboms` 参数的情况下调用 `[UpdatePackageVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdatePackageVersion.html)` API 操作。接下来，您的授权委托人将担任您创建的 IAM 角色，在 Amazon S3 中找到更新的软件物料清单，然后在 Software Package Catalog 中 AWS IoT Core 更新软件包版本。

执行此更新需要以下策略：

**策略**
+ **信任策略**：该策略与代入 IAM 角色的授权主体建立信任关系，以便其可以从 Amazon S3 中受版本控制的存储桶找到更新的软件物料清单，并在 AWS IoT Core中更新程序包版本。
  +   
****  

    ```
    {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "s3.amazonaws.com"
            },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    ```
  +   
****  

    ```
    {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "iot.amazonaws.com"
            },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    ```
+ **权限策略**：通过该策略可以访问其中存储了程序包版本软件物料清单的 Amazon S3 受版本控制的存储桶，并在 AWS IoT Core中更新程序包版本。
  +   
****  

    ```
    {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject"
                ],
                "Resource": [
                    "arn:aws:s3:::awsexamplebucket1"
                ]
            }
        ]
    }
    ```
  +   
****  

    ```
    {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "iot:UpdatePackageVersion"
                ],
                "Resource": [
                    "arn:aws:iot:*:111122223333:package/<packageName>/version/<versionName>"
                ]
            }
        ]
    }
    ```
+ **传递角色权限**：策略授予在您调用 `[UpdatePackageVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdatePackageVersion.html)` API 操作 AWS IoT Core 时向 Amazon S3 传递 IAM 角色的权限。
  +   
****  

    ```
    {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "iam:PassRole",
            "s3:GetObject"
          ],
          "Resource": [
            "arn:aws:s3:::awsexamplebucket1"
          ]
        }
      ]
    }
    ```
  +   
****  

    ```
    {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "iam:PassRole",
                    "iot:UpdatePackageVersion"
                ],
                "Resource": "arn:aws:iam::111122223333:role/<roleName>"
            }
        ]
    }
    ```

**注意**  
对于已转换为 `Deleted` 生命周期状态的程序包版本，您无法更新软件物料清单。

有关为 AWS 服务创建 IAM 角色的更多信息，请参阅[创建向 AWS 服务委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

有关创建 Amazon S3 存储桶并向其上传对象的更多信息，请参阅[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)和[上传对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)。