IoT 응용 제품을 Google Cloud에 빠르고 안전하게 연결하는 방법
DigiKey 북미 편집자 제공
2019-04-24
Google Cloud와 같은 엔터프라이즈급 클라우드 서비스는 IoT 개발자에게 확장 가능한 가상 머신 서비스, 턴키 인공 지능(AI) 응용 제품을 비롯한 광범위한 기능을 제공합니다. 이러한 서비스에 대한 기본 요구 사항으로 IoT 장치와 클라우드를 안전하게 연결하여 유지할 수 있는 특정 보안 방법을 사용해야 합니다. 하지만 개발자의 경우 적절한 보안 메커니즘을 구현하려면, 기한이 빠듯한 설계 프로젝트에 지연이 발생하고 복잡도를 더할 수 있습니다.
전용 보안 IC로 구축된 Microchip Technology의 PIC-IoT WG 개발 기판은 Google Cloud 연결을 위한 턴키 솔루션을 제공합니다. 이 키트는 전용 보안 IC를 사용하여 Google Cloud 서비스에 안전하게 연결할 수 있는 IoT 설계를 빠르게 개발하도록 고안된 포괄적인 플랫폼을 제공합니다. 이 기사에서는 보안 연결을 위한 주요 요구 사항을 설명하고 개발자가 일반 IoT 설계에서 PIC-IoT WG를 사용하여 이러한 요구 사항을 충족할 수 있는 방법을 보여줍니다.
보안 복잡도
IoT 응용 제품과 관련 네트워크 엔터프라이즈 리소스를 안전하게 보호하려면 기본적으로 IoT 장치와 원격 호스트 서버를 안전하게 연결할 수 있어야 합니다. 이러한 서버와 기타 엔터프라이즈급 시스템은 리소스가 제한적인 마이크로 컨트롤러 및 최소 메모리로 구축된 IoT 장치에서는 사용할 수 없는 기능 및 성능을 제공할 수 있습니다. 적시에 센서 데이터를 제공하거나 액추에이터를 작동하는 데 필요한 간단한 IoT 장치의 경우 본질적으로 가장 기본적인 보안 알고리즘을 구현하기 위한 처리 요구 사항만으로는 엄두도 내기 힘듭니다.
보안 방법은 보안 장벽을 침투하는 비용이 장벽을 보호하기 위한 자산보다 더 많이 들어야 한다는 기본 원칙을 따릅니다. 알고리즘 보안 방법의 경우 암호화된 메시지를 해독하거나 인증 프로토콜을 침투하는 것이 힘들도록 계산되어야 합니다. 적어도 알고리즘 보안을 침투하는 데 보호된 데이터 또는 통신 채널의 가치 또는 적시성을 초과하는 수준의 컴퓨팅 리소스와 시간이 소요되어야 합니다. 따라서 암호화 알고리즘에서는 보안 키를 포함하는 복잡한 컴퓨팅 집약적 처리 단계를 통해 중요한 데이터를 보호하고자 합니다. 예를 들어, 널리 사용되는 AES(Advanced Encryption Standard) 알고리즘에서는 보안 키, 바이트 대체, 이동, 매트릭스 계산 등 일련의 단계로 구성되는 여러 번의 데이터 처리 과정을 거칩니다(그림 1).

