Seguridad de Azure Service Fabric

Para más información acerca de los procedimientos recomendados de seguridad de Azure, revise Procedimientos recomendados de seguridad de Azure Service Fabric.

Key Vault

Azure Key Vault es el servicio de administración de secretos recomendado para aplicaciones y clústeres de Azure Service Fabric.

Nota:

Si se implementan certificados o secretos de una instancia de Key Vault en un conjunto de escalado de máquinas virtuales como un secreto de conjunto de escalado de máquinas virtuales, la instancia de Key Vault y el conjunto de escalado de máquinas virtuales deben compartir ubicación.

Creación de un certificado de Service Fabric emitido por una entidad de certificación

Un certificado de Azure Key Vault se puede crear o importar en una instancia de Key Vault. Cuando se crea un certificado de Key Vault, la clave privada se crea en la instancia de Key Vault y no se expone al propietario del certificado. Estas son las formas de crear un certificado en Key Vault:

  • Cree un certificado autofirmado para crear un par de claves pública y privada para asociarlo a un certificado. El certificado se firmará con su propia clave.
  • Cree manualmente un nuevo certificado para crear un par de claves pública y privada y generar una solicitud de firma de certificado X.509. La solicitud de firma puede estar firmada por la autoridad de registro o la entidad de certificación. Para completar el certificado KV en Key Vault, el certificado X.509 se puede combinar con el par de claves pendiente. Aunque este método requiere más pasos, proporciona mayor seguridad, ya que la clave privada se crea en Key Vault y se restringe. Esto se explica en el diagrama siguiente.

Revise Métodos de creación de certificados de Azure Key Vault para obtener más detalles.

Implementación de certificados de Key Vault en conjuntos de escalado de máquinas virtuales de clúster de Service Fabric

Para implementar certificados desde un almacén de claves colocalizado en un conjunto de escalado de máquinas virtuales, use el conjunto de escalado de máquinas virtuales osProfile. A continuación, se indican las propiedades de la plantilla de Resource Manager:

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

Nota:

El almacén debe estar habilitado para la implementación de plantillas de Resource Manager.

Aplicación de una lista de control de acceso (ACL) a su certificado para el clúster de Service Fabric

El publicador de extensiones de conjuntos de escalado de máquinas virtuales Microsoft.Azure.ServiceFabric se usa para configurar la seguridad de los nodos. Para aplicar una ACL a los certificados para los procesos de clúster de Service Fabric, use las siguientes propiedades de plantilla de Resource Manager:

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

Protección de un certificado de clúster de Service Fabric por nombre común

Para proteger su clúster de Service Fabric mediante el certificado Common Name, use la propiedad de plantilla de Resource Manager certificateCommonNames de la siguiente manera:

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

Nota:

El clúster de Service Fabric usará el primer certificado válido que se encuentre en el almacén de certificados del host. En Windows, este será el certificado con la fecha de expiración más tardía que coincida con su nombre común y la huella digital del emisor.

Los dominios de Azure, como *<SU SUBDOMINIO>.cloudapp.azure.com o <SU SUBDOMINIO>.trafficmanager.net, pertenecen a Microsoft. Las entidades de certificación no emitirán certificados para dominios a usuarios no autorizados. La mayoría de los usuarios deberá adquirir un dominio a un registrador o ser un administrador de dominio autorizado para que una entidad de certificación le emita un certificado con ese nombre común.

Para más información sobre cómo configurar el servicio DNS para resolver el dominio en una dirección IP de Microsoft, consulte cómo configurar Azure DNS para hospedar su dominio.

Nota:

Después de la delegación de los servidores de nombres de dominio a los servidores de nombre de la zona de Azure DNS, agregue los dos registros siguientes a la zona DNS:

  • Un registro "A" para el dominio APEX que NO es Alias record set en todas las direcciones IP en las que se resolverá su dominio personalizado.
  • Un registro "C" para subdominios de Microsoft aprovisionados que no son Alias record set. Por ejemplo, podría utilizar el nombre DNS de Traffic Manager o Load Balancer.

Para actualizar el portal para mostrar un nombre DNS personalizado para su clúster de Service Fabric "managementEndpoint", actualice las siguientes propiedades de plantilla de Resource Manager del clúster de Service Fabric:

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

Cifrado de los valores de secretos del paquete de Service Fabric

Entre los valores habituales que se cifran en paquetes de Service Fabric se incluyen credenciales de Azure Container Registry (ACR), variables de entorno, opciones de configuración y claves de cuenta de almacenamiento de complemento de volumen de Azure.

