Azure Service Fabric のセキュリティ

Azure のセキュリティに関するベスト プラクティスについて詳しくは、「Azure Service Fabric セキュリティに関するベスト プラクティス」をご覧ください

Key Vault

Azure Key Vault は、Azure Service Fabric のアプリケーションとクラスターに対して推奨されるシークレット管理サービスです。

Note

キー コンテナーからの証明書/シークレットが仮想マシン スケール セット シークレットとして仮想マシン スケール セットにデプロイされる場合は、キー コンテナーと仮想マシン スケール セットを同じ場所に置く必要があります。

証明機関発行の Service Fabric 証明書を作成する

Azure Key Vault 証明書は、作成するか、またはキー コンテナーにインポートすることができます。 Key Vault 証明書を作成すると、秘密キーはキー コンテナー内に作成され、証明書の所有者に公開されることはありません。 Key Vault で証明書を作成する方法は次のとおりです。

  • 自己署名証明書を作成して公開/秘密キー ペアを作成して、証明書と関連付けます。 証明書は、独自のキーで署名されます。
  • 新しい証明書を手動で作成して公開/秘密キー ペアを作成し、X.509 証明書署名要求を生成します。 署名要求には、登録機関または証明機関が署名できます。 署名された x509 証明書を保留中のキー ペアとマージして、Key Vault の KV 証明を完成できます。 この方法では必要な手順が増えますが、秘密キーが作成されて Key Vault に限定されるため、セキュリティが強化されます。 これを次の図で説明します。

詳しくは、Azure Key Vault 証明書の作成方法に関する記事をご覧ください。

Service Fabric クラスターの仮想マシン スケール セットに Key Vault 証明書をデプロイする

併置されているキー コンテナーから仮想マシン スケール セットに証明書をデプロイするには、仮想マシン スケール セットの osProfile を使用します。 Resource Manager テンプレートのプロパティを次に示します。

"secrets": [
   {
       "sourceVault": {
           "id": "[parameters('sourceVaultValue')]"
       },
       "vaultCertificates": [
          {
              "certificateStore": "[parameters('certificateStoreValue')]",
              "certificateUrl": "[parameters('certificateUrlValue')]"
          }
       ]
   }
]

Note

コンテナーで Resource Manager テンプレートのデプロイが有効になっている必要があります。

Service Fabric クラスター用の証明書にアクセス制御リスト (ACL) を適用する

ノードのセキュリティを構成するには、仮想マシン スケール セット拡張機能のパブリッシャー Microsoft.Azure.ServiceFabric を使用します。 Service Fabric クラスター プロセスに対する証明書に ACL を適用するには、次の Resource Manager テンプレートのプロパティを使用します。

"certificate": {
   "commonNames": [
       "[parameters('certificateCommonName')]"
   ],
   "x509StoreName": "[parameters('certificateStoreValue')]"
}

共通名を使用して Service Fabric クラスターの証明書をセキュリティで保護する

証明書の Common Name を使用して Service Fabric クラスターをセキュリティ保護するには、Resource Manager テンプレートのプロパティ certificateCommonNames を次のように使用します。

"certificateCommonNames": {
    "commonNames": [
        {
            "certificateCommonName": "[parameters('certificateCommonName')]",
            "certificateIssuerThumbprint": "[parameters('certificateIssuerThumbprint')]"
        }
    ],
    "x509StoreName": "[parameters('certificateStoreValue')]"
}

注意

Service Fabric クラスターでは、ホストの証明書ストアで最初に見つかった有効な証明書が使用されます。 Windows では、これは共通名と発行者のサムプリントが一致し、有効期限が最も遅い証明書になります。

*<自分のサブドメイン>.cloudapp.azure.com や <自分のサブドメイン>.trafficmanager.net などの Azure ドメインは、Microsoft によって所有されています。 証明機関では、承認されていないユーザーにはドメインの証明書は発行されません。 証明機関にその一般名で証明書を発行してもらうには、ほとんどのユーザーは、レジストラーからドメインを購入するか、承認されたドメイン管理者になる必要があります。

自分のドメインが Microsoft の IP アドレスに解決されるように DNS サービスを構成する方法について詳しくは、ドメインをホストするための Azure DNS の構成方法に関する記事をご覧ください。

Note

ドメイン ネーム サーバーを Azure DNS ゾーンのネーム サーバーに委任した後、DNS ゾーンに次の 2 つのレコードを追加します。

  • カスタム ドメインが解決されるすべての IP アドレスに対する Alias record set ではないドメイン APEX の "A" レコード。
  • ユーザーがプロビジョニングした、Alias record set ではないMicrosoft サブドメインの "C" レコード。 たとえば、Traffic Manager または Load Balancer の DNS 名を使用できます。