그림 1: 암호화 알고리즘에서는 암호 해독이 비실용적이고 불가능하도록 만들기 위해 데이터를 개인 키에서 파생된 비트와 결합하는 AES 알고리즘의 이 단계처럼 고의적으로 복잡한 일련의 조작을 채택합니다. (이미지 출처: Wikimedia Commons)
AES와 같은 대칭 암호화 알고리즘에서는 암호화된 메시지 수신자가 동일한 보안 키를 사용하여 데이터를 암호 해독합니다. 반면에 비대칭 알고리즘에서는 개인 키 하나와 공용 키 하나로 구성된 키 쌍을 사용하여 컴퓨팅 복잡도를 높이는 동시에 공유 키 사용에 따른 위험을 해소합니다. 이 방식에서는 발신자와 수신자가 개인 키는 비밀로 유지하면서 공용 키를 교환합니다. 즉, 상대방의 공용 키를 사용하여 상대방의 개인 키로만 해독할 수 있도록 메시지를 암호화할 수 있습니다.
추가적인 보호를 위해 고급 알고리즘에서는 비대칭 공용 키 암호화 방법을 사용하여 특정 메시지 교환 세션 동안에만 데이터를 암호화하는 데 사용되는 단기 공유 개인 키를 안전하게 교환할 수 있습니다. 이러한 키 교환의 임계적 특성으로 인해 ECDH(Elliptic Curve Diffie-Hellman)와 같은 고급 알고리즘에서는 복잡한 타원 곡선 계산을 통해 보안을 더욱 강화합니다. 전송 계층 보안(TLS)과 같은 인증 프로토콜에서는 인증서의 인증을 증명하는 인증 기관(CA)의 확인 가능한 디지털 서명이 있는 공용 키를 내장하는 디지털 인증서를 사용하여 디피-헬먼 키 교환과 같은 메커니즘을 공식 식별 방법과 결합합니다.
이 간단한 설명에서 알 수 있듯이 보안 방법에서는 궁극적으로 개인 키에 종속하는 암호화 알고리즘 및 프로토콜 계층을 사용합니다. 이러한 계층은 해커의 지속적인 공격을 받을 수 있지만 개인 키가 검색될 수 있는 경우 전체 보안 구조가 빠르게 축소됩니다.
따라서 IoT 장치 보안을 위해 기본적으로 하드웨어 기반 보안 키 저장소가 필요합니다. 또한 이러한 알고리즘 및 프로토콜의 계산적 복잡성으로 인해 리소스가 제한적인 마이크로 컨트롤러가 복잡한 계산에서 벗어날 수 있도록 해주는 전용 암호화 엔진이 필요합니다.
하드웨어 기반 보안
Microchip Technology ATECC608A CryptoAuthentication IC와 같은 특수 보안 하드웨어 장치는 암호를 보호하고 암호화 알고리즘 실행을 가속화하는 데 필요한 기능을 제공합니다. 이러한 기능 중에서 ATECC608A는 최대 16개의 키, 인증서 및 기타 데이터를 안전하게 저장할 수 있는 온칩 EEPROM 및 기타 필요한 기능(예: NIST SP 800-90A/B/C 규격 난수 발생기)을 제공합니다.
보안 저장 장치인 ATECC608A는 대칭 암호화를 위한 AES, 비대칭 암호화를 위한 ECDH 등 다양한 알고리즘의 실행을 가속화할 수 있습니다. 또한 보안 부트 등 높은 수준의 서비스를 지원할 수 있습니다(“암호화 칩을 사용하여 IoT 장치 설계에 보안 부트 추가” 참조).
이러한 알고리즘의 실행 부담에서 벗어난다는 직접적인 성능 혜택 외에도 이러한 암호화 엔진, 보안 스토리지 및 기타 기능을 통합한 ATECC608A는 신뢰할 수 없는 엔티티로부터 키를 격리하여 보안을 한층 강화합니다. 이러한 엔티티에는 보안을 고려하여 설계되지 않은 마이크로 컨트롤러, 마이크로 컨트롤러에서 실행 중인 소프트웨어, 소프트웨어를 사용하는 개인 등이 있습니다. 장치에서 개인 키 생성 기능을 제공하여 제조 및 배포 시설에서 프로비저닝하는 동안 보안을 강화합니다.
따라서 기존 소프트웨어 기반 보안 방법에 비해 위협 벡터 수가 감소됩니다. 또한 효과적인 보안 정책의 핵심이 되는 심층 방어를 지원합니다.
ATECC608A는 이 포괄적인 기능 통합을 통해 하드웨어 인터페이스 요구 사항을 간소화합니다. 이 장치는 마이크로 컨트롤러의 I2C 버스를 디지털 센서(예: Microchip Technology의 MCP9808)와 같은 다른 장치와 공유할 수 있는 다른 I2C로 작동됩니다(그림 2).

