모듈 7: 하드웨어 보안 통합 시뮬레이션 - AWS IoT Greengrass

문서의 영문과 번역 사이에 충돌이 있는 경우에는 영문 버전을 따릅니다. 번역 버전은 기계 번역을 사용하여 제공합니다.

모듈 7: 하드웨어 보안 통합 시뮬레이션

이 기능은 AWS IoT Greengrass 코어 v1.7 이상에 사용할 수 있습니다.

이 고급 모듈에서는 Greengrass 코어와 함께 사용하도록 시뮬레이션된 하드웨어 보안 모듈(HSM)을 구성하는 방법을 보여줍니다. 이 구성에서 사용되는 SoftHSM은 PKCS#11 애플리케이션 프로그래밍 인터페이스(API)를 사용하는 일반 소프트웨어 구현입니다. 이 모듈의 목적은 PKCS#11 API의 소프트웨어 전용 구현을 배우고 초기 테스트를 수행할 수 있는 환경을 설정하도록 하는 것입니다. 이 모듈은 학습과 초기 테스트를 위해서만 제공되지 어떠한 종류의 실제 사용 용도로도 제공되지 않습니다.

이 구성을 통해 PKCS#11 호환 서비스를 사용하여 프라이빗 키를 저장하는 실험을 할 수 있습니다. 소프트웨어전용 구현에 대한 자세한 내용은 SoftHSM을 참조하십시오. 일반적인 요구 사항을 포함해 AWS IoT Greengrass코어에 대한 하드웨어 보안 통합에 대한 자세한 내용은 하드웨어 보안 통합단원을 참조하십시오.

중요

이 모듈은 실험 전용으로만 제공됩니다. 잘못된 보안 감지가 늘어날 수 있기 때문에 프로덕션 환경에서는 SoftHSM을 사용하지 않는 것이 좋습니다. 이러한 구성은 실제 보안 이점을 전혀 제공하지 않습니다. SoftHSM에 저장되는 키는 Greengrass 환경에서 보안 암호를 저장하는 다른 수단보다 안전하게 저장되지 않습니다.

이 모듈의 목적은 앞으로 실제 하드웨어 기반 HSM을 사용할 계획이 있는 경우 PKCS#11 사양에 대해 배우고 소프트웨어의 초기 테스트를 수행할 수 있도록 하는 것입니다.

SoftHSM에서 제공하는 PKCS#11 구현과 하드웨어 기반 구현에는 차이가 있을 수 있기 때문에 프로덕션 사용 전에 향후 하드웨어 구현을 별도로 철저하게 테스트해야 합니다.

지원되는 하드웨어 보안 모듈 온보딩과 관련하여 도움이 필요한 경우 AWS 엔터프라이즈 지원 담당자에게 문의하십시오.

시작하기 전에 Greengrass 디바이스 설정 스크립트를 실행하거나 시작하기 자습서의 모듈 1모듈 2를 완료했는지 확인합니다. 이 모듈에서는 코어가 이미 프로비저닝되어 있고 AWS와 통신한다고 가정합니다. 이 모듈을 완료하는 데 약 30분 정도 걸립니다.

SoftHSM 소프트웨어 설치

이 단계에서는 SoftHSM을 설치하고, SoftHSM 인스턴스를 관리하는 데 사용되는 pkcs11 도구를 설치합니다.

  • AWS IoT Greengrass코어 디바이스의 터미널에서 다음 명령을 실행합니다.

    sudo apt-get install softhsm2 libsofthsm2-dev pkcs11-dump

    이러한 패키지에 대한 자세한 내용은 Install softhsm2, Install libsofthsm2-devInstall pkcs11-dump를 참조하십시오.

    참고

    시스템에서 이 명령을 사용할 때 문제가 발생하면 GitHub에서 SoftHSM 버전 2를 참조하십시오. 이 사이트에서는 소스에서 빌드하는 방법을 비롯하여 설치 정보를 더욱 다양하게 제공합니다.

SoftHSM 구성

이 단계에서는 SoftHSM을 구성합니다.

  1. 루트 사용자로 전환합니다.

    sudo su
  2. 매뉴얼 페이지를 사용하여 시스템 전체에서 softhsm2.conf 위치를 찾습니다. 공통 위치는 /etc/softhsm/softhsm2.conf이며, 일부 시스템에서는 이 위치가 다를 수 있습니다.

    man softhsm2.conf
  3. 시스템 전체 위치에서 softhsm2 구성 파일의 디렉터리를 생성합니다. 이 예에서는 위치가 /etc/softhsm/softhsm2.conf라고 가정합니다.

    mkdir -p /etc/softhsm
  4. /greengrass 디렉터리에서 토큰 디렉터리를 생성합니다.

    참고

    이 단계를 건너뛰면 softhsm2-util에서 ERROR: Could not initialize the library를 보고합니다.

    mkdir -p /greengrass/softhsm2/tokens
  5. 토큰 디렉터리를 구성합니다.

    echo "directories.tokendir = /greengrass/softhsm2/tokens" > /etc/softhsm/softhsm2.conf
  6. 파일 기반 백엔드를 구성합니다.

    echo "objectstore.backend = file" >> /etc/softhsm/softhsm2.conf
