Tutorial: Protección de un servidor web en una máquina virtual de Linux en Azure con certificados SSL almacenados en Key VaultTutorial: Secure a web server on a Linux virtual machine in Azure with SSL certificates stored in Key Vault

Para proteger los servidores web, se puede utilizar un certificado Capa de sockets seguros (SSL) para cifrar el tráfico web.To secure web servers, a Secure Sockets Layer (SSL) certificate can be used to encrypt web traffic. Estos certificados SSL pueden almacenarse en Azure Key Vault y permiten implementaciones seguras de certificados en máquinas virtuales Linux en Azure.These SSL certificates can be stored in Azure Key Vault, and allow secure deployments of certificates to Linux virtual machines (VMs) in Azure. En este tutorial, aprenderá a:In this tutorial you learn how to:

  • Crear una instancia de Azure Key VaultCreate an Azure Key Vault
  • Generar o cargar un certificado en Key VaultGenerate or upload a certificate to the Key Vault
  • Creación de una máquina virtual e instalación del servidor web NGINXCreate a VM and install the NGINX web server
  • Inserción del certificado en la máquina virtual y configuración de NGINX con un enlace SSLInject the certificate into the VM and configure NGINX with an SSL binding

Uso de Azure Cloud ShellUse Azure Cloud Shell

En Azure se hospeda Azure Cloud Shell, un entorno de shell interactivo que puede utilizar mediante el explorador.Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Cloud Shell le permite usar bash o PowerShell para trabajar con servicios de Azure.Cloud Shell lets you use either bash or PowerShell to work with Azure services. Puede usar los comandos preinstalados de Cloud Shell para ejecutar el código de este artículo sin tener que instalar nada en su entorno local.You can use the Cloud Shell pre-installed commands to run the code in this article without having to install anything on your local environment.

Para iniciar Azure Cloud Shell:To launch Azure Cloud Shell:

OpciónOption Ejemplo o vínculoExample/Link
Seleccione Probarlo en la esquina superior derecha de un bloque de código.Select Try It in the upper-right corner of a code block. Solo con seleccionar Probar no se copia automáticamente el código en Cloud Shell.Selecting Try It doesn't automatically copy the code to Cloud Shell. Ejemplo de Probarlo para Azure Cloud Shell
Vaya a https://shell.azure.com o seleccione el botón Iniciar Cloud Shell para abrir Cloud Shell en el explorador.Go to https://shell.azure.com or select the Launch Cloud Shell button to open Cloud Shell in your browser. Iniciar Cloud Shell en una nueva ventanaLaunch Cloud Shell in a new window
Seleccione el botón Cloud Shell en la barra de menús de la esquina superior derecha de Azure Portal.Select the Cloud Shell button on the top-right menu bar in the Azure portal. Botón Cloud Shell en Azure Portal

Para ejecutar el código de este artículo en Azure Cloud Shell:To run the code in this article in Azure Cloud Shell:

  1. Abra Cloud Shell.Open Cloud Shell.
  2. Seleccione el botón Copiar de un bloque de código para copiar el código.Select the Copy button on a code block to copy the code.
  3. Pegue el código en la sesión de Cloud Shell con Ctrl+Mayús+V en Windows y Linux, o Cmd+Mayús+V en macOS.Paste the code into the Cloud Shell session with Ctrl+Shift+V on Windows and Linux, or Cmd+Shift+V on macOS.
  4. Presione ENTRAR para ejecutar el código.Press Enter to run the code.

Si decide instalar y usar la CLI localmente, en este tutorial es preciso que ejecute la CLI de Azure de la versión 2.0.30, u otra posterior.If you choose to install and use the CLI locally, this tutorial requires that you are running the Azure CLI version 2.0.30 or later. Ejecute az --version para encontrar la versión.Run az --version to find the version. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.If you need to install or upgrade, see Install Azure CLI.

Información generalOverview

Azure Key Vault protege claves y secretos criptográficos, como certificados y contraseñas.Azure Key Vault safeguards cryptographic keys and secrets, such as certificates or passwords. Key Vault ayuda a agilizar el proceso de administración de certificados y le permite mantener el control de las claves que acceden a ellos.Key Vault helps streamline the certificate management process and enables you to maintain control of keys that access those certificates. Puede crear un certificado autofirmado en Key Vault o cargar un certificado de confianza existente que ya posea.You can create a self-signed certificate inside Key Vault, or upload an existing, trusted certificate that you already own.