Service Fabric クラスター "managementEndpoint" のカスタム DNS 名が表示されるようにポータルを更新するには、Service Fabric クラスターの Resource Manager テンプレートの次のプロパティを更新します。

 "managementEndpoint": "[concat('https://<YOUR CUSTOM DOMAIN>:',parameters('nt0fabricHttpGatewayPort'))]",

Service Fabric パッケージのシークレット値を暗号化する

Service Fabric パッケージで暗号化される一般的な値は、Azure Container Registry (ACR) の資格情報、環境変数、設定、および Azure ボリューム プラグインのストレージ アカウント キーなどです。

Windows クラスターで暗号化証明書を設定してシークレットを暗号化するには:

シークレットを暗号化するための自己署名証明書を生成します。

New-SelfSignedCertificate -Type DocumentEncryptionCert -KeyUsage DataEncipherment -Subject mydataenciphermentcert -Provider 'Microsoft Enhanced Cryptographic Provider v1.0'

Service Fabric クラスターの仮想マシン スケール セットに Key Vault 証明書をデプロイする」の説明に従って、Service Fabric クラスターの仮想マシン スケール セットに Key Vault 証明書をデプロイします。

次の PowerShell コマンドを使ってシークレットを暗号化した後、暗号化された値で Service Fabric のアプリケーション マニフェストを更新します。

Invoke-ServiceFabricEncryptText -CertStore -CertThumbprint "<thumbprint>" -Text "mysecret" -StoreLocation CurrentUser -StoreName My

Linux クラスターで暗号化証明書を設定してシークレットを暗号化するには:

シークレットを暗号化するための自己署名証明書を生成します。

openssl req -newkey rsa:2048 -nodes -keyout TestCert.prv -x509 -days 365 -out TestCert.pem
cat TestCert.prv >> TestCert.pem

Service Fabric クラスターの仮想マシン スケール セットに Key Vault 証明書をデプロイする」の説明に従って、Service Fabric クラスターの仮想マシン スケール セットに Key Vault 証明書をデプロイします。

次のコマンドを使ってシークレットを暗号化した後、暗号化された値で Service Fabric のアプリケーション マニフェストを更新します。

echo "Hello World!" > plaintext.txt
iconv -f ASCII -t UTF-16LE plaintext.txt -o plaintext_UTF-16.txt
openssl smime -encrypt -in plaintext_UTF-16.txt -binary -outform der TestCert.pem | base64 > encrypted.txt

保護対象の値を暗号化した後、Service Fabric アプリケーションで暗号化されたシークレットを指定し、サービス コードから暗号化されたシークレットを暗号化解除します。

Service Fabric アプリケーションにエンドポイント証明書を含める

アプリケーションのエンドポイント証明書を構成するには、EndpointCertificate 要素と、プリンシパル アカウントの User 要素をアプリケーション マニフェストに追加して、証明書を含めます。 既定では、プリンシパル アカウントは NetworkService です。 これにより、指定されたプリンシパルのアプリケーション証明書の秘密キー ACL の管理が提供されます。

<ApplicationManifest … >
  ...
  <Principals>
    <Users>
      <User Name="Service1" AccountType="NetworkService" />
    </Users>
  </Principals>
  <Certificates>
    <EndpointCertificate Name="MyCert" X509FindType="FindByThumbprint" X509FindValue="[YourCertThumbprint]"/>
  </Certificates>
</ApplicationManifest>

Service Fabric アプリケーションにシークレット証明書を含める

アプリケーションがシークレットにアクセスできるようにするには、アプリケーション マニフェストに SecretsCertificate 要素を追加することにより証明書を含めます。

<ApplicationManifest … >
  ...
  <Certificates>
    <SecretsCertificate Name="MyCert" X509FindType="FindByThumbprint" X509FindValue="[YourCertThumbprint]"/>
  </Certificates>
</ApplicationManifest>

マネージド サービス ID (MSI) を使用して Azure リソースに対して Service Fabric アプリケーションを認証する

Azure リソースに対するマネージド ID について詳しくは、「Azure リソースのマネージド ID とは」をご覧ください。 Azure Service Fabric クラスターは、マネージド サービス ID をサポートする仮想マシン スケール セットでホストされています。 MSI を認証に使用できるサービスの一覧を取得するには、「Microsoft Entra 認証をサポートしている Azure サービス」を参照してください。