참고

이러한 구성 설정은 실험 전용입니다. 모든 구성 옵션을 보려면 해당 구성 파일의 매뉴얼 페이지를 읽어보십시오.

man softhsm2.conf

SoftHSM으로 프라이빗 키 가져오기

이 단계에서는 SoftHSM 토큰을 초기화하고, 프라이빗 키 형식을 변환한 다음 프라이빗 키를 가져옵니다.

  1. SoftHSM 토큰을 초기화합니다.

    softhsm2-util --init-token --slot 0 --label greengrass --so-pin 12345 --pin 1234
    참고

    메시지가 표시되면 SO 핀(12345)과 사용자 핀(1234)을 입력합니다. AWS IoT Greengrass에서는 SO(감독자) 핀을 사용하지 않으므로 임의의 값을 사용할 수 있습니다.

    CKR_SLOT_ID_INVALID: Slot 0 does not exist 오류가 발생하면 다음 명령을 대신 시도하십시오.

    softhsm2-util --init-token --free --label greengrass --so-pin 12345 --pin 1234
  2. 프라이빗 키를 SoftHSM 가져오기 도구에서 사용할 수 있는 형식으로 변환합니다. 이 자습서에서는 시작하기 자습서 모듈 2기본 그룹 생성 옵션에서 얻은 프라이빗 키를 변환합니다.

    openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in Hash.private.key -out Hash.private.pem
  3. SoftHSM으로 프라이빗 키를 가져옵니다. softhsm2-util 버전에 따라 다음 명령 중 하나만 실행합니다.

    Raspbian softhsm2-util v2.2.0 구문
    softhsm2-util --import hash.private.pem --token greengrass --label iotkey --id 0000 --pin 12340
    Ubuntu softhsm2-util v2.0.0 구문
    softhsm2-util --import hash.private.pem --slot 0 --label iotkey --id 0000 --pin 1234

    이 명령은 슬롯을 0으로 식별하고, 키 레이블을 iotkey로 정의합니다. 이러한 값은 다음 섹션에서 사용합니다.

프라이빗 키를 가져온 다음에는 /greengrass/certs 디렉터리에서 선택적으로 제거할 수 있습니다. 루트 CA 및 디바이스 인증서는 이 디렉터리에 보관합니다.

SoftHSM을 사용하도록 Greengrass 코어 구성

