Dağıtım verilerini şifreleme

ACI hizmeti, Azure Container Instances (ACI) kaynaklarını bulutta çalıştırırken kapsayıcılarınızla ilgili verileri toplar ve kalıcı hale toplar. ACI, bulutta kalıcı hale geldiğinde bu verileri otomatik olarak şifreler. Bu şifreleme, kuruluşunuzun güvenlik ve uyumluluk taahhütlerini karşılamaya yardımcı olmak için verilerinizi korur. ACI ayrıca bu verileri kendi anahtarınız ile şifreleme seçeneği de sunarak ACI dağıtımlarınızla ilgili veriler üzerinde daha fazla denetim sahibi olmanıza neden oluyor.

ACI veri şifrelemesi hakkında

ACI'daki veriler 256 bit AES şifrelemesi kullanılarak şifrelenir ve şifresi çözülür. Tüm ACI dağıtımları için etkinleştirilir ve bu şifrelemeden yararlanmak için dağıtımınızı veya kapsayıcılarınızı değiştirmeniz gerekmez. Buna dağıtım hakkındaki meta veriler, ortam değişkenleri, kapsayıcılarınıza geçirilen anahtarlar ve kapsayıcılarınız durdurulduktan sonra kalıcı hale gelen günlükler dahildir; böylece bunları görmeye devam edebilirsiniz. Şifreleme, kapsayıcı grubu performansınızı etkilemez ve şifreleme için ek maliyet yoktur.

Kapsayıcı verilerinizi şifrelemek için Microsoft tarafından yönetilen anahtarlara güvenebilir veya şifrelemeyi kendi anahtarlarınızla yönetebilirsiniz. Aşağıdaki tablo bu seçenekleri karşılaştırır:

Microsoft tarafından yönetilen anahtarlar Müşteri tarafından yönetilen anahtarlar
Şifreleme/şifre çözme işlemleri Azure Azure
Anahtar depolama Microsoft anahtar deposu Azure Key Vault
Anahtar döndürme sorumluluğu Microsoft Müşteri
Anahtar erişimi Yalnızca Microsoft Microsoft, Müşteri

Bu makalede, verileri müşteri tarafından yönetilen bir anahtarla şifrelemek için iki akış incelenir:

  • Verileri standart bir Azure Key Vault depolanan müşteri tarafından yönetilen bir anahtarla şifreleme
  • Güvenilen Hizmetler'in etkinleştirildiği ağ korumalı bir Azure Key Vault depolanan müşteri tarafından yönetilen bir anahtarla verileri şifreleyin.

Verileri standart bir Azure Key Vault depolanan müşteri tarafından yönetilen bir anahtarla şifreleme

Önkoşullar

ACI için Hizmet Sorumlusu Oluşturma

İlk adım, Azure kiracınızın Azure Container Instances hizmetine izin vermek için atanmış bir hizmet sorumlusuna sahip olduğundan emin olmaktır.

Önemli

Aşağıdaki komutu çalıştırmak ve hizmet sorumlusunu başarıyla oluşturmak için kiracınızda hizmet sorumluları oluşturma izinlerinizin olduğunu onaylayın.

Aşağıdaki CLI komutu Azure ortamınızda ACI SP'yi ayarlar:

az ad sp create --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9

Bu komutu çalıştırmanın çıktısı size "displayName" ile ayarlanmış bir hizmet sorumlusu göstermelidir: "Azure Container Instance Service."

Hizmet sorumlusunu başarıyla oluşturamıyorsanız:

  • kiracınızda izinlerinizin olduğunu onaylayın
  • ACI'ye dağıtmak üzere kiracınızda zaten bir hizmet sorumlusu olup olmadığını denetleyin. Bunun yerine bu hizmet sorumlusunu çalıştırıp az ad sp show --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9 kullanabilirsiniz

Key Vault kaynağı oluşturma

Azure portal, Azure CLI veya Azure PowerShell kullanarak AzureKey Vault oluşturun.

