Controllo dell'accesso alle risorse Kinesis Video Streams utilizzandoAWS IoT - Amazon Kinesis Video Streams

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Controllo dell'accesso alle risorse Kinesis Video Streams utilizzandoAWS IoT

Questa sezione descrive come abilitare un dispositivo (ad esempio, una videocamera) per inviare dati audio/video solo a un determinato flusso video Kinesis. A tale scopo, è possibile utilizzare il provider di credenziali AWS IoT e un ruolo AWS Identity and Access Management (IAM).

I dispositivi possono usare certificati X.509 per connettersi ad AWS IoT tramite protocolli di autenticazione reciproca TLS. Altri servizi AWS (ad esempio, Kinesis Video Streams) non supportano l'autenticazione basata su certificati, ma possono essere chiamati tramite credenziali AWS in formato AWS Signature Version 4. L'algoritmo Signature Version 4 normalmente richiede all'intermediario di disporre di un ID chiave di accesso e di una chiave di accesso segreta. AWS IoT dispone di un provider di credenziali che consente di utilizzare il certificato X.509 integrato come identità univoca del dispositivo per autenticare le richieste AWS (ad esempio, le richieste a Kinesis Video Streams). Ciò elimina la necessità di archiviare un ID chiave di accesso e la chiave di accesso segreta sul dispositivo.

Il provider di credenziali autentica un client (in questo caso, un SDK Kinesis Video Streams in esecuzione sulla videocamera da cui si desidera inviare dati a un flusso video) utilizzando un certificato X.509 ed emette un token di sicurezza temporaneo con privilegi limitati. Il token può essere utilizzato per firmare e autenticare qualsiasi richiesta AWS (in questo caso, una chiamata a Kinesis Video Streams). Per ulteriori informazioni, consulta Autorizzazione di chiamate dirette ai servizi AWS.

Questa modalità di autenticazione delle richieste della fotocamera a Kinesis Video Streams necessita della configurazione di un ruolo IAM e di collegarvi policy IAM appropriate, in modo che il fornitore di credenziali IoT possa assumere il ruolo per conto dell'utente.

Per ulteriori informazioni su AWS IoT, consulta la documentazione di AWS IoT Core. Per ulteriori informazioni su IAM, consulta AWS Identity and Access Management (IAM).

IoT ThingName come nome flusso

Fase 1: Crea un tipo di oggetto IoT e un oggetto IoT

Un oggetto è una rappresentazione di un'entità logica o un di dispositivo specifico. In questo caso, un oggetto IoT rappresenta il flusso video Kinesis per il quale desideri configurare il controllo degli accessi a livello di risorsa. Per creare un oggetto, devi prima creare un tipo di oggetto IoT. I tipi di oggetti permettono di archiviare la descrizione e le informazioni di configurazione comuni a tutti gli oggetti associati allo stesso tipo.

  1. Il comando di esempio seguente crea un tipo di oggetto kvs_example_camera:

    aws --profile default iot create-thing-type --thing-type-name kvs_example_camera > iot-thing-type.json
  2. Questo comando di esempio crea l'oggetto kvs_example_camera_stream del tipo di oggetto kvs_example_camera:

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

Fase 2: Crea un ruolo IAM che deve essere assunto dall'IoT

I ruoli IAM sono simili agli utenti IAM, in quanto un ruolo è un'identità AWS con policy di autorizzazioni che determinano ciò che l'identità può e non può fare in AWS. Un ruolo può essere assunto da chiunque ne abbia bisogno. Tuttavia, quando assumi un ruolo, vengono fornite le credenziali di sicurezza provvisorie per la sessione del ruolo.

Il ruolo creato in questa fase può essere assunto da IoT per ottenere credenziali temporanee dal servizio token di sicurezza (STS) durante l'esecuzione di richieste di autorizzazione delle credenziali dal client. In questo caso, il client è l'SDK Kinesis Video Streams in esecuzione sulla fotocamera.

