기기 보안

IoT 기기를 배포하고 관리할 때 보안은 매우 중요합니다. Cloud IoT Core는 다음과 같은 보안 기능을 제공합니다.

  • JSON 웹 토큰(JWT, RFC 7519)을 사용한 기기별 공개 키/비공개 키 인증
    • 보안이 침해된 키가 전체 Fleet이 아닌 단일 기기에만 영향을 미치므로 공격 노출 영역이 제한됩니다.
    • JWT는 제한된 기간 동안 유효하므로 보안이 침해된 키가 만료됩니다.
  • 안전한 키 크기를 적용하여 서명을 검증하는 RSA 또는 타원 곡선 알고리즘을 지원합니다.
  • 동시 키 등록을 허용하여 기기당 키 순환과 사용자 인증 정보당 만료 시간을 지원합니다.
  • 루트 인증 기관을 사용한 TLS 1.2 연결(MQTT에 필요)을 지원합니다.
  • Cloud IoT Core API 액세스가 Identity and Access Management(IAM) 역할 및 권한으로 제어됩니다.

사용자 인증 정보 프로비저닝

다음 다이어그램은 기기 사용자 인증 정보를 프로비저닝하는 프로세스를 요약한 것입니다. 종종 기기를 구성하는 사용자가 인증된 '프로비저닝 도구'는 프로젝트와 레지스트리를 만들고 기기를 만들 권한이 있다고 가정합니다. 프로비저닝 도구는 Cloud IoT Core API, gcloud 명령어 또는 Cloud Platform Console을 사용하여 클라우드에 논리적 기기를 만듭니다.

프로비저닝 흐름

  1. 준비자가 공개 키/비공개 키 쌍을 생성합니다.
  2. 준비자가 Cloud IoT Core API, gcloud 명령어 또는 Cloud Platform Console을 사용해 방금 만든 공개 키를 지정하여 기기를 만듭니다. 이 키는 기기의 ID를 확인하는 데 사용됩니다.
  3. Cloud IoT Core 기기 관리자가 기기 리소스와 공개 키를 저장합니다.
  4. 기기 관리자가 준비자에게 응답하여 기기가 생성되었음을 알립니다.
  5. 비공개 키는 나중에 인증에 사용할 수 있도록 기기에 저장됩니다. 이 단계에서 하드웨어 TPM(Trusted Platform Module)을 사용할 수 있습니다.

여기에 나온 단계의 순서를 따를 필요는 없습니다. 예를 들어 기기를 Cloud IoT Core에 등록하기 전에 기기에 키를 저장할 수 있습니다.

키를 만드는 방법에 대한 자세한 내용은 키 쌍 만들기를 참조하세요.

인증

다음 다이어그램은 MQTT를 사용한 Cloud IoT Core 인증을 요약한 것입니다.

인증 흐름

  1. 기기는 JSON 웹 토큰 사용에 설명된 대로 JSON 웹 토큰(JWT)을 준비합니다. JWT는 인증 흐름의 비공개 키로 서명됩니다.
  2. MQTT 브리지에 연결하면 기기는 MQTT CONNECT 메시지의 비밀번호로 JWT를 표시합니다. 사용자 이름 콘텐츠는 무시됩니다. 그러나 사용자 이름이 지정되지 않으면 일부 MQTT 클라이언트 라이브러리는 비밀번호를 전송하지 않습니다. 최상의 결과를 얻으려면 사용자 이름을 unused 또는 ignored와 같은 임의의 값으로 설정합니다.
  3. MQTT 브리지는 기기의 공개 키와 대조해 JWT를 확인합니다.
  4. MQTT 브리지에서 연결을 수락합니다.
  5. (허용된 클럭 드리프트를 처리한 후) JWT가 만료되면 연결이 종료됩니다.

보안 표준

Cloud IoT Core는 RSA 및 타원 곡선 서명 토큰 모두에 대해 디지털 서명 기반 인증을 사용합니다. 다음과 같은 특정 알고리즘이 지원됩니다.

RSA 알고리즘이 일반적으로 사용되며 RSA 알고리즘은 클라이언트 라이브러리에서 광범위하게 지원됩니다. 하지만 생성된 키와 서명이 상당히 클 수 있습니다(일반적으로 약 1~2KB). 또한 RSA는 (키 길이와 CPU 측면에서) 상당량의 리소스를 사용할 수 있으며, 이로 인해 리소스가 제한된 기기에 영향을 줄 수 있습니다.

타원 곡선 알고리즘은 잘 지원되지만 RSA만큼 널리 사용되지는 않습니다. 타원 곡선을 사용하려면 클라이언트 라이브러리에 추가 종속 항목을 설치해야 할 수도 있습니다. 그러나 생성된 키 및 서명은 RSA에서 생성한 키 및 서명보다 훨씬 작으므로 리소스가 제한된 기기에 유용할 수 있습니다.

키 강도

NIST 권장사항(섹션 5.6.2, 55~56페이지)에 따라 Cloud IoT Core에는 최소 112비트의 보안이 필요합니다. 즉, RS256의 최소 키 크기는 2,048비트입니다(NIST 권장사항 53페이지의 표 2 참조).