仮想マシン スケール セットの作成時に、または既存の仮想マシン スケール セットで、システム割り当てのマネージド ID を有効にするには、次の "Microsoft.Compute/virtualMachinesScaleSets" プロパティを宣言します。

"identity": { 
    "type": "SystemAssigned"
}

詳しくは、「Azure リソースのマネージド ID とは」をご覧ください。

ユーザー割り当てのマネージド ID を作成した場合は、テンプレートで次のリソースを宣言して、仮想マシン スケール セットに割り当てます。 \<USERASSIGNEDIDENTITYNAME\> は、作成したユーザー割り当てのマネージド ID の名前に置き換えます。

"identity": {
    "type": "userAssigned",
    "userAssignedIdentities": {
        "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('<USERASSIGNEDIDENTITYNAME>'))]": {}
    }
}

Service Fabric アプリケーションでマネージド ID を使用するには、その前に、認証が必要な Azure リソースに対するアクセス許可を付与する必要があります。 次のコマンドでは、Azure リソースへのアクセスが許可されます。

PRINCIPAL_ID=$(az resource show --id /subscriptions/<YOUR SUBSCRIPTON>/resourceGroups/<YOUR RG>/providers/Microsoft.Compute/virtualMachineScaleSets/<YOUR SCALE SET> --api-version 2018-06-01 | python -c "import sys, json; print(json.load(sys.stdin)['identity']['principalId'])")

az role assignment create --assignee $PRINCIPAL_ID --role 'Contributor' --scope "/subscriptions/<YOUR SUBSCRIPTION>/resourceGroups/<YOUR RG>/providers/<PROVIDER NAME>/<RESOURCE TYPE>/<RESOURCE NAME>"

Service Fabric アプリケーションのコードで、次のような REST 呼び出しを行って、Azure Resource Manager に対するアクセス トークンを取得します。

ACCESS_TOKEN=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -H Metadata:true | python -c "import sys, json; print json.load(sys.stdin)['access_token']")

その後は、Service Fabric アプリでアクセス トークンを使用して、Active Directory をサポートする Azure リソースへの認証を行うことができます。 次の例では、Azure Cosmos DB リソースに対してこれを行う方法を示します。

COSMOS_DB_PASSWORD=$(curl 'https://management.azure.com/subscriptions/<YOUR SUBSCRIPTION>/resourceGroups/<YOUR RG>/providers/Microsoft.DocumentDB/databaseAccounts/<YOUR ACCOUNT>/listKeys?api-version=2016-03-31' -X POST -d "" -H "Authorization: Bearer $ACCESS_TOKEN" | python -c "import sys, json; print(json.load(sys.stdin)['primaryMasterKey'])")

Windows のセキュリティ ベースライン

ベースラインを自分で作成するのではなく、Microsoft セキュリティ ベースラインのように、広く知られており、十分にテストされている業界標準の構成を実装することをお勧めします。これらを仮想マシン スケール セットにプロビジョニングするための 1 つの方法は、Azure Desired State Configuration (DSC) 拡張ハンドラーを使用して、VM をオンラインになるときに構成し、運用ソフトウェアが実行されるようにすることです。

Azure Firewall

Azure Firewall は、Azure Virtual Network リソースを保護するクラウドベースのマネージド ネットワーク セキュリティ サービスです。 これは、組み込みの高可用性とクラウドによる無制限のスケーラビリティを備えた、完全にステートフルなサービスとしてのファイアウォールです。これにより、ワイルド カードが含まれた完全修飾ドメイン名 (FQDN) の指定した一覧に、送信 HTTP/S トラフィックを制限できます。 この機能に TLS/SSL 終了は必要ありません。 Windows Update に Azure Firewall FQDN タグを利用し、Microsoft Windows Update エンドポイントへのネットワーク トラフィックがファイアウォールを通過できるようにすることをお勧めします。 「テンプレートを使用して Azure Firewall をデプロイする」では、Microsoft.Network/azureFirewalls リソース テンプレート定義のサンプルが提供されています。 Service Fabric アプリケーションに共通するファイアウォール規則では、クラスターの仮想ネットワークで以下が許可されます。

  • *download.microsoft.com
  • *servicefabric.azure.com
  • *.core.windows.net

これらのファイアウォール規則は、許可されている送信ネットワーク セキュリティ グループを補完するものであり、お使いの仮想ネットワークから許可される宛先として ServiceFabric と Storage が含まれます。

TLS 1.2

Microsoft Azure は、すべてのお客様がトランスポート層セキュリティ (TLS) 1.2 をサポートするソリューションへの移行を完了し、TLS 1.2 が既定で使用されることを確認することをお勧めします

