FHIR 서비스에 대한 고객 관리형 키 구성

CMK(고객 관리형 키)를 사용하면 사용자가 만들고 관리하는 키를 통해 조직의 데이터에 대한 액세스를 보호하고 제어할 수 있습니다. Azure Key Vault를 사용하여 CMK를 만들고 관리한 다음, 키를 사용하여 FHIR® 서비스에 저장된 데이터를 암호화합니다.

고객 관리형 키를 사용하면 다음을 수행할 수 있습니다.

  • 사용자 고유의 암호화 키를 만들어 키 자격 증명 모음에 저장하거나 Azure Key Vault API를 사용하여 키를 생성할 수 있습니다.

  • 키 순환을 포함하여 키의 수명 주기의 완전한 제어와 책임을 유지합니다.

필수 조건

  • 고객 관리형 키의 모범 사례를 잘 알고 있어야 합니다.

  • Azure 리소스를 만들고 수정할 수 있는 Azure 기여자 RBAC 역할이 할당되었는지 확인합니다.

  • Azure Key Vault에서 FHIR 서비스의 키를 추가합니다. 단계는 A를 참조하세요. 고객 관리형 키는 다음 요구 사항을 충족해야 합니다.

    • 키의 버전이 지정됩니다.

    • 키 유형은 RSA입니다.

    • 키는 2048비트 또는 3072비트입니다.

    • 키 자격 증명 모음은 만든 리소스와 동일한 영역에 있지만 다른 Azure 구독 또는 테넌트에 있을 수 있습니다.

    • 키 자격 증명 모음 이름과 키 이름을 결합한 길이는 94자를 초과할 수 없습니다.

    • 방화벽과 함께 키 자격 증명 모음을 사용하여 공용 액세스를 사용하지 않도록 설정하는 경우 신뢰할 수 있는 Microsoft 서비스가 이 방화벽을 우회하도록 허용하는 옵션을 사용하도록 설정해야 합니다.

    • FHIR 서비스의 암호화 키가 손실되지 않도록 하려면 키 자격 증명 모음 또는 관리되는 HSM에 일시 삭제제거 보호가 사용하도록 설정되어 있어야 합니다. 이러한 기능을 사용하면 특정 시간(기본 90일) 동안 삭제된 키를 복구하고 해당 기간이 종료될 때까지 영구 삭제를 차단할 수 있습니다.

참고 항목

FHIR 서비스는 하나의 ID 유형(시스템이 할당한 ID 또는 사용자가 할당한 ID) 연결을 지원합니다. ID 유형이 이미 매핑된 경우 ID 유형을 변경하면 내보내기 및 가져오기와 같은 백그라운드 작업에 영향을 미칠 수 있습니다.

암호화 키로 FHIR 서비스 업데이트

키를 추가한 후에는 키 URL로 FHIR 서비스를 업데이트해야 합니다.

  1. 키 자격 증명 모음에서 를 선택합니다.

  2. FHIR 서비스의 키를 선택합니다.

Screenshot of the Keys page and the key to use with the FHIR service.

  1. 키 버전을 선택합니다.

  2. 키 식별자를 복사합니다. ARM 템플릿을 사용하여 키를 업데이트할 때 키 URL이 필요합니다.

Screenshot showing the key version details and the copy action for the Key Identifier.

Azure Portal 또는 ARM 템플릿을 사용하여 FHIR 서비스의 키를 업데이트합니다. 업데이트하는 동안 시스템이 할당한 관리 ID 또는 사용자가 할당한 관리 ID 사용 여부를 선택합니다. 시스템이 할당한 관리 ID의 경우 Key Vault Crypto Service 암호화 사용자 역할을 할당해야 합니다. 자세한 내용은 Azure Portal을 사용하여 Azure 역할 할당을 참조하십시오.

Azure Portal을 사용하여 키 업데이트

  1. Azure Portal에서 FHIR 서비스로 이동한 다음, 왼쪽 창에서 암호화를 선택합니다.

  2. 암호화 유형으로 고객 관리형 키 사용를 선택합니다.

  3. 키 자격 증명 모음 및 키를 선택하거나 이전에 만든 키의 키 URI를 입력합니다.

  4. 이전에 구성한 관리 ID 유형과 일치하는 ID 유형(시스템 할당 또는 사용자 할당)을 선택합니다.

  5. 저장을 선택하여 고객 관리형 키를 사용하도록 FHIR 서비스를 업데이트합니다.

