내용으로 건너뛰기

CloudHSM에서 특정 암호화 기능만 허용하도록 다른 사용자와 키를 공유하려면 어떻게 해야 하나요?

6분 분량
0

사용자는 키를 래핑할 수 있고 다른 사용자는 동일한 키만 래핑할 수 있도록 하고 싶습니다.

간략한 설명

AWS CloudHSM 클러스터의 HSM에 저장된 키에 대한 사용자 액세스를 공유할 수 있습니다. 암호 사용자와 키를 공유하면 해당 사용자는 암호화 기능에 키를 사용할 수 있습니다. 해당 사용자는 키를 삭제, 내보내기, 공유 또는 공유 취소할 수 없습니다. 또한 해당 사용자는 키 속성을 변경할 수 없습니다.

암호화 사용자와 키를 공유하고 사용자를 특정 암호화 기능으로 제한하려면 키를 두 번 내보낸 다음 다시 가져오십시오. 가져온 키 속성은 래핑 또는 언래핑 권한에 따라 변경됩니다. 그런 다음 키를 다른 사용자와 공유하여 줄 바꿈 또는 줄 바꿈 해제 기능을 수행합니다.

해결 방법

클러스터의 모든 사용자 목록

클러스터의 모든 사용자를 나열하려면 CloudHSM 명령줄 인터페이스(CLI)를 사용합니다. 대화형 명령 모드를 사용하고 있는지 확인하세요.

$ /opt/cloudhsm/bin/cloudhsm-cli interactive

암호화폐 사용자로 로그인하세요. 다음 예제 명령은 crypto_user1이라는 암호화 사용자로 로그인하는 방법을 보여줍니다.

aws-cloudhsm > login --username crypto_user1 --role crypto-user

CloudHSM 클러스터의 모든 사용자를 나열하려면 다음 명령을 실행합니다.

aws-cloudhsm > user list

Output:
{
    "error_code": 0,
    "data": {
        "users": [{
                "username": "crypto_user1",
                "role": "crypto-user",
                "locked": "false",
                "mfa": [],
                "quorum": [],
                "cluster-coverage": "full"
            },
            {
                "username": "crypto_user2",
                "role": "crypto-user",
                "locked": "false",
                "mfa": [],
                "quorum": [],
                "cluster-coverage": "full"
            }
        ]
    }
}

AES 대칭 키 생성

CloudHSM CLI를 사용하여 대칭 키를 생성하여 암호화하고 해독할 수 있습니다. RootKey라는 레이블이 있는 AES 256 비트 키를 생성하려면 다음 명령을 실행합니다. 명령어에 줄 바꿈 및 줄 바꿈 해제할 속성을 포함시키십시오.

aws-cloudhsm > key generate-symmetric aes --label rootKey --key-length-bytes 32 --attributes wrap=true unwrap=true

Output:
{
  "error_code": 0,
  "data": {
    "key": {
      "key-reference": "0x00000000000000123",
      "key-info": {
        "key-owners": [
          {
            "username": "crypto_user1",
            "key-coverage": "full"
          }
        ],
        "shared-users": [],
        "cluster-coverage": "full"
      },
      "attributes": {
        "key-type": "aes",
        "label": "rootKey",
        "id": "0x",
        "check-value": "0xabcdefg",
        "class": "secret-key",
        "encrypt": false,
        "decrypt": false,
        "token": true,
        "always-sensitive": true,
        "derive": false,
        "destroyable": true,
        "extractable": true,
        "local": true,
        "modifiable": true,
        "never-extractable": false,
        "private": true,
        "sensitive": true,
        "sign": true,
        "trusted": false,
        "unwrap": true,
        "verify": true,
        "wrap": true,
        "wrap-with-trusted": false,
        "key-length-bytes": 32
      }
    }
  }
}		

출력은 래핑하고 래핑을 해제한 다음 공유할 수 있는 키입니다.

세션 키 생성

SessionKey라는 레이블이 붙은 AES 256 비트 세션 키를 생성하려면 다음 명령을 실행합니다. --session을 지정해야 합니다. \ --attributes wrap=true를 사용하여 랩 속성을 true로 설정합니다.

