Desarrollar una aplicación web seguraDevelop a secure web app

Este ejemplo es una aplicación de Python sencilla que muestra una página web que contiene vínculos a recursos de seguridad para el desarrollo de aplicaciones en Azure.This sample is a simple Python app that displays a web page containing links to security resources for developing apps on Azure. Esta aplicación implementa procedimientos recomendados de seguridad que pueden ayudar a mejorar seguridad de la aplicación y la organización al desarrollar aplicaciones en Azure.The app implements security best practices that can help improve your application and your organization’s security posture when you develop apps on Azure.

Debe seguir los pasos que se describen en este artículo secuencialmente para asegurarse de que los componentes de la aplicación estén configurados correctamente.You should follow the steps described in this article sequentially to ensure that the application components are configured properly. La base de datos, Azure App Service, la instancia de Azure Key Vault y la instancia de Azure Application Gateway son dependientes entre sí.The database, Azure App Service, Azure Key Vault instance, and Azure Application Gateway instance, depend on each other.

Los scripts de implementación configuran la infraestructura.The deployment scripts set up the infrastructure. Después de ejecutar los scripts de implementación, deberá realizar cierta configuración manual en Azure Portal para vincular los componentes y los servicios.After you run the deployment scripts, you'll need to do some manual configuration in the Azure portal to link the components and services together.

La aplicación de ejemplo está orientada a principiantes que desarrollan aplicaciones en Azure y quieren implementar medidas de seguridad en sus aplicaciones.The sample app is targeted toward beginners developing applications on Azure who want to implement security measures in their applications.

Al desarrollar e implementar esta aplicación, aprenderá a:In developing and deploying this app, you'll learn how to:

  • Crear una instancia de Azure Key Vault, y almacenar y recuperar sus secretos.Create an Azure Key Vault instance, store and retrieve secrets from it.
  • Implementar Azure Database for PostgreSQL, configurar contraseñas seguras y autorizar el acceso a este.Deploy Azure Database for PostgreSQL, set up secure passwords and authorize access to it.
  • Ejecute un contenedor de Alpine Linux en Azure Web Apps para Linux y habilite las identidades administradas para los recursos de Azure.Run an Alpine Linux container on Azure Web Apps for Linux and enable managed identities for Azure resources.
  • Cree y configure una instancia de Azure Application Gateway con un firewall que use el conjunto de 10 reglas principales de OWASP.Create and configure an Azure Application Gateway instance with a firewall that uses OWASP Top 10 Ruleset.
  • Habilite el cifrado de datos en tránsito y en reposo mediante los servicios de Azure.Enable encryption of data in transit and at rest by using Azure services.

Después de desarrollar e implementar esta aplicación, habrá configurado la aplicación web de ejemplo siguiente junto con las medidas de configuración y seguridad que se describen.After you develop and deploy this app, you will have set up the following sample web app along with the configuration and security measures that are described.

Aplicación web de ejemplo

ArquitecturaArchitecture

La aplicación es una aplicación de n niveles típica con tres niveles.The app is a typical n-tier application with three tiers. El front-end, el back-end y el nivel de base de datos con los componentes de supervisión y administración de secretos integrados se muestran aquí:The front end, back end, and database layer with monitoring and secret-management components integrated are shown here:

Arquitectura de la aplicación

La arquitectura consta de los siguientes componentes:The architecture consists of these components:

Modelo de amenazasThreat model

El proceso de modelado de amenazas consiste en identificar posibles amenazas de seguridad para la empresa y la aplicación y, luego, asegurarse que exista un plan de mitigación adecuado.Threat modeling is the process of identifying potential security threats to your business and application and then ensuring that a proper mitigation plan is in place.

En este ejemplo, se usó Microsoft Threat Modeling Tool para implementar el modelado de amenazas para la aplicación de ejemplo segura.This sample used the Microsoft Threat Modeling Tool to implement threat modeling for the secure sample app. Mediante la creación de diagramas de los componentes y los flujos de datos, puede identificar los problemas y las amenazas al principio del proceso de desarrollo.By diagramming the components and the data flows, you can identify issues and threats early in the development process. Esto ahorra tiempo y dinero más tarde.This saves time and money later.

Este es el modelo de amenazas para la aplicación de ejemplo:This is the threat model for the sample app:

Modelo de amenazas

En la captura de pantalla siguiente se muestran algunas amenazas de ejemplo y posibles vulnerabilidades que genera Threat Modeling Tool.Some sample threats and potential vulnerabilities that the threat modeling tool generates are shown in the following screenshot. El modelo de amenazas ofrece información general sobre la superficie expuesta a ataques y solicita a los desarrolladores que piensen en cómo mitigar los problemas.The threat model gives an overview of the attack surface exposed and prompts the developers to think about how to mitigate the issues.

Salida del modelo de amenazas

Por ejemplo, la inyección de SQL en la salida del modelo de amenazas anterior se mitiga mediante la limpieza de las entradas del usuario y el uso de funciones almacenadas en Azure Database for PostgreSQL.For example, SQL injection in the preceding threat model output is mitigated by sanitizing user inputs and by using stored functions in Azure Database for PostgreSQL. Esta mitigación evita la ejecución arbitraria de consultas durante las lecturas y escrituras de datos.This mitigation prevents arbitrary execution of queries during data reads and writes.

Los desarrolladores mejoran la seguridad general del sistema mediante la mitigación de cada una de las amenazas de la salida del modelo de amenazas.Developers improve the overall security of the system by mitigating each of the threats in the threat model output.

ImplementaciónDeployment

Las siguientes opciones le permiten ejecutar Linux en Azure App Service:The following options let you run Linux on Azure App Service:

  • Elija un contenedor de la lista de contenedores de Microsoft precompilados en Azure creados con tecnologías auxiliares (Python, Ruby, PHP, Java, Node.js, .NET Core).Choose a container from the list of prebuilt Microsoft containers on Azure that have been created with supporting technologies (Python, Ruby, PHP, Java, Node.js, .NET Core).
  • Use un contenedor compilado de forma personalizada.Use a custom-built container. Seleccione sus propios registros de contenedor como el origen de la imagen y use las numerosas tecnologías disponibles que admiten HTTP.Select your own container registries as the source of the image and build upon the many available technologies that support HTTP.

En este ejemplo, ejecutará el script de implementación que implementará la aplicación web en App Service y creará los recursos.In this example, you'll run the deployment script that'll deploy the webapp onto App Service and create the resources.

La aplicación puede usar los diferentes modelos de implementación que se muestran a continuación:The app can use the different deployment models shown below:

Diagrama de flujo de datos de implementación

Hay muchas maneras de implementar aplicaciones en Azure, entre las que se incluyen las siguientes:There are many ways to deploy apps on Azure, including:

  • Plantillas del Administrador de recursos de AzureAzure Resource Manager templates
  • PowerShellPowerShell
  • CLI de AzureAzure CLI
  • Portal de AzureAzure portal
  • Azure DevOpsAzure DevOps

En esta aplicación, se ha usado:This application used:

Consideraciones sobre la seguridadSecurity considerations

RedNetwork

La aplicación de ejemplo usa el cifrado SSL de un extremo a otro para el flujo de datos en tránsito que entra y sale de la red.The sample app uses end-to-end SSL encryption for in-transit data flowing into and out of the network. La puerta de enlace se ha configurado con un certificado autofirmado.The gateway is configured with a self-signed certificate.

Importante

En esta demostración, se usa un certificado autofirmado.A self-signed certificate is used in this demonstration. En un entorno de producción, debe obtener los certificados de una entidad de certificación (CA) verificada.In a production environment, you should obtain certificates from a verified Certificate Authority (CA).

El firewall de la aplicación también inspecciona el tráfico entrante y los administradores de alertas cuando se detecta tráfico malintencionado en el tráfico de red.The application firewall also inspects incoming traffic and alerts admins when malicious traffic is detected in the network traffic. Application Gateway reduce la posibilidad de que se detecten amenazas de DDoS e inyección de SQL en el modelo de amenazas.Application Gateway mitigates the possibility for DDoS and SQL injection threats discovered in the threat model.

IdentidadIdentity

Para iniciar sesión en el portal, la aplicación de ejemplo usa Multi-Factor Authentication para los administradores de Azure Active Directory (Azure AD) que tienen asignado acceso a los recursos.To sign in to the portal, the sample app uses Multi-Factor Authentication for Azure Active Directory (Azure AD) administrators who are assigned access to the resources. La aplicación de ejemplo usa identidades administradas para obtener permisos para leer y recuperar secretos de Azure Key Vault, lo que garantiza que la aplicación no necesita codificar las credenciales y los tokens para leer los secretos.The sample app uses managed identities to gain permissions to read and retrieve secrets from Azure Key Vault, ensuring the app doesn't need to hard code credentials and tokens to read the secrets. Azure AD crea automáticamente las entidades de servicio que la aplicación necesita leer y modifica los secretos cuando se usan identidades administradas.Azure AD automatically creates the service principals that the app needs to read and modifies the secrets when managed identities are used.

