

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

# 亚马逊 Kinesis Video Streams 中的安全
<a name="security"></a>

云安全 AWS 是重中之重。作为 AWS 客户，您将受益于专为满足大多数安全敏感型组织的要求而构建的数据中心和网络架构。

安全是双方共同承担 AWS 的责任。[责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)将其描述为云*的* 安全性和云*中* 的安全性：
+ **云安全** — AWS 负责保护在 AWS 云中运行 AWS 服务的基础架构。 AWS 还为您提供可以安全使用的服务。作为 [AWS 合规性计划](https://aws.amazon.com/compliance/programs/)的一部分，我们的安全措施的有效性定期由第三方审计员进行测试和验证。要了解适用于 Kinesis Video Streams 的合规性计划，请参阅[合规性计划范围内的AWS 服务](https://aws.amazon.com/compliance/services-in-scope/)。
+ **云端安全**-您的责任由您使用的 AWS 服务决定。您还需要对其他因素负责，包括您的数据的敏感性、您组织的要求以及适用的法律法规。

本文档可帮助你了解在使用 Kinesis Video Streams 时如何应用分担责任模型。以下主题向您展示了如何配置 Kinesis Video Streams 以实现您的安全和合规目标。您还将学习如何使用其他 AWS 服务来帮助您监控和保护您的 Kinesis Video Streams 资源。

**Topics**
+ [Kinesis Video Streams 中的数据保护](how-kms.md)
+ [使用 IAM 控制对 Kinesis Video Streams 资源的访问权限](how-iam.md)
+ [使用控制对 Kinesis Video Streams 资源的访问权限 AWS IoT](how-iot.md)
+ [亚马逊 Kinesis Video Streams 的合规性验证](akda-java-compliance.md)
+ [亚马逊 Kinesis Video Streams 的弹性](disaster-recovery-resiliency.md)
+ [Kinesis Video Streams 中的基础设施安全](infrastructure-security.md)
+ [Kinesis Video Streams 的安全最佳实践](security-best-practices.md)

# Kinesis Video Streams 中的数据保护
<a name="how-kms"></a>

您可以使用 () 密钥使用服务器端加密 (SSE)，通过对 Amazon Kinesis Video Streams 中的静态数据进行加密，从而满足严格的数据管理要求。 AWS Key Management Service AWS KMS

**Topics**
+ [什么是 Kinesis Video Streams 的服务器端加密？](#what-is-sse-akvs)
+ [费用、区域和性能注意事项](#costs-performance-akvs)
+ [如何开始使用服务器端加密？](#getting-started-with-sse-akvs)
+ [创建和使用客户管理的密钥](#creating-using-sse-master-keys-akvs)
+ [使用客户托管密钥的权限](#permissions-user-key-KMS-akvs)

## 什么是 Kinesis Video Streams 的服务器端加密？
<a name="what-is-sse-akvs"></a>

服务器端加密是 Kinesis Video Streams 中的一项功能，它使用您指定的密钥在数据静态存储之前自动对其 AWS KMS 进行加密。数据在写入 Kinesis Video Streams 流存储层之前加密，并在从存储检索到之后进行解密。因此，您的数据在 Kinesis Video Streams 服务中始终处于静态加密状态。

借助服务器端加密，您的 Kinesis 视频流制作者和使用者无需管理 KMS 密钥或加密操作。如果启用了数据保留，则您的数据在进入和离开 Kinesis Video Streams 时会自动加密，因此您的静态数据将被加密。 AWS KMS 提供了服务器端加密功能使用的所有密钥。 AWS KMS 简化了 Kinesis Video Streams Kinesis Video Streams 的 KMS 密钥的使用，该密钥 AWS由导入到服务 AWS KMS 中的用户指定的密钥管理。 AWS KMS 

## 费用、区域和性能注意事项
<a name="costs-performance-akvs"></a>

当你应用服务器端加密时，你需要支付 AWS KMS API 使用量和密钥费用。与自定义 AWS KMS 密钥不同，默认 `aws/kinesisvideo` KMS 密钥是免费提供的。但是，你仍然必须支付 Kinesis Video Streams 代表你产生的 API 使用费用。

API 使用费用适用于每个 KMS 密钥，包括自定义密钥。 AWS KMS 费用会随着您在数据创建者和使用者身上使用的用户凭证数量而变化，因为每个用户凭证都需要唯一的 API 调用。 AWS KMS

下面按资源介绍各项费用：

**键**
+  AWS 由（别名 `aws/kinesisvideo` =）管理的 Kinesis Video Streams 的 KMS 密钥不收费。
+ 用户生成的 KMS 密钥需要 AWS KMS key 付费。有关更多信息，请参阅[AWS Key Management Service 定价](https://aws.amazon.com/kms/pricing/#Keys)。

### AWS KMS API 使用情况
<a name="api-usage"></a>

生成新数据加密密钥或检索现有加密密钥的 API 请求会随着流量的增加而增加，并且需要支付 AWS KMS 使用成本。有关更多信息，请参阅[AWS Key Management Service 定价：用量](https://aws.amazon.com/kms/pricing/#Usage)。

即使保留期设置为 0（无保留期），Kinesis Video Streams 也会生成密钥请求。

### 按区域的服务器端加密的可用性
<a name="sse-regions-akvs"></a>

在所有提供 Kinesis Video Streams 的地方，都可以对 Kinesis 视频流 AWS 区域 进行服务器端加密。

## 如何开始使用服务器端加密？
<a name="getting-started-with-sse-akvs"></a>

Kinesis Video Streams 始终启用服务器端加密。如果在创建直播时未指定用户提供的密钥，则使用 AWS 托管式密钥 （由 Kinesis Video Streams 提供）。

在创建 Kinesis 视频流时，必须将用户提供的 KMS 密钥分配给 Kinesis 视频流。以后您无法使用 [UpdateStream](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_UpdateStream.html)API 为直播分配不同的密钥。

您可以通过两种方式为 Kinesis 视频流分配用户提供的 KMS 密钥：
+ 在中创建 Kinesis 视频流时 AWS 管理控制台，请在**创建新视频流**页面的**加密**选项卡中指定 KMS 密钥。
+ 使用 [CreateStream](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_CreateStream.html)API 创建 Kinesis 视频流时，请在参数中指定密钥 ID。`KmsKeyId`

## 创建和使用客户管理的密钥
<a name="creating-using-sse-master-keys-akvs"></a>

本节介绍如何创建和使用您自己的 KMS 密钥，而不是使用由 Amazon Kinesis Video Streams 管理的密钥。

### 创建客户托管的密钥
<a name="creating-sse-master-keys-akvs"></a>

有关如何创建自己的密钥的信息，请参阅*AWS Key Management Service 开发者指南*中的[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。在您为账户创建密钥后，Kinesis Video Streams 服务会在**客户管理的密钥列表中**返回这些密钥。

### 使用由客户托管的密钥。
<a name="using-sse-master-keys-akvs"></a>

向您的使用者、生产者和管理员应用正确的权限后，您就可以在自己的密钥 AWS 账户 或其他密钥中使用自定义 KMS 密钥 AWS 账户。您账户中的所有 KMS 密钥都显示在控制台的**客户托管密钥**列表中。

要使用位于其他账户中的自定义 KMS 密钥，您必须拥有使用这些密钥的权限。此外，您必须使用 `CreateStream` API 创建流。您不能在控制台中创建的直播中使用来自不同账户的 KMS 密钥。

**注意**  
在执行`PutMedia`或`GetMedia`操作之前，不会访问 KMS 密钥。这会产生以下结果：  
如果您指定的密钥不存在，则`CreateStream`操作会成功，但对流`PutMedia`的`GetMedia`操作将失败。
如果您使用提供的密钥 (`aws/kinesisvideo`)，则在执行第一个`PutMedia`或`GetMedia`操作之前，该密钥不会出现在您的账户中。

## 使用客户托管密钥的权限
<a name="permissions-user-key-KMS-akvs"></a>

在对客户托管密钥使用服务器端加密之前，必须配置 KMS 密钥策略以允许对流进行加密以及对流记录进行加密和解密。有关 AWS KMS 权限的示例和更多信息，请参阅 [AWS KMS API 权限：操作和资源参考](https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html)。

**注意**  
使用默认服务密钥进行加密不需要应用自定义 IAM 权限。

在使用客户托管密钥之前，请验证您的 Kinesis 视频流制作者和使用者（IAM 委托人）是否为 AWS KMS 默认密钥策略中的用户。否则，与流相关的读写操作会失败，这可能最终导致数据丢失、处理延迟或应用程序挂起。您可以使用 IAM policy 来管理 KMS 密钥的权限。有关更多信息，请参阅[将 IAM 策略与一起使用 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html)。

### 产生器权限示例
<a name="example-producer-permissions-akvs"></a>

您的 Kinesis 视频流制作者必须获得以下许可：`kms:GenerateDataKey`

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "kms:GenerateDataKey"
        ],
        "Resource": "arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    }, 
    {
        "Effect": "Allow",
        "Action": [
            "kinesisvideo:PutMedia"
        ],
        "Resource": "arn:aws:kinesisvideo:*:123456789012:stream/MyStream/*"
    }
  ]
}
```

------

### 消费者权限示例
<a name="example-consumer-permissions-akvs"></a>

您的 Kinesis 视频流用户必须获得以下许可：`kms:Decrypt`

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "kms:Decrypt"
        ],
        "Resource": "arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    }, 
    {
        "Effect": "Allow",
        "Action": [
            "kinesisvideo:GetMedia"
        ],
        "Resource": "arn:aws:kinesisvideo:*:123456789012:stream/MyStream/*"
    }
  ]
}
```

------

# 使用 IAM 控制对 Kinesis Video Streams 资源的访问权限
<a name="how-iam"></a>

您可以将 AWS Identity and Access Management (IAM) 与 Amazon Kinesis Video Streams 配合使用，以控制组织中的用户是否可以使用特定的 Kinesis Video Streams API 操作执行任务，以及他们是否可以使用特定资源。 AWS 

有关 IAM 的更多信息，请参阅以下文档：
+ [AWS Identity and Access Management (IAM)](https://aws.amazon.com/iam/)
+ [IAM 入门](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started.html)
+ [IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/)

**Topics**
+ [策略语法](#policy-syntax)
+ [Kinesis Video Streams 的操作](#kinesis-using-iam-actions)
+ [Kinesis Video Streams 的亚马逊资源名称 (ARNs)](#kinesis-using-iam-arn-format)
+ [向其他 IAM 账户授予访问 Kinesis 视频流的权限](#how-iam-crossaccount)
+ [Kinesis Video Streams 的策略示例](#how-iam-policies)

## 策略语法
<a name="policy-syntax"></a>

IAM 策略是包含一个或多个语句的 JSON 文档。每个语句的结构如下：

```
{
  "Statement":[{
    "Effect":"effect",
    "Action":"action",
    "Resource":"arn",
    "Condition":{
      "condition":{
        "key":"value"
        }
      }
    }
  ]
}
```

组成语句的各个元素如下：
+ **效果**-*效果*可以是`Allow`或`Deny`。默认情况下 用户没有使用资源和 API 操作的权限，因此，所有请求均会被拒绝。显式允许将覆盖默认规则。显式拒绝将覆盖任何允许。
+ **操作** — *操作*是您授予或拒绝权限的特定 API 操作。
+ **资源**-受操作影响的资源。要在语句中指定资源，必须使用其 Amazon 资源名称 (ARN)。
+ **条件**：条件是可选的。它们可以用于控制策略生效的时间。

在创建和管理 IAM 策略时，我们建议您使用 [IAM 策略生成器](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-generator)和 [IAM 策略模拟器](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_testing-policies.html)。

## Kinesis Video Streams 的操作
<a name="kinesis-using-iam-actions"></a>

在 IAM 策略语句中，您可以从支持 IAM 的任何服务中指定任何 API 操作。对于 Kinesis Video Streams，请使用以下前缀和 API 操作`kinesisvideo:`的名称：。例如：`kinesisvideo:CreateStream`、`kinesisvideo:ListStreams` 和 `kinesisvideo:DescribeStream`。

要在单个语句中指定多项操作，请使用逗号将它们隔开，如下所示：

```
"Action": ["kinesisvideo:action1", "kinesisvideo:action2"]
```

您也可以使用通配符指定多项操作。例如，您可以指定名称以单词“Get”开头的所有操作，如下所示：

```
"Action": "kinesisvideo:Get*"
```

若要指定所有 Kinesis Video Streams 操作，请使用 \$1 (星号) 通配符，如下所示：

```
"Action": "kinesisvideo:*"
```

有关 Kinesis Video Streams API 操作的完整列表，请参阅 [https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_Reference.html](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_Reference.html)。

## Kinesis Video Streams 的亚马逊资源名称 (ARNs)
<a name="kinesis-using-iam-arn-format"></a>

每个 IAM 政策声明都适用于您使用其指定的资源 ARNs。

请对 Kinesis Video Streams 使用以下 ARN 资源格式：

```
arn:aws:kinesisvideo:region:account-id:stream/stream-name/code
```

例如：

```
"Resource": arn:aws:kinesisvideo:*:111122223333:stream/my-stream/0123456789012
```

你可以使用获取直播的 ARN。[DescribeStream](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_DescribeStream.html)

## 向其他 IAM 账户授予访问 Kinesis 视频流的权限
<a name="how-iam-crossaccount"></a>

您可能需要向其他 IAM 账户授予权限才能在 Kinesis Video Streams 中对直播执行操作。下面概述了向各个账户授予对视频流的访问权的常规步骤：

1. 获取您想要授予对账户中创建的直播资源执行操作权限的账户的 12 位账号 ID。

   **示例：**在以下步骤中，我们将使用 111111111111 作为你想要向其授予权限的账户的账户 ID，并使用 99999999999999 作为你的 Kinesis Video Streams 的 ID

1. 在拥有直播的账户 (999999999999) 中创建一个 IAM 托管策略，该策略允许您要授予的访问级别。

   **政策示例：**

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "kinesisvideo:GetDataEndpoint",
                   "kinesisvideo:DescribeStream",
                   "kinesisvideo:PutMedia"
               ],
               "Resource": "arn:aws:kinesisvideo:us-west-2:999999999999:stream/custom-stream-name/1613732218179"
           }
       ]
   }
   ```

------

   有关 Kinesis Video Streams 资源的其他示例政策，[示例策略](#how-iam-policies)请参阅下一节中的。

1. 在拥有直播的账户 (999999999999) 中创建一个角色，然后指定要授予权限的账户 (111111111111)。这将为角色添加可信实体。

   **可信策略示例：**

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::111111111111:root"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

   将您在上一步中创建的策略附加到此角色。

   现在，您已在账户 999999999999 中创建了一个角色，该角色有权在托管策略中对直播资源 ARN 执行诸如`DescribeStream``GetDataEndpoint`、和`PutMedia`之类的操作。这个新角色还信任另一个账户 111111111111 来担任这个角色。
**重要**  
记下角色 ARN，下一步你会用到它。

1. 在另一个账户 111111111111 中创建托管策略，允许对您在上一步中在账户 9999999999 中创建的角色`AssumeRole`执行操作。你需要提及上一步中的角色 ARN。

   **政策示例：**

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": "sts:AssumeRole",
           "Resource": "arn:aws:iam::999999999999:role/CustomRoleName"
       }
   }
   ```

------

1. 将上一步中创建的策略附加到 IAM 实体，例如账户 111111111111 中的角色或用户。此用户现在有权在账户 999999999999 `CustomRoleName` 中扮演角色。

   该用户的凭据调用 AWS STS `AssumeRole` API 来获取会话凭证，这些凭据随后用于在账户 999999999999 中创建的直播中调用 Kinesis Video APIs Streams。

   ```
   aws sts assume-role --role-arn "arn:aws:iam::999999999999:role/CustomRoleName" --role-session-name "kvs-cross-account-assume-role"
   {
       "Credentials": {
           "AccessKeyId": "",
           "SecretAccessKey": "",
           "SessionToken": "",
           "Expiration": ""
       },
       "AssumedRoleUser": {
           "AssumedRoleId": "",
           "Arn": ""
       }
   }
   ```

1. 根据之前在环境中设置的访问密钥、私有密钥和会话凭证。

   ```
   set AWS_ACCESS_KEY_ID=
   set AWS_SECRET_ACCESS_KEY=
   set AWS_SESSION_TOKEN=
   ```

1. 运行 Kinesis Video APIs Streams 来描述并获取账户 999999999999 中直播的数据端点。

   ```
   aws kinesisvideo describe-stream --stream-arn "arn:aws:kinesisvideo:us-west-2:999999999999:stream/custom-stream-name/1613732218179"
   {
       "StreamInfo": {
           "StreamName": "custom-stream-name",
           "StreamARN": "arn:aws:kinesisvideo:us-west-2:999999999999:stream/custom-stream-name/1613732218179",
           "KmsKeyId": "arn:aws:kms:us-west-2:999999999999:alias/aws/kinesisvideo",
           "Version": "abcd",
           "Status": "ACTIVE",
           "CreationTime": "2018-02-19T10:56:58.179000+00:00",
           "DataRetentionInHours": 24
       }
   }
   
   aws kinesisvideo get-data-endpoint --stream-arn "arn:aws:kinesisvideo:us-west-2:999999999999:stream/custom-stream-name/1613732218179" --api-name "PUT_MEDIA"
   {
       "DataEndpoint": "https://s-b12345.kinesisvideo.us-west-2.amazonaws.com"
   }
   ```

有关授予跨账户访问权限的一般 step-by-step说明，请参阅[AWS 账户 使用 IAM 角色委派访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)。

## Kinesis Video Streams 的策略示例
<a name="how-iam-policies"></a>

以下示例策略演示了如何控制用户对 Kinesis Video Streams 的访问权限

**Example 1：允许用户从任何 Kinesis 视频流中获取数据**  
此策略允许用户或群组对任何 Kinesis 视频流执行`DescribeStream``GetDataEndpoint``GetMedia``ListStreams`、、、和`ListTagsForStream`操作。此策略适用于可从任何视频流获取数据的用户。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kinesisvideo:Describe*",
                "kinesisvideo:Get*",
                "kinesisvideo:List*"
            ],
            "Resource": "*"
        }
    ]
}
```

**Example 2：允许用户创建 Kinesis 视频流并向其写入数据**  
此策略允许用户或组执行 `CreateStream` 和 `PutMedia` 操作。此策略适用于可创建视频流并向该流发送数据的安保摄像头。  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kinesisvideo:CreateStream",
                "kinesisvideo:PutMedia"            
            ],
            "Resource": "*"
        }
    ]
}
```

**Example 3：允许用户完全访问所有 Kinesis Video Streams 资源**  
此策略允许用户或组对任何资源执行任何 Kinesis Video Streams 操作。此策略适用于管理员。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "kinesisvideo:*",
            "Resource": "*"
        }
    ]
}
```

**Example 4：允许用户向特定的 Kinesis 视频流写入数据**  
此策略允许用户或组将数据写入特定的视频流。此策略适用于可将数据发送到单个流的设备。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "kinesisvideo:PutMedia",
            "Resource": "arn:aws:kinesisvideo:us-west-2:123456789012:stream/your_stream/0123456789012"
        }
    ]
}
```

# 使用控制对 Kinesis Video Streams 资源的访问权限 AWS IoT
<a name="how-iot"></a>

本节介绍如何允许设备（例如摄像机）仅向一个特定的 Kinesis 视频流发送音频和视频数据。您可以使用 AWS IoT 证书提供商和 AWS Identity and Access Management (IAM) 角色来执行此操作。

设备可以使用 X.509 证书通过 TLS 双向身份验证协议 AWS IoT 进行连接。其他 AWS 服务 （例如 Kinesis Video Streams Video Streams）不支持基于证书的身份验证，但可以使用签名版本 4 格式的凭据 AWS AWS 进行调用。签名版本 4 算法通常要求呼叫者拥有访问密钥 ID 和私有访问密钥。 AWS IoT 有一个凭据提供程序，允许您使用内置的 X.509 证书作为唯一的设备身份来验证 AWS 请求（例如，对 Kinesis Video Streams Video Streams 的请求）。这样就无需在设备上存储访问密钥 ID 和私有访问密钥。

凭证提供者使用 X.509 证书对客户端（在本例中为要向视频流发送数据的摄像机上运行的 Kinesis Video Streams SDK）进行身份验证，并颁发临时的有限权限安全令牌。您可以使用该令牌对任何 AWS 请求（在本例中为对 Kinesis Video Streams 的调用）进行签名和身份验证。有关更多信息，请参阅[授权直接呼叫 AWS 服务。](https://docs.aws.amazon.com//iot/latest/developerguide/authorizing-direct-aws.html)

这种验证摄像机向 Kinesis Video Streams 发出的请求的方法要求您创建和配置 IAM 角色并为该角色附加相应的 IAM 策略， AWS IoT 以便证书提供者可以代表您担任该角色。

有关的更多信息 AWS IoT，请参阅[AWS IoT Core 文档](https://docs.aws.amazon.com/iot/?id=docs_gateway)。有关 IAM 的更多信息，请参阅 [AWS Identity and Access Management (IAM)](https://aws.amazon.com/iam/)。

**Topics**
+ [AWS IoT ThingName 作为直播名称](#how-iot-thingnamestreamname)
+ [AWS IoT CertificateId 作为直播名称](#how-iot-iotcertstreamname)
+ [使用 AWS IoT 凭据直播到硬编码的直播名称](#how-iot-hard-coded-stream)

## AWS IoT ThingName 作为直播名称
<a name="how-iot-thingnamestreamname"></a>

**Topics**
+ [步骤 1：创建 AWS IoT 事物类型和 AWS IoT 事物](#how-iot-create-thing-type)
+ [步骤 2：创建由代入的 IAM 角色 AWS IoT](#how-iot-add-iot-policy)
+ [步骤 3：创建和配置 X.509 证书](#how-iot-create-cert-keys)
+ [第 4 步：使用你的 Kinesis 视频流测试 AWS IoT 凭证](#how-iot-test-it)
+ [第 5 步：在摄像机的文件系统上部署 AWS IoT 证书和凭证，并将数据流式传输到视频流](#how-iot-deploy)

### 步骤 1：创建 AWS IoT 事物类型和 AWS IoT 事物
<a name="how-iot-create-thing-type"></a>

在中 AWS IoT，事物是特定设备或逻辑实体的表示。在本例中，一个 AWS IoT 东西代表你想要配置资源级访问控制的 Kinesis 视频流。要创建事物，首先必须创建 AWS IoT 事物类型。您可以使用 AWS IoT 事物类型来存储与相同事物类型关联的所有事物的通用描述和配置信息。

1. 以下示例命令可以创建事物类型 `kvs_example_camera`：

   ```
   aws --profile default iot create-thing-type --thing-type-name kvs_example_camera > iot-thing-type.json
   ```

1. 以下示例命令创建`kvs_example_camera_stream``kvs_example_camera`的事物类型为：

   ```
   aws --profile default  iot create-thing --thing-name kvs_example_camera_stream --thing-type-name kvs_example_camera > iot-thing.json
   ```

### 步骤 2：创建由代入的 IAM 角色 AWS IoT
<a name="how-iot-add-iot-policy"></a>

IAM 角色与用户类似，因为角色是一种 AWS 身份，其权限策略决定了该身份可以做什么和不能做什么 AWS。任何需要角色的人都可以代入该角色。当您代入角色时，它会为您提供角色会话的临时安全凭证。

在执行来自客户端的凭证授权请求时，可以代入您在此步骤中创建的角色 AWS IoT 来从安全令牌服务 (STS) 获取临时证书。在本例中，客户端是在你的相机上运行的 Kinesis Video Streams SDK。

执行以下步骤来创建和配置此 IAM 角色：

1. 创建 IAM 角色。

   以下示例命令可创建一个名为 `KVSCameraCertificateBasedIAMRole` 的 IAM 角色：

   ```
   aws --profile default iam create-role --role-name KVSCameraCertificateBasedIAMRole --assume-role-policy-document 'file://iam-policy-document.json' > iam-role.json
   ```

   您可以将以下信任策略 JSON 用于 `iam-policy-document.json`：

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

****  

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

------

1. 接下来，将权限策略附加到您之前创建的 IAM 角色。此权限策略允许对 AWS 资源进行选择性访问控制（支持的操作的子集）。在这种情况下， AWS 资源就是您希望摄像机发送数据的视频流。换句话说，所有配置步骤完成后，您的摄像机将只能向该视频流发送数据。

   ```
   aws --profile default iam put-role-policy --role-name KVSCameraCertificateBasedIAMRole --policy-name KVSCameraIAMPolicy --policy-document 'file://iam-permission-document.json' 
   ```

   您可以使用以下 IAM 策略 JSON 来实现`iam-permission-document.json`：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "kinesisvideo:DescribeStream",
                   "kinesisvideo:PutMedia",
                   "kinesisvideo:TagStream",
                   "kinesisvideo:GetDataEndpoint"
               ],
               "Resource": "arn:aws:kinesisvideo:*:*:stream/${credentials-iot:ThingName}/*"
           }
       ]
   }
   ```

------

   请注意，此政策仅授权对占位符`(${credentials-iot:ThingName})`指定的视频流（AWS 资源）执行指定操作。当 AWS IoT 凭证提供者在请求中发送视频流名称`ThingName`时，此占位符会取用 thin AWS IoT g 属性的值。

1. 接下来，为您的 IAM 角色创建角色别名。角色别名是一个指向 IAM 角色的备用数据模型。 AWS IoT 证书提供商请求必须包含角色别名，以指明要代入哪个 IAM 角色才能从 STS 获取临时证书。

   以下示例命令可以创建一个称作 `KvsCameraIoTRoleAlias` 的角色别名。

   ```
   aws --profile default iot create-role-alias --role-alias KvsCameraIoTRoleAlias --role-arn $(jq --raw-output '.Role.Arn' iam-role.json) --credential-duration-seconds 3600 > iot-role-alias.json
   ```

1. 现在，您可以使用角色别名创建 AWS IoT 允许使用证书代入角色的策略（附加证书后）。

   以下示例命令为 AWS IoT 被调用创建策略`KvsCameraIoTPolicy`。

   ```
   aws --profile default iot create-policy --policy-name KvsCameraIoTPolicy --policy-document 'file://iot-policy-document.json'
   ```

   您可以使用以下命令来创建`iot-policy-document.json`文档 JSON：

   ```
   cat > iot-policy-document.json <<EOF
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "iot:AssumeRoleWithCertificate"
               ],
               "Resource": "$(jq --raw-output '.roleAliasArn' iot-role-alias.json)"
           }
       ]
   }
   EOF
   ```

### 步骤 3：创建和配置 X.509 证书
<a name="how-iot-create-cert-keys"></a>

设备之间的通信（您的视频流）通过使用 X.509 证书受到保护。 AWS IoT 

1. 创建证书，您必须将之前创建的策略附加到 AWS IoT 该证书。

   ```
   aws --profile default iot create-keys-and-certificate --set-as-active --certificate-pem-outfile certificate.pem --public-key-outfile public.pem.key --private-key-outfile private.pem.key > certificate
   ```

1. 将 AWS IoT （之前`KvsCameraIoTPolicy`创建的）的策略附加到此证书。

   ```
   aws --profile default iot attach-policy --policy-name KvsCameraIoTPolicy --target $(jq --raw-output '.certificateArn' certificate)
   ```

1. 将你的 AWS IoT 东西 (`kvs_example_camera_stream`) 附加到你刚刚创建的证书上：

   ```
   aws --profile default iot attach-thing-principal --thing-name kvs_example_camera_stream --principal $(jq --raw-output '.certificateArn' certificate)
   ```

1. 要通过 AWS IoT 凭证提供商授权请求，您需要凭 AWS IoT 证端点，该端点是您的 AWS 账户 ID 所独有的。您可以使用以下命令来获取 AWS IoT 凭据端点。

   ```
   aws --profile default iot describe-endpoint --endpoint-type iot:CredentialProvider --output text > iot-credential-provider.txt
   ```

1. 除了之前创建的 X.509 证书外，您还必须拥有 CA 证书，才能通过 TLS 与后端服务建立信任。您可以使用以下命令获取 CA 证书：

   ```
   curl --silent 'https://www.amazontrust.com/repository/SFSRootCAG2.pem' --output cacert.pem
   ```

### 第 4 步：使用你的 Kinesis 视频流测试 AWS IoT 凭证
<a name="how-iot-test-it"></a>

现在，您可以测试到目前为止已设置的 AWS IoT 凭证。

1. 首先，创建一个要用于测试此配置的 Kinesis 视频流。
**重要**  
创建与您在上一步中创建 AWS IoT 的事物名称相同的视频流（`kvs_example_camera_stream`）。

   ```
   aws kinesisvideo create-stream --data-retention-in-hours 24 --stream-name kvs_example_camera_stream
   ```

1. 接下来，致电 AWS IoT 证书提供商以获取临时证书：

   ```
   curl --silent -H "x-amzn-iot-thingname:kvs_example_camera_stream" --cert certificate.pem --key private.pem.key https://IOT_GET_CREDENTIAL_ENDPOINT/role-aliases/KvsCameraIoTRoleAlias/credentials --cacert ./cacert.pem > token.json
   ```
**注意**  
你可以使用以下命令获取`IOT_GET_CREDENTIAL_ENDPOINT`：  

   ```
   IOT_GET_CREDENTIAL_ENDPOINT=`cat iot-credential-provider.txt`
   ```

   输出 JSON 包含`accessKey``secretKey`、和，你可以用它们来访问 Kinesis Video Streams。`sessionToken`

1. 在测试中，您可以使用这些凭据为`kvs_example_camera_stream`示例视频`DescribeStream`流调用 Kinesis Video Streams API。

   ```
   AWS_ACCESS_KEY_ID=$(jq --raw-output '.credentials.accessKeyId' token.json) AWS_SECRET_ACCESS_KEY=$(jq --raw-output '.credentials.secretAccessKey' token.json) AWS_SESSION_TOKEN=$(jq --raw-output '.credentials.sessionToken' token.json) aws kinesisvideo describe-stream --stream-name kvs_example_camera_stream
   ```

### 第 5 步：在摄像机的文件系统上部署 AWS IoT 证书和凭证，并将数据流式传输到视频流
<a name="how-iot-deploy"></a>

**注意**  
本节中的步骤描述了从正在使用 Kinesis 的摄像机向 Kinesis 视频流发送媒体。[使用 C\$1\$1 制作人库](producer-sdk-cpp.md)

1. 将之前步骤中生成的 X.509 证书、私钥和 CA 证书复制到相机的文件系统。指定这些文件的存储路径、角色别名以及用于运行`gst-launch-1.0`命令或示例应用程序的 AWS IoT 凭据端点。

1. 以下示例命令使用 AWS IoT 证书授权向 Kinesis Video Streams 发送视频：

   ```
   gst-launch-1.0 rtspsrc location=rtsp://YourCameraRtspUrl short-header=TRUE ! rtph264depay ! video/x-h264,format=avc,alignment=au ! h264parse ! kvssink stream-name="kvs_example_camera_stream" aws-region="YourAWSRegion" iot-certificate="iot-certificate,endpoint=credential-account-specific-prefix.credentials.iot.aws-region.amazonaws.com,cert-path=/path/to/certificate.pem,key-path=/path/to/private.pem.key,ca-path=/path/to/cacert.pem,role-aliases=KvsCameraIoTRoleAlias"
   ```

## AWS IoT CertificateId 作为直播名称
<a name="how-iot-iotcertstreamname"></a>

要通过某 AWS IoT 物来表示您的设备（例如您的摄像头），但授权不同的直播名称，则可以使用该 AWS IoT `certificateId`属性作为直播名称，并使用为直播提供 Kinesis Video Stream AWS IoT s 权限。完成此操作的步骤与前面概述的步骤类似，但有一些改动。
+ 按如下方式修改您的 IAM 角色 (`iam-permission-document.json`) 的权限策略：

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "kinesisvideo:DescribeStream",
                  "kinesisvideo:PutMedia",
                  "kinesisvideo:TagStream",
                  "kinesisvideo:GetDataEndpoint"
              ],
              "Resource": "arn:aws:kinesisvideo:*:*:stream/${credentials-iot:AwsCertificateId}/*" 
          }
      ]
  }
  ```

------
**注意**  
资源 ARN 将证书 ID 用作流名称的占位符。当您使用证书 ID 作为直播名称时，IAM 权限将起作用。从证书中获取证书 ID，这样您就可以在以下描述流 API 调用中将其用作直播名称。  

  ```
  export CERTIFICATE_ID=`cat certificate | jq --raw-output '.certificateId'`
  ```
+ 使用 Kinesis Video Streams describe-stream CLI 命令验证此更改：

  ```
  AWS_ACCESS_KEY_ID=$(jq --raw-output '.credentials.accessKeyId' token.json) AWS_SECRET_ACCESS_KEY=$(jq --raw-output '.credentials.secretAccessKey' token.json) AWS_SESSION_TOKEN=$(jq --raw-output '.credentials.sessionToken' token.json) aws kinesisvideo describe-stream --stream-name ${CERTIFICATE_ID}
  ```
+ 在 Kinesis Video Streams C AWS IoT \$1\$1 SDK [的示例应用程序中将](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/samples/kvs_gstreamer_sample.cpp)证书 ID 传递给证书提供者：

  ```
  credential_provider = make_unique<IotCertCredentialProvider>(iot_get_credential_endpoint,
          cert_path,
          private_key_path,
          role_alias,
          ca_cert_path,
          certificateId);
  ```
**注意**  
请注意，您要将传递`thingname`给 AWS IoT 凭证提供商。您可以使用`getenv`将 thingname 传递给演示应用程序，就像传递其他 AWS IoT 属性一样。运行示例应用程序时，将证书 ID 用作命令行参数中的流名称。

## 使用 AWS IoT 凭据直播到硬编码的直播名称
<a name="how-iot-hard-coded-stream"></a>

要通过某 AWS IoT 件事物展示你的设备（例如你的摄像头），但授权直播到特定的亚马逊 Kinesis 视频流，请使用向直播提供 Amazon Kinesis Video Streams 权限。 AWS IoT该过程与前面的章节类似，但有一些改动。

按如下方式修改您的 IAM 角色 (`iam-permission-document.json`) 的权限策略：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kinesisvideo:DescribeStream",
                "kinesisvideo:PutMedia",
                "kinesisvideo:TagStream",
                "kinesisvideo:GetDataEndpoint"
            ],
            "Resource": "arn:aws:kinesisvideo:*:*:stream/YourStreamName/*" 
        }
    ]
}
```

------

将前面步骤中生成的 X.509 证书、私钥和 CA 证书复制到相机的文件系统。

指定这些文件的存储路径、角色别名、 AWS IoT 事物名称以及用于运行`gst-launch-1.0`命令或示例应用程序的 AWS IoT 凭据端点。

以下示例命令使用 AWS IoT 证书授权将视频发送到 Amazon Kinesis Video Streams：

```
gst-launch-1.0 rtspsrc location=rtsp://YourCameraRtspUrl short-header=TRUE ! rtph264depay ! video/x-h264,format=avc,alignment=au ! h264parse ! kvssink stream-name="YourStreamName" aws-region="YourAWSRegion" iot-certificate="iot-certificate,endpoint=credential-account-specific-prefix.credentials.iot.aws-region.amazonaws.com,cert-path=/path/to/certificate.pem,key-path=/path/to/private.pem.key,ca-path=/path/to/cacert.pem,role-aliases=KvsCameraIoTRoleAlias,iot-thing-name=YourThingName"
```

# 亚马逊 Kinesis Video Streams 的合规性验证
<a name="akda-java-compliance"></a>

要了解是否属于特定合规计划的范围，请参阅AWS 服务 “[按合规计划划分的范围](https://aws.amazon.com/compliance/services-in-scope/)” ”，然后选择您感兴趣的合规计划。 AWS 服务 有关一般信息，请参阅[AWS 合规计划AWS](https://aws.amazon.com/compliance/programs/)。

您可以使用下载第三方审计报告 AWS Artifact。有关更多信息，请参阅中的 “[下载报告” 中的 “ AWS Artifact](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)。

您在使用 AWS 服务 时的合规责任取决于您的数据的敏感性、贵公司的合规目标以及适用的法律和法规。有关您在使用时的合规责任的更多信息 AWS 服务，请参阅[AWS 安全文档](https://docs.aws.amazon.com/security/)。

# 亚马逊 Kinesis Video Streams 的弹性
<a name="disaster-recovery-resiliency"></a>

 AWS 全球基础设施是围绕 AWS 区域和可用区构建的。 AWS 区域提供多个物理隔离和隔离的可用区，这些可用区通过低延迟、高吞吐量和高度冗余的网络相连。利用可用区，您可以设计和操作在可用区之间无中断地自动实现失效转移的应用程序和数据库。与传统的单个或多个数据中心基础架构相比，可用区具有更高的可用性、容错性和可扩展性。

有关 AWS 区域和可用区的更多信息，请参阅[AWS 全球基础设施](https://aws.amazon.com/about-aws/global-infrastructure/)。

# Kinesis Video Streams 中的基础设施安全
<a name="infrastructure-security"></a>

作为一项托管服务，Amazon Kinesis Video Streams 受 AWS [亚马逊网络服务：安全流程概述白皮书中描述的全球网络安全程序的](https://d0.awsstatic.com/whitepapers/Security/AWS_Security_Whitepaper.pdf)保护。

您可以使用 AWS 已发布的 API 调用通过网络访问 Kinesis Video Streams。客户端必须支持传输层安全性协议（TLS）1.2 或更高版本。客户端还必须支持具有完全向前保密（PFS）的密码套件，例如 Ephemeral Diffie-Hellman（DHE）或 Elliptic Curve Ephemeral Diffie-Hellman（ECDHE）。大多数现代系统（如 Java 7 及更高版本）都支持这些模式。

此外，必须使用访问密钥 ID 和与 IAM 委托人关联的私有访问密钥对请求进行签名。或者，您可以使用 [AWS Security Token Service](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html) (AWS STS) 生成临时安全凭证来对请求进行签名。

# Kinesis Video Streams 的安全最佳实践
<a name="security-best-practices"></a>

Amazon Kinesis Video Streams 提供了许多安全功能，供您在制定和实施自己的安全策略时考虑。以下最佳实践是一般指导原则，并不代表完整安全解决方案。这些最佳实践可能不适合环境或不满足环境要求，请将其视为有用的考虑因素而不是惯例。

有关远程设备的安全最佳实践，请参阅[设备代理的安全最佳实践](https://docs.aws.amazon.com/iot/latest/developerguide/device-defender-DetectMetricsMessagesBestPract.html)。

## 实施最低权限访问
<a name="security-best-practices-privileges"></a>

在授予权限时，您可以决定谁获得哪些 Kinesis Video Streams 资源的哪些权限。您可以对这些资源启用希望允许的特定操作。因此，您应仅授予执行任务所需的权限。实施最低权限访问对于减小安全风险以及可能由错误或恶意意图造成的影响至关重要。

例如，向 Kinesis Video Streams 发送数据的创建者仅需要 `PutMedia`、`GetStreamingEndpoint` 和 `DescribeStream`。请勿向创建者应用程序授予所有操作 (`*`) 或其他操作（例如 `GetMedia`）的权限。

有关更多信息，请参阅[什么是最低权限以及为什么需要它？](https://www.beyondtrust.com/blog/entry/what-is-least-privilege)

## 使用 IAM 角色
<a name="security-best-practices-roles"></a>

制作者和客户端应用程序必须具有有效的凭据才能访问 Kinesis Video Streams。您不能将 AWS 凭证直接存储在客户端应用程序或 Amazon S3 存储桶中。这些是长期证书，不会自动轮换，如果遭到泄露，可能会对业务产生重大影响。

相反，您应该使用 IAM 角色来管理您的制作者和客户端应用程序访问Kinesis Video Streams的临时证书。使用角色时，无需使用长期证书（例如用户名和密码或访问密钥）即可访问其他资源。

有关更多信息，请参阅 *IAM 用户指南*中的以下主题：
+ [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)
+ [针对角色的常见情形：用户、应用程序和服务](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios.html)

## CloudTrail 用于监控 API 调用
<a name="security-best-practices-cloudtrail"></a>

Kinesis Video Streams AWS CloudTrail与一项服务配合使用，可记录用户、角色或用户在 Kinesis Vid AWS 服务 eo Streams 中采取的操作。

您可以使用收集的信息 CloudTrail 来确定向 Kinesis Video Streams 发出的请求、发出请求的 IP 地址、谁发出了请求、何时发出请求以及其他详细信息。

有关更多信息，请参阅 [使用记录亚马逊 Kinesis Video Streams Video Streams API 调用 AWS CloudTrail](monitoring-cloudtrail.md)。