aws-cloudhsm > key generate-symmetric aes --label sessionKey --key-length-bytes 32 --session --attributes wrap=true unwrap=true

**참고:**세션 키는 세션이 종료된 후 삭제됩니다.

키를 디스크에 쓰고 키를 기밀로 유지

key wrap 명령을 사용하여 대칭 키 RootKey를 로컬 드라이브에 있는 파일로 래핑합니다. rootKey는 세션 키 sessionKey로 암호화됩니다. 이 암호화를 통해 대칭 키 RootKey를 HSM 외부에 일반 텍스트로 저장하지 않아도 됩니다. rootKey를 로컬 드라이브에 래핑한 후 key unwrap 명령을 사용하여 rootKey을 HSM으로 다시 가져옵니다. HSM 내에 rootKey의 복사본을 만듭니다. 그런 다음 rootKey 복사본의 속성을 변경하여 키가 사용되는 방식을 제한합니다.

다음 예제에서는 sessionKeyrootKey를 래핑한 다음 로컬 드라이브에 root.key 파일로 저장합니다.

aws-cloudhsm > key wrap aes-gcm --payload-filter attr.label=rootKey --wrapping-filter attr.label=sessionKey --tag-length-bits 64 --aad 0x10 --path root.key

Output:
{
  "error_code": 0,
  "data": {
    "payload-key-reference": "0x0000000000120000",
    "wrapping-key-reference": "0x0000000000220000",
    "iv": "0xabcdefghijklmno123456789",
    "wrapped-key-data": "abcdefghi123456789123456789123456789123456789123456789=="
  }
}

중요: 출력에서 반환되는 iv 값에 주목하세요. 나중에 이 값을 사용하게 됩니다.

로컬 디렉터리에서 래핑된 키를 보려면 ls 명령을 사용합니다.

키를 새 레이블과 함께 HSM으로 다시 가져오기

root.key 키를 HSM으로 다시 가져오려면 key unwrap 명령을 사용합니다. sessionKey는 암호화된 root.key 파일을 HSM으로 다시 복호화합니다. 다음 예제에서는 새 키를 정의합니다: shared_rootKey1shared_rootKey2. key wrap 명령 출력에서 iv를 정의해야 합니다.

 aws-cloudhsm > key unwrap aes-gcm --key-type-class aes --label shared_rootKey1 --filter attr.label=sessionKey --tag-length-bits 64  --aad 0x10 --iv 0xabcdefghijklmno123456789 --data-path root.key --attributes wrap=true

참고: shared_rootKey1wrap=true 속성이 있는지 확인합니다.

 aws-cloudhsm > key unwrap aes-gcm --key-type-class aes --label shared_rootKey2 --filter attr.label=sessionKey --tag-length-bits 64  --aad 0x10 --iv 0xabcdefghijklmno123456789 --data-path root.key --attributes unwrap=true

참고: shared_rootKey2unwrap=true 속성이 있는지 확인합니다.

키 레이블 확인 및 속성 할당

crypto_user1가 소유한 모든 키 레이블을 확인하려면 다음 명령을 실행합니다. 각 키 레이블에 대해 다음 필터를 지정합니다.

  • shared_rootKey1wrap=true, unwrap=false 속성을 가집니다.
  • shared_rootKey2wrap=false, unwrap=true 속성을 가집니다.
aws-cloudhsm > key list --verbose --filter attr.label=shared_rootKey1

aws-cloudhsm > key list --verbose --filter attr.label=shared_rootKey2

모든 속성이 올바르게 설정되었는지 확인

share_rootKey1는 키를 래핑할 수 있고 share_rootKey2는 키 래핑만 해제할 수 있는지 확인하려면 두 키를 동일한 키 재질에 대한 래핑 키로 사용합니다.

share_rootKey2를 사용하여 rootKey를 래핑하려면 다음 명령을 실행합니다.