Las identidades administradas para los recursos de Azure y MFA hacen que sea más difícil para los adversarios obtener privilegios y escalar sus privilegios en el sistema.Managed identities for Azure resources and MFA make it harder for adversaries to gain privilege and escalate their privileges in the system. Esta amenaza se señaló en el modelo de amenazas.This threat was pointed out in the threat model. La aplicación usa OAuth, que permite a los usuarios registrados en la aplicación OAuth iniciar sesión en la aplicación.The app uses OAuth, which allows users registered in the OAuth application to sign in to the app.

StorageStorage

Azure Database for PostgreSQL cifra los datos de la base de datos PostgreSQL en reposo automáticamente.Data in the PostgreSQL database is encrypted at rest automatically by Azure Database for PostgreSQL. La base de datos autoriza las direcciones IP de App Service para que solo la aplicación web de App Service implementada pueda acceder a los recursos de la base de datos con las credenciales de autenticación correctas.The database authorizes the App Service IP addresses so that only the deployed App Service web app can access the database resources with the right authentication credentials.

Registro y auditoríaLogging and auditing

La aplicación implementa el registro mediante el uso de Application Insights para realizar un seguimiento de las métricas, los registros y las excepciones que se producen.The app implements logging by using Application Insights to track metrics, logs and exceptions that occur. Este registro proporciona suficientes metadatos de aplicación para informar a los desarrolladores y a los miembros del equipo de operaciones sobre el estado de la aplicación.This logging provides enough app metadata to inform developers and operations team members on the status of the app. También proporciona suficientes datos para retroceder en caso de incidentes de seguridad.It also provides enough data to backtrack in case of security incidents.

Consideraciones sobre el costoCost considerations

En caso de no tener ninguna cuenta de Azure, puede crear una gratuitamente.If you don't already have an Azure account, you can create a free one. Vaya a la página de la cuenta gratuita para comenzar, ver lo que puede hacer con una cuenta gratuita de Azure y averiguar qué productos son gratis durante 12 meses.Go to the free account page to get started, see what you can do with a free Azure account, and learn which products are free for 12 months.

Para implementar los recursos de la aplicación de ejemplo con las características de seguridad, debe pagar algunas características prémium.To deploy the resources in the sample app with the security features, you need to pay for some premium features. A medida que la aplicación se escala y los niveles gratis y las pruebas que ofrece Azure deben actualizarse para cumplir los requisitos de la aplicación, es posible que los costos aumenten.As the app scales and the free tiers and trials offered by Azure need to be upgraded to meet application requirements, your costs might increase. Puede usar la calculadora de precios de Azure para calcular los costos.Use the Azure pricing calculator to estimate your costs.

Implementación de la soluciónDeploy the solution

Requisitos previosPrerequisites

Para poner en marcha la aplicación, debe instalar estas herramientas:To get the application up and running, you need to install these tools:

  • Un editor de código para modificar y ver el código de la aplicación.Visual Studio Code es una opción de código abierto.A code editor to modify and view the application code.Visual Studio Code is an open source option.
  • La CLI de Azure en el equipo de desarrollo.Azure CLI on your development computer.
  • GIT en el sistema.Git on your system. GIT se usa para clonar el código fuente localmente.Git is used to clone the source code locally.
  • jq, una herramienta de UNIX fácil de usar para consultar JSON.jq, a UNIX tool for querying JSON in a user-friendly way.

Necesita una suscripción a Azure para implementar los recursos de la aplicación de ejemplo.You need an Azure subscription to deploy the sample app's resources. Si no tiene una suscripción a Azure, puede crear una cuenta gratuita para probar la aplicación de ejemplo.If you don't have an Azure subscription, you can create a free account to test the sample app.

Después de instalar estas herramientas, está listo para implementar la aplicación en Azure.After installing these tools, you’re ready to deploy the app on Azure.

Configuración del entornoEnvironment setup

Ejecute los scripts de implementación para configurar el entorno y la suscripción:Run the deployment scripts to set up the environment and subscription:

  1. Para clonar el repositorio de código fuente, use este comando de GIT:To clone the source code repository, use this Git command:

    git clone https://github.com/Azure-Samples/sample-linux-python-app tutorial-project
    
  2. Para ir al directorio, use este comando:To move into the directory, use this command:

    cd tutorial-project/scripts
    
  3. Hay archivos en la carpeta de scripts que son específicos de la plataforma que usa (Windows o Linux).There are files in the scripts folder that are specific to the platform you're using (Windows or Linux). Como ya se ha instalado la CLI de Azure, inicie sesión en la cuenta de Azure en el símbolo del sistema mediante la ejecución de este comando de la CLI:As the Azure CLI has already been installed, sign in to the Azure account at the command prompt by running this CLI command:

    az login
    

Cuando se abra el explorador, inicie sesión con sus credenciales.The browser will open, sign in with your credentials. Después de iniciar sesión, puede empezar a implementar los recursos desde el símbolo del sistema.After signing in, you can start to deploy the resources from the command prompt.

Los scripts deploy-powershell.ps1 y deploy-bash.sh de desarrollo contienen código que implementa toda la aplicación.The deployment scripts deploy-powershell.ps1 and deploy-bash.sh contain code that deploys the entire application. Para implementar la solución:To deploy the solution:

  1. Si está en PowerShell, ejecute el archivo deploy-powershell.ps1 escribiendo ./deploy-powershell.ps1 REGION RESOURCE_GROUP_NAME y reemplazando el nombre de la región y el grupo de recursos con las regiones de Azure adecuadas y un nombre para el grupo de recursos.If you are on PowerShell run the deploy-powershell.ps1 file by typing ./deploy-powershell.ps1 REGION RESOURCE_GROUP_NAME replacing the region and resource group name with suitable Azure regions and a name for the resource group
  2. Si está en Linux, ejecute el archivo deploy-bash.sh escribiendo /deploy-bash.sh REGION RESOURCE_GROUP_NAME. Puede que tenga que escribir chmod +x deploy-bash.sh para poder ejecutar el archivo.If you are on Linux run the deploy-bash.sh file by typing /deploy-bash.sh REGION RESOURCE_GROUP_NAME, you may have to make the file executable by typing chmod +x deploy-bash.sh

En los siguientes ejemplos se muestran fragmentos de código de los componentes clave.The following examples showcase snippets of the key components. Puede implementar los ejemplos individualmente o con el resto de los componentes mediante la ejecución de los archivos de implementación.You can deploy the examples individually or with the rest of the components by running the deploy files.

Guía de implementaciónImplementation guidance

El script de implementación es un script que se puede dividir en cuatro fases.The deployment script is one script that can be broken down into four phases. Cada fase implementa y configura un recurso de Azure que se encuentra en el diagrama de arquitectura.Each phase deploys and configures an Azure resource that's in the architecture diagram.

Las cuatro fases son:The four phases are:

  • Implementar Azure Key VaultDeploy Azure Key Vault.
  • Implementar Azure Database for PostgreSQLDeploy Azure Database for PostgreSQL.
  • Implementar Azure Web Apps en LinuxDeploy Azure Web Apps on Linux.
  • Implementar Application Gateway con un firewall de aplicaciones web.Deploy Application Gateway with web application firewall.

Cada fase se basa en la anterior mediante la configuración de los recursos implementados previamente.Each phase builds upon the preceding one by using configuration from the previously deployed resources.

Para completar los pasos de implementación, asegúrese de que ha instalado las herramientas que se indican en Requisitos previos.To complete the implementation steps, make sure you’ve installed the tools listed under Prerequisites.

Implementar Azure Key VaultDeploy Azure Key Vault

En esta sección, creará e implementará una instancia de Azure Key Vault que se usa para almacenar secretos y certificados.In this section, you create and deploy an Azure Key Vault instance that is used to store secrets and certificates.

Después de completar la implementación, tendrá una instancia de Azure Key Vault implementada en Azure.After you complete the deployment, you have an Azure Key Vault instance deployed on Azure.