그림 2: Microchip Technology ATECC608A CryptoAuthentication IC(왼쪽)는 칩에서 보안 처리를 완료하므로 Microchip Technology의 MCP9808 I2C 디지털 온도 센서(오른쪽)와 같은 다른 I2C 장치에서 사용하기 위한 간단한 I2C 하드웨어 인터페이스를 제공할 수 있습니다. (이미지 출처: Microchip Technology)
하드웨어 수준에서 ATECC608A의 포괄적인 기능으로 인해 인터페이스가 더 복잡해집니다. Microchip Technology의 CryptoAuthLib 라이브러리는 이 인터페이스를 CryptoAuthLib 애플리케이션 프로그래밍 인터페이스(API)에서 사용할 수 있는 직관적인 함수 호출 세트로 추출합니다. 이 라이브러리는 Microchip Technology의 MPLAB X 통합 개발 환경(IDE)에서 관련 드라이버 및 미들웨어와 함께 번들로 제공됩니다. CryptoAuthLib API 및 드라이버는 ATECC608A에서 맞춤형 설계를 위한 기능 요소를 제공하지만, 개발자는 Google Cloud와의 보안 연결에 필요한 전체 보안 체인을 구현해야 하는 추가적인 과제에 직면합니다. Microchip Technology의 PIC-IoT WG 개발 기판은 이러한 장애물을 제거합니다.
종단간 IoT 응용 제품 개발
ATECC608A 및 Microchip Technology의 저비용 PIC24FJ128GA705 16비트 마이크로 컨트롤러를 기반으로 하는 PIC-IoT 기판은 Microchip Technology ATWINC1510 Wi-Fi 모듈, Vishay Semiconductor의 TEMT6000X01 주변광 센서 및 MCP9808 I2C 온도 센서를 포함하는 무선 IoT 설계입니다. 또한 개발자는 수백 개의 사용 가능한 MikroElektronika Click 기판과 함께 제공되는 센서 및 액추에이터를 추가하여 하드웨어 기본 플랫폼을 쉽게 확장할 수 있습니다. 소프트웨어 개발의 경우 Microchip Technology는 MPLAB X IDE 및 관련 MPLAB Code Configurator(MCC) 고속 시제품 제작 도구를 제공합니다.
이 기판 및 관련 소프트웨어는 IoT 센서 장치, 보안 연결을 통한 Google Cloud 서비스 등 기본 종단 간 IoT 응용 제품을 평가하기 위한 턴키 플랫폼을 제공합니다. 이 키트는 리소스가 제한적인 IoT 장치에서도 상호 인증을 지원하도록 설계된 고유한 접근 방식을 구현합니다. 이 방식에서 IoT 장치는 경량 TLS 서비스를 사용하여 Google 측 연결을 인증하고 JSON(JavaScript Object Notation) 웹 토큰(JWT)을 사용하여 Google 서버에 자체적으로 인증합니다(“IoT 장치를 클라우드에 안전하게 연결하기 위한 손쉬운 솔루션” 참조). 장치 드라이버, 기판 지원 패키지, 미들웨어 서비스와 함께 Microchip Technology는 MPLAB 개발 제품군을 통해 PIC-IoT 기판에 사용 가능한 전체 샘플 IoT 응용 제품의 일부로 이 접근 방식을 시연합니다.
개발자는 샘플 응용 제품을 사용하여 클라우드 응용 제품 작업뿐 아니라 주요 클라우드 서비스 제공업체에서 IoT 장치를 클라우드에 연결하기 위해 제공하는 IoT 관련 서비스 작업도 경험할 수 있습니다. 예를 들어, IoT 장치에서는 장치 연결, 관련 메타데이터 관리 등에 필요한 다양한 서비스를 제공하는 Google Cloud IoT Core를 통해 Google Cloud 리소스에 액세스할 수 있습니다(그림 3).

