

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

# 자습서: 신뢰할 수 있는 플랫폼 모듈(TPM)을 사용하여 Greengrass Nucleus 보호
<a name="gg-with-tpm-tutorial"></a>

**참고**  
이 자습서의 메커니즘은 [수동 리소스 프로비저닝을 사용하여 AWS IoT Greengrass 코어 소프트웨어 설치](manual-installation.md)에서만 지원됩니다.

이 자습서에는 TPM2 칩을 하드웨어 보안 모듈(HSM)로 사용하여 프라이빗 키와 CSR을 생성하는 방법에 대한 지침이 포함되어 있습니다. 이것은 [사물 인증서 생성](manual-installation.md#create-thing-certificate)에 사용됩니다.

이 자습서에서는 PKCS\#11 인터페이스를 사용하여 신뢰할 수 있는 플랫폼 모듈(TPM)로 AWS IoT Greengrass 코어 소프트웨어(Greengrass Nucleus)를 구성하여 디바이스 보안을 강화하는 방법을 보여줍니다. 이 TPM 통합은 디바이스 자격 증명 및에 연결하는 데 사용되는 프라이빗 키와 인증서를 변조 방지 하드웨어에 AWS IoT Core 안전하게 저장하여 위장 또는 기타 악의적인 활동을 위한 추출을 방지합니다.

이 통합을 완료하면 Greengrass 코어 디바이스는 ID 및 AWS IoT 서비스와의 통신에 TPM 보호 프라이빗 키를 사용합니다.

Greengrass 디바이스 보안에 대한 자세한 내용은 [의 보안 AWS IoT Greengrass](security.md) 섹션을 참조하세요.

## 사전 조건
<a name="prerequisites"></a>

이 자습서를 완료하려면 다음이 필요합니다.
+ TPM 2.0 하드웨어 또는 펌웨어 TPM 2.0이 있는 Linux 호환 디바이스.
+ 이 자습서의 지침은 Ubuntu 24.04 LTS를 기준으로 정의됩니다.
  + [Linux TPM2 소프트웨어 스택](https://tpm2-software.github.io/)을 지원하는 모든 Linux 배포판에서 이 메커니즘 지원이 가능합니다.
+ 가 AWS CLI 설치되고 다음에 대한 권한으로 구성된 개발자 시스템:
  +  AWS IoT 리소스 생성 및 관리
  + IAM 역할 및 정책 생성 및 관리
+ 디바이스에 설치된 Java 런타임 환경(JRE) 버전 8 이상.
+ 디바이스에 설치된 다음 소프트웨어 패키지:
  + curl
  + jq
+ 디바이스에서 루트 권한 또는 sudo 권한.

## 1단계: TPM2 도구 및 종속성 설치
<a name="tpm_step1"></a>

이 단계에서는 필요한 TPM2 소프트웨어 도구와 라이브러리를 설치합니다.

1. 패키지 관리자를 업데이트하고 다음 명령을 실행하여 TPM2 도구와 종속성을 설치합니다.

   ```
   sudo apt-get update && sudo apt-get install tpm2-tools \
   tpm2-abrmd \
   tpm2-tss-engine-tools \
   gnutls-bin \
   libtpm2-pkcs11-1 \
   libtpm2-pkcs11-tools \
   libtpm2-pkcs11-1-dev \
   python3-tpm2-pkcs11-tools \
   libengine-pkcs11-openssl \
   libtss2-tcti-tabrmd0
   ```

1. OpenSSL 엔진 3을 사용하는 OpenSSL TPM2 공급자 패키지를 Ubuntu 24.04에 설치합니다.

   ```
   sudo apt-get install tpm2-openssl
   ```

## 2단계: PKCS\#11 저장소 초기화 및 슬롯 생성
<a name="tpm_step2"></a>

1. 데이터를 저장할 디렉터리를 생성합니다.

   ```
   sudo mkdir -p /etc/tpm2_pkcs11
   ```

1. 저장 위치를 환경 변수로 설정합니다. 스토어 계층 구조에 대한 자세한 내용은 [초기화](https://github.com/tpm2-software/tpm2-pkcs11/blob/master/docs/INITIALIZING.md#initialization)를 참조하세요.

   ```
   export TPM2_PKCS11_STORE=/etc/tpm2_store
   ```

1. 기본 객체를 사용하여 TPM2 토큰을 초기화합니다.

   ```
   sudo tpm2_ptool init
   ```

   사용 가능한 옵션은 다음과 같습니다.  
`hierarchy-auth HIERARCHY_AUTH`  
계층 구조에 기본 객체를 추가할 때 사용하는 인증 비밀번호.  
`primary-auth PRIMARY_AUTH`  
기존 프라이머리 키 객체에 대한 인증 값.  
기본값은 빈 인증 값입니다.  
`primary-handle [PRIMARY_HANDLE]`  
기존 프라이머리 키 객체를 사용합니다.  
기본값: `0x81000001`  
`transient-parents`  
지정된 템플릿의 임시 기본 객체를 사용합니다.  
값: `tpm2-tools-default`,`tpm2-tools-ecc-default`, `tss2-engine-key`   
`path PATH`  
스토어 디렉터리의 위치입니다. 지정한 경우 디렉터리가 존재해야 합니다. 지정하지 않으면 환경 변수 `TPM2_PKCS11_STORE`를 확인하여 검색합니다. 환경 변수도 설정되어 있지 않으면 `/etc/tpm2_pkcs11`을 확인합니다. 해당 디렉터리를 찾을 수 없거나 생성할 수 없으면 기본적으로 현재 작업 디렉터리로 설정됩니다.

## 3단계: 토큰 및 키 생성
<a name="tpm_step3"></a>

1. PKCS\#11 토큰을 생성합니다.

   ```
   sudo tpm2_ptool addtoken —pid=1 —userpin={{USERPIN}} —sopin={{SOPIN}} —label=greengrass
   ```

   사용 가능한 옵션은 다음과 같습니다.  
`--pid PID`  
이 토큰과 연결할 기본 객체 ID입니다.  
`--sopin SOPIN`  
관리자 핀입니다. 이 핀은 객체 복구에 사용됩니다.  
`--userpin USERPIN`  
사용자 핀입니다. 이 핀은 객체 사용을 위한 인증에 사용됩니다.  
`--label LABEL`  
사용 중인 프로파일을 식별하는 고유 레이블은 고유해야 합니다.  
`--hierarchy-auth HIERARCHY_AUTH`  


1. ECC 키 객체를 생성합니다.

   ```
   sudo tpm2_ptool addkey —algorithm=ecc256 —label=greengrass —userpin=****** —key-label=greenkey
   ```  
`--label LABEL`  
키를 가져올 토큰의 레이블을 지정합니다.  
`--key-label KEY_LABEL`  
가져온 키의 레이블을 지정합니다. 기본값은 정수 값입니다.  
`--id ID`  
키 ID입니다. 기본값은 8바이트의 무작위 16진수입니다.  
`--attr-always-authenticate`  
CKA\_ALWAYS\_AUTHENTICATE 속성을 CK\_TRUE로 설정합니다.  
`--hierarchy-auth HIERARCHY_AUTH`  
임시 객체에 필요한 계층 인증을 지정합니다.  
`--sopin SOPIN`  
관리자 핀입니다.  
`--userpin USERPIN`  
사용자 핀입니다.  
`--algorithm`  
{rsa1024,rsa2048,rsa3072,rsa4096,aes128,aes256,ecc224,ecc256,ecc384,ecc521,hmac:sha1,hmac:sha256,hmac:sha384,hmac:sha512}  
 키 유형입니다.

1. 토큰에서 TPM2-TSS 개체를 내보내 인증 데이터를 캡처합니다.

   ```
   yaml_ecc0=$(sudo tpm2_ptool export —label="greengrass" —key-label="greenkey" —userpin="******")
   ```

   출력 예시:

   ```
   > echo $yaml_ecc0
   object-auth: 706c1cad8a5238871b30149705255926
   primary-object:
     auth: ''
     hierarchy: owner
     is_transient: false
   ```
**참고**  
이 명령을 실행한 디렉토리에는 TSS2 프라이빗 키인 `greenkey.pem`이라는 파일이 함께 생성됩니다. 이 키를 사용하여 `tpm2` OpenSSL 공급자로 CSR을 생성할 수 있습니다. TSS2 PRIVATE KEY 파일은 TPM에 의해 보호되며 다른 시스템에서 사용할 수 없습니다. TSS2 키와 OpenSSL 관련 자세한 내용은 [프라이빗 또는 퍼블릭 키 저장](https://github.com/tpm2-software/tpm2-openssl/blob/master/docs/keys.md#storing-the-private-or-a-public-key)을 참조하세요.

1. TSS 프라이빗 키의 인증 데이터를 캡처합니다.

   ```
   auth_ecc0=$(echo "$yaml_ecc0" | grep "object-auth" | cut -d' ' -f2-)
   ```

## 4단계: 인증서 서명 요청(CSR) 생성
<a name="step4"></a>

이 단계에서는 TPM2로 보호된 프라이빗 키를 사용하여 CSR을 생성합니다.

1. TPM2 공급자를 사용하여 CSR을 생성합니다.

   ```
   sudo openssl req -new -provider tpm2 -provider base -key greenkey.pem -passin "pass:$auth_ecc0" -out "$H"$HOSTNAME".csr
   ```

   CSR 생성을 진행하면 다음 정보를 입력하라는 메시지가 표시됩니다.
   + 국가명(2자리 코드)
   + 주 또는 지방 이름
   + 시 이름
   + 조직 이름
   + 조직 단위 이름
   + 일반 이름
   + 이메일 주소

   또는 OpenSSL 구성 파일을 사용하여 무인으로 CSR을 생성할 수도 있습니다. 자세한 내용은 [OpenSSL 설명서](https://docs.openssl.org/3.0/man1/openssl-req/#standard-commands)를 참조하세요.

1. 동일한 시스템에서 CSR을 생성하지 않는 경우 생성된 CSR을 AWS 자격 증명이 구성된 시스템에 복사합니다.

## 5단계: 사물 인증서 생성
<a name="step5"></a>

 AWS IoT 사물 인증서를 생성합니다. 사물 인증서 요청을 승인하는 방법에 대한 자세한 내용은 [사물 인증서 생성](manual-installation.md#create-thing-certificate) 섹션을 참조하세요.

## 6단계: 사물 인증서를 TPM에 가져오기
<a name="step6"></a>

1. 사물 인증서를 디바이스에 복사합니다.

1. 사물 인증서를 Greengrass 토큰에 추가합니다.

   ```
   sudo tpm2_ptool addcert --label=greengrass --key-label=greenkey device.pem.crt
   ```

   사용 가능한 옵션은 다음과 같습니다.  
`--help`  
도움말 메시지를 표시하고 종료합니다.  
`--label LABEL`  
제거할 프로파일 레이블을 지정합니다.  
`--key-label KEY_LABEL`  
관련된 프라이빗 키 레이블을 지정합니다.  
`--key-id KEY_ID`  
관련된 프라이빗 키 ID를 16진수로 지정합니다.  
`cert`  
추가할 X.509 PEM 인증서를 지정합니다.

## 7단계: PKCS\#11 객체 URL 캡처
<a name="step7"></a>

`gnutls-bin` 패키지에서 제공하는 `p11tool`을 사용하여 PKCS\#11 토큰 URL 및 객체 URL을 가져옵니다.

1. Greengrass 토큰의 토큰 URL을 캡처합니다.

   ```
   TOKEN=sudo p11tool --list-token-urls | grep "token=greengrass"
   ```

1. Greengrass 토큰의 객체 URL을 가져옵니다. 3단계에서 사용한 것과 동일한 핀을 사용합니다.

   ```
   sudo p11tool --login --list-all "${TOKEN}"
   ```

   출력 예시:

   ```
   Token 'greengrass' with URL 'pkcs11:model=SLB9672%00%00%00%00%00%00%00%00%00;manufacturer=Infineon;serial=0000000000000000;token=greengrass' requires user PIN
   Enter PIN:
   WARNING: Needed CKA_VALUE but didn't find encrypted blob
   Object 0:
           URL: pkcs11:model=SLB9672%00%00%00%00%00%00%00%00%00;manufacturer=Infineon;serial=0000000000000000;token=greengrass;id=%39%32%37%65%61%64%61%39%31%32%35%31%61%35%37%31;object=greenkey;type=private
           Type: Private key (EC/ECDSA-SECP256R1)
           Label: greenkey
           Flags: CKA_PRIVATE; CKA_NEVER_EXTRACTABLE; CKA_SENSITIVE;
           ID: 39:32:37:65:61:64:61:39:31:32:35:31:61:35:37:31
   
   Object 1:
           URL: pkcs11:model=SLB9672%00%00%00%00%00%00%00%00%00;manufacturer=Infineon;serial=0000000000000000;token=greengrass;id=%39%32%37%65%61%64%61%39%31%32%35%31%61%35%37%31;object=greenkey;type=public
           Type: Public key (EC/ECDSA-SECP256R1)
           Label: greenkey
           ID: 39:32:37:65:61:64:61:39:31:32:35:31:61:35:37:31
   
   Object 2:
           URL: pkcs11:model=SLB9672%00%00%00%00%00%00%00%00%00;manufacturer=Infineon;serial=0000000000000000;token=greengrass;id=%39%32%37%65%61%64%61%39%31%32%35%31%61%35%37%31;object=greenkey;type=cert
           Type: X.509 Certificate (EC/ECDSA-SECP256R1)
           Expires: Fri Dec 31 18:59:59 2049
           Label: greenkey
           ID: 39:32:37:65:61:64:61:39:31:32:35:31:61:35:37:31
   ```

1. 프라이빗 키 및 인증서의 객체 URL을 캡처합니다.

## 8단계: TPM2 지원을 사용하여 Greengrass 구성 및 설치
<a name="step8"></a>

1. 사물 인증서를 구성합니다. 자세한 내용은 [사물 인증서 구성](https://docs.aws.amazon.com/greengrass/v2/developerguide/manual-installation.html#configure-thing-certificate)을 참조하세요.

1. 의 HSM에 프라이빗 키와 인증서를 사용하여 AWS IoT Greengrass 코어 소프트웨어를 설치하는 지침을 완료합니다[AWS IoT Greengrass 코어 소프트웨어 설치](manual-installation.md#run-greengrass-core-v2-installer-manual). 그런 후, 다음 단계를 따라 PKCS\#11 인터페이스를 통해 TPM2를 활용하도록 설치 구성을 진행합니다.

1. Greengrass 설치 프로그램 위치에 PKCS\#11 공급자 구성 요소가 다운로드되어 저장되어 있는지 확인합니다.

1. 텍스트 편집기를 사용하여 `config.yaml` 구성 파일을 생성하고 설치 관리자에 제공합니다. 예를 들어 Linux 기반 시스템에서 다음 명령을 실행하면 GNU `nano`를 사용하여 파일을 생성할 수 있습니다.

   ```
   nano GreengrassInstaller/config.yaml
   ```

1. 다음 YAML 내용을 파일에 복사합니다. 이 부분 구성 파일은 시스템 파라미터, Greengrass nucleus 파라미터 및 PKCS\#11 공급자 파라미터를 지정합니다.

   ```
   ---
   system:
     certificateFilePath: "pkcs11:model=SW%20%20%20TPM%00%00%00%00%00%00%00%00;manufacturer=IBM;serial=0000000000000000;token=greengrass;id=%34%35;object=greenkey;type=cert"
     privateKeyPath: "pkcs11:model=SW%20%20%20TPM%00%00%00%00%00%00%00%00;manufacturer=IBM;serial=0000000000000000;token=greengrass;id=%34%35;object=greenkey;type=private"
     rootCaPath: "/greengrass/v2/AmazonRootCA1.pem"
     rootpath: "/greengrass/v2"
     thingName: "myThing"
   services:
     aws.greengrass.Nucleus:
       componentType: "NUCLEUS"
       version: "2.14.0"
       configuration:
         awsRegion: "us-east-1"
         iotRoleAlias: "GreengrassCoreTokenExchangeRoleAlias"
         iotDataEndpoint: "device-data-prefix-ats.iot.us-west-2.amazonaws.com"
         iotCredEndpoint: "device-credentials-prefix.credentials.iot.us-west-2.amazonaws.com"
     aws.greengrass.crypto.Pkcs11Provider:
       configuration:
         name: "tpm2_pkcs11"
         library: "/usr/lib/x86_64-linux-gnu/pkcs11/libtpm2_pkcs11.so"
         slot: 1
         userPin: "123456"
   ```

1. 설치 환경에 맞는 파라미터로 파일을 편집합니다.

   1. 7단계에서 캡처한 PKCS\#11 URL을 사용하여 certificateFilePath 및 privateKeyPath를 Update certificateFilePath 및 privateKeyPath로 업데이트합니다.

   1.  AWS IoT 엔드포인트를 기반으로 iotDataEndpoint 및 iotCredEndpoint를 업데이트합니다.

   1. `aws.greengrass.crypto.Pkcs11Provider` 구성에서 플랫폼을 기반으로 라이브러리를 업데이트합니다.
**참고**  
위 예시는 X86\_64 아키텍처 기준입니다. ARM64 디바이스의 경우 파일 경로가 유사하나 다를 수 있습니다.

1. [AWS IoT Greengrass 코어 소프트웨어 설치](manual-installation.md#run-greengrass-core-v2-installer-manual)에서 Greengrass 설치 단계를 완료합니다.

## 9단계: 설치 확인
<a name="step9"></a>

이 단계에서는 TPM2 통합이 적용된 Greengrass가 올바르게 실행되고 있는지를 확인합니다.

1. Greengrass 서비스 상태를 확인합니다.

   ```
   sudo systemctl status greengrass.service
   ```

1. 오류가 없는지 확인하기 위해 Greengrass 로그를 확인합니다.

   ```
   sudo tail -f /greengrass/v2/logs/greengrass.log
   ```

1. [AWS IoT 콘솔](https://console.aws.amazon.com/iot)에서 디바이스 연결 상태를 확인합니다.

   1. [AWS IoT Greengrass 콘솔](https://console.aws.amazon.com/greengrass)에 로그인합니다.

   1. **관리**에서 **Greengrass 디바이스**를 확장하고 **코어 디바이스**를 선택합니다.

   1. 디바이스가 연결되어 있는지 확인합니다. 디바이스가 연결되어 있으면 상태가 `HEALTHY`로 표시됩니다. 자세한 내용은 [Greengrass 코어 디바이스 상태 확인](device-status.md) 단원을 참조하십시오.

## 문제 해결
<a name="troubleshoot"></a>

TPM2가 활성화된 Greengrass 디바이스 설정 또는 작동 중에 문제가 발생하면 다음 문제 해결 단계를 시도하세요.
+ 주요 Greengrass 로그 파일을 확인합니다.

  ```
  sudo tail -f /greengrass/v2/logs/greengrass.log
  ```
+ PKCS\#11 공급자 구성을 확인합니다.

  ```
  sudo cat /greengrass/v2/config/effectiveConfig.yaml
  ```
+ TPM2 서비스가 실행 중인지 확인합니다.

  ```
  sudo systemctl status tpm2-abrmd.service
  ```
+ TPM2 키에 액세스할 수 있는지 확인합니다.

  ```
  sudo pkcs11-tool —module /usr/lib/x86_64-linux-gnu/pkcs11/libtpm2_pkcs11.so -l -p 123456 —list-objects
  ```
+ 운영 체제에서 Clevis 또는 systemd-cryptenroll과 같은 TPM2 저장소 루트 키를 사용하는 전체 디스크 암호화가 설정되어 있는 경우, 이 도구들이 사용하는 영구 핸들과 동일한 핸들을 사용하지 않았는지 확인합니다. 동일한 핸들을 사용할 경우, 디스크 암호화 메커니즘에 영향을 줄 수 있습니다. 모든 생성 및 사용 중인 영구 핸들을 확인하려면 다음 명령을 실행합니다.

  ```
  sudo tpm2_getcap handles-persistent
  ```

## 다음 단계
<a name="next-steps"></a>

TPM2가 통합된 Greengrass 코어 디바이스 구성을 성공적으로 완료했으므로, 이제 다음 작업을 수행할 수 있습니다.
+ 보안이 강화된 Greengrass 디바이스에 구성 요소를 배포합니다. 자세한 내용은 [디바이스에 AWS IoT Greengrass 구성 요소 배포](manage-deployments.md) 섹션을 참조하세요.
+ TPM2 통합이 적용된 Greengrass 디바이스를 추가로 설정합니다.

Greengrass 디바이스 보안에 대한 자세한 내용은 [의 보안 AWS IoT Greengrass](security.md) 섹션을 참조하세요.