Vývoj zabezpečené webové aplikace

Tato ukázka je jednoduchá aplikace v Pythonu, která zobrazuje webovou stránku s odkazy na prostředky zabezpečení pro vývoj aplikací v Azure. Aplikace implementuje osvědčené postupy zabezpečení, které vám můžou pomoct zlepšit stav zabezpečení vaší aplikace a vaší organizace při vývoji aplikací v Azure.

Měli byste postupovat podle kroků popsaných v tomto článku postupně, abyste zajistili, že jsou komponenty aplikace správně nakonfigurované. Databáze, Azure App Service, instance Azure Key Vault a Azure Application Gateway instance na sobě vzájemně závisí.

Skripty nasazení nastavují infrastrukturu. Po spuštění skriptů nasazení budete muset provést ruční konfiguraci v Azure Portal, aby se komponenty a služby propojily dohromady.

Ukázková aplikace je určená pro začátečníky, kteří vyvíjejí aplikace v Azure a chtějí do svých aplikací implementovat bezpečnostní opatření.

Při vývoji a nasazení této aplikace se naučíte:

  • Vytvořte instanci Azure Key Vault, uložte z ní a načtěte z ní tajné kódy.
  • Nasaďte Azure Database for PostgreSQL, nastavte zabezpečená hesla a autorizujete k němu přístup.
  • Spusťte kontejner Alpine Linux v Azure Web Apps pro Linux a povolte spravované identity pro prostředky Azure.
  • Vytvořte a nakonfigurujte instanci Azure Application Gateway s bránou firewall, která používá sadu pravidel OWASP Top 10.
  • Povolte šifrování přenášených a neaktivních uložených dat pomocí služeb Azure.

Po vývoji a nasazení této aplikace budete mít nastavenou následující ukázkovou webovou aplikaci spolu s popsanými konfiguračními a bezpečnostními opatřeními.

Ukázková webová aplikace

Architektura

Aplikace je typická n-vrstvá aplikace se třemi vrstvami. Front-end, back-end a databázová vrstva s integrovanými komponentami monitorování a správy tajných kódů jsou uvedené tady:

Architektura aplikace

Architektura se skládá z těchto komponent:

Model hrozeb

Modelování hrozeb je proces identifikace potenciálních bezpečnostních hrozeb pro vaši firmu a aplikaci a následného zajištění správného plánu zmírnění rizik.

Tato ukázka použila Microsoft Threat Modeling Tool k implementaci modelování hrozeb pro zabezpečenou ukázkovou aplikaci. Pomocí diagramu komponent a toků dat můžete identifikovat problémy a hrozby v rané fázi procesu vývoje. Tím ušetříte čas a peníze později.

Toto je model hrozeb pro ukázkovou aplikaci:

Model hrozeb

Některé ukázkové hrozby a potenciální ohrožení zabezpečení, které nástroj pro modelování hrozeb generuje, jsou znázorněny na následujícím snímku obrazovky. Model hrozeb poskytuje přehled o vystavených prostorech útoku a vyzývá vývojáře, aby přemýšleli o tom, jak tyto problémy zmírnit.

Výstup modelu hrozeb

Například injektáž SQL v předchozím výstupu modelu hrozeb je zmírněna sanitizací uživatelských vstupů a použitím uložených funkcí v Azure Database for PostgreSQL. Toto omezení rizik zabraňuje libovolnému spouštění dotazů během čtení a zápisu dat.

Vývojáři zlepšují celkové zabezpečení systému tím, že zmírňují každou hrozbu ve výstupu modelu hrozeb.

Nasazení

Následující možnosti umožňují spustit Linux na Azure App Service:

  • Vyberte kontejner ze seznamu předem vytvořených kontejnerů Microsoftu v Azure, které byly vytvořeny s využitím podpůrných technologií (Python, Ruby, PHP, Java, Node.js, .NET Core).
  • Použijte vlastní kontejner. Jako zdroj image vyberte vlastní registry kontejnerů a stavět na mnoha dostupných technologiích, které podporují PROTOKOL HTTP.

V tomto příkladu spustíte skript nasazení, který nasadí webovou aplikaci do App Service a vytvoří prostředky.

Aplikace může používat různé modely nasazení uvedené níže:

Diagram toku dat nasazení

Existuje mnoho způsobů nasazení aplikací v Azure, mezi které patří:

  • Šablony Azure Resource Manageru
  • PowerShell
  • Azure CLI
  • portál Azure
  • Azure DevOps

Tato aplikace použila:

Důležité informace o zabezpečení

Síť

Ukázková aplikace používá koncové šifrování TLS/SSL pro přenos dat, která proudí do a ze sítě. Brána je nakonfigurovaná s certifikátem podepsaným svým držitelem.

Důležité