ES256에서는 128비트의 사전 설정된 보안 수준이 사용됩니다(키 크기는 고정됨).

공개 키 형식

기기의 공개 키를 등록할 때 키가 다음 형식 중 하나여야 합니다.

형식 설명
RSA_PEM base64로 인코딩된 RSA 공개 키입니다. JWT 토큰(RFC 7518)에서 RS256 서명을 확인하는 데 사용할 수 있습니다.
RSA_X509_PEM base64로 인코딩되고 X.509v3 인증서로 래핑된 RSA_PEM 키입니다(RFC 5280). 인증서를 자체 서명할 수 있습니다. 그렇지 않은 경우 Cloud IoT Core에서 기기 인증서 서명을 레지스트리 수준 인증서와 비교하여 인증서의 출처를 확인할 수 있습니다.
ES256_PEM base64로 인코딩된 (P-256 및 SHA-256을 사용하는) ECDSA 알고리즘의 공개 키입니다. ES256 알고리즘을 사용한 JWT 토큰을 확인하는 데 사용할 수 있습니다(RFC 7518). 이 공개 키는 인증서에 래핑되지 않습니다. 키 크기를 작게 유지하며, 이는 ES256의 주요 이점 중 하나입니다.
ES256_X509_PEM base64로 인코딩되고 X.509v3 인증서로 래핑된 ES256_PEM 키입니다(RFC 5280). 인증서를 자체 서명할 수 있습니다. 그렇지 않은 경우 Cloud IoT Core에서 기기 인증서 서명을 레지스트리 수준 인증서와 비교하여 인증서의 출처를 확인할 수 있습니다.

키를 만드는 방법에 대한 자세한 내용은 공개 키/비공개 키 쌍 만들기를 참조하세요.

키 순환

Cloud IoT Core는 끊김 없이 순환되도록 여러 개의 활성 키(기기당 최대 3개)를 지원합니다. 서비스에서 각 활성 키를 사용해 JWT를 확인하려고 시도하며 활성 키가 일치하면 연결을 수락합니다.

API를 사용하면 각 기기 사용자 인증 정보(공개 키)의 expirationTime을 정의할 수 있습니다. 만료되면 키는 무시되지만 자동으로 삭제되지는 않습니다. 10분의 시계 보정값 허용치가 적용됩니다. 키에 만료 시간을 지정하지 않으면 만료되지 않습니다.

기기 보안 권장사항

다음 보안 권장사항은 Cloud IoT Core에서 시행되지 않지만 기기 및 연결을 보호하는 데 도움이 됩니다.

  • 비공개 키를 보안 비밀로 유지합니다.
  • 포트 8883 및 443에서 mqtt.googleapis.com 또는 mqtt.2030.ltsapis.goog와 통신할 때 TLS 1.2를 사용합니다. TLS 연결을 유지하려면 다음 안내를 따르세요.
    • Google 루트 CA 인증서를 사용하여 서버 인증서가 유효한지 확인합니다.
    • 정기적으로 보안 관련 펌웨어 업데이트를 수행하여 서버 인증서를 최신 상태로 유지합니다.
    • TLS 요구사항 및 이후 호환성을 자세히 알아보려면 이 보안 참고사항을 읽어보세요.
  • 각 기기에는 고유한 공개 키/비공개 키 쌍이 있어야 합니다. 여러 기기에서 단일 키를 공유하는데 이 기기 중 하나가 손상된 경우 공격자가 해당 키로 구성된 모든 기기를 가장할 수 있습니다.
  • Cloud IoT Core에 등록할 때 공개 키를 안전하게 유지하세요. 공격자가 공개 키를 변조하고 프로비저닝 도구를 속여서 공개 키를 교체하고 잘못된 공개 키를 등록할 수 있는 경우 공격자는 이후에 기기를 대신하여 인증할 수 있습니다.
  • Cloud IoT Core에 기기를 인증하는 데 사용한 키 쌍을 다른 용도나 프로토콜에 사용해서는 안 됩니다.
  • 키를 안전하게 저장하는 기기 성능에 따라 키 쌍을 주기적으로 순환해야 합니다. 가능하다면 기기를 재설정할 때 모든 키를 삭제해야 합니다.
  • 기기에서 운영체제를 실행하는 경우 안전하게 업데이트할 방법이 있는지 확인합니다. 운영체제가 없는 기기의 경우 배포 후 보안 취약점이 발견되면 기기의 소프트웨어를 안전하게 업데이트할 수 있는지 확인합니다.
  • 루트 인증서를 업데이트할 방법이 있는지 확인합니다. 자세한 내용은 Google Internet Authority 사이트를 참조하세요.
  • 기기의 시계가 변조되지 않았는지 확인합니다. 기기 시계가 손상되면 강력한 공격자가 기기를 속여 토큰 만료 시간을 우회하여 미래에 유효할 토큰을 발행하게 할 수 있습니다. 최상의 결과를 얻으려면 Google 공개 NTP 서버를 사용하세요.