Screenshot of the Encryption view, showing the selection of the Customer-managed key option, key vault settings, identity type settings, and Save button.

ARM 템플릿을 사용하여 키 업데이트

Azure Portal을 사용하여 사용자 지정 템플릿을 배포하고 ARM 템플릿 중 하나를 사용하여 키를 업데이트합니다. 자세한 내용은 Azure Portal을 사용하여 ARM 템플릿 만들기 및 배포를 참조하세요.

시스템이 할당한 관리 ID의 ARM 템플릿

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "workspaceName": {
            "type": "String"
        },
        "fhirServiceName": {
            "type": "String"
        },
        "keyEncryptionKeyUrl": {
            "type": "String"
        },
        "region": {
            "defaultValue": "West US 3",
            "type": "String"
        }
    },
    "resources": [
        {
            "type": "Microsoft.HealthcareApis/workspaces/fhirservices",
            "apiVersion": "2023-06-01-preview",
            "name": "[concat(parameters('workspaceName'), '/', parameters('fhirServiceName'))]",
            "location": "[parameters('region')]",
            "identity": {
                "type": "SystemAssigned"
            },
            "properties": {
                "encryption": {
                    "customerManagedKeyEncryption": {
                        "keyEncryptionKeyUrl": "[parameters('keyEncryptionKeyUrl')]"
                    }
                }
            }
        }
    ]
}

사용자가 할당한 관리 ID의 ARM 템플릿

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "workspaceName": {
            "type": "String"
        },
        "fhirServiceName": {
            "type": "String"
        },
        "keyVaultName": {
            "type": "String"
        },
        "keyName": {
            "type": "String"
        },
        "userAssignedIdentityName": {
            "type": "String"
        },
        "roleAssignmentName": {
            "type": "String"
        },
        "region": {
            "defaultValue": "West US 3",
            "type": "String"
        },
        "tenantId": {
            "type": "String"
        }
    },
    "resources": [
        {
            "type": "Microsoft.KeyVault/vaults",
            "apiVersion": "2022-07-01",
            "name": "[parameters('keyVaultName')]",
            "location": "[parameters('region')]",
            "properties": {
              "accessPolicies": [],
              "enablePurgeProtection": true,
              "enableRbacAuthorization": true,
              "enableSoftDelete": true,
              "sku": {
                "family": "A",
                "name": "standard"
              },
              "tenantId": "[parameters('tenantId')]"
            }
        },
        {
            "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
            "apiVersion": "2023-01-31",
            "name": "[parameters('userAssignedIdentityName')]",
            "location": "[parameters('region')]"
        },
        {
            "type": "Microsoft.KeyVault/vaults/keys",
            "apiVersion": "2022-07-01",
            "name": "[concat(parameters('keyVaultName'), '/', parameters('keyName'))]",
            "properties": {
              "attributes": {
                "enabled": true
              },
              "curveName": "P-256",
              "keyOps": [ "unwrapKey","wrapKey" ],
              "keySize": 2048,
              "kty": "RSA"
            },
            "dependsOn": [
                "[resourceId('Microsoft.KeyVault/vaults/', parameters('keyVaultName'))]"
            ]
        },
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2021-04-01-preview",
            "name": "[guid(parameters('roleAssignmentName'))]",
            "properties": {
              "roleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', '14b46e9e-c2b7-41b4-b07b-48a6ebf60603')]",
              "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName'))).principalId]"
            },
            "dependsOn": [
                "[resourceId('Microsoft.KeyVault/vaults/keys', parameters('keyVaultName'), parameters('keyName'))]",
                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName'))]"
            ]
        },
        {
            "type": "Microsoft.HealthcareApis/workspaces",
            "name": "[parameters('workspaceName')]",
            "apiVersion": "2022-05-15",
            "location": "[parameters('region')]"
        },
        {
            "type": "Microsoft.HealthcareApis/workspaces/fhirservices",
            "apiVersion": "2023-06-01-preview",
            "name": "[concat(parameters('workspaceName'), '/', parameters('fhirServiceName'))]",
            "location": "[parameters('region')]",
            "dependsOn": [
                "[resourceId('Microsoft.HealthcareApis/workspaces', parameters('workspaceName'))]",
                "[resourceId('Microsoft.Authorization/roleAssignments', guid(parameters('roleAssignmentName')))]"
            ],
            "identity": {
                "type": "userAssigned",
                "userAssignedIdentities": {
                    "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities/', parameters('userAssignedIdentityName'))]": {}
                }
            },
            "properties": {
                "encryption": {
                    "customerManagedKeyEncryption": {
                        "keyEncryptionKeyUrl": "[reference(resourceId('Microsoft.KeyVault/vaults/keys', parameters('keyVaultName'), parameters('keyName'))).keyUriWithVersion]"
                    }
                }
            }
        }
    ]
}
  1. 메시지가 표시되면 리소스 그룹, 지역, 작업 영역, FHIR 서비스 이름의 값을 선택합니다.

    • 시스템이 할당한 관리 ID를 사용하는 경우 키 암호화 키 URL 필드의 키 자격 증명 모음에서 복사한 키 식별자를 입력합니다.
    • 사용자가 할당한 관리 ID를 사용하는 경우 키 자격 증명 모음 이름, 키 이름, 사용자 할당 ID 이름, 테넌트 ID의 값을 입력합니다.
  2. 검토 + 만들기를 선택하여 키에 업데이트를 배포합니다.