V této ukázce se použije certifikát podepsaný svým držitelem. V produkčním prostředí byste měli získat certifikáty od ověřené certifikační autority (CA).

Brána firewall aplikace také kontroluje příchozí provoz a upozorní správce na zjištění škodlivého provozu v síťovém provozu. Application Gateway zmírní možnost výskytu hrozeb DDoS a injektáže SQL zjištěných v modelu hrozeb.

Identita

Pro přihlášení k portálu používá ukázková aplikace vícefaktorové ověřování pro správce Azure Active Directory (Azure AD), kteří mají přiřazený přístup k prostředkům. Ukázková aplikace používá spravované identity k získání oprávnění ke čtení a načítání tajných kódů z Azure Key Vault a zajišťuje, aby aplikace nemusela pevně kódovat přihlašovací údaje a tokeny pro čtení tajných kódů. Azure AD automaticky vytvoří instanční objekty, které aplikace potřebuje ke čtení, a upraví tajné kódy při použití spravovaných identit.

Spravované identity pro prostředky Azure a vícefaktorové ověřování znesnadňují nežádoucím uživatelům získání oprávnění a eskalaci jejich oprávnění v systému. Na tuto hrozbu jsme upozorňovali v modelu hrozeb. Aplikace používá OAuth, což umožňuje uživatelům zaregistrovaným v aplikaci OAuth přihlásit se k aplikaci.

Storage

Data v databázi PostgreSQL se v neaktivním stavu automaticky šifrují pomocí Azure Database for PostgreSQL. Databáze autorizuje App Service IP adresy, aby k prostředkům databáze se správnými ověřovacími přihlašovacími údaji přistupovala jenom nasazená App Service webová aplikace.

Protokolování a auditování

Aplikace implementuje protokolování pomocí Application Insights ke sledování metrik, protokolů a výjimek, ke kterým dochází. Toto protokolování poskytuje dostatek metadat aplikace, aby mohli vývojáři a členové provozního týmu informovat o stavu aplikace. Poskytuje také dostatek dat pro případ bezpečnostních incidentů.

Důležité informace o nákladech

Pokud ještě nemáte účet Azure, můžete si vytvořit bezplatný účet. Přejděte na stránku bezplatného účtu , abyste mohli začít, podívejte se, co můžete dělat s bezplatným účtem Azure, a zjistěte, které produkty jsou zdarma po dobu 12 měsíců.

Pokud chcete nasadit prostředky v ukázkové aplikaci s funkcemi zabezpečení, musíte zaplatit za některé prémiové funkce. Vzhledem k tomu, že se aplikace škáluje a bezplatné úrovně a zkušební verze nabízené Azure musí upgradovat tak, aby splňovaly požadavky aplikací, můžou se vaše náklady zvyšovat. K odhadu nákladů použijte cenovou kalkulačku Azure.

Nasazení řešení

Požadavky

Aby byla aplikace zprovozněná, musíte nainstalovat tyto nástroje:

  • Editor kódu pro úpravu a zobrazení kódu aplikace. Visual Studio Code je open source možnost.
  • Azure CLI na vývojovém počítači.
  • Git ve vašem systému. Git se používá k místnímu klonování zdrojového kódu.
  • jq, unixový nástroj pro dotazování JSON uživatelsky přívětivým způsobem.

K nasazení prostředků ukázkové aplikace potřebujete předplatné Azure. Pokud nemáte předplatné Azure, můžete vytvořit bezplatný účet pro otestování ukázkové aplikace.

Po instalaci těchto nástrojů jste připraveni nasadit aplikaci v Azure.

Nastavení prostředí

Spuštěním skriptů nasazení nastavte prostředí a předplatné:

  1. Pokud chcete naklonovat úložiště zdrojového kódu, použijte tento příkaz Gitu:

    git clone https://github.com/Azure-Samples/sample-linux-python-app tutorial-project
    
  2. Pokud chcete přejít do adresáře, použijte tento příkaz:

    cd tutorial-project/scripts
    
  3. Ve složce scripts jsou soubory, které jsou specifické pro platformu, kterou používáte (Windows nebo Linux). Vzhledem k tomu, že azure CLI už je nainstalované, přihlaste se k účtu Azure na příkazovém řádku spuštěním tohoto příkazu Azure CLI:

    az login
    

Otevře se prohlížeč a přihlásí se pomocí svých přihlašovacích údajů. Po přihlášení můžete začít nasazovat prostředky z příkazového řádku.

Skripty deploy-powershell.ps1 nasazení a deploy-bash.sh obsahují kód, který nasadí celou aplikaci. Nasazení řešení:

  1. Pokud používáte PowerShell, spusťte deploy-powershell.ps1 soubor zadáním nahrazení ./deploy-powershell.ps1 REGION RESOURCE_GROUP_NAME názvu oblasti a skupiny prostředků vhodnými oblastmi Azure a názvem skupiny prostředků.
  2. Pokud jste v Linuxu deploy-bash.sh , spusťte soubor zadáním /deploy-bash.sh REGION RESOURCE_GROUP_NAMEpříkazu , možná budete muset soubor spustit tak, že zadáte. chmod +x deploy-bash.sh

