使用控制对 Kinesis Video Streams 资源的访问权限Amazon IoT - Amazon Kinesis Video Streams
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用控制对 Kinesis Video Streams 资源的访问权限Amazon IoT

本节介绍如何使设备(例如摄像头)仅向一个特定的 Kinesis 视频流发送音频和视频数据。您可以使用以下方法执行此操作Amazon IoT凭证提供者和Amazon Identity and Access Management(IAM) 角色。

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

凭证提供者使用 X.509 证书对客户端(在本例中为在摄像机上运行的 Kinesis Video Streams SDK)进行身份验证,并颁发临时的有限权限安全令牌。您可以使用令牌对任何内容进行签名和验证Amazon请求(在本例中为调用 Kinesis 视频流)。有关更多信息,请参见授权直接呼叫Amazon服务

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

有关 Amazon IoT 的更多信息,请参阅 Amazon IoT Core 文档。有关 IAM 的更多信息,请参阅 Amazon Identity and Access Management (IAM)

物联网ThingName作为直播名称

步骤 1:创建 IoT 事物类型和 IoT 事物

在 IoT 中,事物是特定设备或逻辑实体的表示形式。在这种情况下,物联网事物代表您要配置资源级访问控制的 Kinesis 视频流。要创建事物,首先,您必须创建一个 IoT 事物类型。您可以使用 IoT 事物类型存储与同一事物类型相关的所有事物共有的描述和配置信息。

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

    aws --profile default iot create-thing-type --thing-type-name kvs_example_camera > iot-thing-type.json
  2. 此示例命令创建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:创建由 IoT 担任的 IAM 角色

IAM 角色与用户类似,因为角色是Amazon使用权限策略来确定身份在其中可以做什么和不能做什么Amazon。任何需要角色的人都可以代入该角色。当您代入角色时,它会为您提供角色会话的临时安全凭证。

在执行来自客户端的证书授权请求时,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

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "credentials.iot.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. 接下来,将权限策略附加到您之前创建的 IAM 角色。此权限策略允许对以下对象进行选择性访问控制(支持的操作子集)Amazon资源。在这种情况下,Amazon资源是你希望你的摄像机发送数据的视频流。换句话说,所有配置步骤完成后,您的摄像机将只能向该视频流发送数据。

    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:

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

    请注意,此政策仅授权对视频流进行指定操作(Amazon资源) 由占位符 ($ {credentials-iot:ThingName})。这个占位符取代 IoT 事物属性的值ThingName当 IoT 凭证提供商在请求中发送视频流名称时。

  3. 接下来,为您的 IAM 角色创建一个角色别名。角色别名是一个指向 IAM 角色的备用数据模型。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
  4. 现在,您可以创建策略,让 IoT 使用该角色别名代入具有证书(证书附加后)的角色。

    以下示例命令可以创建一个名为 KvsCameraIoTPolicy 的 IoT 策略。

    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:Connect" ], "Resource": "$(jq --raw-output '.roleAliasArn' iot-role-alias.json)" }, { "Effect": "Allow", "Action": [ "iot:AssumeRoleWithCertificate" ], "Resource": "$(jq --raw-output '.roleAliasArn' iot-role-alias.json)" } ] } EOF

步骤 3:创建和配置 X.509 证书

设备(您的视频流)与设备之间的通信Amazon IoT通过使用 X.509 证书进行保护。

  1. 创建证书,您必须将之前创建的 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
  2. 附上 IoT 政策 (KvsCameraIoTPolicy之前创建的)到这个证书。

    aws --profile default iot attach-policy --policy-name KvsCameraIoTPolicy --target $(jq --raw-output '.certificateArn' certificate)
  3. 将您的 IoT 事物 (kvs_example_camera_stream) 附加到刚才创建的证书:

    aws --profile default iot attach-thing-principal --thing-name kvs_example_camera_stream --principal $(jq --raw-output '.certificateArn' certificate)
  4. 要通过 IoT 凭证提供商批准请求,您需要 IoT 凭证终端节点,这是您独有的Amazon Web Services 账户ID。您可以使用以下命令获取 IoT 凭证终端节点。

    aws --profile default iot describe-endpoint --endpoint-type iot:CredentialProvider --output text > iot-credential-provider.txt
  5. 除了先前创建的 X.509 证书外,您还必须拥有 CA 证书才能通过 TLS 与后端服务建立信任。您可以使用以下命令获取 CA 证书:

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

第 4 步:使用 Kinesis 视频流测试物联网证书

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

  1. 首先,创建一个要用于测试此配置的 Kinesis 视频流。

    重要

    使用与上一步中创建的 IoT 事物名称(kvs_example_camera_stream)相同的名称创建视频流。

    aws kinesisvideo create-stream --data-retention-in-hours 24 --stream-name kvs_example_camera_stream
  2. 接下来,调用 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 和 SessionToken,您可以使用它们来访问 Kinesis 视频流。

  3. 在测试中,您可以使用这些凭据调用 Kinesis 视频直播DescribeStream示例的 APIkvs_example_camera_stream视频直播。

    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 步:在摄像机的文件系统上部署 IoT 证书和凭证,并将数据流式传输到视频流

注意

本节中的步骤描述了使用摄像机将媒体发送到 Kinesis 视频流C++ 制作者库

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

  2. 以下示例命令使用 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=iot-credential-endpoint-host-name,cert-path=/path/to/certificate.pem,key-path=/path/to/private.pem.key,ca-path=/path/to/cacert.pem,role-aliases=KvsCameraIoTRoleAlias"

物联网CertificateId作为直播名称

要通过 IoT 事物表示您的设备(例如您的摄像头),但要授权不同的直播名称,则可以使用 IoTcertifiacateId属性为您的直播名称,并使用 IoT 为直播提供 Kinesis Video Streams 权限。完成此操作的步骤与前面概述的步骤类似,但有一些改动。

  • 修改您的 IAM 角色的权限策略 (iam-permission-document.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,以便在以下 descripe stream API 调用中将其用作直播名称。

    export CERTIFICATE_ID=`cat certificate | jq --raw-output '.certificateId'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}
  • 将 certifateID 传递给 IoT 凭证提供商示例应用程序在 Kinesis 视频流 C++ SDK 中:

    credential_provider = make_unique<IotCertCredentialProvider>(iot_get_credential_endpoint, cert_path, private_key_path, role_alias, ca_cert_path, certificateId);
    注意

    请注意,您正在将 thingname 传递给 IoT 凭证提供商。您可以使用 getenv 将 thingname 传递给演示应用程序,这与传递其他 IoT 属性类似。运行示例应用程序时,将证书 ID 用作命令行参数中的流名称。