그림 3: 다른 엔터프라이즈 클라우드 제공업체와 마찬가지로 Google Cloud는 IoT 장치를 클라우드 리소스와 통합하는 것과 관련한 고유한 요구 사항을 지원하도록 설계된 특수 서비스 Google Cloud IoT Core를 제공합니다. (이미지 출처: Google)
클라우드 서비스 사용
백 엔드에서 Google Cloud IoT Core는 게시/구독(pub/sub) 모델을 사용하여 데이터 브로커를 통해 상위 Google Cloud 리소스에 액세스할 수 있는 권한을 장치에 제공합니다. 프론트 엔드에서 IoT Core는 HTTP(Hypertext Transfer Protocol) 또는 MQTT(Message Queuing Telemetry Transport)를 사용하여 IoT 장치 연결을 지원하는 브리지를 제공합니다. MQTT는 최소한의 통신 대역폭과 IoT 장치 리소스로 실행하도록 설계된 국제 표준화 기구(ISO) 표준 메시징 전송입니다. Microchip Technology의 PIC-IoT 기판용 소프트웨어 응용 제품은 앞서 설명한 TLS/JWT 상호 인증 방법으로 보호되는 TCP/IP(Transmission Control Protocol/Internet Protocol) 소켓 연결에서 실행 중인 MQTT 사용을 시연합니다.
이 소프트웨어는 보안 연결을 설정한 후 Google Cloud에 센서 데이터를 전송하고 클라우드 서비스의 명령에 응답하는 데 사용되는 채널 또는 “주제”를 설정하기 위해 MQTT를 사용하여 Google Cloud IoT Core 서비스와 통신합니다. Google은 구독할 IoT 장치 소프트웨어를 호출한 후 /devices/{deviceID}/events 형식의 지정된 주제에 데이터를 전송하고 기판 이벤트 주제 아래의 하위 주제에 대한 옵션을 제공합니다. 다른 주제(예: 장치 관리 기능 관련 주제)를 비롯하여 Google은 클라우드에서 IoT 장치로 명령을 전송하기 위해 /devices/{device-id}/commands 주제를 지정합니다. 또한 Google은 IoT 장치에서 하위 주제를 통해 전송되는 명령을 수신할 수 있도록 catch-all 주제(/devices/{device-id}/commands/#)를 제공합니다.
PIC-IoT 응용 제품은 타이머와 콜백을 기반으로 확장 가능한 소프트웨어 아키텍처를 사용하여 다양한 절차를 시연합니다. 이 아키텍처로 인해 기본 모듈(main.c)은 기본 루틴(main())과 메시지를 보내고(sendToCloud()) 받는(receivedFromCloud()) 애플리케이션 수준 루틴만 제공해야 합니다. main() 루틴은 타이머 스케줄러를 실행하고 사용자 루틴을 위한 자리 표시자를 제공하는 무한 루프를 시작하기 전에 초기화 루틴 쌍을 호출합니다(목록 1).
복사 void receivedFromCloud(uint8_t *topic, uint8_t *payload) { char *toggleToken = "\"toggle\":"; char *subString; if ((subString = strstr((char*)payload, toggleToken))) { LED_holdYellowOn( subString[strlen(toggleToken)] == '1' ); } debug_printer(SEVERITY_NONE, LEVEL_NORMAL, "topic: %s", topic); debug_printer(SEVERITY_NONE, LEVEL_NORMAL, "payload: %s", payload); } // This will get called every 1 second only while we have a valid Cloud connection void sendToCloud(void) { static char json[70]; // This part runs every CFG_SEND_INTERVAL seconds int rawTemperature = SENSORS_getTempValue(); int light = SENSORS_getLightValue(); int len = sprintf(json, "{\"Light\":%d,\"Temp\":\"%d.%02d\"}", light,rawTemperature/100,abs(rawTemperature)%100); if (len >0) { CLOUD_publishData((uint8_t*)json, len); LED_flashYellow(); } } #include "mcc_generated_files/application_manager.h" /* Main application */ int main(void) { // initialize the device SYSTEM_Initialize(); application_init(); while (1) { // Add your application code runScheduler(); } return 1; }
목록 1: Microchip Technology의 PIC-IoT 기판용 샘플 애플리케이션에서는 기본 루프를 간소화하고 개발자가 자체 서비스 및 애플리케이션 루틴을 쉽게 추가할 수 있도록 도와주는 일련의 타이머 및 콜백을 사용합니다. (코드 출처: Microchip Technology)
무한 루프보다 먼저 호출되는 SYSTEM_Initialize() 루틴은 클록, 아날로그 디지털 컨버터(ADC), 인터럽트를 비롯한 하드웨어 부품을 초기화합니다. application_init() 루틴은 CryptoAuthentication 라이브러리를 비롯한 다양한 소프트웨어 시스템을 초기화하고 Wi-Fi 및 클라우드에 연결합니다. 마지막으로 application_init()은 MAIN_dataTask() 실행을 위한 100밀리초 타이머를 설정합니다. 타이머가 만료되고 MAIN_dataTask()가 호출되면 애플리케이션의 현재 작동 상태를 나타내도록 기판의 LED를 적절히 설정하여 클라우드 연결을 확인하고 sendToCloud()를 1초에 한 번씩 호출합니다(목록 2). 따라서 개발자는 Microchip Technology가 Google Cloud에서 제공하는 무료 샌드박스 계정에서 표시되는 센서 값을 확인할 수 있습니다.
복사 // This gets called by the scheduler approximately every 100ms uint32_t MAIN_dataTask(void *payload) { static time_t previousTransmissionTime = 0; // Get the current time. This uses the C standard library time functions time_t timeNow = time(NULL); // Example of how to send data when MQTT is connected every 1 second based on the system clock if (CLOUD_isConnected()) { // How many seconds since the last time this loop ran?
int32_t delta = difftime(timeNow,previousTransmissionTime); if (delta >= CFG_SEND_INTERVAL) { previousTransmissionTime = timeNow; // Call the data task in main.c sendToCloud(); } } if(shared_networking_params.haveAPConnection) { LED_BLUE_SetLow(); } else { LED_BLUE_SetHigh(); } if(shared_networking_params.haveERROR) { LED_RED_SetLow(); } else { LED_RED_SetHigh(); } if (LED_isBlinkingGreen() == false) { if(CLOUD_isConnected()) { LED_GREEN_SetLow(); } else { LED_GREEN_SetHigh(); } } // This is milliseconds managed by the RTC and the scheduler, this return makes the // timer run another time, returning 0 will make it stop return MAIN_DATATASK_INTERVAL; }
목록 2: 타이머와 콜백 메커니즘을 사용하여 Microchip Technology의 PIC-IoT 샘플 애플리케이션은 1초에 한 번씩 클라우드에 센서 데이터를 전송하고(CFG_SEND_INTERVAL=1) 기판의 LED를 업데이트하여 현재 작동 상태를 나타냅니다. (코드 출처: Microchip Technology)
클라우드의 명령은 쉽게 처리됩니다. 샘플 애플리케이션은 receivedFromCloud()와 같은 콜백 루틴을 연결하여 수신된 메시지를 처리하는 방법을 보여줍니다. 초기화 단계의 일부로 앞서 언급한 application_init() 루틴은 Google Cloud 구독 프로세스를 수행하는 루틴(CLOUD_subscribe())을 호출합니다. 이 공정의 일부로 소프트웨어는 receivedFromCloud()에 대한 콜백을 사용하여 테이블(imqtt_publishReceiveCallBackTable)을 업데이트합니다(목록 3). 이 경우 NUM_TOPICS_SUBSCRIBE=1이므로 샘플 애플리케이션에서는 config 주제를 사용하고 인덱스를 테이블에 하드코딩하지만, 일반적인 명령 주제와 파생된 하위 주제는 다른 옵션입니다.
복사 void CLOUD_subscribe(void) { mqttSubscribePacket cloudSubscribePacket; uint8_t topicCount = 0; // Variable header cloudSubscribePacket.packetIdentifierLSB = 1; cloudSubscribePacket.packetIdentifierMSB = 0; // Payload for(topicCount = 0; topicCount < NUM_TOPICS_SUBSCRIBE; topicCount++) { sprintf(mqttSubscribeTopic, "/devices/%s/config", deviceId); cloudSubscribePacket.subscribePayload[topicCount].topic = (uint8_t *)mqttSubscribeTopic; cloudSubscribePacket.subscribePayload[topicCount].topicLength = strlen(mqttSubscribeTopic); cloudSubscribePacket.subscribePayload[topicCount].requestedQoS = 0; imqtt_publishReceiveCallBackTable[0].topic = mqttSubscribeTopic; imqtt_publishReceiveCallBackTable[0].mqttHandlePublishDataCallBack = receivedFromCloud; MQTT_SetPublishReceptionHandlerTable(imqtt_publishReceiveCallBackTable); } if(MQTT_CreateSubscribePacket(&cloudSubscribePacket) == true) { debug_printInfo("CLOUD: SUBSCRIBE packet created"); sendSubscribe = false; } }
목록 3: Microchip Technology 샘플 애플리케이션은 개발자가 콜백 루틴을 수신된 MQTT 메시지와 쉽게 연결할 수 있는 방법을 보여줍니다. 이 경우 receivedFromCloud() 함수를 기본 주제로부터 수신되는 메시지에 대한 콜백으로 정의합니다. (코드 출처: Microchip Technology)
개발자는 제공된 PIC-IoT 하드웨어 및 소프트웨어 번들을 사용하여 Google Cloud에서 데이터를 보내고 받는 다른 시나리오를 즉시 탐색할 수 있습니다. ATECC608A CryptoAuthentication 장치를 비롯한 PIC-IoT 하드웨어는 Google Cloud IoT Core와 이 사용 모델을 지원하도록 미리 구성되어 있습니다. 개발자는 MPLAB X IDE 및 MPLAB Code Configurator를 사용하여 Google Cloud에 안전하게 연결하도록 설계된 완전히 새로운 IoT 애플리케이션을 쉽게 수정하거나 빌드할 수 있습니다.
결론
네트워크 서비스 환경과 상업용 클라우드 서비스로 작업하려면 IoT 장치와 네트워크 리소스 간의 보안 연결을 제공해야 합니다. 보안 연결에 필요한 소프트웨어 서비스 계층을 구축하면 IoT 프로젝트에 대한 지연 시간이 크게 증가하며 리소스 제약이 있는 IoT 설계에서는 실용적이지 않을 수 있습니다. 특수 보안 IC가 포함된 Microchip Technology PIC-IoT와 같은 특수 기판을 사용하면 개발자가 Google Cloud에 안전하게 연결하는 IoT 애플리케이션을 빠르게 구축할 수 있습니다.
면책 조항: 이 웹 사이트에서 여러 작성자 및/또는 포럼 참가자가 명시한 의견, 생각 및 견해는 DigiKey의 의견, 생각 및 견해 또는 DigiKey의 공식 정책과 관련이 없습니다.