Následující příklady ukazují fragmenty klíčových komponent. Příklady můžete nasadit jednotlivě nebo se zbývajícími komponentami spuštěním souborů nasazení.

Pokyny k implementaci

Skript nasazení je jeden skript, který je možné rozdělit do čtyř fází. Každá fáze nasadí a nakonfiguruje prostředek Azure, který je v diagramu architektury.

Jsou to čtyři fáze:

  • Nasazení Azure Key Vault
  • Nasazení Azure Database for PostgreSQL.
  • Nasazení Azure Web Apps v Linuxu
  • Nasaďte Application Gateway pomocí firewallu webových aplikací.

Každá fáze vychází z předchozí fáze pomocí konfigurace z dříve nasazených prostředků.

Pokud chcete dokončit kroky implementace, ujistěte se, že jste nainstalovali nástroje uvedené v části Požadavky.

Nasazení trezoru klíčů Azure Key Vault

V této části vytvoříte a nasadíte instanci Azure Key Vault, která se používá k ukládání tajných kódů a certifikátů.

Po dokončení nasazení máte v Azure nasazenou instanci Azure Key Vault.

Nasazení Azure Key Vault pomocí Azure CLI:

  1. Deklarujte proměnné pro Azure Key Vault.

  2. Zaregistrujte poskytovatele Azure Key Vault.

  3. Vytvořte skupinu prostředků pro instanci.

  4. Vytvořte instanci Azure Key Vault ve skupině prostředků vytvořené v kroku 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
    
    

Osvědčeným postupem je používat spravované identity pro prostředky Azure v aplikacích, které pro přístup k prostředkům používají Key Vault. Stav zabezpečení se zvýší, když přístupové klíče k Key Vault nejsou uložené v kódu nebo v konfiguraci.

Nasazení Azure Database for PostgreSQL

Azure Database for PostgreSQL funguje následujícím způsobem, nejprve vytvořte databázový server a pak vytvořte databázi, do které se má uložit schéma a data.

Po dokončení nasazení budete mít server PostgreSQL a databázi spuštěnou v Azure.

Nasazení Azure Database for PostgreSQL pomocí Azure CLI:

  1. Otevřete terminál pomocí Azure CLI a nastavení předplatného Azure.
  2. Vygenerujte zabezpečenou kombinaci uživatelského jména a hesla, která se používá pro přístup k databázi. (Pro aplikace, které je používají, by měly být uložené v Azure Key Vault.)
  3. Vytvořte instanci serveru PostgreSQL.
  4. Vytvořte databázi na instanci serveru, kterou jste vytvořili v kroku 3.
  5. Spouštění skriptů PostgreSQL v instanci PostgreSQL

Následující kód závisí na tajných klíčích PGUSERNAME a PGPASSWORD uložených v Azure KeyVault z výše uvedeného kroku nasazení KeyVault.

$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

Po nasazení databáze je potřeba uložit její přihlašovací údaje a připojovací řetězec v Azure Key Vault. Ve složce scripts je functions.sql soubor obsahující kód PL/pgSQL, který při spuštění vytvoří uložené funkce. Spuštění tohoto souboru parametrizuje vstupy a omezí tak injektáž SQL.

PostgreSQL je součástí nástroje s názvem psql , který se používá k připojení k databázi. Pokud chcete spustit functions.sql, musíte se připojit k instanci Azure Database for PostgreSQL z místního počítače a spustit ji odtud. Instalace nástroje psql je součástí výchozí instalace postgreSQL v každém operačním systému. Další informace najdete v dokumentaci k psql.

Azure Cloud Shell zahrnuje psql také nástroj. Cloud Shell můžete použít přímo z Azure Portal tak, že vyberete ikonu Cloud Shell.

Pokud chcete povolit vzdálený přístup k instanci PostgreSQL, musíte autorizovat IP adresu v PostgreSQL. Tento přístup povolíte tak, že přejdete na kartu Zabezpečení připojení , vyberete Přidat IP adresu klienta a uložíte nové nastavení.

Autorizace IP adresy klienta

Pokud používáte Cloud Shell místo místního nástroje psql, vyberte Povolit přístup ke službám Azure a změňte jeho hodnotu na ZAPNUTO, abyste povolili přístup Cloud Shell.

Pak se k instanci připojte spuštěním následujícího příkazu psql s připojovací řetězec parametry z karty Připojovací řetězce instance PostgreSQL na Azure Portal. Prázdné složené závorky nahraďte parametry z okna Připojovací řetězec databáze a heslo heslem z Azure Key Vault.

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

