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

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

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

本节介绍如何允许设备(例如摄像机)仅向一个特定的 Kinesis 视频流发送音频和视频数据。你可以使用以下方法来做到这一点 AWS IoT 凭证提供商和 AWS Identity and Access Management (IAM) 角色。

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

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

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

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

AWS IoT ThingName 作为直播名称

步骤 1:创建一个 AWS IoT 事物类型和 AWS IoT thing

In 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
  2. 以下示例命令创建kvs_example_camera_streamkvs_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

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

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

要创建和配置此IAM角色,请执行以下步骤:

  1. 创建IAM角色。

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

    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角色。此权限策略允许对某项进行选择性访问控制(支持的操作的子集) AWS 资源。在这种情况下, AWS 资源是您希望摄像机发送数据的视频流。换句话说,所有配置步骤完成后,您的摄像机将只能向该视频流发送数据。

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

    您可以对 iam-permission-document .json 使用以下IAM策略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}/*" } ] }

    请注意,此政策仅授权对视频流执行指定操作 (AWS 资源),由占位符 ($ {credentials-iot:}) 指定。ThingName此占位符取值为 AWS IoT ThingName当 thing 属性时 AWS IoT 凭据提供者在请求中发送视频流名称。

  3. 接下来,为您的IAM角色创建角色别名。角色别名是指向IAM角色的替代数据模型。网络 ACL 和安全组都允许 (因此可到达您的实例) 的发起 ping 的 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
  4. 现在,您可以创建将启用的策略 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 证书

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

  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
  2. 附上保单 AWS IoT (之前KvsCameraIoTPolicy创建)到此证书。

    aws --profile default iot attach-policy --policy-name KvsCameraIoTPolicy --target $(jq --raw-output '.certificateArn' certificate)
  3. 附上你的 AWS IoT thing (kvs_example_camera_stream) 到你刚刚创建的证书:

    aws --profile default iot attach-thing-principal --thing-name kvs_example_camera_stream --principal $(jq --raw-output '.certificateArn' certificate)
  4. 要授权请求,请通过 AWS IoT 凭证提供商,你需要 AWS IoT 凭证端点,这是您独有的 AWS 账户 同义词。你可以使用以下命令获取 AWS 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 步:测试 AWS IoT 带有 Kinesis 视频流的凭证

现在你可以测试了 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
  2. 接下来,致电 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包含accessKeysecretKey、和,可用于访问 Kinesis Video Streams。sessionToken

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

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

注意

本节中的步骤描述了从正在使用 Kinesis 的摄像机向 Kinesis 视频流发送媒体。使用 C++ 制作人库

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

  2. 以下示例命令使用 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 作为直播名称

通过以下方式表示您的设备(例如您的相机) AWS IoT 东西,但是授权一个不同的直播名称,那么你可以使用 AWS IoT certificateId属性作为你的直播名称,并使用该直播提供 Kinesis Video Streams 权限 AWS IoT。 完成此操作的步骤与前面概述的步骤类似,但有一些改动。

  • 按如下方式修改您的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,这样您就可以在以下描述直播API调用中将其用作直播名称。

    export CERTIFICATE_ID=`cat certificate | jq --raw-output '.certificateId'`
  • 使用 Kinesis Video Streams desc CLI ribe-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 ${CERTIFICATE_ID}
  • 把它 certificateId 传递给 AWS IoT Kinesis Video Stream SDK s C++ 中示例应用程序中的凭据提供者:

    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 用于流式传输到硬编码流名称的凭据

通过以下方式表示您的设备(例如您的相机) AWS IoT 东西,但是授权直播到特定的亚马逊 Kinesis 视频流,请使用向直播提供亚马逊 Kinesis Video Streams 权限 AWS IoT。 该过程与前面的章节类似,但有一些改动。

按如下方式修改您的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/YourStreamName/*" } ] }

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

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

以下示例命令使用 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="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"