Anahtar kasanızın özellikleri için aşağıdaki yönergeleri kullanın:

  • Ad: Benzersiz bir ad gereklidir.
  • Abonelik: Bir abonelik seçin.
  • Kaynak Grubu'nun altında var olan bir kaynak grubunu seçin veya yeni oluşturup bir kaynak grubu adı girin.
  • Konum açılır menüsünde bir konum seçin.
  • Diğer seçenekleri varsayılanlarına bırakabilir veya ek gereksinimlere göre seçebilirsiniz.

Önemli

Müşteri tarafından yönetilen anahtarları kullanarak ACI dağıtım şablonunu şifrelerken anahtar kasasında aşağıdaki iki özelliğin ayarlanması önerilir: Geçici Silme ve Temizleme. Bu özellikler varsayılan olarak etkin değildir, ancak yeni veya mevcut bir anahtar kasasında PowerShell veya Azure CLI kullanılarak etkinleştirilebilir.

Yeni anahtar oluşturma

Anahtar kasanız oluşturulduktan sonra Azure portal'da kaynağa gidin. Kaynak dikey penceresinin sol gezinti menüsünde, Ayarlar'ın altında Anahtarlar'a tıklayın. "Anahtarlar" görünümünde "Oluştur/İçeri Aktar" seçeneğine tıklayarak yeni bir anahtar oluşturun. Bu anahtar için herhangi bir benzersiz Ad ve gereksinimlerinize göre diğer tercihleri kullanın.

Yeni anahtar oluşturma

Erişim ilkesini ayarlama

ACI hizmetinin Anahtarınıza erişmesine izin vermek için yeni bir erişim ilkesi oluşturun.

  • Anahtarınız oluşturulduktan sonra anahtar kasası kaynak dikey pencerenize dönün ve Ayarlar'ın altında Erişim İlkeleri'ne tıklayın.
  • Anahtar kasanızın "Erişim İlkeleri" sayfasında Erişim İlkesi Ekle'ye tıklayın.
  • Anahtar İzinleriniAlma ve Anahtar Kümesini Açmaanahtar izinlerini içerecek şekilde ayarlayın
  • Sorumlu Seç için Azure Container Instance Service'i seçin
  • Alttaki Ekle'ye tıklayın

Erişim ilkesi artık anahtar kasanızın erişim ilkelerinde gösterilmelidir.

Yeni erişim ilkesi

JSON dağıtım şablonunuzu değiştirme

Önemli

Dağıtım verilerini müşteri tarafından yönetilen bir anahtarla şifreleme, şu anda kullanıma sunulan en son API sürümünde (2019-12-01) kullanılabilir. Dağıtım şablonunuzda bu API sürümünü belirtin. Bununla ilgili herhangi bir sorun yaşıyorsanız lütfen Azure Desteği'ne ulaşın.

Anahtar kasası anahtarı ve erişim ilkesi ayarlandıktan sonra ACI dağıtım şablonunuza aşağıdaki özellikleri ekleyin. Öğretici: Resource Manager şablonu kullanarak çok kapsayıcılı grup dağıtma bölümünde şablonla ACI kaynaklarını dağıtma hakkında daha fazla bilgi edinin.

  • altında resourcesolarak ayarlayın apiVersion2019-12-01.
  • Dağıtım şablonunun kapsayıcı grubu özellikleri bölümünün altına aşağıdaki değerleri içeren bir encryptionPropertiesekleyin:
    • vaultBaseUrl: Anahtar kasanızın DNS Adı, Portalda anahtar kasası kaynağının genel bakış dikey penceresinde bulunabilir
    • keyName: daha önce oluşturulan anahtarın adı
    • keyVersion: anahtarın geçerli sürümü. Bu, anahtarın kendisine tıklayarak bulunabilir (anahtar kasası kaynağınızın Ayarlar bölümündeki "Anahtarlar" altında)
  • Kapsayıcı grubu özelliklerinin altına değerine Standardsahip bir sku özellik ekleyin. sku Özelliği API sürüm 2019-12-01'de gereklidir.