Po ověření, že jste připojení k databázi, spusťte následující skript PL/pgSQL. Skript vytvoří uložené funkce, které slouží k vložení dat do databáze.

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;

Další informace o nastavení ověřování tls a certifikační autority (CA) pro PostgreSQL najdete v tématu Konfigurace připojení TLS v Azure Database for PostgreSQL.

Kořenový certifikát je součástí kontejneru. K získání certifikátu je třeba provést následující kroky:

  1. Stáhněte soubor certifikátu z certifikační autority.

  2. Stáhněte a nainstalujte OpenSSL na svůj počítač.

  3. Dekódování souboru certifikátu:

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

Další informace o konfiguraci zabezpečení TLS pro PostgreSQL najdete tady : Konfigurace zabezpečení připojení TLS.

Nasazení Azure Web Apps v Linuxu

Kromě Azure App Service můžete snadno vytvářet linuxové služby, protože Azure poskytuje sadu předem připravených kontejnerů a imagí pro široce používané jazyky, jako jsou Python, Ruby, C# a Java. Azure také podporuje vlastní kontejnery, které umožňují spouštět prakticky všechny programovací jazyky na platformě Azure App Service.

Nasazovaná aplikace je jednoduchá aplikace v Pythonu, která běží na nejnovější distribuci Ubuntu Linuxu. Připojuje se k instancím Azure Key Vault a PostgreSQL vytvořeným v předchozích částech pro správu přihlašovacích údajů a ukládání dat.

V kořenové složce aplikace je k dispozici následující soubor Dockeru:

# 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"]

Výše uvedený soubor Dockerfile slouží k sestavení kontejneru hostovaného na Azure Container Registry na adrese mcr.microsoft.com/samples/basic-linux-app.

Následující kód:

  1. Deklaruje proměnné a názvy pro instanci App Service.

  2. Vytvoří skupinu prostředků pro plán App Service.

  3. Zřídí Web Apps Azure v instanci kontejnerů Linuxu.

  4. Povolí protokolování kontejneru webové aplikace.

  5. Nastaví některé konfigurace aplikací v nastavení aplikace kontejneru.

    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
    }
    

Tento skript vytvoří přiřazenou identitu pro instanci App Service, kterou je možné použít s MSI k interakci s Azure Key Vault bez pevného kódování tajných kódů v kódu nebo konfiguraci.

Na portálu přejděte na instanci Azure Key Vault a na kartě Zásady přístupu ověřte přiřazenou identitu. Vyberte Přidat nové zásady přístupu. V části Vybrat objekt zabezpečení vyhledejte název aplikace, který se podobá názvu App Service vytvořené instance. Instanční objekt připojený k aplikaci by měl být viditelný. Vyberte ji a uložte stránku zásad přístupu, jak je znázorněno na následujícím snímku obrazovky.

Vzhledem k tomu, že aplikace potřebuje jenom načíst klíče, vyberte oprávnění Získat v možnostech tajných kódů a povolte přístup a zároveň omezte udělená oprávnění.

Key Vault zásady přístupu

Vytvoření zásad Key Vault přístupu

Uložte zásadu přístupu a pak novou změnu uložte na kartě Zásady přístupu , aby se zásady aktualizovaly.

Nasazení Application Gateway s povolenou bránou firewall webových aplikací

Ve webových aplikacích se nedoporučuje zpřístupňovat služby přímo vnějšímu světu na internetu. Vyrovnávání zatížení a pravidla brány firewall poskytují větší zabezpečení a kontrolu nad příchozím provozem a pomáhají vám ho spravovat.

Nasazení instance Application Gateway:

  1. Vytvořte skupinu prostředků pro aplikační bránu.

  2. Zřiďte virtuální síť pro připojení k bráně.

  3. Vytvořte podsíť pro bránu ve virtuální síti.

  4. Zřiďte veřejnou IP adresu.

  5. Zřiďte aplikační bránu.

  6. Povolte na bráně Firewall webových aplikací.

    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
    

Předchozí skript:

  1. Vytvoří v Azure nový certifikát podepsaný svým držitelem.
  2. Stáhne certifikát podepsaný svým držitelem jako soubor s kódováním base64.
  3. Vygeneruje heslo pro certifikát podepsaný svým držitelem.
  4. Exportuje certifikát jako soubor PFX podepsaný heslem.
  5. Uloží heslo certifikátu v Azure Key Vault.

Tato část nasadí aplikační bránu:

# 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

Po dokončení nasazení budete mít aplikační bránu s povolenou bránou firewall webových aplikací.

Instance brány zveřejňuje port 443 pro PROTOKOL HTTPS. Tato konfigurace zajišťuje, že naše aplikace bude přístupná pouze na portu 443 prostřednictvím protokolu HTTPS.

Blokování nepoužívaných portů a omezení rizika útoku je osvědčený postup zabezpečení.