Para implementar Azure Key Vault mediante la CLI de Azure:To deploy Azure Key Vault by using Azure CLI:

  1. Declare las variables para Azure Key Vault.Declare the variables for Azure Key Vault.

  2. Registre el proveedor de Azure Key Vault.Register the Azure Key Vault provider.

  3. Cree el grupo de recursos para la instancia.Create the resource group for the instance.

  4. Cree la instancia de Azure Key Vault en el grupo de recursos creado en el paso 3.Create the Azure Key Vault instance in the resource group created in step 3.

    
     function Get-Hash() {
         return (New-Guid).Guid.Split('-')[4]
     }
    
    az provider register -n Microsoft.KeyVault
    
    # Create the Azure Key Vault instance
    Write-Host "Creating Azure Key Vault instance: $($kvName)"
    az keyvault create --name $kvName `
        --resource-group $ResourceGroup `
        --location $Location `
        --verbose
    
    # Generate usernames and passwords using system functions and environment variables
    Write-Host "Generating PostgreSQL username and password"
    $pgUsername = "$($env:Username)$(Get-Hash)"
    $pgPassword = (New-Guid).Guid
    
    # Set the username secret in the Azure Key Vault instance
    Write-Host "Setting PostgreSQL username in KeyVault"
    az keyvault secret set --vault-name $kvName `
        --name PGUSERNAME `
        --value $pgUsername `
        --verbose
    
    # Set the password secret in the Azure Key Vault instance
    Write-Host "Setting PostgreSQL password in KeyVault"
    az keyvault secret set --vault-name $kvName `
        --name PGPASSWORD `
        --value $pgPassword `
        --verbose
    
    

El procedimiento recomendado es usar identidades administradas para los recursos de Azure en las aplicaciones que usan Key Vault para acceder a los recursos.It's a best practice to use managed identities for Azure resources in apps that use Key Vault to access resources. La seguridad aumenta cuando las claves de acceso a Key Vault no se almacenan en el código ni en la configuración.Your security posture increases when access keys to Key Vault aren't stored in code or in configuration.

Implementar Azure Database for PostgreSQLDeploy Azure Database for PostgreSQL

Azure Database for PostgreSQL funciona de la siguiente manera: cree primero el servidor de bases de datos y, a continuación, cree la base de datos en la que se almacenará el esquema y los datos.Azure Database for PostgreSQL works in the following way, first create the database server then create the database on which to store the schema and data.

Una vez completada la implementación, tendrá un servidor y una base de datos PostgreSQL en ejecución en Azure.After you complete the deployment, you have a PostgreSQL server and database running on Azure.

Para implementar Azure Database for PostgreSQL mediante la CLI de Azure:To deploy Azure Database for PostgreSQL by using Azure CLI:

  1. Abra un terminal con la CLI de Azure y la configuración de suscripción de Azure.Open a terminal with Azure CLI and your Azure subscription setup.
  2. Genere una combinación de nombre de usuario y contraseña segura que se usará para acceder a la base de datos.Generate a secure user name and password combination that is used to access the database. Deben almacenarse en Azure Key Vault para las aplicaciones que los usan.(These should be stored in Azure Key Vault for apps that use them.)
  3. Cree la instancia del servidor PostgreSQL.Create the PostgreSQL server instance.
  4. Cree una base de datos en la instancia del servidor que creó en el paso 3.Create a database on the server instance that you created in step 3.
  5. Ejecute scripts de PostgreSQL en la instancia de PostgreSQL.Run PostgreSQL scripts on the PostgreSQL instance.

El código siguiente se basa en los secretos PGUSERNAME y PGPASSWORD almacenados en Azure Key Vault en el paso de implementación de Key Vault anterior.The code below relies on the PGUSERNAME and PGPASSWORD secrets stored in Azure KeyVault from the deploying KeyVault step above.

$pgUsername = $(az keyvault secret show --name PGUSERNAME --vault-name $kvName --query value) -replace '"',''
$pgPassword = $(az keyvault secret show --name PGPASSWORD --vault-name $kvName --query value) -replace '"',''

# Create an Azure Database for PostgreSQL server
Write-Host "Creating the PostreSQL server: $($dbServer)"
az  postgres server create -l $Location `
    --resource-group $ResourceGroup `
    --name $dbServer `
    --admin-user $pgUsername `
    --admin-password $pgPassword `
    --sku-name B_Gen5_1 `
    --verbose

# Create a database in the server instance created above
Write-Host "Creating the PostgreSQL database: $($dbName)"
az postgres db create --resource-group $ResourceGroup `
    --server-name $dbServer `
    --name $dbName `
    --verbose

