BLOG

인증서 자동화 시스템 참조 응용프로그램을 사용하여 AWS IoT Core와의 안전한 통신 보장하기
작성일: 2018년 7월 26일

X.509 인증서는 IoT 디바이스와 AWS IoT Core간의 보안 통신을 위해 사용됩니다. 디바이스는 TLS 상호 인증을 통해 AWS IoT Core에 연결하기 위해 이 인증서를 사용합니다. AWS IoT Core는 TLS 상호 인증을 사용하여 AWS IoT Core와 다른 디바이스 또는 다른 AWS 서비스 간에 이동하는 데이터를 암호화합니다.

 

 

디바이스에 설치된 A X.509 인증서는 다음 조건 중 하나를 충족해야 합니다.

  • AWS IoT Core에서 발급해야 합니다.
  • IoT 디바이스 인증서를 서명하는 데 사용되는 CA 인증서가 AWS 계정으로 이미 가져와 AWS IoT 구현과 연결되어 있어야 합니다.

이러한 조건을 충족하지 않는 디바이스가 있다는 것을 알고 있으므로 CVM(인증서 자동화시스템) 이라는 참조 응용프로그램을 제공하여 이 항목은 AWS IoT Core에서 생성된 인증서로 디바이스를 프로비저닝하는 방법을 보여줍니다. 이 글은 CVM을 시작하는 데 도움이 되는 디자인 아이디어와 관련 소스 코드를 제공합니다.

 

CVM을 누가 사용해야 하는가?

인증서 자동화 시스템은 디바이스에 인증서가 사전 설치되어 있지 않은 사용자에게 이상적이며 제조 프로세스 중에 CA 인증서를 사용하여 디바이스 인증서를 프로비저닝 할 수 없습니다. CVM을 사용하여 디바이스가 자체 인증서를 적용하도록 허용할 수 있습니다. 이 예에서는 IoT 디바이스에 TLS 상호 인증을 위한 인증서가 없으므로 다음 세가지 사항에 유의해야 합니다.

  • 디바이스와 CVM이 통신할 때 중간자 공격을 방지하려면 서버 인증서를 사용하여 엔드 포인트의 신뢰성을 검증해야 합니다. 특히 디바이스 인증서를 생성할 때 디바이스와 CVM사이에 TLS 터널 또는 IPsec VPN과 같은 보안 통신이 있어야 합니다.
  • 인증서를 요청하는 IoT 디바이스는 정책 바인딩에 사용되고 디바이스가 유효한지 확인하는 데 사용되는 일련 번호, 클라이언트 ID 또는 제품 ID와 같은 고유 식별자를 가져야 합니다.
  • CVM이 제출한 모든 인증서는 AWS IoT Core 인증서입니다. 사용자 지정 CA 인증서를 사용해야 하는 경우 대량 프로비저닝을 사용할 수 있습니다. 자세한 내용은 AWS IoT 블로그 게시물에서 디바이스 인증서의 적시 등록을 참조하십시오.

 

구현 방법론

CVM 구현은 IoT 디바이스, CVM 서버, AWS IoT Core의 세가지 모듈로 나눌 수 있습니다.

  • IoT 디바이스
    • HTTPS 연결을 통해 디바이스 인증서를 요청합니다.
    • 요청 시 디바이스 일련 번호와 등록 토큰을 제출합니다. 등록 토큰은 디바이스 일련 번호 스푸핑을 방지하기 위한 일회성 토큰입니다.
  • CVM 서버
    • 인증서 애플리케이션을 위한 IoT 디바이스에 원격 액세스 할 수 있습니다.
    • AWS IoT Core와 통신하는 데 사용할 수 있는 각 IoT 디바이스에 대한 보안 인증서를 생성합니다.
    • DynamoDB를 사용하여 디바이스 ID, 키 등록 정보 및 적용된 디바이스 인증서와 같은 정보를 저장합니다.
    • DynamoDB에서 연결 테이블을 쿼리하여 IoT 객체 이름, 인증서 정책 및 인증서 ID를 연결합니다. 이와 동시에 CVM은 디바이스가 단일 활성 인증서에 대해서만 등록할 수 있도록 DynamoDB의 인증서 상태 특성을 수정합니다.
  • AWS IoT Core
    • 인증서 및 개인 키 페어를 생성한 다음 개별 IoT 디바이스로 이동합니다.

 

기본 CVM 워크 플로우는 다음과 같습니다.

 

 

CVM 아키텍처는 다음과 같습니다.

 

 

 

