La lliçó anterior va deixar les identitats de Contoso Airlines creades i governades, però amb una mancança deliberada: Contoso-Desarrollo existeix i encara no pot fer absolutament res, mentre que la Marta Ríos és Propietària de tot perquè va ser qui va crear la subscripció. Ni una cosa ni l'altra són acceptables. Avui muntes el sistema que decideix què pot fer cada identitat sobre cada recurs: el control d'accés basat en rols d'Azure, o RBAC. I a la segona meitat resols el problema que arrosseguem des del mòdul 2: app-contoso-reservas-pro guarda avui una clau de compte d'emmagatzematge i una cadena de connexió als seus ajustos d'aplicació. En acabar la lliçó, l'aplicació s'autenticarà contra sttarjetascontosopro i db-reservas sense ni una sola contrasenya enlloc, gràcies a les identitats administrades. És, probablement, la millora de seguretat amb millor relació esforç/benefici de tot el curs.
Contingut
- Com autoritza Azure: la tríada de l'assignació de rol
- Àmbits i herència per la jerarquia
- Rols integrats imprescindibles
- El parany: Col·laborador no dona accés a les dades
- Rols personalitzats: «Operador de Reservas de Contoso»
- Denegació d'assignacions
- Mínim privilegi aplicat als grups de Contoso
- Diagnosticar per què algú no té accés
- Identitats administrades: què són i què eliminen
- Assignades pel sistema davant d'assignades per l'usuari
- El flux del testimoni: IMDS per dins
- Contoso sense contrasenyes: emmagatzematge i base de dades
- Errors Comuns i Consells
- Exercicis
- Conclusió
- Com autoritza Azure: la tríada de l'assignació de rol
Quan algú crida l'API d'Azure Resource Manager, passen dues coses en ordre: Entra ID autentica (qui ets?) i RBAC autoritza (pots fer això?). Una assignació de rol és sempre la unió de tres elements, i si en falta un no hi ha accés.
flowchart LR
A["ENTITAT DE SEGURETAT<br/>Contoso-Desarrollo"] --> D{{"ASSIGNACIO<br/>DE ROL"}}
B["DEFINICIO DE ROL<br/>Col-laborador"] --> D
C["AMBIT<br/>rg-contoso-reservas-dev"] --> D
D --> E["El grup Contoso-Desarrollo pot<br/>gestionar recursos, i nomes dins<br/>del grup de recursos de desenvolupament"]
L'entitat de seguretat és a qui (usuari, grup, entitat de servei o identitat administrada); la definició de rol és què (una col·lecció d'operacions permeses a Actions i restades a NotActions); i l'àmbit és on (el nivell de la jerarquia sobre el qual s'aplica).
az role assignment create \
--assignee-object-id $(az ad group show --group "Contoso-Desarrollo" --query id -o tsv) \
--assignee-principal-type Group \
--role "Contributor" \
--scope "/subscriptions/$SUB_DEV/resourceGroups/rg-contoso-reservas-dev"Fer servir --assignee-object-id amb --assignee-principal-type en lloc de --assignee estalvia una consulta extra a Graph i, sobretot, evita la fallada intermitent de les assignacions a identitats acabades de crear, la propagació de les quals al directori triga uns segons.
- Àmbits i herència per la jerarquia
RBAC s'hereta cap avall per la jerarquia d'Azure Resource Manager que vas veure a 01-05: grup d'administració (mg-contoso) → subscripció (Contoso Airlines - Producció) → grup de recursos (rg-contoso-reservas-pro) → recurs (app-contoso-reservas-pro).
Qui és Lector a la subscripció és Lector a tots els seus grups de recursos i a tots els recursos de dins. Els permisos són acumulatius i només sumen: no existeix la «denegació per rol», així que donar Lector en un grup de recursos a qui ja és Col·laborador de la subscripció no li treu res.
El grup d'administració es reserva per a rols transversals de govern (Lector per a auditoria) i abasta totes les subscripcions; la subscripció, per a administració de plataforma; el recurs, per a excepcions puntuals difícils de mantenir. Contoso assigna gairebé tot a nivell de grup de recursos, que coincideix amb el cicle de vida de cada càrrega de treball. I sempre a grups d'Entra ID, no a persones: amb quatre grups i quatre grups de recursos hi ha 16 combinacions possibles i cap no es refà quan algú canvia d'equip; amb assignacions individuals, cada alta i cada baixa és una revisió manual de tota la subscripció. Hi ha un límit dur que a més ho obliga: 4.000 assignacions de rol per subscripció, i les empreses que assignen a persones l'assoleixen.
- Rols integrats imprescindibles
Azure porta més de 400 rols integrats. Aquests són els que es fan servir cada dia:
| Rol | Pla de gestió | Pla de dades | Pot assignar rols | Ús típic |
|---|---|---|---|---|
| Propietari | Total | Segons el servei | Sí | Només amb PIM, mai permanent |
| Col·laborador | Total | No | No | Crear i gestionar recursos |
| Lector | Només lectura | No | No | Auditoria, suport de primer nivell |
| Administrador d'accés d'usuari | Només permisos | No | Sí | Delegar la gestió d'accessos |
| Col·laborador de dades de Blob Storage | No | Llegir, escriure, esborrar blobs | No | Aplicacions que pugen targetes |
| Lector de dades de Blob Storage | No | Llegir blobs | No | Processos de només consulta |
| Usuari de Key Vault Secrets | No | Llegir valors de secrets | No | Aplicacions que consumeixen secrets |
| Responsable de Key Vault Secrets | No | Crear i gestionar secrets | No | La Marta gestionant el magatzem |
| Col·laborador de màquina virtual | Gestionar VMs | No (no dona SSH) | No | Operació de còmput |
La diferència entre Propietari i Col·laborador es redueix a una sola cosa, però enorme: Propietari pot assignar rols, és a dir, pot donar-se a si mateix i a qualsevol qualsevol permís. Per això és el rol que menys gent ha de tenir i el candidat número u per a PIM (04-01).
- El parany: Col·laborador no dona accés a les dades
Aquest és el punt que més confusió genera en tot RBAC, i convé entendre'l amb el cas concret.
En Diego Salas és Col·laborador de rg-contoso-reservas-pro. Amb aquest rol pot veure sttarjetascontosopro, canviar-ne el nivell d'accés, la redundància i el tallafoc, i fins i tot eliminar el compte d'emmagatzematge sencer amb les targetes d'embarcament de dos anys a dins. I no pot llegir ni un sol blob del contenidor tarjetas-embarque.
No és un error de configuració: Azure té dos plans. El pla de gestió (management.azure.com) crea, configura i esborra recursos. El pla de dades (<compte>.blob.core.windows.net, <vault>.vault.azure.net) llegeix i escriu el contingut. Col·laborador cobreix el primer per complet i el segon gens.
# En Diego pot fer aixo (pla de gestio)
az storage account show -n sttarjetascontosopro -g rg-contoso-reservas-pro
# I aixo FALLA amb AuthorizationPermissionMismatch (pla de dades)
az storage blob list --account-name sttarjetascontosopro -c tarjetas-embarque --auth-mode loginLa conseqüència no és una molèstia, és la base del mínim privilegi: la Marta Ríos pot administrar la infraestructura sense poder llegir les dades personals dels passatgers, cosa que l'RGPD agraeix i que a més redueix el dany si li roben la sessió. I hi ha un matís important: mentre existeixin claus de compte, un Col·laborador les pot llegir (listKeys) i amb elles accedir a les dades, saltant-se tot l'anterior. Per això Contoso desactivarà l'autenticació per clau —ho veuràs a l'apartat 12— i per això les claus i les SAS del mòdul 2 desapareixeran.
- Rols personalitzats: «Operador de Reservas de Contoso»
Contoso-Operaciones necessita una cosa que cap rol integrat no ofereix: reiniciar l'aplicació web quan es penja i consultar mètriques, sense poder canviar la configuració ni esborrar res. Això és un rol personalitzat.
{
"Name": "Operador de Reservas de Contoso",
"Description": "Reinicia l'aplicacio web i consulta metriques; no modifica configuracio ni elimina recursos.",
"IsCustom": true,
"Actions": [
"Microsoft.Web/sites/read",
"Microsoft.Web/sites/restart/action",
"Microsoft.Web/sites/slots/read",
"Microsoft.Web/sites/slotsswap/action",
"Microsoft.Insights/metrics/read",
"Microsoft.Insights/metricDefinitions/read",
"Microsoft.Resources/subscriptions/resourceGroups/read"
],
"NotActions": [
"Microsoft.Web/sites/config/list/action"
],
"DataActions": [],
"NotDataActions": [],
"AssignableScopes": [
"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-contoso-reservas-pro"
]
}Cada bloc importa:
Actions: operacions del pla de gestió permeses, amb el formatProveïdor/tipusRecurs/operació. Aquí, llegir llocs, reiniciar-los, intercanviar ranures (per promourepreproduccion) i consultar mètriques.NotActions: es resten d'Actions.config/list/actionretorna els ajustos de l'aplicació, que inclouen cadenes de connexió: la resta ho deixa explícit i documentat.DataActions/NotDataActions: l'equivalent per al pla de dades, buides a propòsit, perquè operacions no necessita llegir targetes d'embarcament. IAssignableScopes: on es pot assignar el rol; limitar-lo al grup de recursos de producció impedeix aplicar-lo per error a tota la subscripció.
az role definition create --role-definition ./rol-operador-reservas.json
az role assignment create \
--assignee-object-id $(az ad group show --group "Contoso-Operaciones" --query id -o tsv) \
--assignee-principal-type Group \
--role "Operador de Reservas de Contoso" \
--scope "/subscriptions/$SUB_PRO/resourceGroups/rg-contoso-reservas-pro"Abans de crear un rol personalitzat, busca si ja n'existeix un d'integrat: az role definition list --query "[?contains(roleName,'Website')].roleName" -o tsv. Els personalitzats s'han de mantenir quan Azure afegeix operacions noves, i aquest manteniment és real. El límit és de 5.000 rols personalitzats per inquilí, però el problema pràctic arriba molt abans, en forma de catàleg impossible de gestionar.
- Denegació d'assignacions
Existeix un mecanisme que bloqueja operacions encara que un rol les permeti: la denegació d'assignacions, que sempre guanya davant de qualsevol concessió. No es pot crear directament per CLI ni pel portal; la generen serveis d'Azure com Blueprints o les implementacions administrades d'aplicacions. Es menciona aquí perquè, si algun dia veus un accés denegat sent Propietari, sàpigues on mirar: az role assignment list-deny.
- Mínim privilegi aplicat als grups de Contoso
| Grup | Àmbit | Rol | Motiu |
|---|---|---|---|
Contoso-Infraestructura |
Subscripció de producció | Col·laborador i Administrador d'accés d'usuari, tots dos aptes via PIM | Gestiona tot, sense privilegi en repòs |
Contoso-Desarrollo |
rg-contoso-reservas-dev |
Col·laborador | Llibertat total en desenvolupament |
Contoso-Desarrollo |
Subscripció de producció | Lector | Diagnosticar sense poder tocar |
Contoso-Operaciones |
rg-contoso-reservas-pro |
Operador de Reservas de Contoso | Reiniciar i observar |
Contoso-DBA-Reservas |
sql-contoso-reservas-pro |
Col·laborador de SQL Server + admin d'Entra al servidor | Administrar la base sense tocar la resta |
SUB_PRO=$(az account show --query id -o tsv)
DEV=$(az ad group show --group "Contoso-Desarrollo" --query id -o tsv)
# Lector en produccio per a desenvolupament: veuen els problemes, no els provoquen
az role assignment create --assignee-object-id $DEV --assignee-principal-type Group \
--role "Reader" --scope "/subscriptions/$SUB_PRO"
# Auditoria del repartiment actual, incloent-hi el que s'hereta
az role assignment list --all --include-inherited \
--query "[].{Qui:principalName, Rol:roleDefinitionName, Ambit:scope}" -o tableRegla pràctica de Contoso: Propietari només mitjançant PIM i amb aprovació, Col·laborador en producció només per a infraestructura, i tothom qui «només necessita mirar» rep Lector. El 90 % de les peticions d'accés es resolen amb Lector més un rol de dades concret.
- Diagnosticar per què algú no té accés
Quan algú diu «no puc», segueix aquest ordre:
# 1. Que te aquesta persona, incloent-hi herencia i pertinenca a grups
az role assignment list --assignee [email protected] \
--all --include-inherited --include-groups -o table
# 2. Que hi ha assignat al recurs concret
az role assignment list --scope "/subscriptions/$SUB_PRO/resourceGroups/rg-contoso-reservas-pro" -o table
# 3. Quina accio exacta exigeix l'operacio que falla
az provider operation show --namespace Microsoft.Storage --query "resourceTypes[].operations[].name" -o tsvSi la CLI no aclareix res, al portal hi ha Control d'accés (IAM) → Comprovar accés, que mostra l'accés efectiu d'una identitat sobre aquest recurs amb l'origen de cada permís. I si l'accés s'ha perdut, el registre d'activitat diu qui va retirar l'assignació i quan: filtra per l'operació Microsoft.Authorization/roleAssignments/delete.
Quatre causes expliquen gairebé tots els casos: (1) el rol és de gestió i l'operació és de dades —apartat 4—; (2) l'àmbit és més estret del que es creia; (3) l'assignació es va fer en una altra subscripció; (4) l'assignació és correcta però el testimoni de l'usuari és anterior i cal tancar la sessió i tornar a entrar. La propagació de RBAC triga fins a cinc minuts, i de tant en tant una mica més.
- Identitats administrades: què són i què eliminen
Ara el segon problema. app-contoso-reservas-pro té avui, als seus ajustos d'aplicació, una clau de sttarjetascontosopro i una cadena de connexió amb usuari i contrasenya de db-reservas. Aquests secrets existeixen com a mínim en quatre llocs: la configuració de l'aplicació, el fitxer .env del portàtil d'en Diego, l'historial del repositori i un correu de fa vuit mesos. No han rotat mai. Si algun es filtra, l'atacant llegeix les targetes d'embarcament de tots els passatgers.
Una identitat administrada és una entitat de servei d'Entra ID el cicle de vida i les credencials de la qual els gestiona Azure: el recurs obté testimonis sense que existeixi una contrasenya que algú pugui copiar, escriure en un fitxer o filtrar. No hi ha credencial per rotar perquè no hi ha credencial. És gratuïta i està disponible a App Service, Functions, VMs, VMSS, Container Apps, AKS, Data Factory, Logic Apps i pràcticament tota la resta.
- Assignades pel sistema davant d'assignades per l'usuari
| Assignada pel sistema | Assignada per l'usuari | |
|---|---|---|
| Cicle de vida | Lligat al recurs: neix i mor amb ell | Recurs independent, s'elimina a part |
| Relació | 1:1 amb un recurs | 1:N, compartida per diversos recursos |
| En recrear el recurs | Nou ID: cal refer les assignacions | El mateix ID: els permisos es conserven |
| Preassignar permisos | No (l'ID encara no existeix) | Sí, abans de crear el recurs |
| Quan fer-la servir | Aplicació única i estable | Flotes (VMSS), infraestructura com a codi, desplegaments blau-verd |
Contoso fa servir l'assignada pel sistema per a app-contoso-reservas-pro, perquè és una aplicació única. Per a vmss-api-disponibilidad-pro, on les instàncies es creen i es destrueixen amb l'escalat automàtic, fa servir una assignada per l'usuari anomenada id-contoso-api-pro: els permisos es concedeixen una vegada a la identitat i totes les instàncies els hereten, presents i futures. Si a més desplegaràs amb Bicep (05-06), l'assignada per l'usuari evita el problema de l'ou i la gallina: es crea primer, se li donen permisos i després s'associa als recursos.
- El flux del testimoni: IMDS per dins
sequenceDiagram
participant App as app-contoso-reservas-pro
participant IMDS as Punt de connexio local<br/>(IMDS 169.254.169.254)
participant Entra as Microsoft Entra ID
participant St as sttarjetascontosopro
App->>IMDS: GET /metadata/identity/oauth2/token<br/>?resource=https://storage.azure.com/
IMDS->>Entra: Demana testimoni per a la identitat del recurs
Entra-->>IMDS: Testimoni d acces JWT (valid ~24 h)
IMDS-->>App: Testimoni d acces
App->>St: GET /tarjetas-embarque/BP-4471.pdf<br/>Authorization: Bearer <token>
St->>St: Valida el testimoni i comprova RBAC
St-->>App: PDF de la targeta d embarcament
L'essencial d'aquest flux: la petició del testimoni viatja a 169.254.169.254, una adreça link-local no encaminable que només respon dins de la mateixa màquina virtual o instància. Cap atacant extern no pot demanar aquest testimoni perquè no pot arribar a aquest punt de connexió; i com que tot passa dins del recurs, no hi ha secret per transmetre. A App Service el mecanisme és equivalent, exposat mitjançant les variables IDENTITY_ENDPOINT i IDENTITY_HEADER, que l'SDK fa servir automàticament.
- Contoso sense contrasenyes: emmagatzematge i base de dades
Primer s'activa la identitat i es desa el seu identificador d'objecte:
RG="rg-contoso-reservas-pro"; APP="app-contoso-reservas-pro"
PRINCIPAL=$(az webapp identity assign -g $RG -n $APP --query principalId -o tsv)Després se li concedeix accés a les dades, amb el rol més estret possible i en l'àmbit més estret possible —el contenidor, no el compte:
ST_ID=$(az storage account show -n sttarjetascontosopro -g $RG --query id -o tsv)
az role assignment create --assignee-object-id $PRINCIPAL --assignee-principal-type ServicePrincipal \
--role "Storage Blob Data Contributor" \
--scope "$ST_ID/blobServices/default/containers/tarjetas-embarque"
# I ara el mes important: es tanca la porta antiga
az storage account update -n sttarjetascontosopro -g $RG --allow-shared-key-access falseAquesta darrera línia és la que converteix l'exercici en una millora real: amb --allow-shared-key-access false, les claus de compte i les SAS del mòdul 2 deixen de funcionar, i l'únic accés possible passa per identitats d'Entra ID amb el seu rol. Abans d'executar-la cal assegurar-se que cap procés heretat no les fa servir, perquè el tall és immediat.
Per a db-reservas, la base ja té autenticació només amb Entra ID sobre el grup Contoso-DBA-Reservas (03-02). Falta crear l'usuari de l'aplicació, executant això connectat com a administrador d'Entra ID:
CREATE USER [app-contoso-reservas-pro] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [app-contoso-reservas-pro];
ALTER ROLE db_datawriter ADD MEMBER [app-contoso-reservas-pro];
GRANT EXECUTE ON SCHEMA::dbo TO [app-contoso-reservas-pro];El nom de l'usuari és exactament el del recurs d'App Service, que és com es diu la seva identitat administrada. Fixa't que no se li dona db_owner: llegir, escriure i executar procediments és tot el que l'aplicació necessita, i amb això no pot alterar l'esquema.
Al codi, tot això es redueix a una classe. DefaultAzureCredential prova en ordre les credencials disponibles —variables d'entorn, identitat administrada, Azure CLI, Visual Studio— de manera que el mateix codi funciona al portàtil d'en Diego i en producció sense canvis ni secrets:
using Azure.Identity;
using Azure.Storage.Blobs;
using Microsoft.Data.SqlClient;
// Una sola instancia, reutilitzada: la credencial guarda els testimonis en memoria cau
var credencial = new DefaultAzureCredential();
// Emmagatzematge: sense clau de compte ni SAS, nomes el nom del compte
var blobs = new BlobServiceClient(
new Uri("https://sttarjetascontosopro.blob.core.windows.net"),
credencial);
var contenidor = blobs.GetBlobContainerClient("tarjetas-embarque");
await contenidor.UploadBlobAsync("BP-4471.pdf", fluxPdf);
// SQL: cadena de connexio SENSE usuari ni contrasenya
var cadena = "Server=tcp:sql-contoso-reservas-pro.database.windows.net,1433;"
+ "Database=db-reservas;Authentication=Active Directory Default;Encrypt=True;";
await using var connexio = new SqlConnection(cadena);
await connexio.OpenAsync();L'equivalent en Python és literalment el mateix patró: DefaultAzureCredential() es passa com a paràmetre credential de BlobServiceClient, i no apareix cap clau enlloc. Compara les dues cadenes de connexió: la del mòdul 3 duia usuari i contrasenya; aquesta no duu res. No hi ha secret per rotar, filtrar ni revocar. Els secrets que sí que continuen existint —claus d'APIs de tercers, el certificat de la passarel·la de pagament— són el tema de la lliçó següent.
Errors Comuns i Consells
- Donar Col·laborador i esperar accés a les dades. És la incidència número u. Els rols de dades són uns altres (apartat 4).
- Assignar Propietari «perquè no molesti», o assignar rols a persones i no a grups, o pujar a l'àmbit de subscripció per comoditat. Els tres són la mateixa peresa i els tres es paguen el mes dotze.
- Deixar les claus de compte actives després de passar a identitat administrada. Si
allow-shared-key-accesscontinua atrue, la porta antiga continua oberta i qualsevol Col·laborador la pot fer servir. - Crear un rol personalitzat abans de buscar l'integrat. N'hi ha més de 400; gairebé sempre n'existeix un que serveix, i el personalitzat s'ha de mantenir.
- Oblidar que la identitat assignada pel sistema mor amb el recurs. Si recrees l'aplicació, les seves assignacions de rol queden òrfenes. I tingues paciència amb la propagació: RBAC triga fins a cinc minuts, i el testimoni de l'usuari fins que torni a iniciar sessió.
- Consell: crea una sola instància de
DefaultAzureCredentiali reutilitza-la. Una per petició dispara la latència i pot provocar limitació de sol·licituds. - Consell: revisa trimestralment
az role assignment list --allbuscant assignacions òrfenes (les identitats esborrades apareixen com a GUID sense nom) i elimina-les.
Exercicis
Exercici 1: repartir permisos a Contoso Millas
El projecte «Contoso Millas» (centro-coste=CC-2077) té rg-contoso-millas-pro i rg-contoso-millas-dev. Hi participen: tres desenvolupadors que despleguen a desenvolupament i necessiten diagnosticar producció; un analista que només consulta mètriques i costos; una aplicació web que llegeix i escriu blobs a stmillascontosopro; i la Marta Ríos, que administra la infraestructura.
- Indica entitat, rol i àmbit per a cada cas, en format de taula.
- Quina d'aquestes quatre entitats no ha de ser un usuari, i què ha de ser?
- Quina assignació posaries sota PIM i per què?
Exercici 2: escriure un rol personalitzat
Contoso necessita un rol «Soporte de Reservas de Contoso» que permeti llegir qualsevol recurs del grup de producció, reiniciar màquines virtuals i obrir tiquets de suport, però mai llegir secrets de Key Vault ni dades de blobs.
- Escriu el
jsonde la definició ambActions,NotActions,DataActionsiAssignableScopes. - Per què
DataActionsbuit ja impedeix llegir blobs, encara que no aparegui res aNotDataActions? - Quina ordre faries servir per esbrinar el nom exacte de l'acció de reinici d'una VM?
Exercici 3: eliminar l'última contrasenya
L'API de Disponibilitat corre a vmss-api-disponibilidad-pro i guarda en un fitxer de configuració la clau de stoperacionescontosopro i la contrasenya de cosmos-contoso-tarifas-pro.
- Quin tipus d'identitat administrada correspon aquí i per què no l'altra?
- Enumera els passos, amb les ordres, per eliminar tots dos secrets.
- Un desenvolupador diu que «en local no funcionarà perquè no hi ha identitat administrada». Què li respons?
Solucions
Solució 1:
- Grup
Contoso-Millas-Desarrollo: Col·laborador arg-contoso-millas-devi Lector arg-contoso-millas-pro. Analista: Lector més Lector de Cost Management a la subscripció. Aplicació web: Col·laborador de dades de Blob Storage al contenidor destmillascontosopro, mai al compte sencer. La Marta, a través deContoso-Infraestructura: Col·laborador a la subscripció, apte via PIM. - L'aplicació web: ha de ser una identitat administrada, no un usuari ni una entitat de servei amb secret. Cap aplicació no necessita una contrasenya a Azure.
- Les de la Marta, i qualsevol Propietari o Administrador d'accés d'usuari: són les que permeten escalar privilegis, i amb PIM no existeixen en repòs. L'accés de Lector de desenvolupament sobre producció no ho necessita: és de només lectura i el seu ús és quotidià.
Solució 2:
Actions:*/read,Microsoft.Compute/virtualMachines/restart/action,Microsoft.Support/*.NotActions:Microsoft.KeyVault/vaults/secrets/read,Microsoft.Storage/storageAccounts/listKeys/action(crítica: sense ella,*/readno la inclou però convé deixar-la explícita, i evita obtenir claus si s'ampliessin les accions).DataActions:[].NotDataActions:[].AssignableScopes: l'identificador derg-contoso-reservas-pro.- Perquè el pla de dades denega per defecte: només es concedeix el que apareix explícitament a
DataActions.NotDataActionsserveix per restar d'un conjunt concedit, i aquí no n'hi ha cap. SenseDataActions, no hi ha accés a dades, punt. az provider operation show --namespace Microsoft.Compute --query "resourceTypes[?name=='virtualMachines'].operations[].name", o la mateixa ordre filtrant perrestart.
Solució 3:
- Assignada per l'usuari (
id-contoso-api-pro). En un conjunt d'escalat les instàncies neixen i moren constantment; amb identitat assignada pel sistema, cada instància tindria el seu propi identificador i caldria assignar-li permisos en crear-se, cosa inviable amb escalat automàtic. Amb l'assignada per l'usuari els permisos es concedeixen una vegada i totes les instàncies els hereten. - Crear la identitat (
az identity create -g rg-contoso-reservas-pro -n id-contoso-api-pro); associar-la al conjunt (az vmss identity assign --identities); assignar-li Col·laborador de dades de Blob Storage sobre el contenidor destoperacionescontosoproi Col·laborador de dades integrat de Cosmos DB sobre la basecatalogo(ambaz cosmosdb sql role assignment create, que és el sistema RBAC propi de Cosmos); desactivar l'accés per clau a l'emmagatzematge amb--allow-shared-key-access falsei deshabilitar les claus de Cosmos amb--disable-key-based-metadata-write-access; i finalment eliminar el fitxer de configuració i purgar el secret de l'historial del repositori. - Que sí que funciona:
DefaultAzureCredentialrecorre una cadena de proveïdors i, si no troba identitat administrada, fa servir la sessió d'Azure CLI (az login) o la de Visual Studio Code. El codi és idèntic en local i en producció; l'únic que canvia és d'on surt el testimoni. N'hi ha prou de donar al seu usuari el rol de dades corresponent a l'entorn de desenvolupament.
Conclusió
Ja saps com autoritza Azure. Una assignació de rol és sempre una tríada —entitat de seguretat, definició de rol i àmbit— que s'hereta cap avall per la jerarquia grup d'administració, subscripció, grup de recursos i recurs, amb permisos que només sumen. Coneixes els rols integrats que es fan servir de debò i la diferència decisiva entre Propietari i Col·laborador: assignar rols. I tens clar el parany que més incidències genera: Col·laborador no dona accés a les dades, perquè el pla de gestió i el pla de dades són universos separats, de manera que en Diego pot esborrar sttarjetascontosopro sencera i no pot llegir ni un sol PDF de dins. Has escrit el rol personalitzat «Operador de Reservas de Contoso» entenent Actions, NotActions, DataActions i AssignableScopes, saps que existeix la denegació d'assignacions i has repartit els permisos dels quatre grups de Contoso amb mínim privilegi real, a més d'un procediment ordenat per diagnosticar per què algú no té accés.
A la segona meitat has eliminat el problema d'arrel. Les identitats administrades són entitats de servei les credencials de les quals les gestiona Azure, distingeixes les assignades pel sistema —una per recurs, moren amb ell— de les assignades per l'usuari —compartides, amb permisos preassignables, obligatòries a vmss-api-disponibilidad-pro—, i entens el flux del testimoni contra el punt de connexió local IMDS a 169.254.169.254, no encaminable des de fora. Amb això, app-contoso-reservas-pro accedeix a sttarjetascontosopro amb el rol Col·laborador de dades de Blob Storage i a db-reservas com a usuari extern amb db_datareader i db_datawriter, s'ha desactivat l'accés per clau compartida i DefaultAzureCredential fa que el mateix codi funcioni al portàtil i en producció sense ni un sol secret.
Però no tots els secrets desapareixen així. Contoso continua tenint la clau de la passarel·la de pagament, el testimoni del proveïdor de dades meteorològiques, el certificat TLS de contosoairlines.example i unes quantes cadenes de connexió de sistemes heretats, avui repartides entre ajustos d'aplicació, el repositori i un document compartit. A la lliçó següent, Azure Key Vault, centralitzaràs tot això a kv-contoso-pro dins de rg-contoso-seguridad-pro, amb eliminació temporal, protecció contra purga, permisos per RBAC i punt de connexió privat, i faràs que l'aplicació els llegeixi amb la mateixa identitat administrada d'avui mitjançant referències @Microsoft.KeyVault(...). És el moment en què les contrasenyes desapareixen també del desplegament.
Curs d'Azure
Mòdul 1: Introducció a Azure
- Què és Azure?
- Models de servei, regions i zones de disponibilitat
- Crear i configurar el teu compte d'Azure
- Recorregut pel portal d'Azure
- Azure Resource Manager: subscripcions, grups de recursos i etiquetes
- Azure CLI, PowerShell i Cloud Shell
Mòdul 2: Serveis principals d'Azure
- Màquines virtuals d'Azure
- Escalat i alta disponibilitat del còmput
- Azure App Service
- Azure Storage: blobs, fitxers, cues i taules
- Xarxes a Azure: xarxes virtuals, subxarxes i NSG
- Connectivitat híbrida i lliurament global
Mòdul 3: Bases de dades d'Azure
- Triar el servei de dades adequat
- Azure SQL Database
- Azure Cosmos DB
- Azure Database for MySQL
- Azure Database for PostgreSQL
- Analítica de dades: Data Lake, Data Factory i Synapse
Mòdul 4: Seguretat a Azure
- Microsoft Entra ID i gestió d'identitats
- RBAC i identitats administrades
- Azure Key Vault
- Protecció DDoS i tallafoc d'aplicacions web
- Microsoft Defender for Cloud
- Governança i compliment amb Azure Policy
Mòdul 5: Azure DevOps
- Introducció a Azure DevOps
- Azure Repos
- Azure Pipelines: integració contínua
- Desplegament continu amb entorns i aprovacions
- Azure Artifacts
- Infraestructura com a codi amb Bicep
Mòdul 6: Serveis avançats d'Azure
- Contenidors a Azure: Container Registry i Container Apps
- Azure Kubernetes Service (AKS)
- Azure Functions
- Azure Logic Apps
- Missatgeria i esdeveniments: Service Bus, Event Grid i Event Hubs
- Serveis d'IA d'Azure
Mòdul 7: Monitoratge i gestió
- Azure Monitor: mètriques, alertes i taulers
- Log Analytics i consultes KQL
- Application Insights
- Azure Automation i runbooks
- Còpies de seguretat i recuperació davant desastres
Mòdul 8: Gestió i optimització de costos
- Calculadora de preus i estimació de costos
- Azure Cost Management: anàlisi, pressupostos i alertes
- Reserves, plans d'estalvi i Azure Hybrid Benefit
- Azure Advisor
- Estratègies d'optimització i cultura FinOps