Para configurar un certificado de cifrado y cifrar secretos en clústeres de Windows:

Genere un certificado autofirmado para cifrar su secreto:

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

Siga las instrucciones de Implementación de certificados de Key Vault en conjuntos de escalado de máquinas virtuales de clúster de Service Fabric para implementar dichos certificados en los conjuntos de escalado de máquinas virtuales de su clúster de Service Fabric.

Cifre el secreto con el siguiente comando de PowerShell y, a continuación, actualice el manifiesto de la aplicación de Service Fabric con el valor cifrado:

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

Para configurar un certificado de cifrado y cifrar secretos en clústeres de Linux:

Genere un certificado autofirmado para cifrar sus secretos:

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

Siga las instrucciones de Implementación de certificados de Key Vault en conjuntos de escalado de máquinas virtuales de clúster de Service Fabric para implementar dichos certificados en los conjuntos de escalado de máquinas virtuales de su clúster de Service Fabric.

Cifre el secreto mediante los comandos siguientes y, a continuación, actualice el manifiesto de la aplicación de Service Fabric con el valor cifrado:

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

Después de cifrar los valores protegidos, especifique los secretos cifrados en la aplicación de Service Fabric y descifre los secretos cifrados desde el código de servicio.

Incluir certificados de punto de conexión en aplicaciones de Service Fabric

Para configurar el certificado de punto de conexión de la aplicación, incluya el certificado añadiendo un elemento EndpointCertificate y un elemento User a la cuenta de entidad de seguridad del manifiesto de aplicación. Por defecto, la cuenta de entidad de seguridad es NetworkService. Esto proporcionará la administración de la ACL de clave privada del certificado de aplicación para la entidad de seguridad proporcionada.

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

Inclusión de certificados secretos en aplicaciones de Service Fabric

Para proporcionar a la aplicación acceso a los secretos, incluya el certificado agregando un elemento SecretsCertificate al manifiesto de aplicación.

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

Autentique las aplicaciones de Service Fabric en recursos de Azure mediante Managed Service Identity (MSI)

Para más información sobre las identidades administradas para recursos de Azure, consulte ¿Qué es Managed Identities for Azure Resources?. Los clústeres de Azure Service Fabric se hospedan en Virtual Machine Scale Sets, que admite Managed Service Identity. Para obtener una lista de servicios en los que se puede usar MSI para autenticarse, consulte Servicios de Azure que admiten la autenticación de Microsoft Entra.

Para habilitar la identidad administrada asignada por el sistema durante la creación de un conjunto de escalado de máquinas virtuales o un conjunto de escalado de máquinas virtuales existente, declare la siguiente propiedad "Microsoft.Compute/virtualMachinesScaleSets":

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

Para más información, consulte ¿Qué es Managed Identities for Azure Resources?.

Si ha creado una identidad administrada asignada por el usuario, declare el siguiente recurso en la plantilla para asignarla al conjunto de escalado de máquinas virtuales. Reemplace \<USERASSIGNEDIDENTITYNAME\> por el nombre de la identidad administrada asignada por el usuario que ha creado:

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

Antes de que su aplicación de Service Fabric pueda utilizar una identidad administrada, se deben conceder permisos a los recursos de Azure que necesita para autenticarse. Los siguientes comandos conceden acceso a un recurso de 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>"

En el código de su aplicación de Service Fabric, obtenga un token de acceso para Azure Resource Manager con un REST similar al siguiente:

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']")

A continuación, la aplicación de Service Fabric puede usar el token de acceso para autenticarse en recursos de Azure que admiten Active Directory. El ejemplo siguiente muestra cómo hacerlo para el recurso de 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'])")

Líneas base de seguridad de Windows

Es recomendable que implemente una configuración estándar del sector que sea ampliamente conocida y esté probada, como las líneas base de seguridad de Microsoft, en lugar de crear una línea base usted mismo. Una opción para aprovisionarlas en Virtual Machine Scale Sets consiste en usar el controlador de extensión Desired State Configuration (DSC) de Azure para configurar las máquinas virtuales a medida que se conecten, de modo que ejecuten el software de producción.

Azure Firewall