aws-cloudhsm > key wrap aes-gcm --payload-filter attr.label=rootKey --wrapping-filter attr.label=shared_rootKey2 --tag-length-bits 64 --aad 0x10 --path test_root.key
Output:
{
  "error_code": 1,
  "data": "Key can not be used for wrapping."
}

이 명령은 share_rootKey2false 래핑 속성이 있기 때문에 실패합니다.

share_rootKey1를 사용하여 rootKey를 래핑하려면 다음 명령을 실행합니다.

aws-cloudhsm > key wrap aes-gcm --payload-filter attr.label=rootKey --wrapping-filter attr.label=shared_rootKey1 --tag-length-bits 64 --aad 0x10 --path test_root.key

Output:
{
  "error_code": 0,
  "data": {
    "payload-key-reference": "0x0000000000220000",
    "wrapping-key-reference": "0x0000000000330000",
    "iv": "0x123456abcdefghijklmno123",
    "wrapped-key-data": "123456abcdefghi123456789123456789123456789123456789123=="
  }
}

이 명령은 share_rootKey1에 wrap 속성 true가 있으므로 성공합니다.

암호화폐 사용자와 키 공유

key share 명령을 사용하여 crypto_user2와 키를 공유합니다. crypto_user2 사용자는 허용된 암호화 기능에 키를 사용할 수 있지만 키 속성을 삭제, 내보내기, 공유, 공유 해제 또는 변경할 수 없습니다. 키를 공유하려면 다음 명령을 실행합니다.

aws-cloudhsm > key share --filter attr.label="shared_rootKey1" attr.class=secret-key --username crypto_user2 --role crypto-user

Output:
{
  "error_code": 0,
  "data": {
    "message": "Key shared successfully"
  }
}

aws-cloudhsm > key share --filter attr.label="shared_rootKey2" attr.class=secret-key --username crypto_user2 --role crypto-user

Output:
{
  "error_code": 0,
  "data": {
    "message": "Key shared successfully"
  }
}

디스크와 HSM 간의 WrapKey 명령 기능 테스트

crypto_user2로 로그인하여 CloudHSM CLI로 키의 기능을 확인합니다. crypto_user2shared_rootKey1를 사용하여 래핑할 수 있는지, 사용자가 shared_rootKey2을 사용하여 래핑을 해제할 수 있는지 테스트합니다.

테스트 키를 생성하려면 다음 명령을 실행합니다.

aws-cloudhsm > key generate-symmetric aes --label testKey --key-length-bytes 32 --session

다음 예와 같이 shared_rootKey1를 사용하여 testKey를 래핑하고 test.key 파일로 저장합니다.

aws-cloudhsm > key wrap aes-gcm --payload-filter attr.label=testKey --wrapping-filter attr.label=shared_rootKey1 --tag-length-bits 64 --aad 0x10 --path test.key

Output:
{
  "error_code": 0,
  "data": {
    "payload-key-reference": "0x0000000000aa0000",
    "wrapping-key-reference": "0x0000000000bb0000",
    "iv": "0x00abcd123abcdefghijklmno",
    "wrapped-key-data": "xyz123abcdefghi123456789123456789123456789123456789123=="
  }
}

중요: 출력에서 반환되는 iv 값에 주목하세요. 나중에 이 값을 사용하게 됩니다.

다음 명령과 같이 shared_rootKey2를 사용하여 testKey의 래핑을 해제합니다.

aws-cloudhsm >key unwrap aes-gcm --key-type-class aes --label imported_testKey --filter attr.label=shared_rootKey2 --tag-length-bits 64  --aad 0x10 --iv 0x00abcd123abcdefghijklmno --data-path test.key

crypto_user2가 키의 속성을 변경할 수 없는지 확인하려면 다음 명령을 실행합니다.

 aws-cloudhsm > key set-attribute --filter attr.label=shared_rootKey1 --name unwrap --value true
{
  "error_code": 1,
  "data": "The current user does not have adequate key permissions to perform the key operation"
  }

관련 정보

클라우드HSM CLI 명령에 대한 참조

클러스터 활성화

AWS 공식업데이트됨 2년 전