Eseguire la procedura seguente per creare e configurare questo ruolo IAM:

  1. Creare un ruolo IAM.

    Il comando di esempio seguente crea un ruolo IAM denominato KVSCameraCertificateBasedIAMRole:

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

    Puoi utilizzare il seguente JSON della policy di attendibilità per iam-policy-document.json:

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":"credentials.iot.amazonaws.com" }, "Action":"sts:AssumeRole" } ] }
  2. Quindi, devi collegare una policy di autorizzazione al ruolo IAM creato in precedenza. Questa policy di autorizzazione consente il controllo selettivo degli accessi (un sottoinsieme di operazioni supportate) per una risorsa AWS. In questo caso, la risorsa AWS è il flusso video a cui desideri che la fotocamera invii i dati. In altre parole, una volta completate tutte le fasi di configurazione, questa telecamera sarà in grado di inviare dati solo a questo flusso video.

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

    Puoi utilizzare la seguente policy JSON IAM per 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}/*" } ] }

    Questa policy autorizza le operazioni specificate solo su un flusso video (risorsa AWS) specificato dal segnaposto (${credentials-iot:ThingName}). Questo segnaposto assume il valore dell'attributo dell'oggetto IoTThingNamequando il provider di credenziali IoT invia il nome del flusso video nella richiesta.

  3. Quindi, crea un alias ruolo per il ruolo IAM. L'alias del ruolo è un modello di dati alternativo che punta al ruolo IAM. Una richiesta di provider di credenziali IoT deve includere un alias-ruolo per indicare quale ruolo IAM assumere per ottenere le credenziali temporanee da STS.

    Il comando di esempio seguente crea un alias del ruolo denominato 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. Ora puoi creare la policy che consentirà a IoT di assumere il ruolo con il certificato (una volta collegato) utilizzando l'alias del ruolo.

    Il comando di esempio seguente crea una policy per IoT denominata KvsCameraIoTPolicy.

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

    Puoi utilizzare il comando seguente per creare il JSON del documento iot-policy-document.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

Fase 3: Creare e configurare il certificato X.509

La comunicazione tra un dispositivo (il flusso video) e AWS IoT è protetta tramite l'uso di certificati X.509.

  1. Crea il certificato a cui devi collegare la policy per IoT creata in precedenza.

    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. Collegare la policy per IoT (KvsCameraIoTPolicy creata in precedenza) a questo certificato.

    aws --profile default iot attach-policy --policy-name KvsCameraIoTPolicy --target $(jq --raw-output '.certificateArn' certificate)
  3. Collegare l'oggetto IoT (kvs_example_camera_stream) al certificato appena creato:

    aws --profile default iot attach-thing-principal --thing-name kvs_example_camera_stream --principal $(jq --raw-output '.certificateArn' certificate)
  4. Per autorizzare le richieste tramite il provider di credenziali IoT, è necessario l'endpoint delle credenziali IoT univoco per l'ID dell'account AWS. Puoi utilizzare il comando seguente per ottenere l'endpoint delle credenziali IoT.

    aws --profile default iot describe-endpoint --endpoint-type iot:CredentialProvider --output text > iot-credential-provider.txt
  5. Oltre al certificato X.509 creato sopra, è necessario disporre anche di un certificato CA per stabilire l'attendibilità con il servizio di back-end tramite TLS. Puoi ottenere il certificato CA utilizzando il comando seguente:

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

Fase 4: Verifica delle credenziali IoT con Kinesis Video Streams

Ora puoi testare le credenziali IoT che hai configurato fino a questo momento.

  1. In primo luogo, creare un Kinesis Video Stream con cui testare questa configurazione.

    Importante

    Crea un flusso video con un nome identico al nome dell'oggetto IoT creato nella fase precedente (kvs_example_camera_stream).

    aws kinesisvideo create-stream --data-retention-in-hours 24 --stream-name kvs_example_camera_stream
  2. Quindi, chiamare il provider di credenziali IoT per ottenere le credenziali temporanee:

    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
    Nota

    È possibile utilizzare il comando seguente per ottenere IOT_GET_CREDENTIAL_ENDPOINT:

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

    L'output JSON contiene accessKey, secretKey e sessionToken che è possibile utilizzare per accedere a Kinesis Video Streams.

  3. Ora, per il test, puoi utilizzare queste credenziali per richiamare i Kinesis Video Streams DescribeStream API per il campionekvs_example_camera_streamflusso video.

    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

Fase 5: Distribuzione di certificati IoT e credenziali sul file system della fotocamera e streaming di dati nel flusso video

Nota

Le fasi illustrate in questa sezione descrivono l'invio di contenuti multimediali a un flusso video Kinesis da una videocamera che utilizza C++ Producer Library.

  1. Copiare il certificato X.509, la chiave privata e il certificato CA generato nelle fasi precedenti nel file system della telecamera. È necessario specificare i percorsi in cui vengono archiviati questi file, il nome alias del ruolo e l'endpoint delle credenziali IOT per eseguire il comando gst-launch-1.0 o l'applicazione di esempio.

  2. Il comando di esempio seguente utilizza l'autorizzazione del certificato IoT per inviare video a 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" 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"

IoT CertificateId come nome flusso

Se si desidera rappresentare il dispositivo (ad esempio la fotocamera) tramite un oggetto IoT ma autorizzare un nome di flusso diverso, è possibile utilizzare l'attributo IoT certifiacateId come nome del flusso e fornire a Kinesis Video Streams le autorizzazioni per il flusso che utilizza IoT. Le fasi per eseguire questa operazione sono simili a quelle descritte in precedenza, con alcune modifiche.

  • Modificare le policy di autorizzazioni nel ruolo IAM (iam-permission-document.json) come segue:

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

    L'ARN risorsa utilizza l'ID certificato come segnaposto per il nome del flusso. L'autorizzazione IAM funzionerà quando si utilizza l'ID certificato come nome del flusso. Ottenere l'ID dal certificato in modo che si possa utilizzarlo come nome del flusso nella seguente chiamata API di descrizione del flusso.

    export CERTIFICATE_ID=`cat certificate | jq --raw-output '.certificateId'jq --raw-output '.certificateId'`
  • Verificare questa modifica utilizzando il comando CLI describe-stream di 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 ${CERTIFICATE_ID}
  • Inviare certificatId al provider di credenziali IoT nell'applicazione di esempio nell'SDK C++ di Kinesis Video Streams:

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

    Si noti che si sta inviando thingname al provider di credenziali IoT. È possibile utilizzare getenv per passare thingname all'applicazione demo in modo simile all'invio degli altri attributi IoT. Utilizzare l'ID certificato come nome del flusso nei parametri della riga di comando quando si esegue l'applicazione di esempio.