Azure Firewall es un servicio de seguridad de red administrado y basado en la nube que protege los recursos de Azure Virtual Network. Se trata de un firewall como servicio con estado completo que incorpora alta disponibilidad y escalabilidad a la nube sin restricciones.Esto permite limitar el tráfico HTTP/S saliente a una lista especificada de nombres de dominio completos (FQDN), incluidos caracteres comodín. Esta característica no requiere terminación de TLS/SSL. Se recomienda que aproveche las etiquetas FQDN de Azure Firewall para Windows Update y que habilite el tráfico de red a los puntos de conexión de Microsoft Windows Update para que pueda fluir a través del firewall. En Implementación de Azure Firewall mediante una plantilla encontrará un ejemplo de definición de la plantilla de recursos Microsoft.Network/azureFirewalls. En las reglas de firewall habituales de las aplicaciones de Service Fabric se permite lo siguiente para la red virtual de clústeres:

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

Estas reglas de firewall complementan los grupos de seguridad de red de salida permitidos, que incluirían ServiceFabric y Storage, como destinos aceptados desde la red virtual.

TLS 1.2

Microsoft Azure recomienda que todos los clientes realicen la migración a soluciones que admitan la seguridad de la capa de transporte (TLS) 1.2 y asegúrese de que se usa TLS 1.2 de forma predeterminada.

Los servicios de Azure, como Service Fabric, han completado el trabajo de ingeniería para retirar la dependencia de los protocolos TLS 1.0/1.1 y proporcionan soporte técnico completo a los clientes que desean que sus cargas de trabajo estén configuradas para aceptar e iniciar solo conexiones TLS 1.2.

Los clientes deben configurar sus cargas de trabajo hospedadas en Azure y las aplicaciones locales que interactúan con los servicios de Azure para usar TLS 1.2 de forma predeterminada. Aquí se muestra cómo configurar nodos y aplicaciones de clúster de Service Fabric para usar una versión específica de TLS.

Windows Defender

De forma predeterminada, el antivirus Windows Defender está instalado en Windows Server 2016. Para más información, consulte Antivirus Windows Defender en Windows Server 2016. La interfaz de usuario está instalada de forma predeterminada en algunas SKU, pero no es necesaria. Para reducir cualquier impacto en el rendimiento y sobrecarga en el consumo de recursos provocados por Windows Defender, siempre que sus directivas de seguridad permitan excluir procesos y rutas de acceso para software de código abierto, declare las siguientes propiedades de plantilla de Resource Manager de extensión de conjuntos de escalado de máquinas virtuales para excluir su clúster de Service Fabric de los análisis:

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

Nota:

Consulte su documentación antimalware para obtener reglas de configuración si no utiliza Windows Defender. Windows Defender no es compatible con Linux.

Hospedaje de aplicaciones que no son de confianza en un clúster de Service Fabric

Un clúster de Service Fabric es un único inquilino por diseño y las aplicaciones hospedadas se consideran de confianza. Por tanto, a las aplicaciones se les concede el acceso al entorno de ejecución de Service Fabric, que se manifiesta de diferentes formas, por ejemplo: variables de entorno que apuntan a rutas de acceso en el host correspondientes a los archivos de la aplicación y de Fabric, rutas de acceso del host montadas con acceso de escritura a las cargas de trabajo de contenedor, un punto de conexión de comunicación entre procesos que acepta solicitudes específicas de la aplicación y el certificado de cliente que Fabric espera que la aplicación use para autenticarse.

Si está pensando en hospedar aplicaciones que no son de confianza, debe realizar más pasos para definir y tener la propiedad de la experiencia multiinquilino hostil para el clúster de Service Fabric. Esto requerirá que tenga en cuenta varios aspectos en el contexto de su escenario, incluidos, entre otros, los siguientes:

  • Una revisión de seguridad exhaustiva de las interacciones de las aplicaciones que no son de confianza con otras aplicaciones, el propio clúster y la infraestructura de proceso subyacente.
  • Uso de la tecnología de espacio aislado más sólida aplicable (por ejemplo, los modos de aislamiento adecuados para cargas de trabajo de contenedor).
  • Evaluación de riesgos de las aplicaciones que no son de confianza que se escapan de la tecnología de espacio aislado, ya que el siguiente límite de confianza y seguridad es el propio clúster.
  • Eliminación del acceso de las aplicaciones que no son de confianza al entorno de ejecución de Service Fabric.

RemoveServiceFabricRuntimeAccess

Para eliminar el acceso al entorno de ejecución de Service Fabric, use la siguiente declaración en la sección Directivas del manifiesto de aplicación:

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

Pasos siguientes