Azure App Services는 개발자가 웹 애플리케이션, 모바일 앱 백엔드 및 API를 원활하게 구축, 배포 및 확장할 수 있도록 합니다. 여러 프로그래밍 언어를 지원하며, 향상된 기능과 관리를 위해 다양한 Azure 도구 및 서비스와 통합됩니다.
각 앱은 샌드박스 내에서 실행되지만 격리는 App Service 계획에 따라 다릅니다.
무료 및 공유 계층의 앱은 공유 VM에서 실행됩니다.
표준 및 프리미엄 계층의 앱은 전용 VM에서 실행됩니다.
이러한 격리는 파일 업로드나 주입과 같은 다른 일반적인 웹 취약점을 방지하지 않습니다. 그리고 관리 ID가 사용되는 경우, 권한을 상승시킬 수 있습니다.
Azure Function Apps
기본적으로 Azure Function 앱은 Azure App Service의 하위 집합이며, 웹 콘솔로 이동하여 모든 앱 서비스를 나열하거나 az cli에서 az webapp list를 실행하면 여기에도 Function 앱이 나열된 것을 볼 수 있습니다.
실제로 App 서비스가 사용하는 일부 보안 관련 기능(webapp in az cli)은 Function 앱에서도 사용됩니다.
Basic Authentication
웹 앱(및 일반적으로 Azure 함수)을 생성할 때 기본 인증을 활성화할지 여부를 지정할 수 있습니다. 이는 기본적으로 SCM 및 FTP를 애플리케이션에 대해 활성화하여 이러한 기술을 사용하여 애플리케이션을 배포할 수 있게 합니다.
또한 이들에 연결하기 위해 Azure는 SCM 및 FTP 서버에 연결하기 위한 사용자 이름, 비밀번호 및 URL을 가져오는 API를 제공합니다.
인증: az webapp auth show --name lol --resource-group lol_group
SSH
Always On
Debugging
Enumeration
# List webappsazwebapplist## Less informationazwebapplist--query"[].{hostName: defaultHostName, state: state, name: name, resourcegroup: resourceGroup}"# Get info about 1 appazwebappshow--name<name>--resource-group<res-group># Get instances of a webappazwebapplist-instances--name<name>--resource-group<res-group>## If you have enough perm you can go to the "consoleUrl" and access a shell inside the instance form the web# Get configured Auth informationazwebappauthshow--name<app-name>--resource-group<res-group># Get access restrictions of an appazwebappconfigaccess-restrictionshow--name<name>--resource-group<res-group># Remove access restrictionsazwebappconfigaccess-restrictionremove--resource-group<res-group>-n<name>--rule-name<rule-name># Get appsettings of an appazwebappconfigappsettingslist--name<name>--resource-group<res-group># Get backups of a webappazwebappconfigbackuplist--webapp-name<name>--resource-group<res-group># Get backups scheduled for a webappazwebappconfigbackupshow--webapp-name<name>--resource-group<res-group># Get snapshotsazwebappconfigsnapshotlist--resource-group<res-group>-n<name># Restore snapshotazwebappconfigsnapshotrestore-g<res-group>-n<name>--time2018-12-11T23:34:16.8388367# Get connection strings of a webappazwebappconfigconnection-stringlist--name<name>--resource-group<res-group># Get used container by the appazwebappconfigcontainershow--name<name>--resource-group<res-group># Get storage account configurations of a webappazwebappconfigstorage-accountlist--name<name>--resource-gl_group# List all the functionsazfunctionapplist# Get info of 1 funciton (although in the list you already get this info)azfunctionappshow--name<app-name>--resource-group<res-group>## If "linuxFxVersion" has something like: "DOCKER|mcr.microsoft.com/..."## This is using a container# Get details about the source of the function codeazfunctionappdeploymentsourceshow \--name <app-name> \--resource-group <res-group>## If error like "This is currently not supported."## Then, this is probalby using a container# Get more info if a container is being usedazfunctionappconfigcontainershow \--name <name> \--resource-group <res-group># Get settings (and privesc to the sorage account)azfunctionappconfigappsettingslist--name<app-name>--resource-group<res-group># Check if a domain was assigned to a function appazfunctionappconfighostnamelist--webapp-name<app-name>--resource-group<res-group># Get SSL certificatesazfunctionappconfigssllist--resource-group<res-group># Get network restrictionsazfunctionappconfigaccess-restrictionshow--name<app-name>--resource-group<res-group># Get more info about a function (invoke_url_template is the URL to invoke and script_href allows to see the code)azrest--methodGET \--url "https://management.azure.com/subscriptions/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions?api-version=2024-04-01"# Get source code with Master Key of the functioncurl"<script_href>?code=<master-key>"## Python examplecurl"https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=<master-key>"-v# Get source codeazrest--url"https://management.azure.com/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01"
az 파워셸
# Get App Services and Function AppsGet-AzWebApp# Get only App ServicesGet-AzWebApp|?{$_.Kind-notmatch"functionapp"}
#!/bin/bash# Get all App Service and Function Apps# Define Azure subscription IDazure_subscription="your_subscription_id"# Log in to Azureazlogin# Select Azure subscriptionazaccountset--subscription $azure_subscription# Get all App Services in the specified subscriptionlist_app_services=$(azappservicelist--query"[].{appServiceName: name, group: resourceGroup}"-otsv)# Iterate over each App Serviceecho"$list_app_services"|while IFS=$'\t'read-rappServiceNamegroup; do# Get the type of the App Serviceservice_type=$(azappserviceshow--name $appServiceName --resource-group $group --query"kind"-otsv)# Check if it is a Function App and print its nameif [ "$service_type"=="functionapp" ]; thenecho"Function App Name: $appServiceName"fidone
자격 증명 얻기 및 웹앱 코드에 접근하기
# Get connection strings that could contain credentials (with DBs for example)azwebappconfigconnection-stringlist--name<name>--resource-group<res-group>## Check how to use the DBs connection strings in the SQL page# Get credentials to access the code and DB credentials if configured.azwebappdeploymentlist-publishing-profiles--resource-group<res-group>-n<name># Get git URL to access the codeazwebappdeploymentsourceconfig-local-git--resource-group<res-group>-n<name># Access/Modify the code via gitgitclone'https://<username>:<password>@name.scm.azurewebsites.net/repo-name.git'## In my case the username was: $nameofthewebapp and the password some random chars## If you change the code and do a push, the app is automatically redeployed