Aşağıdaki şablon parçacığı, dağıtım verilerini şifrelemek için bu ek özellikleri gösterir:

[...]
"resources": [
    {
        "name": "[parameters('containerGroupName')]",
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2019-12-01",
        "location": "[resourceGroup().location]",    
        "properties": {
            "encryptionProperties": {
                "vaultBaseUrl": "https://example.vault.azure.net",
                "keyName": "acikey",
                "keyVersion": "xxxxxxxxxxxxxxxx"
            },
            "sku": "Standard",
            "containers": {
                [...]
            }
        }
    }
]

Öğretici: Resource Manager şablonu kullanarak çok kapsayıcılı bir grup dağıtma altındaki şablondan uyarlanmış eksiksiz bir şablon aşağıdadır.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "containerGroupName": {
      "type": "string",
      "defaultValue": "myContainerGroup",
      "metadata": {
        "description": "Container Group name."
      }
    }
  },
  "variables": {
    "container1name": "aci-tutorial-app",
    "container1image": "mcr.microsoft.com/azuredocs/aci-helloworld:latest",
    "container2name": "aci-tutorial-sidecar",
    "container2image": "mcr.microsoft.com/azuredocs/aci-tutorial-sidecar"
  },
  "resources": [
    {
      "name": "[parameters('containerGroupName')]",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2019-12-01",
      "location": "[resourceGroup().location]",
      "properties": {
        "encryptionProperties": {
            "vaultBaseUrl": "https://example.vault.azure.net",
            "keyName": "acikey",
            "keyVersion": "xxxxxxxxxxxxxxxx"
        },
        "sku": "Standard",  
        "containers": [
          {
            "name": "[variables('container1name')]",
            "properties": {
              "image": "[variables('container1image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              },
              "ports": [
                {
                  "port": 80
                },
                {
                  "port": 8080
                }
              ]
            }
          },
          {
            "name": "[variables('container2name')]",
            "properties": {
              "image": "[variables('container2image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              }
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "protocol": "tcp",
              "port": "80"
            },
            {
                "protocol": "tcp",
                "port": "8080"
            }
          ]
        }
      }
    }
  ],
  "outputs": {
    "containerIPv4Address": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups/', parameters('containerGroupName'))).ipAddress.ip]"
    }
  }
}

Kaynaklarınızı dağıtma

Şablon dosyasını masaüstünüzde oluşturup düzenlediyseniz, dosyayı içine sürükleyerek Cloud Shell dizininize yükleyebilirsiniz.

az group create komutuyla bir kaynak grubu oluşturun.

az group create --name myResourceGroup --location eastus

şablonu az deployment group create komutuyla dağıtın.

az deployment group create --resource-group myResourceGroup --template-file deployment-template.json

Birkaç saniye içinde Azure’dan bir ilk yanıt almanız gerekir. Dağıtım tamamlandıktan sonra, ACI hizmeti tarafından kalıcı hale gelen onunla ilgili tüm veriler sağladığınız anahtarla şifrelenir.

Güvenilen Hizmetler etkinken ağ korumalı Azure Key Vault müşteri tarafından yönetilen bir anahtarla verileri şifreleme

Key Vault kaynağı oluşturma

Azure portal, Azure CLI veya Azure PowerShell kullanarak AzureKey Vault oluşturun. Başlamak için, kasaya gerekli anahtarları ekleyebilmemiz için herhangi bir ağ sınırlaması uygulamayın. Sonraki adımlarda ağ sınırlamaları ekleyecek ve güvenilen hizmetleri etkinleştireceğiz.

Anahtar kasanızın özellikleri için aşağıdaki yönergeleri kullanın:

  • Ad: Benzersiz bir ad gereklidir.
  • Abonelik: Bir abonelik seçin.
  • Kaynak Grubu'nun altında var olan bir kaynak grubunu seçin veya yeni oluşturup bir kaynak grubu adı girin.
  • Konum açılır menüsünde bir konum seçin.
  • Diğer seçenekleri varsayılan olarak bırakabilir veya ek gereksinimlere göre seçebilirsiniz.