Přidání skupin zabezpečení sítě do instance App Service

App Service instance je možné integrovat s virtuálními sítěmi. Tato integrace jim umožňuje nakonfigurovat zásady skupiny zabezpečení sítě, které spravují příchozí a odchozí provoz aplikace.

  1. Tuto funkci povolíte tak, že v okně instance služby Aplikace Azure v části Nastavení vyberete Sítě. V pravém podokně v části Integrace virtuální sítě vyberte Kliknutím sem nakonfigurujte.

    Nová integrace virtuální sítě

    Nová integrace virtuální sítě pro App Service

  2. Na další stránce vyberte Přidat virtuální síť (Preview).

  3. V další nabídce vyberte virtuální síť vytvořenou v nasazení, které začíná na hello-vnet. Můžete vytvořit novou podsíť nebo vybrat existující. V takovém případě vytvořte novou podsíť. Nastavte Rozsah adres na 10.0.3.0/24 a pojmenujte podsíť app-subnet.

    App Service konfigurace virtuální sítě

    Konfigurace virtuální sítě pro App Service

Teď, když jste povolili integraci virtuální sítě, můžete do naší aplikace přidat skupiny zabezpečení sítě.

  1. Pomocí vyhledávacího pole vyhledejte skupiny zabezpečení sítě. Ve výsledcích vyberte Skupiny zabezpečení sítě .

    Search pro skupiny zabezpečení sítě

    Search pro skupiny zabezpečení sítě

  2. V další nabídce vyberte Přidat. Zadejte Název skupiny zabezpečení sítě a skupinu prostředků , ve které se má skupina nacházet. Tato skupina zabezpečení sítě se použije na podsíť služby Application Gateway.

    Vytvoření skupiny zabezpečení sítě

    Vytvoření skupiny zabezpečení sítě

  3. Po vytvoření skupiny zabezpečení sítě ji vyberte. V jeho okně v části Nastavení vyberte Příchozí pravidla zabezpečení. Nakonfigurujte tato nastavení tak, aby umožňovala připojení přicházející do aplikační brány přes port 443.

    Konfigurace skupiny zabezpečení sítě

    Konfigurace skupiny zabezpečení sítě

  4. V pravidlech odchozích přenosů pro skupinu zabezpečení sítě brány přidejte pravidlo, které umožňuje odchozí připojení k instanci App Service vytvořením pravidla, které cílí na značku AppServiceslužby:

    Přidání odchozích pravidel pro skupinu zabezpečení sítě

    Přidání odchozích pravidel pro skupinu zabezpečení sítě

    Přidejte další pravidlo odchozích přenosů, které bráně umožní odesílat odchozí pravidla do virtuální sítě.

    Přidání dalšího pravidla odchozích přenosů

    Přidání dalšího pravidla odchozích přenosů

  5. V okně podsítě skupiny zabezpečení sítě vyberte Přidružit, vyberte virtuální síť vytvořenou v nasazení a vyberte podsíť brány s názvem gw-subnet. Skupina zabezpečení sítě se použije na podsíť.

  6. Vytvořte další skupinu zabezpečení sítě jako v předchozím kroku, tentokrát pro instanci App Service. Pojmenujte ho. Přidejte příchozí pravidlo pro port 443 stejně jako pro skupinu zabezpečení sítě služby Application Gateway.

    Pokud máte App Service instanci nasazenou v instanci App Service Environment, což není případ této aplikace, můžete přidat příchozí pravidla, která povolí sondy služby Azure Service Health, otevřením portů 454–455 pro příchozí skupiny zabezpečení vaší skupiny zabezpečení sítě App Service. Tady je konfigurace:

    Přidání pravidel pro sondy služby Azure Service Health

    Přidání pravidel pro sondy služby Azure Service Health (jenom App Service Environment)

  7. V odchozích pravidlech zabezpečení vytvořte nové odchozí pravidlo zabezpečení, které umožní instanci App Service komunikovat s databází PostgreSQL. Nakonfigurujte ho takto:

    Pravidlo pro povolení odchozích připojení PostgreSQL

    Přidání pravidla pro povolení odchozích připojení PostgreSQL

Pokud chcete omezit prostor pro útok, upravte App Service nastavení sítě tak, aby přístup k aplikaci umožňovala jenom aplikační bráně. Uděláte to tak, že přejdete na kartu App Service síť, vyberete kartu Omezení IP adres a vytvoříte pravidlo povolení, které povolí přímý přístup ke službě jenom s IP adresou služby Application Gateway.

IP adresu brány můžete načíst ze stránky přehledu brány. Na kartě CIDR IP adresa zadejte IP adresu v tomto formátu: <GATEWAY_IP_ADDRESS>/32.

Povolit pouze bránu

Povolit přístup k App Service pouze IP adrese brány

