Azure Service Fabric 安全性

如需 Azure 安全性最佳做法的相關詳細資訊,請參閱 Azure Service Fabric 安全性最佳做法

Key Vault

Azure Key Vault 是建議採用的 Azure Service Fabric 應用程式和叢集的秘密管理服務。

注意

如果 Key Vault 的憑證/秘密已部署至虛擬機器擴展集作為虛擬機器擴展集祕密,Key Vault 和虛擬機器擴展集必須位於相同位置。

建立發出 Service Fabric 憑證的憑證授權單位

您可以建立 Azure Key Vault 憑證,或將它匯入至 Key Vault。 當建立 Key Vault 憑證時,會在 Key Vault 內部建立私密金鑰,並且絕不會向憑證擁有者公開。 以下是在 Key Vault 中建立憑證的方式:

  • 建立自我簽署憑證以建立公開-私密金鑰組,並與憑證建立關聯。 憑證會由自己擁有的金鑰簽署。
  • 手動建立新憑證以建立公開-私密金鑰組,並產生 X.509 憑證簽署要求。 簽署要求可以由您的登錄授權單位或憑證授權單位簽署。 經過簽署的 x509 憑證能與擱置中的金鑰組合併,在 Key Vault 中完成 KV 憑證。 這個方式的步驟比較繁瑣,不過能確實提高安全性,因為私密金鑰僅限在 Key Vault 中建立。 下圖提供相關說明。

檢閱Azure 金鑰保存庫憑證建立方法了解其他詳細資訊。

將 Key Vault 憑證部署至 Service Fabric 叢集虛擬機器擴展集

若要將憑證從位於相同位置的金鑰保存庫部署至虛擬機器擴展集,請使用虛擬機器擴展集 osProfile。 下列是 Resource Manager 範本屬性:

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

注意

必須啟用保存庫才能進行 Resource Manager 範本部署。

將存取控制清單 (ACL) 套用至您 Service Fabric 叢集的憑證

虛擬機器擴展集延伸模組 發行者 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 中,這將會是到期日期最慢、並且與一般名稱和簽發者指紋相符的憑證。

Azure 網域,例如 *<YOUR SUBDOMAIN>.cloudapp.azure.com 或 <YOUR SUBDOMAIN>.trafficmanager.net,由 Microsoft 擁有。 憑證授權單位不會發出網域憑證給未經授權的使用者。 大部分的使用者必須向註冊機構購買網域,或本身為授權的網域系統管理員,憑證授權單位才會發出具備該一般名稱的憑證給您。

如需有關如何設定 DNS 服務以將網域解析為 Microsoft IP 位址的其他詳細資訊,請檢閱如何設定 Azure DNS 來裝載您的網域

注意

將網域名稱伺服器委派給您的 Azure DNS 區域名稱伺服器之後,請將下列兩項記錄新增至您的 DNS 區域:

  • 不是您的自訂網域將解析之所有 IP 位址 Alias record set 的網域 APEX 'A' 記錄。
  • 不是 Alias record set 之您所佈建 Microsoft 子網域的 'C' 記錄。 例如,可以使用您的流量管理員或負載平衡器的 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'

使用將 Key Vault 憑證部署至 Service Fabric 叢集虛擬機器擴展集中的指示,將 Key Vault 憑證部署至您 Service Fabric 叢集的虛擬機器擴展集。

使用以下 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

使用將 Key Vault 憑證部署至 Service Fabric 叢集虛擬機器擴展集中的指示,將 Key Vault 憑證部署至您 Service Fabric 叢集的虛擬機器擴展集。

使用以下命令將您的秘密加密,然後使用加密的值更新您的 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>

使用受控服務識別 (MSI) 向 Azure 資源驗證 Service Fabric 應用程式

若要了解適用於 Azure 資源的受控識別,請參閱什麼是適用於 Azure 資源的受控識別?。 Azure Service Fabric 叢集裝載在虛擬機器擴展集中,支援受控服務識別。 若要取得 MSI 可用來進行驗證的服務清單,請參閱支援 Microsoft Entra 驗證的 Azure 服務

若要在虛擬機器擴展集建立期間,或在現有的虛擬機器擴展集上,啟用系統指派的受控識別,請宣告以下 "Microsoft.Compute/virtualMachinesScaleSets" 屬性:

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

如需詳細資訊,請參閱什麼是適用於 Azure 資源的受控識別?

如果已建立使用者指派的受控識別,請在範本中宣告下列資源,以指派給虛擬機器擴展集。 請將 \<USERASSIGNEDIDENTITYNAME\> 取代為您建立的使用者指派受控識別名稱:

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

在您的 Service Fabric 應用程式可以使用受控識別之前,必須先將權限授與需要向它驗證的 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 安全性基準,而不是自行建立基準。若要在虛擬機器擴展集上佈建這些基準,可選擇使用 Azure Desired State Configuration (DSC) 延伸模組處理常式,將上線的 VM 設定為執行生產軟體。

Azure 防火牆

Azure 防火牆是受控的雲端式網路安全性服務,可保護您的 Azure 虛擬網路資源。 它是完全具狀態的防火牆即服務,具有內建的高可用性和不受限制的雲端延展性。;這可讓您將輸出 HTTP/S 流量限制為包含萬用字元的特殊完整網域名稱 (FQDN) 清單。 此功能不需要 TLS/SSL 終止。 建議利用 Azure 防火牆 FQDN 標記來允許 Windows Update,讓 Microsoft Windows Update 端點的網路流量流經防火牆。 使用範本部署 Azure 防火牆提供 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。

Azure 服務 (包括 Service Fabric) 已完成工程工作來停止依賴 TLS 1.0/1.1 通訊協定,並完整支援客戶將工作負載設定為僅接受和起始 TLS 1.2 連線。

客戶應該將 Azure 託管的工作負載及與 Azure 服務互動的內部部署應用程式,設定為預設使用 TLS 1.2。 以下說明如何設定 Service Fabric 叢集節點和應用程式,以使用特定的 TLS 版本。

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
    }
}

注意

如果您沒有使用 Windows Defender,請參閱您的反惡意程式碼文件,以了解設定規則。 Linux 不支援 Windows Defender。

在 Service Fabric 叢集中裝載不受信任的應用程式

Service Fabric 叢集的設計是單一租用戶,託管的應用程式則視為是受信任。 因此,應用程式獲授權存取 Service Fabric 執行階段,其本身以各種形式呈現:環境變數 (指向主機上對應於應用程式和 Fabric 檔案的檔案路徑)、安裝在容器工作負載上具有寫入存取權的主機路徑、程序間通訊端點 (接受應用程式特有的要求),以及用戶端憑證 (Fabric 預期由應用程式用來驗證本身)。

如果您考慮裝載未受信任的應用程式,則必須採取額外的步驟,來定義及擁有 Service Fabric 叢集的惡意多租用戶體驗。 這需要您在情節的內容中考慮多個層面,包括但不限於下列各項:

  • 針對未受信任的應用程式與其他應用程式互動、叢集本身以及基礎計算基礎結構的全面安全性檢閱。
  • 使用適用的最強大沙箱技術 (例如,適用於容器工作負載的適當隔離模式)。
  • 對於逸出沙箱技術的未受信任應用程式進行風險評量,因為下一個信任和安全性界限是叢集本身。
  • 移除不受信任應用程式對 Service Fabric 執行階段的存取

RemoveServiceFabricRuntimeAccess

在應用程式資訊清單的原則區段中,使用下列宣告以移除對 Service Fabric 執行階段的存取權:

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

下一步