Önemli

ACI dağıtım şablonunu şifrelemek için müşteri tarafından yönetilen anahtarları kullanırken anahtar kasasında aşağıdaki iki özelliğin ayarlanması önerilir: Geçici Silme ve Temizleme. Bu özellikler varsayılan olarak etkin değildir, ancak yeni veya mevcut bir anahtar kasasında PowerShell veya Azure CLI kullanılarak etkinleştirilebilir.

Yeni anahtar oluşturma

Anahtar kasanız oluşturulduktan sonra Azure portal'daki kaynağa gidin. Kaynak dikey penceresinin sol gezinti menüsünde, Ayarlar'ın altında Anahtarlar'a tıklayın. "Anahtarlar" görünümünde "Oluştur/İçeri Aktar" seçeneğine tıklayarak yeni bir anahtar oluşturun. Bu anahtar için herhangi bir benzersiz Ad ve gereksinimlerinize göre diğer tercihleri kullanın. Sonraki adımlar için anahtar adını ve sürümünü yakalamayı unutmayın.

Anahtar oluşturma ayarlarının ekran görüntüsü, PNG.

Kapsayıcı grubunuz için kullanıcı tarafından atanan yönetilen kimlik oluşturma

az identity create komutunu kullanarak aboneliğinizde bir kimlik oluşturun . Anahtar kasasını oluşturmak için kullanılan kaynak grubunu kullanabilir veya farklı bir kaynak grubu kullanabilirsiniz.

az identity create \
  --resource-group myResourceGroup \
  --name myACIId

Aşağıdaki adımlarda kimliği kullanmak için az identity show komutunu kullanarak kimliğin hizmet sorumlusu kimliğini ve kaynak kimliğini değişkenlerde depolayın.

# Get service principal ID of the user-assigned identity
spID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query principalId --output tsv)

Erişim ilkesini ayarlama

Kullanıcı tarafından atanan kimliğin şifreleme amacıyla anahtarınıza erişmesine ve anahtarınızı açmasına izin vermek için yeni bir erişim ilkesi oluşturun.

az keyvault set-policy \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --object-id $spID \
    --key-permissions get unwrapKey

Azure Key Vault ağ izinlerini değiştirme

Aşağıdaki komutlar Azure Key Vault için bir Azure Güvenlik Duvarı ayarlar ve ACI gibi Azure Güvenilen Hizmetler'e erişim izni verir.

az keyvault update \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --default-action Deny
az keyvault update \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --bypass AzureServices

JSON dağıtım şablonunuzu değiştirme

Önemli

Dağıtım verilerini müşteri tarafından yönetilen bir anahtarla şifreleme, 2022-09-01 API sürümünde veya daha yeni bir sürümde kullanılabilir. 2022-09-01 API sürümü yalnızca ARM veya REST aracılığıyla kullanılabilir. Bununla ilgili herhangi bir sorun yaşıyorsanız lütfen Azure Desteği'ne ulaşın. Anahtar kasası anahtarı ve erişim ilkesi ayarlandıktan sonra ACI dağıtım şablonunuza aşağıdaki özellikleri ekleyin. ACI kaynaklarını şablonla dağıtma hakkında daha fazla bilgi edinmek için Öğretici: Resource Manager şablonu kullanarak çok kapsayıcılı bir grup dağıtma.

  • altında resourcesolarak ayarlayın apiVersion2022-09-01.
  • Dağıtım şablonunun kapsayıcı grubu özellikleri bölümünün altına aşağıdaki değerleri içeren bir encryptionPropertiesekleyin:
    • vaultBaseUrl: anahtar kasanızın DNS Adı. Bu, Portaldaki anahtar kasası kaynağının genel bakış dikey penceresinde bulunabilir
    • keyName: daha önce oluşturulan anahtarın adı
    • keyVersion: anahtarın geçerli sürümü. Bu, anahtarın kendisine tıklayarak bulunabilir (anahtar kasası kaynağınızın Ayarlar bölümündeki "Anahtarlar" bölümünde)
    • identity: Bu, daha önce oluşturulan Yönetilen Kimlik örneğinin kaynak URI'sidir
  • Kapsayıcı grubu özelliklerinin altına değerine Standardsahip bir sku özellik ekleyin. sku özelliği API sürüm 2022-09-01'de gereklidir.
  • Kaynaklar'ın identity altında, aşağıdaki değerleri içeren ACI ile Yönetilen Kimliği kullanmak için gereken nesneyi ekleyin:
    • type: kullanılan kimliğin türü (kullanıcı tarafından atanan veya sistem tarafından atanan). Bu durum "UserAssigned" olarak ayarlanır
    • userAssignedIdentities: nesnesinde yukarıda kullanılan aynı kullanıcı tarafından atanan kimliğin resourceURI'si encryptionProperties .