Implementace Azure Active Directory OAuth

Dokumenty Azure distribuované na stránce ukázkové webové aplikace jsou prostředky v naší aplikaci, které můžou vyžadovat ochranu. Azure Active Directory (Azure AD) můžete použít k implementaci ověřování pro webové, desktopové a mobilní aplikace pomocí různých toků ověřování. Aplikace používá Přihlášení u Microsoftu, která umožňuje číst profily uživatelů, kteří byli přidáni do jednoho tenanta Azure AD seznamu uživatelů.

V Azure Portal nakonfigurujte aplikaci tak, aby používala požadované přihlašovací údaje:

  1. Vyberte Azure Active Directory nebo ji vyhledejte pomocí vyhledávacího pole.

  2. Vyberte Nová registrace:

    Vytvoření registrace

    Vytvoření registrace aplikace Azure AD

  3. Na další stránce zadejte název aplikace. V části Podporované typy účtů vyberte Účty pouze v tomto organizačním adresáři. V části Identifikátor URI pro přesměrování zadejte základní doménu, ve které bude aplikace běžet, a jednu s koncovým bodem tokenu. Příklad: GATEWAY_HASH.cloudapp.net/token.

    Konfigurace registrace Azure AD aplikace

    Konfigurace registrace Azure AD aplikace

  4. Zobrazí se obrazovka s zaregistrovanou aplikací a jejími informacemi. Tyto informace musíte přidat do instance Azure Key Vault.

    1. Zkopírujte ID aplikace (klienta) a uložte ho do Key Vault jako CLIENTID.

    2. Zkopírujte identifikátor URI přesměrování, který jste zadali v předchozím kroku, a uložte ho jako REDIRECTURI.

    3. Zkopírujte Azure AD výchozí název adresáře s formátem název.microsoftonline.com a uložte ho do Key Vault jako TENANT.

    4. Přejděte na kartu Certifikáty & tajné kódy aplikace Azure AD, kterou jste vytvořili dříve, a vyberte Nový tajný klíč klienta, jak je znázorněno na následujícím snímku obrazovky. Nastavte datum vypršení platnosti a pak vygenerovanou hodnotu zkopírujte a uložte ji do Key Vault jako CLIENTSECRET.

      Azure AD autorizačního tajného kódu

      Azure AD autorizačního tajného kódu

    5. Vygenerujte zabezpečený náhodný tajný klíč pomocí libovolného nástroje příkazového řádku nebo online nástroje. Uložte ho do Key Vault jako FLASKSECRETKEY. Aplikační architektura používá tento klíč k vytváření relací. Informace o vygenerování tajného klíče najdete v tématu Relace Flasku.

  5. Po nakonfigurování přihlášení musíte přidat uživatele do Azure AD odkazu, aby se mohli k prostředku přihlásit. Pokud je chcete přidat, přejděte v Azure AD na kartu Uživatelé, vyberte Všichni uživatelé a pak vyberte Nový uživatel nebo Nový uživatel typu host. Pro účely testování můžete přidat uživatele typu host a pozvat ho do adresáře. Nebo můžete přidat nového uživatele, pokud je doména, na které aplikace běží, ověřená. V tomto příkladu je možné pro přístup zaregistrovat jenom uživatele zaregistrované v tenantovi Azure AD. Informace o víceklientských přihlašovacích přístupech najdete v dokumentaci.

    Přidání uživatelů do výchozí domény

    Přidání uživatelů do výchozí domény Azure Active Directory

Po přidání konfigurace Azure AD a tajných kódů do Key Vault je možné uživatele ověřit v aplikaci pomocí ověřování Azure OAuth. V kódu aplikace to zpracovává knihovna Azure Active Directory Authentication Library (ADAL).