En lugar de usar una imagen de máquina virtual personalizada que incluya los certificados preparados, inserta los certificados en una máquina virtual en ejecución.Rather than using a custom VM image that includes certificates baked-in, you inject certificates into a running VM. Este proceso garantiza que los certificados más actualizados se instalan en un servidor web durante la implementación.This process ensures that the most up-to-date certificates are installed on a web server during deployment. Si renueva o reemplaza un certificado, no tiene también que crear una nueva imagen de máquina virtual personalizada.If you renew or replace a certificate, you don't also have to create a new custom VM image. Los certificados más recientes se insertan automáticamente a medida que se crean máquinas virtuales adicionales.The latest certificates are automatically injected as you create additional VMs. Durante el proceso completo, el certificado nunca deja la plataforma de Azure ni se expone en un script, historial de la línea de comandos o una plantilla.During the whole process, the certificates never leave the Azure platform or are exposed in a script, command-line history, or template.

Crear una instancia de Azure Key VaultCreate an Azure Key Vault

Para poder crear una instancia de Key Vault y certificados, cree un grupo de recursos con az group create.Before you can create a Key Vault and certificates, create a resource group with az group create. En el ejemplo siguiente, se crea un grupo de recursos denominado myResourceGroupSecureWeb en la ubicación eastus:The following example creates a resource group named myResourceGroupSecureWeb in the eastus location:

az group create --name myResourceGroupSecureWeb --location eastus

Después, cree una instancia de Key Vault con az keyvault create y habilítela para usarla al implementar una máquina virtual.Next, create a Key Vault with az keyvault create and enable it for use when you deploy a VM. Cada almacén Key Vault requiere un nombre único, que debe estar todo en minúsculas.Each Key Vault requires a unique name, and should be all lowercase. Reemplace <mykeyvault> en el siguiente ejemplo por su propio nombre único de Key Vault:Replace <mykeyvault> in the following example with your own unique Key Vault name:

keyvault_name=<mykeyvault>
az keyvault create \
    --resource-group myResourceGroupSecureWeb \
    --name $keyvault_name \
    --enabled-for-deployment

Generación de un certificado y almacenamiento en Key VaultGenerate a certificate and store in Key Vault

Para usarlo en producción, debe importar un certificado válido firmado por un proveedor de confianza con az keyvault certificate import.For production use, you should import a valid certificate signed by trusted provider with az keyvault certificate import. En este tutorial, el ejemplo siguiente muestra cómo puede generar un certificado autofirmado con az keyvault certificate create que usa la directiva de certificado predeterminada:For this tutorial, the following example shows how you can generate a self-signed certificate with az keyvault certificate create that uses the default certificate policy:

az keyvault certificate create \
    --vault-name $keyvault_name \
    --name mycert \
    --policy "$(az keyvault certificate get-default-policy)"

Preparación del certificado para usarlo con una máquina virtualPrepare a certificate for use with a VM

Para usar el certificado durante el proceso de creación de la máquina virtual, obtenga el id. del certificado con az keyvault secret list-versions.To use the certificate during the VM create process, obtain the ID of your certificate with az keyvault secret list-versions. Convierta el certificado con az vm secret format.Convert the certificate with az vm secret format. En el ejemplo siguiente se asigna la salida de estos comandos a las variables para facilitar su uso en los pasos siguientes:The following example assigns the output of these commands to variables for ease of use in the next steps:

secret=$(az keyvault secret list-versions \
          --vault-name $keyvault_name \
          --name mycert \
          --query "[?attributes.enabled].id" --output tsv)
vm_secret=$(az vm secret format --secrets "$secret" -g myResourceGroupSecureWeb --keyvault $keyvault_name)

Creación de una configuración de cloud-init para proteger NGINXCreate a cloud-init config to secure NGINX

cloud-init es un enfoque ampliamente usado para personalizar una máquina virtual Linux la primera vez que se arranca.Cloud-init is a widely used approach to customize a Linux VM as it boots for the first time. Puede usar cloud-init para instalar paquetes y escribir archivos o para configurar los usuarios y la seguridad.You can use cloud-init to install packages and write files, or to configure users and security. Como cloud-init se ejecuta durante el proceso de arranque inicial, no hay pasos adicionales o agentes requeridos que aplicar a la configuración.As cloud-init runs during the initial boot process, there are no additional steps or required agents to apply your configuration.