Aşağıdaki şablon parçacığı, dağıtım verilerini şifrelemek için bu ek özellikleri gösterir:

[...]
"resources": [
    {
        "name": "[parameters('containerGroupName')]",
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2019-12-01",
        "location": "[resourceGroup().location]",    
        "identity": {
         "type": "UserAssigned",
         "userAssignedIdentities": {
           "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {}
         }
        },
        "properties": {
            "encryptionProperties": {
                "vaultBaseUrl": "https://example.vault.azure.net",
                "keyName": "acikey",
                "keyVersion": "xxxxxxxxxxxxxxxx",
                "identity": "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId"
            },
            "sku": "Standard",
            "containers": {
                [...]
            }
        }
    }
]

Öğretici: Resource Manager şablonu kullanarak çok kapsayıcılı bir grup dağıtma bölümündeki şablondan uyarlanmış eksiksiz bir şablon aşağıdadır.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "containerGroupName": {
      "type": "string",
      "defaultValue": "myContainerGroup",
      "metadata": {
        "description": "Container Group name."
      }
    }
  },
  "variables": {
    "container1name": "aci-tutorial-app",
    "container1image": "mcr.microsoft.com/azuredocs/aci-helloworld:latest",
    "container2name": "aci-tutorial-sidecar",
    "container2image": "mcr.microsoft.com/azuredocs/aci-tutorial-sidecar"
  },
  "resources": [
    {
      "name": "[parameters('containerGroupName')]",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2022-09-01",
      "location": "[resourceGroup().location]",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {}
        }
      },
      "properties": {
        "encryptionProperties": {
          "vaultBaseUrl": "https://example.vault.azure.net",
          "keyName": "acikey",
          "keyVersion": "xxxxxxxxxxxxxxxx",
          "identity": "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId"
        },
        "sku": "Standard",
        "containers": [
          {
            "name": "[variables('container1name')]",
            "properties": {
              "image": "[variables('container1image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              },
              "ports": [
                {
                  "port": 80
                },
                {
                  "port": 8080
                }
              ]
            }
          },
          {
            "name": "[variables('container2name')]",
            "properties": {
              "image": "[variables('container2image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              }
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "protocol": "tcp",
              "port": "80"
            },
            {
              "protocol": "tcp",
              "port": "8080"
            }
          ]
        }
      }
    }
  ],
  "outputs": {
    "containerIPv4Address": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups/', parameters('containerGroupName'))).ipAddress.ip]"
    }
  }
}

Kaynaklarınızı dağıtma

Şablon dosyasını masaüstünüzde oluşturup düzenlediyseniz, dosyayı içine sürükleyerek Cloud Shell dizininize yükleyebilirsiniz.

az group create komutuyla bir kaynak grubu oluşturun.

az group create --name myResourceGroup --location eastus

şablonu az deployment group create komutuyla dağıtın.

az deployment group create --resource-group myResourceGroup --template-file deployment-template.json

Birkaç saniye içinde Azure’dan bir ilk yanıt almanız gerekir. Dağıtım tamamlandıktan sonra, ACI hizmeti tarafından kalıcı hale gelen onunla ilgili tüm veriler sağladığınız anahtarla şifrelenir.