# Retrieve the database information above
$db = (az postgres server show --resource-group $ResourceGroup `
        --name $dbServer)

$db = $db | ConvertFrom-Json

# Get the Fully Qualified Domain Name (FQDN) of the database to use in
# the database connection strings to be stored in Azure Key Vault
Write-Host "Generating the PostgreSQL connection string"
$PGCONNECTIONSTRING = "postgresql+psycopg2://${pgUsername}@$($db.fullyQualifiedDomainName):${pgPassword}@$($db.fullyQualifiedDomainName):$dbPort/$($dbName)?sslmode=$($dbSSLMode)"
$PGCONNECTIONSTRING = $PGCONNECTIONSTRING + '"&"' + "sslrootcert=$($dbRootCertPath)"

# Set the database connection string above into Azure Key Vault
Write-Host "Setting the PostgreSQL connection string into KeyVault"
az keyvault secret set --vault-name $kvName `
    --name PGCONNECTIONSTRING `
    --value $PGCONNECTIONSTRING `
    --verbose

Después de implementar la base de datos, debe almacenar sus credenciales y la cadena de conexión en Azure Key Vault.After you deploy the database, you need to store its credentials and connection string in Azure Key Vault. En la carpeta de scripts, hay un archivo functions.sql que contiene el código PL/pgSQL que crea funciones almacenadas cuando lo ejecuta.In the scripts folder, there's a functions.sql file that contains the PL/pgSQL code that creates stored functions when you run it. La ejecución de este archivo parametriza las entradas para limitar la inyección de SQL.Running this file parameterizes the inputs to limit SQL injection.

PostgreSQL está agrupado con una herramienta llamada psql que se usa para conectar con la base de datos.PostgreSQL is bundled with a tool called psql that is used to connect to the database. Para ejecutar functions.sql, debe conectarse a la instancia de Azure Database for PostgreSQL desde el equipo local y ejecutarla desde allí.To run functions.sql, you need to connect to the Azure Database for PostgreSQL instance from your local machine and run it from there. La instalación de la herramienta psql se incluye en la instalación predeterminada de PostgreSQL en cada sistema operativo.Installation of the psql tool is included in the default installation for PostgreSQL on each operating system. Para obtener más información, consulte la documentación de psql.For more information, see the psql Documentation.

Azure Cloud Shell también incluye la herramienta psql.Azure Cloud Shell also includes the psql tool. Para usar Cloud Shell directamente desde Azure Portal, seleccione el icono de Cloud Shell.You can use Cloud Shell directly from the Azure portal by selecting the Cloud Shell Icon.

Para habilitar el acceso remoto a la instancia de PostgreSQL, debe autorizar la dirección IP en PostgreSQL.To enable remote access to the PostgreSQL instance, you need to authorize the IP address in PostgreSQL. Para habilitar este acceso, vaya a la pestaña Seguridad de conexión, seleccione Agregar IP de cliente y guarde la nueva configuración.You enable this access by going to the Connection security tab, selecting Add client IP, and saving the new settings.

Autorizar la dirección IP de cliente

Si usa Cloud Shell en lugar de la herramienta psql local, seleccione Permitir el acceso a servicios de Azure y cambie su valor a Activado para permitir el acceso de Cloud Shell.If you're using Cloud Shell instead of the local psql tool, select Allow access to Azure services and change its value to ON to allow your Cloud Shell access.

A continuación, conéctese a la instancia ejecutando el siguiente comando psql con los parámetros de la cadena de conexión de la pestaña Cadenas de conexión de la instancia de PostgreSQL en Azure Portal.Then connect to the instance by running the below psql command with connection string parameters from the Connection strings tab of the PostgreSQL instance on the Azure portal. Reemplace las llaves vacías por parámetros de la hoja Cadena de conexión de la base de datos y la contraseña por la contraseña de Azure Key Vault.Replace the empty braces with parameters from the Connection String blade of the database and the password with the password from Azure Key Vault.

psql "host={} port=5432 dbname=hellodb user={} password=PGPASSWORD sslmode=require"

Ejecute el siguiente script PL/pgSQL después de asegurarse de que está conectado a la base de datos.Run the following PL/pgSQL script after you make sure you're connected to the database. El script crea las funciones almacenadas que se usan para insertar datos en la base de datos.The script creates the stored functions used to insert data into the database.

CREATE OR REPLACE FUNCTION insert_visitor(country VARCHAR(40), browser VARCHAR(40), operating_system VARCHAR(40)) RETURNS void AS $$
BEGIN
    INSERT INTO visitor(
        country,
        browser,
        operating_system,
        date_visited)
    VALUES (
        country,
        browser,
        operating_system,
        NOW()
    );
END;
$$ LANGUAGE PLPGSQL;


CREATE OR REPLACE FUNCTION insert_azure_document(title VARCHAR(40), url VARCHAR(100), category VARCHAR(40)) RETURNS void AS $$
BEGIN
    INSERT INTO azure_document(
        title,
        url,
        category)
    VALUES (
        title,
        url,
        category
    );
END;
$$ LANGUAGE PLPGSQL;

Para obtener más información sobre cómo configurar SSL y la verificación de la entidad de certificación (CA) para PostgreSQL, consulte Configuración de la conectividad SSL en Azure Database for PostgreSQL: servidor único.For more information on how to setup SSL and Certificate Authority (CA) verification for PostgreSQL, see Configure SSL connectivity in Azure Database for PostgreSQL.

En el contenedor se incluye un certificado raíz.A root certificate is included in the container. Los pasos que se siguen para obtener el certificado son:The steps taken to obtain the certificate are:

  1. Descargar el archivo de certificado de la entidad de certificación.Download the certificate file from the Certificate Authority.

  2. Descargar e instalar OpenSSL en la máquina.Download and install OpenSSL on your machine.

  3. Descodificar el archivo del certificado:Decode your certificate file:

    openssl x509 -inform DER -in BaltimoreCyberTrustRoot.crt -text -out root.crt
    

Para obtener más información sobre cómo configurar la seguridad SSL para PostgreSQL, consulte Configuración de la conectividad SSL en Azure Database for PostgreSQL: servidor único.Read more on how to configure SSL security for PostgreSQL here Configure SSL Connection Security.

Implementar Azure Web Apps en LinuxDeploy Azure Web Apps on Linux

Puede compilar fácilmente servicios de Linux basados en Azure App Service, ya que Azure proporciona un conjunto de imágenes y contenedores precompilados para lenguajes comunes como Python, C#, Ruby y Java.You can easily build Linux services on top of Azure App Service as Azure provides a set of prebuilt containers and images for widely used languages like Python, Ruby, C#, and Java. Azure también admite contenedores personalizados, lo que permite que prácticamente todos los lenguajes de programación se ejecuten en la plataforma Azure App Service.Azure also supports custom containers, which can allow virtually all programming languages to run on the Azure App Service platform.

La aplicación que se va a implementar es una sencilla aplicación de Python que se ejecuta en la distribución de Ubuntu Linux más reciente.The app being deployed is a simple Python app that runs on the latest Ubuntu Linux distribution. Se conecta a las instancias de Azure Key Vault y PostgreSQL creadas en las secciones anteriores para la administración de credenciales y el almacenamiento de datos, respectivamente.It connects to the Azure Key Vault and PostgreSQL instances that were created in the previous sections for credential management and data storage, respectively.

El siguiente archivo de Docker se proporciona en la carpeta raíz de la aplicación:The following Docker file is provided in the root folder of the app:

# Docker file for the basic web app
# Using the latest Alpine Linux

FROM alpine:latest

# Copy requirements to the container
COPY requirements.txt /tmp/requirements.txt

# Install Python and PostgreSQL dependencies
RUN apk update && \
    apk add --update bash gcc libffi-dev musl-dev  postgresql-dev python3 python3-dev && \
    rm -r /usr/lib/python*/ensurepip && \
    pip3 install --upgrade pip setuptools && \
    if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi && \
    if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/bin/python; fi && \
    pip3 install --no-cache-dir -r /tmp/requirements.txt && \
    rm -rf /.wh /root/.cache /var/cache /tmp/requirements.txt

# Change the working directory inside the container to /hello
WORKDIR /hello

# Copy the application code into the container
COPY . /hello

# Set the FLASK_APP environment variable used by flask migrate
ENV FLASK_APP=app.py

# Copy the init script to the container
COPY init.sh /usr/local/bin/

# Make the init script executable
RUN  chmod u+x /usr/local/bin/init.sh

# Expose the container web service endpoint
EXPOSE 8000

# Run the app with a non root user
RUN addgroup -g 1000 -S appgroup && \
    adduser  -u 1000 -S appuser -G appgroup

# Allow the non root user to access the folder
RUN chown -R appuser:appgroup /hello

# Switch to the non root user
USER appuser

# Set the init script as the file to be run during container startups
ENTRYPOINT ["/usr/local/bin/init.sh"]

El archivo Dockerfile anterior se utiliza para compilar el contenedor que se hospeda en Azure Container Registry en mcr.microsoft.com/samples/basic-linux-app.The Dockerfile above is used to build the container that is hosted on the Azure Container Registry at mcr.microsoft.com/samples/basic-linux-app.

El código siguiente:The code below:

  1. Declara las variables y los nombres de la instancia de App Service.Declares the variables and names for the App Service instance.

  2. Crea el grupo de recursos para el plan de App Service.Creates the resource group for the App Service plan.

  3. Aprovisiona una instancia de contenedores de Azure Web Apps en Linux.Provisions an Azure Web Apps on Linux containers instance.

  4. Habilita el registro para el contenedor de la aplicación web.Enables logging for the web app container.

  5. Establece algunas configuraciones de aplicación en la configuración de la aplicación del contenedor.Sets some app configurations in the container's app settings.

    Write-Host "Retrieving the Azure Key Vault URL"
    $kvURI = $(az keyvault show --name $kvName --query properties.vaultUri)
    
    # Create the App Service plan, using --linux for running containers on Web Apps on Linux
    Write-Host "Creating App Service Plan: $($appName)"
    az appservice plan create --name $appServicePlanName `
        --resource-group $ResourceGroup `
        --location $Location `
        --number-of-workers 1 `
        --sku B1 `
        --is-linux `
        --verbose
    
    # Create the web app
    Write-Host "Creating Azure Web App for Linux: $($appName)"
    az webapp create --name $appName `
        --resource-group $ResourceGroup `
        --plan $appServicePlanName `
        --deployment-container-image-name $containerName `
        --verbose
    
    # Assign a system-assigned identity
    # This creates a service principal to be used for managed identities for Azure resources allowing access to Key Vault Secrets without using auth keys/tokens
    Write-Host "Assigning Service Principal Identity to webapp: $($appName)"
    az webapp identity assign --name $appName `
        --resource-group $ResourceGroup `
        --verbose
    
    # Configure logging for the Docker container on App Service
    Write-Host "Configuring logging for the web app: $($appName)"
    az webapp log config --name $appName `
        --resource-group $ResourceGroup `
        --application-logging true `
        --detailed-error-messages true `
        --docker-container-logging filesystem `
        --verbose
    
    # Set app configuration settings to be set in the container's environment variables
    Write-Host "Setting app settings for our web app: $($appName)"
    az webapp config appsettings set --name $appName `
        --resource-group $ResourceGroup `
        --settings WEBSITE_TIME_ZONE=$timezone KEY_VAULT_URI=$kvURI `
        --verbose
    
    # Stop the web app to enable us to first allow the created managed identities for Azure resources service principals access to the Key Vault instance
    az webapp stop --name $appName `
        --resource-group $ResourceGroup `
        --verbose
    
    # Get all the outbound IPs the App Service instance might use
    Write-Host "Adding outbound Azure App Service IP's to the PostgreSQL database firewall."
    $outboundIps = (az webapp show --resource-group $ResourceGroup `
        --name $appName `
        --query outboundIpAddresses `
        --output tsv)
    
    # Loop over all the outbound IP addresses and authorize them in the PostgreSQL firewall
    $outboundIps = $outboundIps.Split(',')
    for($i=0; $i -lt $outboundIps.length; $i++) {
        Write-Output "Adding IP Rule $($outboundIps[$i]) on PostgreSQL for App Service"
    
        az postgres server firewall-rule create --name "OUTBOUND_IP_RULE$i" `
            --resource-group $ResourceGroup `
            --server-name $dbServer `
            --start-ip-address $outboundIps[$i] `
            --end-ip-address $outboundIps[$i] `
            --verbose
    }
    
    

Este script crea una identidad asignada para la instancia de App Service que se puede usar con MSI para interactuar con Azure Key Vault sin codificar de forma rígida los secretos en el código ni en la configuración.This script creates an assigned identity for the App Service instance that can be used with MSI to interact with Azure Key Vault without hard coding secrets in code or configuration.

Vaya a la instancia de Azure Key Vault en el portal para autorizar la identidad asignada en la pestaña de la directiva de acceso. Seleccione Agregar una nueva directiva de acceso.Go to the Azure Key Vault instance in the portal to authorize the assigned identity on the access policy tab. Select Add new access policy. En Seleccionar entidad, busque el nombre de la aplicación similar al nombre de la instancia de App Service creada.Under Select principal, search for the application name that is similar to the name of the App Service instance created. Una entidad de servicio adjuntada a la aplicación debe estar visible.A service principal attached to the application should be visible. Selecciónela y guarde la página de directiva de acceso, tal y como se muestra en la siguiente captura de pantalla.Select it and save access policy page, as shown in the following screenshot.

Dado que la aplicación solo necesita recuperar claves, seleccione el permiso Get en las opciones de secretos para permitir el acceso y, al mismo tiempo, reducir los privilegios concedidos.Because the application only needs to retrieve keys, select the Get permission in the secrets options, allowing access while reducing the privileges granted.

Directiva de acceso de Key Vault

Crear una directiva de acceso a Key VaultCreate a Key Vault access policy

Guarde la directiva de acceso y, a continuación, guarde el nuevo cambio en la pestaña Directivas de acceso para actualizar las directivas.Save the access policy and then save the new change on the Access Policies tab to update the policies.

Implementar Application Gateway con un firewall de aplicaciones web habilitadoDeploy Application Gateway with web application firewall enabled

En las aplicaciones web, no se recomienda exponer los servicios directamente al mundo exterior en Internet.In web apps, it is not recommended that you expose services directly to the outside world on the internet. Las reglas de equilibrio de carga y firewall proporcionan más seguridad y control sobre el tráfico entrante y le ayudan a administrarlo.Load balancing and firewall rules provide more security and control over the incoming traffic and help you manage it.

Para implementar una instancia de Application Gateway:To deploy an Application Gateway instance:

  1. Cree el grupo de recursos para hospedar Application Gateway.Create the resource group to house the application gateway.

  2. Aprovisione una red virtual para conectarla a la puerta de enlace.Provision a virtual network to attach to the gateway.

  3. Cree una subred para la puerta de enlace en la red virtual.Create a subnet for the gateway in the virtual network.

  4. Aprovisione una dirección IP pública.Provision a public IP address.

  5. Aprovisione Application Gateway.Provision the application gateway.

  6. Habilite el firewall de aplicaciones web en la puerta de enlace.Enable web application firewall on the gateway.

    az keyvault certificate create --vault-name $kvName `
        --name $certName `
        --policy `@policy.json `
        --verbose
    
    az keyvault secret download --file $filePath `
        --encoding base64 `
        --name $certName `
        --vault-name $kvName `
        --verbose
    
    $pfxFile = Get-PfxData -FilePath $filePath
    
    $certPassword = Get-Random
    
    az keyvault secret set --vault-name $kvName `
        --name CERTPASSWORD `
        --value $certPassword `
        --verbose
    
    $signPassword = ConvertTo-SecureString $certPassword -Force -AsPlainText
    Export-PfxCertificate -PFXData $pfxFile -FilePath $certPath -Password $signPassword
    

El script anterior:The preceding script:

  1. Crea un nuevo certificado autofirmado en Azure.Creates a new self-signed certificate on Azure.
  2. Descarga el certificado autofirmado como un archivo codificado en Base64.Downloads the self-signed certificate as a base64-encoded file.
  3. Genera una contraseña para el certificado autofirmado.Generates a password for the self-signed certificate.
  4. Exporta el certificado como archivo PFX firmado con la contraseña.Exports the certificate as a PFX file signed with the password.
  5. Almacena la contraseña del certificado en Azure Key Vault.Stores the certificate's password in Azure Key Vault.

En esta sección se implementa Application Gateway:This section deploys the application gateway:

# Create a virtual network required by the gateway
Write-Host "Creating the Azure Virtual Network: $($vnetName)"
az network vnet create --name $vnetName `
    --resource-group $ResourceGroup `
    --location $Location `
    --address-prefix $vnetAddressPrefix `
    --verbose

# Add a subnet to the virtual network
Write-Host "Creating the Subnet: $($gwSubnet)"
az network vnet subnet create --name $gwSubnet `
    --resource-group $ResourceGroup `
    --vnet-name $vnetName `
    --address-prefix $gatewayAddressPrefix `
    --verbose

# Create a public IP address that will be used by clients to access the application gateway
Write-Host "Creating the Public IP Address: $($publicIpName)"
az network public-ip create --resource-group $ResourceGroup `
    --name $publicIpName `
    --verbose

# Create the application gateway
Write-Host "Creating the Application Gateway: $($gwName)"
az network application-gateway create `
    --name $gwName `
    --resource-group $ResourceGroup `
    --location $Location `
    --vnet-name $vnetName `
    --subnet $gwSubnet `
    --public-ip-address $publicIpName `
    --http-settings-cookie-based-affinity Disabled `
    --frontend-port 443 `
    --http-settings-protocol Https `
    --http-settings-port 443 `
    --capacity 2 `
    --sku WAF_Medium `
    --cert-file $certPath `
    --cert-password $certPassword `
    --verbose

# Enable the firewall with OWASP Ruleset 3.0 on the application gateway
Write-Host "Creating the Application Gateway WAF Configuration"
az network application-gateway waf-config set `
    --enabled true `
    --gateway-name $gwName `
    --resource-group $ResourceGroup `
    --firewall-mode Detection `
    --rule-set-version 3.0 `
    --verbose

# Retrieve the name of the HTTP settings that will be updated below
$gwHTTPSettings = $(az network application-gateway http-settings list --resource-group $ResourceGroup `
    --gateway-name $gwName)

$gwHTTPSettings = $gwHTTPSettings | ConvertFrom-Json
$gwHTTPSettingsName = $gwHTTPSettings.name

# Retrieve the name of the backend address pool that will be updated below
$gwAddressPool = $(az network application-gateway address-pool list --resource-group $ResourceGroup `
    --gateway-name $gwName)

$gwAddressPool = $gwAddressPool | ConvertFrom-Json
$gwAddressPoolName = $gwAddressPool.name

# Update the backend pool with the App Service host name
Write-Host "Updating the Azure Application Gateway backend pool host name: $($appHostName)"
az network application-gateway address-pool update --name $gwAddressPoolName `
    --resource-group $ResourceGroup `
    --gateway-name $gwName `
    --servers $appHostName `
    --verbose

# Create a probe that will check the backend pool's availability
Write-Host "Updating the Azure Application Gateway Probe: $($gwProbe)"
az network application-gateway probe create --gateway-name $gwName `
    --name $gwProbe `
    --resource-group $ResourceGroup `
    --protocol Https `
    --path $gwProbePath `
    --host-name-from-http-settings true `
    --verbose

# Update the app to user https and to pick the host name from the backend settings
Write-Host "Deploying the updated application gateway"
az network application-gateway http-settings update --gateway-name $gwName `
    --resource-group $ResourceGroup `
    --name $gwHTTPSettingsName `
    --connection-draining-timeout 0 `
    --enable-probe true `
    --host-name-from-backend-pool true `
    --probe $gwProbe `
    --protocol Https `
    --port 443 `
    --verbose

Una vez completada la implementación, tendrá una instancia de Application Gateway con el firewall de aplicaciones web habilitado.After you complete the deployment, you have an application gateway with web application firewall enabled.

La instancia de la puerta de enlace expone el puerto 443 para HTTPS.The gateway instance exposes port 443 for HTTPS. Esta configuración garantiza que la aplicación solo esté accesible en el puerto 443 a través de HTTPS.This configuration ensures that our app is only accessible on port 443 through HTTPS.

El bloqueo de los puertos que no se usan y la limitación de la exposición de la superficie de ataque es una práctica de seguridad recomendada.Blocking unused ports and limiting the attack surface exposure is a security best practice.

Agregar grupos de seguridad de red a la instancia de App ServiceAdd network security groups to the App Service instance

Las instancias de App Service se pueden integrar con redes virtuales.App Service instances can be integrated with virtual networks. Esta integración permite que se configuren con directivas de grupo de seguridad de red que administran el tráfico entrante y saliente de la aplicación.This integration allows them to be configured with network security group policies that manage the app's incoming and outgoing traffic.

  1. Para habilitar esta característica, en la hoja de la instancia de Azure App Service, en Configuración, seleccione Redes.To enable this feature, on the Azure App service instance blade, under Settings, select Networking. En el panel derecho, en Integración de VNET, seleccione Haga clic aquí para configurar.In the right pane, under VNet Integration, select Click here to configure.

    Integración de una nueva red virtual

    Integración de una nueva red virtual para App ServiceNew virtual network integration for App Service

  2. En la página siguiente, seleccione Agregar VNET (versión preliminar) .On the next page, select Add VNET (preview).

  3. En el menú siguiente, seleccione la red virtual creada en la implementación que empieza por hello-vnet.On the next menu, select the virtual network created in the deployment that starts with hello-vnet. Puede crear un subconjunto nuevo o seleccionar uno existente.You can either create a new subnet or select an existing one. En este caso, cree una nueva subred.In this case, create a new subnet. Defina el Intervalo de direcciones como 10.0.3.0/24 y asigne a la subred el nombre app-subnet.Set the Address range to 10.0.3.0/24 and name the subnet app-subnet.

    Configuración de la red virtual de App Service

    Configuración de la red virtual para App ServiceVirtual network configuration for App Service

Ahora que ha habilitado la integración de la red virtual, puede agregar grupos de seguridad de red a nuestra aplicación.Now that you've enabled the virtual network integration, you can add network security groups to our app.

  1. En el cuadro de búsqueda, busque grupos de seguridad de red.Use the search box, search for network security groups. Seleccione Grupos de seguridad de red en los resultados.Select Network security groups in the results.

    Buscar grupos de seguridad de red

    Buscar grupos de seguridad de redSearch for network security groups

  2. En el menú siguiente, seleccione Agregar.On the next menu, select Add. Escriba el Nombre del NSG y el Grupo de recursos en el que se debe ubicar.Enter the Name of the NSG and the Resource group in which it should be located. Este NSG se aplicará a la subred de la puerta de enlace de la aplicación.This NSG will be applied to the application gateway's subnet.

    Crear un NSG

    Crear un NSGCreate an NSG

  3. Una vez creado el NSG, selecciónelo.After the NSG is created, select it. En su hoja, en Configuración, seleccione Reglas de seguridad de entrada.In its blade, under Settings, select Inbound Security rules. Configure estas opciones para permitir conexiones entrantes en la puerta de enlace de la aplicación a través del puerto 443.Configure these settings to allow connections coming into the application gateway over port 443.

    Configurar el NSG

    Configurar el NSGConfigure the NSG

  4. En las reglas de salida para el NSG de la puerta de enlace, agregue una regla que permita las conexiones salientes con la instancia de App Service creando una regla orientada a la etiqueta de servicio AppService:In the outbound rules for the gateway NSG, add a rule that allows outbound connections to the App Service instance by creating a rule that targets the service tag AppService:

    Agregar reglas de salida para el NSG

    Agregar reglas de salida para el NSGAdd outbound rules for the NSG

    Agregue otra regla de salida para permitir que la puerta de enlace envíe reglas de salida a una red virtual.Add another outbound rule to allow the gateway to send outbound rules to a virtual network.

    Agregar otra regla de salida

    Agregar otra regla de salidaAdd another outbound rule

  5. En la hoja de subredes del NSG, seleccione Asociar, seleccione la red virtual creada en la implementación y seleccione la subred de puerta de enlace denominada gw-subnet.On the subnets blade of the NSG, select Associate, select the virtual network created in the deployment, and select the gateway subnet named gw-subnet. El NSG se aplica a la subred.The NSG is applied to the subnet.

  6. Cree otro NSG como en el paso anterior; esta vez, para la instancia de App Service.Create another NSG as in the earlier step, this time for the App Service instance. Asígnele un nombre.Give it a name. Agregue la regla de entrada para el puerto 443 como lo hizo para el NSG de la puerta de enlace de la aplicación.Add the inbound rule for port 443 as you did for the application gateway NSG.

    Si tiene una instancia de App Service implementada en una instancia de App Service Environment, que no es el caso de esta aplicación, puede agregar reglas de entrada para permitir sondeos de Azure Service Health abriendo los puertos 454-455 en los grupos de seguridad de entrada de su NSG de App Service.If you have an App Service instance deployed on an App Service Environment instance, which is not the case for this app, you can add inbound rules to allow Azure Service Health probes by opening up ports 454-455 on the inbound security groups of your App Service NSG. Esta es la configuración:Here's the configuration:

    Agregar reglas para sondeos de Azure Service Health

    Agregar reglas para sondeos de Azure Service Health (solo App Service Environment)Add rules for Azure Service Health probes (App Service Environment only)

  7. En las reglas de seguridad de salida, cree una nueva regla de seguridad de salida que permita a la instancia de App Service comunicarse con la base de datos de PostgreSQL.In the outbound security rules, create a new outbound security rule that allows the App Service instance to communicate with the PostgreSQL database. Configúrela como se indica a continuación:Configure it like this:

    Regla para permitir conexiones de salida de PostgreSQL

    Agregar una regla para permitir conexiones de salida de PostgreSQLAdd a rule to allow outbound PostgreSQL connections

Para limitar la superficie expuesta a ataques, modifique la configuración de red de App Service para que solo la puerta de enlace de la aplicación tenga acceso a la aplicación.To limit the attack surface, modify the App Service network settings to allow only the application gateway to access the application. Para ello, vaya a la pestaña de red de App Service, seleccione la pestaña Restricciones de IP y cree una regla de permiso que solo permita a la dirección IP de Application Gateway acceder directamente al servicio.You do this by going into the App Service network tab, selecting the IP Restrictions tab, and creating an allow rule that allows only the application gateway’s IP to directly access the service.

Puede recuperar la dirección IP de la puerta de enlace desde esta página de información general.You can retrieve the IP address of the gateway from its overview page. En la pestaña Dirección IP o CIDR, escriba la dirección IP en este formato: <GATEWAY_IP_ADDRESS>/32.On the IP Address CIDR tab, enter the IP address in this format: <GATEWAY_IP_ADDRESS>/32.

Permitir solo la puerta de enlace

Permitir que solo la dirección IP de la puerta de enlace tenga acceso a App ServiceAllow only the gateway IP to access the App Service

Implementación de OAuth en Azure Active DirectoryImplement Azure Active Directory OAuth

Los documentos de Azure distribuidos en la página de la aplicación web de ejemplo son recursos de la aplicación que podrían necesitar protección.The Azure documents distributed on the sample web app page are resources in our app that might need protection. Puede usar Azure Active Directory (Azure AD) para implementar la autenticación de aplicaciones web, de escritorio y móviles mediante diferentes flujos de autenticación.You can use Azure Active Directory (Azure AD) to implement authentication for web, desktop, and mobile apps by using different authentication flows. La aplicación usa el inicio de sesión con Microsoft, que permite a la aplicación leer los perfiles de los usuarios que se han agregado a la lista de usuarios de un solo inquilino de Azure AD.The app uses Login With Microsoft, that allows the app to read profiles of users who have been added to our single-tenant Azure AD user's list.

En Azure Portal, configure la aplicación para que use las credenciales necesarias:In the Azure portal, configure the app to use the required credentials:

  1. Seleccione Azure Active Directory o búsquelo desde el cuadro de búsqueda.Select Azure Active Directory, or search for it by using the search box.

  2. Seleccione Nuevo registro:Select New registration:

    Crear un registro

    Creación de un registro de aplicaciones de Azure ADCreate an Azure AD app registration

  3. En la página siguiente, especifique el nombre de la aplicación.On the next page, enter the app name. En Tipos de cuenta admitidos, seleccione Solo las cuentas de este directorio organizativo.Under Supported account types, select Accounts in this organizational directory only. En URI de redirección, escriba el dominio base en el que se ejecutará la aplicación más uno con el punto de conexión del token.Under Redirect URI, enter the base domain that the app will be running on plus one with the token endpoint. Por ejemplo: GATEWAY_HASH.cloudapp.net/token.For example: GATEWAY_HASH.cloudapp.net/token.

    Configuración del registro de aplicaciones de Azure AD

    Configuración del registro de aplicaciones de Azure ADConfigure Azure AD app registration

  4. Aparece una pantalla que muestra la aplicación registrada y su información.You are presented with a screen that shows the registered app and its information. Debe agregar esta información a la instancia de Azure Key Vault.You need to add this information into the Azure Key Vault instance.

    1. Copie el identificador de la aplicación (cliente) y guárdelo en Key Vault como CLIENTID.Copy the application (client) ID and save it in Key Vault as CLIENTID.

    2. Copie el URI de redirección que especificó en el paso anterior y guárdelo como REDIRECTURI.Copy the redirect URI that you entered in the previous step and save it as REDIRECTURI.

    3. Copie el nombre del directorio predeterminado de Azure AD, que tiene el formato nombre.microsoftonline.com y guárdelo en Key Vault como TENANT.Copy the Azure AD default directory name, which has the format name.microsoftonline.com, and save it in Key Vault as TENANT.

    4. Vaya a la pestaña Certificados y secretos de la aplicación de Azure AD que creó anteriormente y seleccione Nuevo secreto de cliente, como se muestra en la siguiente captura de pantalla.Go to the Certificates & secrets tab of the Azure AD app that you created previously and select New client secret, as shown in the following screenshot. Defina una fecha de expiración y, a continuación, copie el valor generado y guárdelo en Key Vault como CLIENTSECRET.Set an expiration date, and then copy the generated value and save it in Key Vault as CLIENTSECRET.

      Secreto de autorización de Azure AD

      Secreto de autorización de Azure ADAzure AD authorization secret

    5. Genere una clave secreta aleatoria segura con cualquier herramienta de línea de comandos o en línea.Generate a secure random secret key by using any command-line/online tool. Guárdela en Key Vault como FLASKSECRETKEY.Save it into Key Vault as FLASKSECRETKEY. El marco de trabajo de la aplicación usa esta clave para crear sesiones.The application framework uses this key to create sessions. Para obtener información sobre cómo generar una clave secreta, consulte Objetos session de Flask.To learn how to generate a secret key, see Flask Sessions.

  5. Después de configurar el inicio de sesión, debe agregar usuarios al vínculo de Azure AD vínculo para permitirles iniciar sesión en el recurso.After you configure the sign-in, you need to add users to the Azure AD link to allow them to sign in to the resource. Para agregarlos, vaya a la pestaña Usuarios de Azure AD, seleccione Todos los usuarios y, a continuación, seleccione Nuevo usuario o Nuevo usuario invitado.To add them, go to the Users tab in Azure AD, select All users, and then select New user or New guest user. Para las pruebas, puede agregar un usuario invitado e invitarlo al directorio.For testing, you can add a guest user and invite the user into the directory. También puede agregar un nuevo usuario si el dominio en el que se ejecuta la aplicación se ha validado.Or you can add a new user if the domain the app is running on has been validated. En este ejemplo, solo se pueden registrar para el acceso los usuarios registrados en el inquilino de Azure AD.In this example, only users registered in the Azure AD tenant can be registered for access. Para obtener información sobre el acceso de inicio de sesión en varios inquilinos, consulte la documentación.For information about multitenant sign-in access, see the documentation.

    Agregar usuarios al dominio predeterminado

    Agregar usuarios al dominio predeterminado de Azure Active DirectoryAdd users to the default Azure Active Directory domain

Después de agregar la configuración de Azure AD y los secretos a Key Vault, los usuarios se pueden autenticar en la aplicación mediante la autenticación de OAuth de Azure.After you add the Azure AD configuration and secrets to Key Vault, users can be authenticated into the app by using Azure OAuth authentication. En el código de la aplicación, se controla mediante la biblioteca de autenticación de Azure Active Directory (ADAL).In the app code, this is handled by the Azure Active Directory Authentication Library (ADAL).

Una vez que los secretos están en Key Vault y la aplicación tiene acceso a los secretos y a la base de datos, se puede acceder al servicio de aplicación a través de la URL de la aplicación de la puerta de enlace https://GATEWAY_HASH.cloudapp.net), que se puede obtener de su hoja.After the secrets are in Key Vault and the application has access to the secrets and the database, the application service can be reached through the gateway's application URL (https://GATEWAY_HASH.cloudapp.net), which you can get from its blade.

Si, al iniciar sesión en Azure AD, recibe un error que indica que "El usuario no está registrado en el directorio en el que intenta iniciar sesión", debe agregar al usuario.If, when you sign in to Azure AD, you get an error that says "User is not registered in the directory you're trying to log into," you need to add the user. Para agregar al usuario, vaya a la pestaña Usuarios de Azure AD y agregue el usuario manualmente. Para ello, escriba sus detalles o invite al usuario escribiendo su dirección de correo electrónico como usuario invitado en Azure AD en la hoja Invitar a un invitado.To add the user, go to the Users tab of Azure AD and add the user manually by entering their details or invite the user by entering their email address as a guest user to Azure AD in the Invite Guest blade.

Implementar Application InsightsDeploy Application Insights

Ahora que la aplicación está implementada y en funcionamiento, debe controlar los errores que se producen dentro de la aplicación junto con el registro y la recopilación de datos de seguimiento.Now that the app is deployed and working, you need to handle errors that occur within the app along with logging and trace data collection. El registro y la recopilación de datos de seguimiento proporcionan una vista de los eventos de auditoría que se producen en la aplicación.Logging and trace data collection provides a view into audit events that happen in the app.

Application Insights es un servicio que recopila registros que pueden generar los usuarios o el sistema.Application Insights is a service that collects logs that can be generated by users or by the system.

Para crear una instancia de Application Insights:To create an Application Insights instance:

  1. Para buscar Application Insights, use el cuadro de búsqueda de Azure Portal.Search for Application Insights by using the search box in the Azure portal.

  2. Seleccione Application Insights.Select Application Insights. Proporcione los detalles que se muestran aquí para crear una instancia.Provide the details shown here to create an instance.

    Crear una instancia de Application Insights

Una vez finalizada la implementación, tendrá una instancia de Application Insights.After the deployment is complete, you have an Application Insights instance.

Después de crear la instancia de Application Insights, debe hacer que la aplicación reconozca la clave de instrumentación que le permite enviar registros a la nube.After you create the Applications Insights instance, you need to make the app aware of the instrumentation key that allows it to send logs to the cloud. Para ello, se recupera la clave de Application Insights y se usa en las bibliotecas de aplicación que proporciona Azure para Application Insights.You do this by retrieving the Application Insights key and using it within the application libraries that Azure provides for Application Insights. El procedimiento recomendado es almacenar claves y secretos en Azure Key Vault para protegerlos.The best practice is to store keys and secrets in Azure Key Vault to keep them secure.

Para la aplicación básica de ejemplo, después de crear la instancia de Application Insights, debe hacer que la aplicación reconozca la clave de instrumentación que le permite enviar registros a la nube.For the basic sample app, after you create the Applications Insights instance, you need to make the app aware of the instrumentation key that allows it to send logs to the cloud. En Key Vault, establezca un secreto APPINSIGHTSKEY y defina su valor como la clave de instrumentación.In Key Vault, set a APPINSIGHTSKEY secret and set its value as the instrumentation key. Esto permite que la aplicación envíe registros y métricas a Application Insights.Doing so allows the app to send logs and metrics to Application Insights.

Implementar Multi-Factor Authentication para Azure Active DirectoryImplement Multi-Factor Authentication for Azure Active Directory

Los administradores deben asegurarse de que las cuentas de suscripción del portal están protegidas.Administrators need to ensure that the subscription accounts in the portal are protected. La suscripción es vulnerable a los ataques porque administra los recursos creados.The subscription is vulnerable to attacks because it manages the resources that you created. Para proteger la suscripción, habilite Multi-Factor Authentication en la pestaña Azure Active Directory de la suscripción.To protect the subscription, enable Multi-Factor Authentication on the Azure Active Directory tab of the subscription.

Azure AD funciona en función de las directivas que se aplican a un usuario o a grupos de usuarios que se ajustan a determinados criterios.Azure AD operates based on policies that are applied to a user or groups of users that fit a certain criteria. Azure crea una directiva predeterminada que especifica que los administradores necesitan la autenticación en dos fases para iniciar sesión en el portal.Azure creates a default policy specifying that administrators need two-factor authentication to sign in to the portal. Después de habilitar esta directiva, es posible que se le pida que cierre sesión y vuelva a iniciarla en Azure Portal.After enabling this policy, you might be prompted to sign out and sign back in to the Azure portal.

Para habilitar MFA para los inicios de sesión de administrador:To enable MFA for admin sign-ins:

  1. Vaya a la pestaña Azure Active Directory en Azure Portal.Go to the Azure Active Directory tab in the Azure portal

  2. En la categoría de seguridad, seleccione el acceso condicional.Under the security category, select conditional access. Verá esta pantalla:You see this screen:

    Acceso condicional: directivas

Si no puede crear una directiva nueva:If you can't create a new policy:

  1. Vaya a la pestaña MFA.Go to the MFA tab.

  2. Seleccione el vínculo Prueba gratuita de Azure AD Premium para suscribirse a la evaluación gratuita.Select the Azure AD Premium Free trial link to subscribe to the free trial.

    Evaluación gratuita de Azure AD Premium

Vuelva a la pestaña de acceso condicional.Return to the conditional access screen.

  1. Seleccione la pestaña de nueva directiva.Select the new policy tab.

  2. Escriba el nombre de la directiva.Enter the policy name.

  3. Seleccione los usuarios o grupos para los que quiere habilitar MFA.Select the users or groups for which you want to enable MFA.

  4. En Controles de acceso, seleccione la pestaña Conceder y, a continuación, seleccione Requerir autenticación multifactor (y cualquier otra opción que quiera).Under Access controls, select the Grant tab and then select Require multi-factor authentication (and other settings if you want).

    Requerir MFA

Para habilitar la directiva, seleccione la casilla de la parte superior de la pantalla. También puede hacerlo desde la pestaña Acceso condicional. Si la directiva está habilitada, los usuarios necesitan MFA para iniciar sesión en el portal.You can enable the policy by selecting the check box at the top of the screen or do so on the Conditional Access tab. When the policy is enabled, users need MFA to sign in to the portal.

Hay una directiva de línea de base que requiere MFA para todos los administradores de Azure.There's a baseline policy that requires MFA for all Azure administrators. Puede habilitarla inmediatamente en el portal.You can enable it immediately in the portal. Al habilitar esta directiva, puede que se invalide la sesión actual y que tenga que volver a iniciar sesión.Enabling this policy might invalidate the current session and force you to sign in again.

Si la directiva de línea de base no está habilitada:If the baseline policy isn't enabled:

  1. Seleccione Requerir MFA para los administradores.Select Require MFA for admins.
  2. Seleccione Usar la directiva inmediatamente.Select Use policy immediately.

Seleccione Usar la directiva inmediatamente.

Usar Azure Sentinel para supervisar aplicaciones y recursosUse Azure Sentinel to monitor apps and resources

A medida que crece una aplicación, resulta difícil agregar todas las señales y métricas de seguridad recibidas de los recursos y hacerlas útiles de forma orientada a la acción.As an application grows, it becomes difficult to aggregate all the security signals and metrics received from resources and make them useful in an action-oriented way.

Azure Sentinel está diseñado para recopilar datos, detectar los tipos de amenazas posibles y proporcionar visibilidad sobre los incidentes de seguridad.Azure Sentinel is designed to collect data, detect the types of threats possible, and provide visibility into security incidents. Mientras espera la intervención manual, Azure Sentinel puede basarse en cuadernos de estrategias escritos previamente para iniciar las alertas y los procesos de administración de incidentes.While it waits for manual intervention, Azure Sentinel can rely on pre-written playbooks to kick off alerts and incident management processes.

La aplicación de ejemplo se compone de varios recursos que Azure Sentinel puede supervisar.The sample app is composed of several resources that Azure Sentinel can monitor. Para configurar Azure Sentinel, primero debe crear un área de trabajo de Log Analytics que almacene todos los datos recopilados de los distintos recursos.To set up Azure Sentinel, you first need to create a Log Analytics workspace that stores all the data collected from the various resources.

Para crear esta área de trabajo:To create this workspace:

  1. En el cuadro de búsqueda de Azure Portal, busque Log Analytics.In the search box in the Azure portal, search for Log Analytics. Seleccione Áreas de trabajo de Log Analytics.Select Log Analytics workspaces.

    Buscar áreas de trabajo de Log Analytics

    Buscar áreas de trabajo de Log AnalyticsSearch for Log Analytics workspaces

  2. En la página siguiente, seleccione Agregar y, a continuación, proporcione un nombre, un grupo de recursos y una ubicación para el área de trabajo.On the next page, select Add and then provide a name, resource group, and location for the workspace. Creación de un área de trabajo de Log AnalyticsCreate a Log Analytics workspace

    Creación de un área de trabajo de Log AnalyticsCreate a Log Analytics workspace

  3. Use el cuadro de búsqueda para buscar Azure Sentinel.Use the search box to search for Azure Sentinel.

    Buscar Azure Sentinel

    Buscar Azure SentinelSearch for Azure Sentinel

  4. Seleccione Agregar y, a continuación, seleccione el área de trabajo de Log Analytics que creó antes.Select Add and then select the Log Analytics workspace that you created earlier.

    Agregar un área de trabajo de Log Analytics

    Agregar un área de trabajo de Log AnalyticsAdd a Log Analytics workspace

  5. En la página Azure Sentinel: conectores de datos, en Configuración, seleccione Conectores de datos.On the Azure Sentinel - Data connectors page, under Configuration, select Data connectors. Verá una matriz de servicios de Azure que puede vincular a la instancia de almacenamiento de Log Analytics para su análisis en Azure Sentinel.You see an array of Azure services that you can link to the Log Analytics storage instance for analysis in Azure Sentinel.

    Conectores de datos de Log Analytics

    Agregar un conector de datos a Azure SentinelAdd a data connector to Azure Sentinel

    Por ejemplo, para conectar Application Gateway, siga estos pasos:For example, to connect the application gateway, take these steps:

    1. Abra la hoja de la instancia de Azure Application Gateway.Open the Azure Application Gateway instance blade.

    2. En Supervisión, seleccione Configuración de diagnóstico.Under Monitoring, select Diagnostic settings.

    3. Seleccione Agregar configuración de diagnóstico.Select Add diagnostic setting.

      Agregar diagnósticos de Application Gateway

      Agregar diagnósticos de Application GatewayAdd Application Gateway diagnostics

    4. En la página Configuración de diagnóstico , seleccione el área de trabajo de Log Analytics que creó y, a continuación, seleccione todas las métricas que quiere recopilar y enviar a Azure Sentinel.On the Diagnostic settings page, select the Log Analytics workspace that you created and then select all the metrics that you want to collect and send to Azure Sentinel. Seleccione Guardar.Select Save.

      Configuración del conector de Azure Sentinel

      Configuración del conector de Azure SentinelAzure Sentinel connector settings

Las métricas del recurso están en Azure Sentinel, donde puede consultarlas e investigarlas.The metrics from the resource are in Azure Sentinel, where you can query and investigate them.

Agregue las mismas métricas en la configuración de diagnóstico para Azure Key Vault, la dirección IP pública, Azure Database for PostgreSQL y cualquier servicio que admita registros de diagnóstico en su cuenta.Add the same metrics in diagnostic settings for Azure Key Vault, the public IP address, Azure Database for PostgreSQL, and any services that support diagnostic logs in your account.

Después de configurar las métricas, Azure Sentinel tiene datos que analizar.After you set up the metrics, Azure Sentinel has data to analyze.

Evaluación y comprobaciónEvaluate and verify

Después de desarrollar e implementar la arquitectura, debe asegurarse de que el código y los servicios implementados cumplan los estándares de seguridad.After you develop and deploy the architecture, you need to ensure that the code and the deployed services meet security standards. Estos son algunos de los pasos que puede seguir para comprobar el software:These are some steps that you can take to verify the software:

  • Análisis de código estáticoStatic code analysis
  • Examen de vulnerabilidadesVulnerability scanning
  • Búsqueda y corrección de vulnerabilidades en las dependencias de la aplicaciónFinding and fixing vulnerabilities in application dependencies

Estos son los bloques de creación básicos para los procedimientos recomendados de desarrollo seguro.These are the basic building blocks for best practices in secure development.

Análisis de código estáticoStatic code analysis

En el caso de la aplicación de ejemplo, la comprobación con las herramientas de análisis estático implica buscar vulnerabilidades en el código de la aplicación mediante técnicas como la comprobación de los datos y el análisis del flujo de datos.For the sample app, verification with static analysis tools involves finding vulnerabilities in the app code by using techniques like taint checking and data-flow analysis. Las herramientas de análisis estático de Python ofrecen mayor confianza en la seguridad de la aplicación.Python static analysis tools give you more confidence that your app is secure.

Búsqueda de erroresLinting

PyFlakes, una biblioteca de búsqueda de errores de Python, le ayuda a quitar el código no alcanzado y las funciones no usadas de las aplicaciones, como se muestra aquí:PyFlakes, a Python linting library, helps you remove dead code and unused functions from apps, as shown here:

PyFlakes

La búsqueda de errores proporciona sugerencias y posibles cambios que pueden hacer que el código sea más limpio y menos propenso a errores en tiempo de ejecución.Linting provides hints and possible changes that can make your code cleaner and less error prone during runtime.

PyLintPyLint

PyLint proporcionó el mayor valor a este proyecto.PyLint provided the most value for this project. Realiza comprobaciones estándar de código, comprobación de errores y sugerencias de refactorización para asegurarse de que el código que se ejecuta en el servidor sea seguro.It performs code-standard checks, error checking, and refactoring tips to ensure that the code running on the server is safe. Al usar PyLint para actualizar el código, puede eliminar los errores y mejorar la clasificación de PyLint, como muestran las siguientes imágenes.By using PyLint to update your code, you can eliminate bugs and improve the PyLint rating, as the following images show.

Antes de PyLint

Antes de PyLintBefore PyLint

Después de corregir algunos de los errores de código encontrados por las herramientas de búsqueda de errores, tendrá más confianza en que el código no es propenso a errores.After you fix some of the code errors found by the linting tools, you have more confidence that the code isn't prone to errors. Corregir los errores reduce de forma significativa los riesgos de seguridad que pueden producirse cuando el código se implementa en entornos de producción.Fixing the errors significantly reduces the security risks that can occur when the code is deployed to production environments.

Después de Pylint

Después de PylintAfter PyLint

Examen de vulnerabilidadesVulnerability scanning

La herramienta ZAP de OWASP es un escáner de vulnerabilidades de aplicaciones web de código abierto que puede usar para comprobar si hay vulnerabilidades en la aplicación de ejemplo.OWASP's ZAP tool is an open-source web application vulnerability scanner that you can use to check the sample app for vulnerabilities. La ejecución de la herramienta en la aplicación de ejemplo revela algunos posibles errores y vectores de ataque.Running the tool on the sample app reveals some possible errors and attack vectors.

Herramienta ZAP

Herramienta ZAPZAP tool

Búsqueda y corrección de vulnerabilidades en las dependencias de la aplicaciónFind and fix vulnerabilities in app dependencies

Para buscar y corregir las dependencias de la aplicación, puede usar la comprobación de dependencias de OWASP.To find and fix application dependencies, you can use OWASP's Dependency Check.

La seguridad es una aplicación similar que comprueba las dependencias.Safety is a similar application that checks dependencies. Puede encontrarla en GitHub.You can find it on GitHub. Los exámenes de seguridad para detectar vulnerabilidades en bases de datos de vulnerabilidades conocidas.Safety scans for vulnerabilities found in well-known vulnerability databases.

Seguridad

SeguridadSafety

Pasos siguientesNext steps

Los siguientes artículos pueden ayudarle a diseñar, desarrollar e implementar aplicaciones seguras.The following articles can help you design, develop, and deploy secure applications.