Screenshot of the deployment template with details, including Key Encryption Key URL filled in.

FHIR 서비스를 만들 때 키 구성

FHIR 서비스와 함께 사용자가 할당한 관리 ID를 사용하는 경우 FHIR 서비스를 만드는 동시에 고객 관리형 키를 구성할 수 있습니다.

  1. FHIR 서비스 만들기 페이지에서 FHIR 서비스 이름을 입력합니다.

  2. 다음: 보안을 선택합니다.

Screenshot of the Create FHIR service view with the FHIR service name filled in.

  1. 보안 탭의 암호화 섹션에서 고객 관리형 키를 선택합니다.

  2. 키 자격 증명 모음에서 선택 또는 키 URI 입력을 선택한 다음, 키를 입력합니다.

  3. 사용자가 할당한 관리 ID를 사용할 ID 선택을 선택합니다. 사용자가 할당한 관리 ID 선택 페이지에서 관리 ID를 필터링한 다음 선택합니다. 추가를 선택합니다.

  4. 보안 탭에서 검토 + 만들기를 선택합니다.

Screenshot of the Security tab with the Customer-managed key option selected.

  1. 검토 + 만들기 탭에서 구성 옵션의 요약 및 유효성 검사 성공 메시지를 검토합니다. 만들기를 선택하여 고객 관리형 키로 FHIR 서비스를 배포합니다.

Screenshot of the Review + create tab with the selected options and validation success message shown.

키 액세스 손실에서 복구

FHIR 서비스가 제대로 작동하려면 항상 키 자격 증명 모음의 키에 액세스할 수 있어야 합니다. 그러나 다음을 포함하여 서비스에서 키에 대한 액세스 권한을 잃을 수 있는 시나리오가 있습니다.

  • 키를 사용할 수 없게 되거나 키가 키 자격 증명 모음에서 삭제됩니다.

  • FHIR 서비스 시스템이 할당한 관리 ID를 사용할 수 없습니다.

  • FHIR 서비스 시스템이 할당한 관리 ID는 키 자격 증명 모음에 대한 액세스 권한을 잃게 됩니다.

FHIR 서비스가 키에 액세스할 수 없는 시나리오에서 API 요청은 500 오류와 함께 반환되며 키에 대한 액세스가 복원될 때까지 데이터에 액세스할 수 없습니다.

키 액세스가 손실된 경우 FHIR 서비스에서 액세스할 수 있도록 키 및 필수 리소스를 업데이트했는지 확인합니다.

일반적인 오류 해결

데이터베이스에 액세스할 수 없도록 하는 일반적인 오류는 일반적으로 구성 문제로 인해 발생합니다. 자세한 내용은 고객 관리형 키의 일반적인 오류를 참조하세요.

참고 항목

FHIR®은 HL7의 등록 상표이며, HL7의 사용 허가 하에 사용됩니다.