이 단계에서는 SoftHSM을 사용하도록 Greengrass 코어 구성 파일을 수정합니다.

  1. 시스템에서 SoftHSM 공급자 라이브러리(libsofthsm2.so) 경로를 찾습니다.

    1. 이 라이브러리에 대해 설치된 패키지 목록을 가져옵니다.

      sudo dpkg -L libsofthsm2

      libsofthsm2.so 파일은 softhsm 디렉터리에 있습니다.

    2. 파일의 전체 경로를 복사합니다(예: /usr/lib/x86_64-linux-gnu/softhsm/libsofthsm2.so). 이 값은 나중에 사용합니다.

  2. Greengrass 데몬을 중지합니다.

    cd /greengrass/ggc/core/ sudo ./greengrassd stop
  3. Greengrass 구성 파일을 엽니다. 이 파일은 /greengrass/config 디렉터리에 있는 config.json 파일입니다.

    참고

    이 절차의 예제는 config.json 파일이 시작하기 자습서의 모듈 2에서 기본 그룹 생성 옵션에서 생성된 형식을 사용한다고 가정하고 작성되었습니다.

  4. crypto.principals 객체에서 다음 MQTT 서버 인증서 객체를 삽입합니다. 유효한 JSON 파일을 생성하는 데 필요한 경우 쉼표를 추가합니다.

    "MQTTServerCertificate": { "privateKeyPath": "path-to-private-key" }
  5. crypto 객체에서 다음 PKCS11 객체를 삽입합니다. 유효한 JSON 파일을 생성하는 데 필요한 경우 쉼표를 추가합니다.

    "PKCS11": { "P11Provider": "/path-to-pkcs11-provider-so", "slotLabel": "crypto-token-name", "slotUserPin": "crypto-token-user-pin" }

    파일은 다음과 같아야 합니다.

    { "coreThing" : { "caPath" : "root.ca.pem", "certPath" : "Hash.cert.pem", "keyPath" : "Hash.private.key", "thingArn" : "arn:partition:iot:region:account-id:thing/core-thing-name", "iotHost" : "host-prefix.iot.region.amazonaws.com", "ggHost" : "greengrass.iot.region.amazonaws.com", "keepAlive" : 600 }, "runtime" : { "cgroup" : { "useSystemd" : "yes" } }, "managedRespawn" : false, "crypto": { "PKCS11": { "P11Provider": "/path-to-pkcs11-provider-so", "slotLabel": "crypto-token-name", "slotUserPin": "crypto-token-user-pin" }, "principals" : { "MQTTServerCertificate": { "privateKeyPath": "path-to-private-key" }, "IoTCertificate" : { "privateKeyPath" : "file:///greengrass/certs/Hash.private.key", "certificatePath" : "file:///greengrass/certs/Hash.cert.pem" }, "SecretsManager" : { "privateKeyPath" : "file:///greengrass/certs/Hash.private.key" } }, "caPath" : "file:///greengrass/certs/root.ca.pem" } }
    참고

    하드웨어 보안에 무선(OTA) 업데이트를 사용하려면 PKCS11 개체에도 OpenSSLEngine 속성이 포함되어야 합니다. 자세한 내용은 무선 업데이트에 대한 지원 구성 단원을 참조하십시오.

  6. 다음과 같이 crypto 객체를 편집합니다.

    1. PKCS11 객체를 구성합니다.

      • P11Providerlibsofthsm2.so의 전체 경로를 입력합니다.

      • slotLabelgreengrass을 입력합니다.

      • slotUserPin1234을 입력합니다.

    2. principals 객체에 프라이빗 키 경로를 구성합니다. certificatePath 속성은 편집하지 마십시오.

      • privateKeyPath 속성에 다음 RFC 7512 PKCS#11 경로(키의 레이블을 지정하는 경로)를 입력합니다. IoTCertificate, SecretsManagerMQTTServerCertificate 보안 주체에 대해 동일하게 수행합니다.

        pkcs11:object=iotkey;type=private
    3. crypto 객체를 확인합니다. 예를 들면 다음과 같아야 합니다.

      "crypto": { "PKCS11": { "P11Provider": "/usr/lib/x86_64-linux-gnu/softhsm/libsofthsm2.so", "slotLabel": "greengrass", "slotUserPin": "1234" }, "principals": { "MQTTServerCertificate": { "privateKeyPath": "pkcs11:object=iotkey;type=private" }, "SecretsManager": { "privateKeyPath": "pkcs11:object=iotkey;type=private" }, "IoTCertificate": { "certificatePath": "file://certs/core.crt", "privateKeyPath": "pkcs11:object=iotkey;type=private" } }, "caPath": "file://certs/root.ca.pem" }
  7. coreThing 객체에서 caPath, certPathkeyPath 값을 제거합니다. 예를 들면 다음과 같아야 합니다.

    "coreThing" : { "thingArn" : "arn:partition:iot:region:account-id:thing/core-thing-name", "iotHost" : "host-prefix-ats.iot.region.amazonaws.com", "ggHost" : "greengrass-ats.iot.region.amazonaws.com", "keepAlive" : 600 }
참고

이 자습서에서는 모든 보안 주체에 대해 동일한 프라이빗 키를 지정합니다. 로컬 MQTT 서버에 대한 프라이빗 키 선택에 대한 자세한 내용은 성능을 참조하십시오. 로컬 보안 암호 관리자에 대한 자세한 내용은 AWS IoT Greengrass 코어에 암호 배포 단원을 참조하십시오.

구성 테스트

  • AWS Greengrass 데몬을 시작합니다.

    cd /greengrass/ggc/core/ sudo ./greengrassd start

    데몬이 성공적으로 시작하면 코어가 제대로 구성된 것입니다.

    이제 PKCS#11 사양에 대해 배우고 SoftHSM 구현에서 제공하는 PKCS#11 API를 사용해 초기 테스트를 수행할 준비가 되었습니다.

    중요

    다시 말하지만, 이 모듈은 학습 및 테스트만을 위한 모듈입니다. 이 모듈이 Greengrass 환경의 보안 상태를 실제로 강화하지는 않습니다.

    대신 이 모듈의 용도는 앞으로 실제 하드웨어 기반 HSM을 사용할 것에 대비해 학습 및 테스트를 시작하도록 하는 데 있습니다. 현재, SoftHSM에서 제공하는 PKCS#11 구현과 하드웨어 기반 구현 사이에는 차이가 있을 수 있으므로 실제 사용 전에 하드웨어 기반 HSM에 대해 소프트웨어를 별도로 철저하게 테스트해야 합니다.

다음 사항도 참조하세요.