확장성을 위해 Amazon API GatewayAWS Lambda를 사용하는 워크 플로우는 다음과 같습니다.

  1. IoT 디바이스가 AWS IoT Core에 대한 액세스를 요청하면 CVM에 대한 인증서 애플리케이션이 트리거 됩니다. IoT 디바이스는 IoT 디바이스 인증서 애플리케이션을 위한 API Gateway로 API 호출을 보냅니다.
  2. API Gateway는 Lambda를 호출하여 AWS IoT Core에 대한 인증서 요청을 시작합니다.
  3. API Gateway에서 요청을 수신한 후, Lambda는 Amazon DynamoDB에서 요청이 올바른지 확인한 다음 AWS IoT Core에 인증서를 적용합니다.
  4. CVM은 AWS SDK를 사용해 AWS IoT Core에 대한 일련의 API 호출을 합니다. 이러한 API호출은 레지스트리에 항목 생성 및 연결된 디바이스 인증서 생성과 같은 작업을 수행합니다.
  5. AWS IoT Core는 디바이스 인증서와 키 페어를 생성하고 인증서 정보와 인증서 ID를 CVM으로 반환합니다.
  6. Lambda는 일련의 API 호출을 사용하여 제품 일련 번호에 따라 DynamoDB 연결 테이블을 쿼리하여 AWS IoT Core의 항목 이름, 인증서 및 정책을 연결합니다.
  7. AWS Lambda는 DynamoDB 연결 테이블을 현재 디바이스에 대한 정보로 업데이트합니다.
  8. CVM은 인증서를 IoT 디바이스로 반환합니다.

 

보안

CVM을 안전하게 보호하려면 AWS Lambda 기능의 범위를 AWS IoT Core에서 디바이스를 만드는 데 필요한 최소 권한으로 제한해야 합니다. 인증서 응용 프로그램 및 발급 프로세스를 완료하려면 CVM은 다음에 대한 IAM 권한을 가지고 있어야 합니다.

  • DynamoDB 테이블에서 디바이스 연결을 쿼리, 수정 및 업데이트하려면 DynamoDB에 액세스 합니다.
  • AWS IoT Core에 액세스하여 X.509 인증서를 요청하고 인증서에 IoT 정책을 연결합니다.

 

다음 단계에서는 CVM에 올바른 IAM 역할 권한을 할당하는 방법을 보여 줍니다. 다음은 CVM에 대한 제한된 권한을 가진 IAM 역할에 대한 정책 예입니다.

{

     “Version”: “2012-10-17”,

     “Statement”: [

     {

        “Sid”: “IoTCWlogsPolicy”,

        “Effect”: “Allow”,

        “Action”: [

                “logs:*”,

                “iot:CreateThing”,

                “iot:AttachPolicy”,

                “iot:AttachThingPrincipal”,

                “iot:CreatePolicy”,

                “iot:CreateKeysAndCertificate”

         ],

        “Resource”: “*”

        },

     {

        “Sid”: “cvmDynamodbPolicy”,

        “Effect”: “Allow”,

        “Action”: [

                “dynamodb:Query”,

                “dynamodb:UpdateItem”

        ],

       “Resource”: “arn:aws:dynamodb:us-west-2:xxxxxxxxxxxx:table/{table_name}”

     }

  ]

}

이제 AWS Lambda가 이 역할을 할 수 있도록 신뢰 관계를 추가합니다.

 

 

디바이스, 인증서 및 정책 간의 바인딩 관계를 보려면 DynamoDB에서 연결 테이블을 만들어야 합니다. 특히 DynamoDB에서 다음 데이터베이스 필드를 만들어야 합니다.

  • 제품 ID: IoT 디바이스 ID
  • 액세스 토큰: IoT 토큰
  • 타임 스탬프: 인증서 요청 타임 스탬프
  • 상태적용: 요청 상태(인증서가-1로 설정되어 있으면 디바이스가 이미 인증서를 등록했음을 의미함)
  • certID: 디바이스와 연결된 인증서 ID

이 표는 승인된 디바이스만 장치 인증서를 적용할 수 있도록 모든 디바이스 인증서 응용 프로그램 진행률을 기록하는 데 사용됩니다.

 

코드 설명

다음 CVM 참조 소스 코드는 Node.js의 JavaScript를 위해 AWS SDK에서 제공하는 AWS IoT Core인터페이스를 사용하여 인증서 요청을 완료하고 관련된 항목 이름과 정책을 추가합니다.

//Use createKeysAndCertificate to create certificate,This API will response certificate and certificate ID iot.createKeysAndCertificate (params = {}, callback) ⇒ AWS.Request # if CSR is in use, you can use following API call # iot.createCertificateFromCsr(params = {}, callback) ⇒ AWS.Request //Attach policy to current certificate iot.attachPrincipalPolicy(params = {}, callback) ⇒ AWS.Request //Attach IoT thing name to current certificat iot.attachThingPrincipal(params = {}, callback) ⇒ AWS.Request

 

 

다음 링크를 사용하여 GitHub에 CVM을 위한 소스 코드를 찾을 수 있을 것입니다.

https://github.com/awslabs/aws-iot-certificate-vending-machine

 

결론

CVM을 이용하면 기존 IoT 디바이스에 디바이스 인증서를 구축해 쉽고 안전하게 IoT 플랫폼에 연결할 수 있습니다.

 

참고자료

AWS SDK for JavaScript

 

원문 URL: https://aws.amazon.com/ko/blogs/iot/ensure-secure-communication-with-aws-iot-core-using-the-certificate-vending-machine-reference-application/

** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.