Service Fabric を含む Azure サービスでは、TLS 1.0/1.1 プロトコルの依存関係を削除するエンジニアリング作業を完了し、TLS 1.2 接続のみを受け入れて開始するようにワークロードを構成する必要があるお客様に完全なサポートを提供します。

お客様は、Azure でホストされるワークロードとオンプレミスのアプリケーションを Azure サービスと対話するように構成して、既定で TLS 1.2 を使用する必要があります。 特定の TLS バージョンを使用するには、Service Fabric クラスター ノードとアプリケーションを構成する方法に関するページを参照してください。

Windows Defender

Windows Server 2016 には、Windows Defender ウイルス対策が既定でインストールされます。 詳しくは、「Windows Server 2016 の Windows Defender ウイルス対策」をご覧ください。 一部の SKU ではユーザー インターフェイスが既定でインストールされますが、必須ではありません。 Windows Defender によって発生するパフォーマンスへの影響とリソース消費のオーバーヘッドを小さくするには、セキュリティ ポリシーでオープン ソース ソフトウェアに対するプロセスとパスの除外が許可されている場合は、仮想マシン スケール セット拡張機能の Resource Manager テンプレートの次のプロパティを宣言して、Service Fabric クラスターをスキャンから除外します。

 {
    "name": "[concat('VMIaaSAntimalware','_vmNodeType0Name')]",
    "properties": {
        "publisher": "Microsoft.Azure.Security",
        "type": "IaaSAntimalware",
        "typeHandlerVersion": "1.5",
        "settings": {
            "AntimalwareEnabled": "true",
            "Exclusions": {
                "Paths": "[concat(parameters('svcFabData'), ';', parameters('svcFabLogs'), ';', parameters('svcFabRuntime'))]",
                "Processes": "Fabric.exe;FabricHost.exe;FabricInstallerService.exe;FabricSetup.exe;FabricDeployer.exe;ImageBuilder.exe;FabricGateway.exe;FabricDCA.exe;FabricFAS.exe;FabricUOS.exe;FabricRM.exe;FileStoreService.exe;FabricBRS.exe;BackupCopier.exe"
            },
            "RealtimeProtectionEnabled": "true",
            "ScheduledScanSettings": {
                "isEnabled": "true",
                "scanType": "Quick",
                "day": "7",
                "time": "120"
            }
        },
        "protectedSettings": null
    }
}

Note

Windows Defender を使用していない場合は、お使いのマルウェア対策のドキュメントで構成ルールを参照してください。 Windows Defender は、Linux ではサポートされていません。

信頼されていないアプリケーションを Service Fabric クラスターでホストする

Service Fabric クラスターはシングル テナントとして設計されており、ホストされるアプリケーションは信頼できるものと見なされます。 したがって、アプリケーションは Service Fabric ランタイムへのアクセスを許可され、そのマニフェストの形式は異なります。たとえば、アプリケーション ファイルと Fabric ファイルに対応するホスト上のファイル パスを指す環境変数、コンテナー ワークロードへの書き込みアクセスでマウントされたホスト パス、アプリケーション固有の要求を受け取るプロセス間通信エンドポイント、アプリケーションがその認証に使用することを Fabric が想定するクライアント証明書などです。

信頼されていないアプリケーションのホストを検討している場合は、Service Fabric クラスターに適さないマルチテナント エクスペリエンスを定義して所有するための追加の手順が必要です。 これには、シナリオのコンテキストで、次のような複数の側面を考慮する必要があります。ただしこれらだけではありません。

  • 信頼されていないアプリケーションの、他のアプリケーション、クラスター自体、基になるコンピューティング インフラストラクチャとのやり取りの完全なセキュリティ レビュー。
  • 適用可能な最も強力なサンドボックス テクノロジ (たとえば、コンテナー ワークロードに対する適切な分離モードなど)。
  • 次の信頼とセキュリティの境界はクラスター自体なので、信頼されていないアプリケーションによるサンドボックス テクノロジのエスケープのリスク評価。
  • 信頼されていないアプリケーションの Service Fabric ランタイムへのアクセスの削除。

RemoveServiceFabricRuntimeAccess

Service Fabric ランタイムへのアクセスは、アプリケーション マニフェストのポリシー セクションで次の宣言を使って削除できます。

<ServiceManifestImport>
    <Policies>
        <ServiceFabricRuntimeAccessPolicy RemoveServiceFabricRuntimeAccess="true"/>
    </Policies>
</ServiceManifestImport>

次のステップ