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.
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 se skládá z těchto komponent:
- Azure Application Gateway. Poskytuje bránu a bránu firewall pro naši aplikační architekturu.
- Azure Web Apps v Linuxu. Poskytuje modul runtime kontejneru pro spuštění aplikace Pythonu v linuxovém prostředí.
- Azure Key Vault. Ukládá a šifruje tajné kódy naší aplikace a spravuje vytváření zásad přístupu kolem nich.
- Azure Database for PostgreSQL. Bezpečně ukládá data naší aplikace.
- Azure Security Center a Aplikace Azure Insights. Poskytuje monitorování a upozornění na provoz naší aplikace.
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:
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.
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:
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:
- Docker k vytvoření a sestavení imagí kontejneru.
- Azure CLI pro nasazení.
- Docker Hub jako registr kontejneru.
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é:
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
Pokud chcete přejít do adresáře, použijte tento příkaz:
cd tutorial-project/scripts
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í:
- 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ů. - Pokud jste v Linuxu
deploy-bash.sh
, spusťte soubor zadáním/deploy-bash.sh REGION RESOURCE_GROUP_NAME
pří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:
Deklarujte proměnné pro Azure Key Vault.
Zaregistrujte poskytovatele Azure Key Vault.
Vytvořte skupinu prostředků pro instanci.
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:
- Otevřete terminál pomocí Azure CLI a nastavení předplatného Azure.
- 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.)
- Vytvořte instanci serveru PostgreSQL.
- Vytvořte databázi na instanci serveru, kterou jste vytvořili v kroku 3.
- 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í.
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:
Stáhněte soubor certifikátu z certifikační autority.
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:
Deklaruje proměnné a názvy pro instanci App Service.
Vytvoří skupinu prostředků pro plán App Service.
Zřídí Web Apps Azure v instanci kontejnerů Linuxu.
Povolí protokolování kontejneru webové aplikace.
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í.
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:
Vytvořte skupinu prostředků pro aplikační bránu.
Zřiďte virtuální síť pro připojení k bráně.
Vytvořte podsíť pro bránu ve virtuální síti.
Zřiďte veřejnou IP adresu.
Zřiďte aplikační bránu.
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:
- Vytvoří v Azure nový certifikát podepsaný svým držitelem.
- Stáhne certifikát podepsaný svým držitelem jako soubor s kódováním base64.
- Vygeneruje heslo pro certifikát podepsaný svým držitelem.
- Exportuje certifikát jako soubor PFX podepsaný heslem.
- 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.
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ě pro App Service
Na další stránce vyberte Přidat virtuální síť (Preview).
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.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ě.
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ě
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ě
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ě
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
AppService
služby: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ů
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íť.
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 (jenom App Service Environment)
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:
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 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:
Vyberte Azure Active Directory nebo ji vyhledejte pomocí vyhledávacího pole.
Vyberte Nová registrace:
Vytvoření registrace aplikace Azure AD
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
Zobrazí se obrazovka s zaregistrovanou aplikací a jejími informacemi. Tyto informace musíte přidat do instance Azure Key Vault.
Zkopírujte ID aplikace (klienta) a uložte ho do Key Vault jako
CLIENTID
.Zkopírujte identifikátor URI přesměrování, který jste zadali v předchozím kroku, a uložte ho jako
REDIRECTURI
.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
.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
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.
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 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:
Search pro Application Insights pomocí vyhledávacího pole v Azure Portal.
Vyberte Application Insights. Zadejte zde uvedené podrobnosti a vytvořte instanci.
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:
V Azure Portal přejděte na kartu Azure Active Directory.
V kategorii zabezpečení vyberte Podmíněný přístup. Zobrazí se tato obrazovka:
Pokud nemůžete vytvořit novou zásadu:
Přejděte na kartu MFA .
Vyberte odkaz na zkušební verzi Azure AD Premium Free a přihlaste se k odběru bezplatné zkušební verze.
Vraťte se na obrazovku podmíněného přístupu.
Vyberte kartu nové zásady.
Zadejte název zásady.
Vyberte uživatele nebo skupiny, pro které chcete povolit vícefaktorové ověřování.
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í).
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á:
Vyberte Vyžadovat vícefaktorové ověřování pro správce.
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:
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
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
Pomocí vyhledávacího pole vyhledejte Azure Sentinel.
Vyhledání textu Azure Sentinel
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
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.
Přidání datového konektoru do Služby Azure Sentinel
Pokud chcete například připojit aplikační bránu, postupujte takto:
Otevřete okno instance Azure Application Gateway.
V části Monitorování vyberte Nastavení diagnostiky.
Vyberte Přidat nastavení diagnostiky.
Přidání diagnostiky Application Gateway
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
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:
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
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
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
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
Další kroky
Následující články vám můžou pomoct s návrhem, vývojem a nasazením zabezpečených aplikací.