使用控制对 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)不支持基于证书的身份验证,但可以使用签名版本 4 格式的凭据 Amazon Amazon 进行调用。签名版本 4 算法通常要求呼叫者拥有访问密钥 ID 和私有访问密钥。 Amazon IoT 有一个凭据提供程序,允许您使用内置的 X.509 证书作为唯一的设备身份来验证 Amazon 请求(例如,对 Kinesis Video Streams Video Streams 的请求)。这样就无需在设备上存储访问密钥 ID 和私有访问密钥。

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

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

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

Amazon IoT ThingName 作为直播名称

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

在中 Amazon IoT,事物是特定设备或逻辑实体的表示。在本例中,一个 Amazon IoT 东西代表你想要配置资源级访问控制的 Kinesis 视频流。要创建事物,首先必须创建 Amazon IoT 事物类型。您可以使用 Amazon 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 角色 Amazon IoT

IAM 角色与用户类似,因为角色是一种 Amazon 身份,其权限策略决定了该身份可以做什么和不能做什么 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-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}/*" } ] }

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

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

    以下示例命令为 Amazon 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 证书

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

  1. 创建证书,您必须将之前创建的策略附加到 Amazon 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. 将 Amazon IoT (之前KvsCameraIoTPolicy创建的)的策略附加到此证书。

    aws --profile default iot attach-policy --policy-name KvsCameraIoTPolicy --target $(jq --raw-output '.certificateArn' certificate)
  3. 将你的 Amazon 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. 要通过 Amazon IoT 凭证提供商授权请求,您需要凭 Amazon IoT 证端点,该端点是您的 Amazon Web Services 账户 ID 所独有的。您可以使用以下命令来获取 Amazon 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 视频流测试 Amazon IoT 凭证

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

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

    重要

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

    aws kinesisvideo create-stream --data-retention-in-hours 24 --stream-name kvs_example_camera_stream
  2. 接下来,致电 Amazon 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 包含访问密钥、密钥和会话令牌,你可以用它们来访问 Kinesis Video Streams。

  3. 在测试中,您可以使用这些凭据为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 步:在摄像机的文件系统上部署 Amazon IoT 证书和凭证,并将数据流式传输到视频流

注意

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

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

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

Amazon IoT CertificateId 作为直播名称

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

  • 按如下方式修改您的 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 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 Amazon IoT ++ SDK 的示例应用程序中将证书 ID 传递给凭证提供者:

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

    请注意,您要将 thingname 传递给 Amazon IoT 凭证提供商。你可以使用 getenv 将 thingname 传递给演示应用程序,就像传递其他属性一样。 Amazon IoT 运行示例应用程序时,将证书 ID 用作命令行参数中的流名称。

使用 Amazon IoT 凭据直播到硬编码的直播名称

要通过某 Amazon IoT 件事物展示你的设备(例如你的摄像头),但授权直播到特定的亚马逊 Kinesis 视频流,请使用向直播提供 Amazon Kinesis Video Streams 权限。 Amazon 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 证书复制到相机的文件系统。

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

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