Cuando crea una máquina virtual, los certificados y las claves se almacenan en el directorio /var/lib/waagent/ protegido.When you create a VM, certificates and keys are stored in the protected /var/lib/waagent/ directory. Para automatizar la adición del certificado a la máquina virtual y configurar el servidor web, utilice cloud-init.To automate adding the certificate to the VM and configuring the web server, use cloud-init. En este ejemplo, instalará y configurará el servidor web NGINX.In this example, you install and configure the NGINX web server. Puede usar el mismo proceso para instalar y configurar Apache.You can use the same process to install and configure Apache.

Cree un archivo denominado cloud-init-web-server.txt y pegue la siguiente configuración:Create a file named cloud-init-web-server.txt and paste the following configuration:

#cloud-config
package_upgrade: true
packages:
  - nginx
write_files:
  - owner: www-data:www-data
  - path: /etc/nginx/sites-available/default
    content: |
      server {
        listen 443 ssl;
        ssl_certificate /etc/nginx/ssl/mycert.cert;
        ssl_certificate_key /etc/nginx/ssl/mycert.prv;
      }
runcmd:
  - secretsname=$(find /var/lib/waagent/ -name "*.prv" | cut -c -57)
  - mkdir /etc/nginx/ssl
  - cp $secretsname.crt /etc/nginx/ssl/mycert.cert
  - cp $secretsname.prv /etc/nginx/ssl/mycert.prv
  - service nginx restart

Creación de una máquina virtual seguraCreate a secure VM

Ahora cree una máquina virtual con el comando az vm create.Now create a VM with az vm create. Los datos del certificado se insertan desde Key Vault con el parámetro --secrets.The certificate data is injected from Key Vault with the --secrets parameter. Pase la configuración cloud-init con el parámetro --custom-data:You pass in the cloud-init config with the --custom-data parameter:

az vm create \
    --resource-group myResourceGroupSecureWeb \
    --name myVM \
    --image UbuntuLTS \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init-web-server.txt \
    --secrets "$vm_secret"

Transcurren unos minutos hasta que la máquina virtual se crea, los paquetes se instalan y la aplicación se inicia.It takes a few minutes for the VM to be created, the packages to install, and the app to start. Cuando se haya creado la máquina virtual, anote el valor publicIpAddress mostrado por la CLI de Azure.When the VM has been created, take note of the publicIpAddress displayed by the Azure CLI. Esta dirección se usa para acceder al sitio en un explorador web.This address is used to access your site in a web browser.

Para permitir que el tráfico web llegue a la máquina virtual, abra el puerto 443 desde Internet con el comando az vm open-port:To allow secure web traffic to reach your VM, open port 443 from the Internet with az vm open-port:

az vm open-port \
    --resource-group myResourceGroupSecureWeb \
    --name myVM \
    --port 443

Prueba de la aplicación web seguraTest the secure web app

Ahora puede abrir un explorador web y escribir http://<Dirección_IP_Pública> en la barra de direcciones.Now you can open a web browser and enter https://<publicIpAddress> in the address bar. Proporcione su propia dirección IP pública obtenida del proceso de creación de la máquina virtual.Provide your own public IP address from the VM create process. Acepte la advertencia de seguridad si usó un certificado autofirmado:Accept the security warning if you used a self-signed certificate:

Aceptar la advertencia de seguridad del explorador web

A continuación, se muestra el sitio de NGINX protegido, como en el ejemplo siguiente:Your secured NGINX site is then displayed as in the following example:

Ver el sitio de NGINX seguro en funcionamiento

Pasos siguientesNext steps

En este tutorial, protegió un servidor web NGINX con un certificado SSL almacenado en Azure Key Vault.In this tutorial, you secured an NGINX web server with an SSL certificate stored in Azure Key Vault. Ha aprendido a:You learned how to:

  • Crear una instancia de Azure Key VaultCreate an Azure Key Vault
  • Generar o cargar un certificado en Key VaultGenerate or upload a certificate to the Key Vault
  • Creación de una máquina virtual e instalación del servidor web NGINXCreate a VM and install the NGINX web server
  • Inserción del certificado en la máquina virtual y configuración de NGINX con un enlace SSLInject the certificate into the VM and configure NGINX with an SSL binding

Siga este vínculo para ver ejemplos de scripts de máquina virtual creados previamente.Follow this link to see pre-built virtual machine script samples.