Jakmile jsou tajné kódy v Key Vault a aplikace má přístup k tajným klíčům a databázi, bude aplikační služba přístupná přes adresu URL aplikace brány (https://GATEWAY_HASH.cloudapp.net)kterou můžete získat z jejího okna.

Pokud se při přihlášení k Azure AD zobrazí chyba Uživatel není zaregistrovaný v adresáři, do kterého se pokoušíte přihlásit, musíte uživatele přidat. Pokud chcete přidat uživatele, přejděte na kartu Uživatelé v Azure AD a přidejte uživatele ručně zadáním jeho podrobností nebo uživatele pozvěte zadáním jeho e-mailové adresy jako uživatele typu host, aby Azure AD v okně Pozvat hosta.

Nasazení služby Application Insights

Teď, když je aplikace nasazená a funkční, musíte zpracovávat chyby, ke kterým v aplikaci dochází, spolu s protokolováním a shromažďováním dat trasování. Protokolování a shromažďování dat trasování poskytuje přehled o událostech auditu, ke kterým dochází v aplikaci.

Application Insights je služba, která shromažďuje protokoly, které můžou generovat uživatelé nebo systém.

Vytvoření instance Application Insights:

  1. Search pro Application Insights pomocí vyhledávacího pole v Azure Portal.

  2. Vyberte Application Insights. Zadejte zde uvedené podrobnosti a vytvořte instanci.

    Vytvoření instance Application Insights

Po dokončení nasazení budete mít instanci Application Insights.

Po vytvoření instance Application Insights musíte aplikaci upozornit na instrumentační klíč, který jí umožní odesílat protokoly do cloudu. Uděláte to tak, že načtete klíč Application Insights a použijete ho v knihovnách aplikací, které azure poskytuje pro Application Insights. Osvědčeným postupem je ukládat klíče a tajné kódy v Azure Key Vault, aby byly zabezpečené.

U základní ukázkové aplikace musíte po vytvoření instance Application Insights aplikaci upozornit na instrumentační klíč, který jí umožní posílat protokoly do cloudu. V Key Vault nastavte APPINSIGHTSKEY tajný kód a jeho hodnotu jako instrumentační klíč. Tím umožníte aplikaci odesílat protokoly a metriky do Application Insights.

Implementace vícefaktorového ověřování pro Azure Active Directory

Správci musí zajistit, aby účty předplatného na portálu byly chráněné. Předplatné je zranitelné vůči útokům, protože spravuje prostředky, které jste vytvořili. Pokud chcete chránit předplatné, povolte vícefaktorové ověřování na kartě Azure Active Directory předplatného.

Azure AD funguje na základě zásad, které se vztahují na uživatele nebo skupiny uživatelů, kteří splňují určitá kritéria. Azure vytvoří výchozí zásadu určující, že správci potřebují k přihlášení k portálu dvojúrovňové ověřování. Po povolení této zásady se může zobrazit výzva k odhlášení a přihlášení k Azure Portal.

Povolení vícefaktorového ověřování pro přihlášení správce:

  1. V Azure Portal přejděte na kartu Azure Active Directory.

  2. V kategorii zabezpečení vyberte Podmíněný přístup. Zobrazí se tato obrazovka:

    Podmíněný přístup – zásady

Pokud nemůžete vytvořit novou zásadu:

  1. Přejděte na kartu MFA .

  2. Vyberte odkaz na zkušební verzi Azure AD Premium Free a přihlaste se k odběru bezplatné zkušební verze.

    bezplatná zkušební verze Azure AD Premium

Vraťte se na obrazovku podmíněného přístupu.

  1. Vyberte kartu nové zásady.

  2. Zadejte název zásady.

  3. Vyberte uživatele nebo skupiny, pro které chcete povolit vícefaktorové ověřování.

  4. V části Řízení přístupu vyberte kartu Udělení a pak vyberte Vyžadovat vícefaktorové ověřování (a pokud chcete, vyberte další nastavení).

    Vyžadování MFA

Zásady můžete povolit zaškrtnutím políčka v horní části obrazovky nebo tak učinit na kartě Podmíněný přístup . Když je zásada povolená, uživatelé potřebují pro přihlášení k portálu vícefaktorové ověřování.

Existují základní zásady, které vyžadují vícefaktorové ověřování pro všechny správce Azure. Můžete ho okamžitě povolit na portálu. Povolení této zásady může zneplatnit aktuální relaci a vynutit, abyste se znovu přihlásili.

Pokud není zásada směrného plánu povolená:

  1. Vyberte Vyžadovat vícefaktorové ověřování pro správce.

  2. Vyberte Použít zásadu okamžitě.

    Vyberte Použít zásadu okamžitě.

Monitorování aplikací a prostředků pomocí Azure Sentinelu

Jak se aplikace rozrůstá, je obtížné agregovat všechny signály zabezpečení a metriky přijaté z prostředků a učinit je užitečným způsobem orientovaným na akce.

Azure Sentinel je navržený tak, aby shromažďuje data, detekuje možné typy hrozeb a poskytuje přehled o bezpečnostních incidentech. Zatímco azure Sentinel čeká na ruční zásah, může se při spouštění výstrah a procesů správy incidentů spoléhat na předem napsané playbooky.

Ukázková aplikace se skládá z několika prostředků, které může Azure Sentinel monitorovat. Pokud chcete nastavit Azure Sentinel, musíte nejprve vytvořit pracovní prostor služby Log Analytics, do kterého se ukládají všechna data shromážděná z různých prostředků.

Vytvoření tohoto pracovního prostoru:

  1. Do vyhledávacího pole v Azure Portal vyhledejte Log Analytics. Vyberte možnost Pracovní prostory služby Log Analytics.

    Search pro pracovní prostory služby Log Analytics

    Search pro pracovní prostory služby Log Analytics

  2. Na další stránce vyberte Přidat a zadejte název, skupinu prostředků a umístění pracovního prostoru. Vytvoření pracovního prostoru služby Log Analytics

    Vytvoření pracovního prostoru služby Log Analytics

  3. Pomocí vyhledávacího pole vyhledejte Azure Sentinel.

    Vyhledání textu Azure Sentinel

    Vyhledání textu Azure Sentinel

  4. Vyberte Přidat a pak vyberte pracovní prostor služby Log Analytics, který jste vytvořili dříve.

    Přidání pracovního prostoru služby Log Analytics

    Přidání pracovního prostoru služby Log Analytics

  5. Na stránce Azure Sentinel – Datové konektory v části Konfigurace vyberte Datové konektory. Zobrazí se pole služeb Azure, které můžete propojit s instancí úložiště Log Analytics pro účely analýzy ve službě Azure Sentinel.

    Datové konektory Log Analytics

    Přidání datového konektoru do Služby Azure Sentinel

    Pokud chcete například připojit aplikační bránu, postupujte takto:

    1. Otevřete okno instance Azure Application Gateway.

    2. V části Monitorování vyberte Nastavení diagnostiky.

    3. Vyberte Přidat nastavení diagnostiky.

      Přidání diagnostiky Application Gateway

      Přidání diagnostiky Application Gateway

    4. Na stránce Nastavení diagnostiky vyberte pracovní prostor služby Log Analytics, který jste vytvořili, a pak vyberte všechny metriky, které chcete shromáždit a odeslat do služby Azure Sentinel. Vyberte Uložit.

      Nastavení konektoru služby Azure Sentinel

      Nastavení konektoru služby Azure Sentinel

Metriky z prostředku jsou ve službě Azure Sentinel, kde se na ně můžete dotazovat a zkoumat je.

Přidejte stejné metriky do nastavení diagnostiky pro Azure Key Vault, veřejnou IP adresu, Azure Database for PostgreSQL a všechny služby, které podporují diagnostické protokoly ve vašem účtu.

Po nastavení metrik má Azure Sentinel data k analýze.

Vyhodnocení a ověření

Po vývoji a nasazení architektury musíte zajistit, aby kód a nasazené služby splňovaly standardy zabezpečení. Při ověření softwaru můžete provést několik kroků:

  • Analýza statického kódu
  • Kontrola ohrožení zabezpečení
  • Hledání a oprava ohrožení zabezpečení v závislostech aplikací

Toto jsou základní stavební bloky pro osvědčené postupy při zabezpečeném vývoji.

Analýza statického kódu

Ověření pomocí nástrojů pro statickou analýzu u ukázkové aplikace zahrnuje vyhledání ohrožení zabezpečení v kódu aplikace pomocí technik, jako je kontrola taintu a analýza toku dat. Nástroje pro statickou analýzu Pythonu poskytují větší jistotu, že je vaše aplikace zabezpečená.

Analyzování kódu

PyFlakes, knihovna pro lintování Pythonu, pomáhá odstranit z aplikací zastaralý kód a nepoužívané funkce, jak je znázorněno tady:

PyFlakes

Linting poskytuje rady a možné změny, díky kterým bude váš kód čistší a méně náchylný k chybám během běhu.

PyLint

PyLint poskytl pro tento projekt nejvyšší hodnotu. Provádí standardní kontroly kódu, kontrolu chyb a tipy pro refaktoring, aby se zajistilo, že kód spuštěný na serveru je bezpečný. Pomocí PyLint k aktualizaci kódu můžete eliminovat chyby a zlepšit hodnocení PyLint, jak je vidět na následujících obrázcích.

Před PyLintem

Před PyLintem

Po opravě některých chyb kódu zjištěných nástroji lintingu máte větší jistotu, že kód není náchylný k chybám. Oprava chyb výrazně snižuje bezpečnostní rizika, ke kterým může dojít při nasazení kódu do produkčních prostředí.

Po Pylintu

Po PyLintu

Kontrola ohrožení zabezpečení

Nástroj ZAP od OWASP je opensourcová kontrola ohrožení zabezpečení webové aplikace, kterou můžete použít ke kontrole ohrožení zabezpečení ukázkové aplikace. Spuštění nástroje v ukázkové aplikaci odhalí některé možné chyby a vektory útoku.

Nástroj ZAP

Nástroj ZAP

Vyhledání a oprava ohrožení zabezpečení v závislostech aplikací

K vyhledání a opravě závislostí aplikací můžete použít kontrolu závislostí OWASP.

Zabezpečení je podobná aplikace, která kontroluje závislosti. Najdete ho na GitHubu. Bezpečnostní kontroly ohrožení zabezpečení nalezených v dobře známých databázích ohrožení zabezpečení.

Bezpečnost

Bezpečnost

Další kroky

Následující články vám můžou pomoct s návrhem, vývojem a nasazením zabezpečených aplikací.