사용자 지정 권한 부여자 생성 및 관리 - AWS IoT Core

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

사용자 지정 권한 부여자 생성 및 관리

AWS IoT Core 권한 부여자 리소스를 사용하여 사용자 지정 인증 및 권한 부여 체계를 구현합니다. 각 권한 부여자는 다음과 같은 구성 요소로 이루어집니다.

  • 이름: 권한 부여자를 식별하는 고유한 사용자 정의 문자열입니다.

  • ARN Lambda 함수: 권한 부여 및 인증 논리를 구현하는 Lambda 함수의 Amazon 리소스 이름(ARN)입니다. 

  • 토큰 키 이름: 서명 유효성 검사를 수행하기 위해 HTTP 헤더, 쿼리 파라미터 또는 MQTT CONNECT 사용자 이름에서 토큰을 추출하는 데 사용되는 키 이름입니다. 권한 부여자에서 서명이 활성화된 경우 이 값이 필요합니다.

  • 서명 비활성화 플래그(선택 사항): 자격 증명에서 서명 요구 사항을 사용하지 않도록 설정할지 여부를 지정하는 부울 값입니다. 이 기능은 MQTT 사용자 이름 및 암호를 사용하는 인증 스키마와 같이 자격 증명에 서명하는 것이 의미가 없는 시나리오에 유용합니다. 기본값은 false(으)로 설정되어 있으므로 기본적으로 서명이 활성화됩니다.

  • 토큰 서명 공개 키: AWS IoT Core 이(가) 토큰 서명의 유효성을 검사하는 데 사용하는 퍼블릭 키입니다. 최소 길이는 2,048비트입니다. 권한 부여자에서 서명이 활성화된 경우 이 값이 필요합니다. 

Lambda는 Lambda 함수가 실행되는 횟수와 함수의 코드가 실행되는 데 걸리는 시간에 대해 요금을 청구합니다. Lambda 요금에 대한 자세한 내용은 Lambda 요금을 참조하세요. Lambda 함수에 대한 자세한 내용은 Lambda 개발자 가이드를 참조하세요.

참고

서명을 활성화한 상태로 두면 인식할 수 없는 클라이언트가 Lambda를 과도하게 트리거하는 것을 방지할 수 있습니다. 권한 부여자의 로그인을 비활성화하기 전에 이 점을 고려하세요.

참고

사용자 지정 권한 부여자에 대한 Lambda 함수 제한 시간은 5초입니다.

Lambda 함수 정의

권한 부여자를 AWS IoT Core 호출하면 다음 JSON 객체를 포함하는 이벤트와 함께 권한 부여자와 연결된 Lambda가 트리거됩니다. 예제 JSON 객체에는 가능한 모든 필드가 포함되어 있습니다. 연결 요청과 관련이 없는 필드는 포함되지 않습니다.

{     "token" :"aToken",     "signatureVerified": Boolean, // Indicates whether the device gateway has validated the signature.     "protocols": ["tls", "http", "mqtt"], // Indicates which protocols to expect for the request.     "protocolData": {         "tls" : {             "serverName": "serverName" // The server name indication (SNI) host_name string.         },         "http": {             "headers": {                 "#{name}": "#{value}"             },             "queryString": "?#{name}=#{value}"         },         "mqtt": {             "username": "myUserName",             "password": "myPassword", // A base64-encoded string.             "clientId": "myClientId" // Included in the event only when the device sends the value.         }     },     "connectionMetadata": {         "id": UUID // The connection ID. You can use this for logging.     }, }

Lambda 함수는 이 정보를 사용하여 들어오는 연결을 인증하고 연결에 허용되는 작업을 결정해야 합니다. 함수는 다음 값을 포함하는 응답을 전송해야 합니다.

  • isAuthenticated: 요청 인증 여부를 나타내는 부울 값입니다.

  • principalId: 사용자 지정 권한 부여 요청에서 전송되는 토큰의 식별자 역할을 하는 영숫자 문자열입니다. 값은 1~128자의 영숫자 문자열이어야 하며 정규식(regex) 패턴 ([a-zA-Z0-9]){1,128}과 일치해야 합니다. 영숫자가 아닌 특수 문자는 in과 함께 사용할 수 없습니다. principalId AWS IoT Core에 영숫자가 아닌 특수 문자를 사용할 수 있는 경우 다른 AWS 서비스 설명서를 참조하십시오. principalId

  • policyDocuments: JSON 형식의 AWS IoT Core 정책 문서 목록 정책 생성에 대한 자세한 내용은 을 참조하십시오. AWS IoT Core AWS IoT Core 정책 정책 문서의 최대 수는 10개의 정책 문서입니다. 각 정책 문서는 최대 2,048자를 포함할 수 있습니다.

  • disconnectAfterInSeconds: AWS IoT Core 게이트웨이에 대한 연결의 최대 지속 시간(초)을 지정하는 정수입니다. 최소값은 300초이고 최대값은 86,400초입니다. 기본값은 86,400입니다.

    참고

    disconnectAfterInSeconds(Lambda 함수에서 반환되는) 의 값은 연결이 설정될 때 설정됩니다. 후속 정책 새로 고침 Lambda 호출 중에는 이 값을 수정할 수 없습니다.

  • refreshAfterInSeconds: 정책 새로 고침 사이의 간격을 지정하는 정수입니다. 이 간격이 경과하면 AWS IoT Core 은(는) Lambda 함수를 호출하여 정책 새로 고침을 허용합니다. 최소값은 300초이고 최대값은 86,400초입니다.

 다음 JSON 객체에는 Lambda 함수가 전송할 수 있는 응답의 예가 들어 있습니다.

{ "isAuthenticated":true, //A Boolean that determines whether client can connect. "principalId": "xxxxxxxx",  //A string that identifies the connection in logs. "disconnectAfterInSeconds": 86400,  "refreshAfterInSeconds": 300,   "policyDocuments": [       {         "Version": "2012-10-17",         "Statement": [            {               "Action": "iot:Publish",               "Effect": "Allow",               "Resource": "arn:aws:iot:us-east-1:<your_aws_account_id>:topic/customauthtesting"             }          ]        }     ] }

policyDocument값에는 유효한 AWS IoT Core 정책 문서가 포함되어야 합니다. AWS IoT Core 정책에 대한 자세한 내용은 을 참조하십시오AWS IoT Core 정책. TLS를 통한 MQTT 및 WebSockets 연결을 통한 MQTT에서는 필드 값에 지정된 간격 동안 이 정책을 AWS IoT Core 캐시합니다. refreshAfterInSeconds HTTP 연결의 경우 디바이스가 HTTP 지속 연결(HTTP 연결 유지 또는 HTTP 연결 재사용이라고도 함)을 사용하지 않는 한 모든 권한 부여 요청에 대해 Lambda 함수가 호출됩니다. 권한 부여자를 구성할 때 캐싱을 사용하도록 선택할 수 있습니다. 이 기간 동안 Lambda 함수를 다시 트리거하지 않고 이 캐시된 정책에 대해 설정된 연결의 작업을 AWS IoT Core 승인합니다. 사용자 지정 인증 중에 장애가 발생하면 연결이 종료됩니다. AWS IoT Core AWS IoT Core 또한 매개변수에 지정된 값보다 오랫동안 열려 있는 경우 연결이 종료됩니다. disconnectAfterInSeconds

다음은 JavaScript MQTT Connect 메시지에서 값이 test 인 비밀번호를 찾고 myClientName 이름이 지정된 클라이언트에 연결할 AWS IoT Core 권한을 부여하는 정책을 반환하는 샘플 Node.js Lambda 함수입니다. 예상된 암호를 찾지 못하면 이 두 작업을 거부하는 정책을 반환합니다.

// A simple Lambda function for an authorizer. It demonstrates // how to parse an MQTT password and generate a response. exports.handler = function(event, context, callback) {     var uname = event.protocolData.mqtt.username;     var pwd = event.protocolData.mqtt.password;     var buff = new Buffer(pwd, 'base64');     var passwd = buff.toString('ascii');     switch (passwd) {         case 'test':             callback(null, generateAuthResponse(passwd, 'Allow')); break;         default:             callback(null, generateAuthResponse(passwd, 'Deny'));       } }; // Helper function to generate the authorization response. var generateAuthResponse = function(token, effect) { var authResponse = {}; authResponse.isAuthenticated = true; authResponse.principalId = 'TEST123'; var policyDocument = {}; policyDocument.Version = '2012-10-17'; policyDocument.Statement = []; var publishStatement = {}; var connectStatement = {}; connectStatement.Action = ["iot:Connect"]; connectStatement.Effect = effect; connectStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:client/myClientName"]; publishStatement.Action = ["iot:Publish"]; publishStatement.Effect = effect; publishStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"]; policyDocument.Statement[0] = connectStatement; policyDocument.Statement[1] = publishStatement; authResponse.policyDocuments = [policyDocument]; authResponse.disconnectAfterInSeconds = 3600; authResponse.refreshAfterInSeconds = 300; return authResponse; }

앞의 Lambda 함수는 MQTT Connect 메시지에서 test의 예상 암호를 수신하면 다음 JSON 값을 반환합니다. passwordprincipalId 속성의 값은 MQTT Connect 메시지의 값이 됩니다.

{ "password": "password", "isAuthenticated": true, "principalId": "principalId", "policyDocuments": [ { "Version": "2012-10-17", "Statement": [ { "Action": "iot:Connect", "Effect": "Allow", "Resource": "*" }, { "Action": "iot:Publish", "Effect": "Allow", "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}" }, { "Action": "iot:Subscribe", "Effect": "Allow", "Resource": "arn:aws:iot:region:accountId:topicfilter/telemetry/${iot:ClientId}" }, { "Action": "iot:Receive", "Effect": "Allow", "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}" } ] } ], "disconnectAfterInSeconds": 3600, "refreshAfterInSeconds": 300 }

권한 부여자 생성

API를 사용하여 권한 부여자를 생성할 수 있습니다. CreateAuthorizer 다음 예제는 명령에 대해 설명합니다.

aws iot create-authorizer --authorizer-name MyAuthorizer --authorizer-function-arn arn:aws:lambda:us-west-2:<account_id>:function:MyAuthorizerFunction  //The ARN of the Lambda function. [--token-key-name MyAuthorizerToken //The key used to extract the token from headers. [--token-signing-public-keys FirstKey= "-----BEGIN PUBLIC KEY-----   [...insert your public key here...]   -----END PUBLIC KEY-----" [--status ACTIVE] [--tags <value>] [--signing-disabled | --no-signing-disabled]

signing-disabled 파라미터를 사용하여 권한 부여자를 호출할 때마다 서명 유효성 검사를 옵트아웃합니다. 필요한 경우가 아니면 서명을 비활성화하지 않는 것이 좋습니다. 서명 유효성 검사는 알 수 없는 디바이스에서 Lambda 함수를 과도하게 호출하지 않도록 보호합니다. 생성한 후에는 권한 부여자의 signing-disabled 상태를 업데이트 할 수 없습니다. 이 동작을 변경하려면 signing-disabled 파라미터에 대해 또 다른 값의 사용자 지정 권한 부여자를 생성해야 합니다.

tokenKeyNametokenSigningPublicKeys 파라미터의 값은 서명을 사용하지 않도록 설정한 경우 선택 사항입니다. 서명이 활성화된 경우 필수 값입니다.

Lambda 함수와 사용자 지정 권한 부여자를 생성한 후에는 사용자를 대신하여 함수를 호출할 수 있는 권한을 서비스에 명시적으로 AWS IoT Core 부여해야 합니다. 다음 명령을 사용하여 이 작업을 수행할 수 있습니다.

aws lambda add-permission --function-name <lambda_function_name> --principal iot.amazonaws.com --source-arn <authorizer_arn> --statement-id Id-123 --action "lambda:InvokeFunction"

권한 부여자 테스트

TestInvokeAuthorizer API를 사용하여 권한 부여자의 호출 및 반환 값을 테스트할 수 있습니다. 이 API를 사용하면 프로토콜 메타데이터를 지정하고 권한 부여자의 서명 검증을 테스트할 수 있습니다.  

다음 탭은 를 사용하여 권한 부여자를 AWS CLI 테스트하는 방법을 보여줍니다.

Unix-like
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER \ --token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
Windows CMD
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ^ --token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
Windows PowerShell
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ` --token TOKEN_VALUE --token-signature TOKEN_SIGNATURE

token-signature 파라미터의 값은 서명된 토큰입니다. 이 값을 얻는 방법을 알아보려면 토큰에 서명하기 단원을 참조하세요.

권한 부여자가 사용자 이름과 암호를 얻은 경우 --mqtt-context 파라미터를 사용하여 이 정보를 전달할 수 있습니다. 다음 탭은 TestInvokeAuthorizer API를 사용하여 사용자 이름, 암호 및 클라이언트 이름이 포함된 JSON 객체를 사용자 지정 권한 부여자에게 전송하는 방법을 보여줍니다.

Unix-like
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER \ --mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
Windows CMD
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ^ --mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
Windows PowerShell
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ` --mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'

암호는 base64 인코딩해야 합니다. 다음 예제에서는 Unix 계열 환경에서 암호를 인코딩하는 방법을 보여 줍니다.

echo -n PASSWORD | base64

사용자 지정 권한 부여자 관리

다음 API를 사용하여 권한 부여자를 관리할 수 있습니다.

  • ListAuthorizers: 계정의 모든 승인자를 표시합니다.

  • DescribeAuthorizer: 지정된 권한 부여자의 속성을 표시합니다. 이러한 값에는 생성 날짜, 마지막 수정 날짜 및 기타 속성이 포함됩니다.

  • SetDefault권한 부여자: 데이터 엔드포인트의 기본 권한 부여자를 지정합니다. AWS IoT Core AWS IoT Core 기기가 AWS IoT Core 자격 증명을 전달하지 않고 승인자를 지정하지 않는 경우 이 권한 부여자를 사용합니다. AWS IoT Core 자격 증명 사용에 대한 자세한 내용은 을 참조하십시오. 클라이언트 인증

  • UpdateAuthorizer: 지정된 권한 부여자의 상태, 토큰 키 이름 또는 공개 키를 변경합니다.

  • DeleteAuthorizer: 지정된 권한 부여자를 삭제합니다.

참고

권한 부여자의 서명 요구 사항은 업데이트할 수 없습니다. 즉, 필요한 기존 권한 부여자에서 로그인을 비활성화할 수 없습니다. 또한 필요하지 않은 기존 권한 부여자에는 로그인을 요구할 수 없습니다.