Sviluppo remoto su AWS: da Cloud9 a VS Code
20 Novembre 2024 - 2 min. read
Alessio Gandini
Cloud-native Development Line Manager
Bentornati su Proud2beCloud!
Oggi vi presentiamo un'uscita speciale: direttamente dal blog di Noovolari Leapp dedicato a IAM, Nicolò Marchesi - Nico per gli amici! :) - ci guiderà alla scoperta di uno degli aspetti-chiave per una strategia multi-account di successo su AWS.
Vi abbiamo già parlato in questa serie dell'importanza di impostare fin da subito un ambiente AWS sicuro, dinamico, scalabile e "a prova di futuro" e di come, in questo contesto, una la Landing Zone progettata a regola d'arte giochi un ruolo fondamentale.
Nella sua implementazione, tuttavia, occorre prestare particolare attenzione ad alcuni aspetti. Uno di questi è la gestione sicura degli accessi a risorse, ambienti e account. Abbiamo chiesto a chi di Cloud Access Management se ne intende per davvero di raccontarci tutto ciò che sa sull'argomento. In particolare, oggi ci parlerà di come utilizzare le IAM Policy e le Service Control Policies (SCPs) in modo efficace per permettere alle aziende a soddisfare vincoli di security e governance.
Parola a Nico!
Ciao compagni di cloud!
Oggi approfondiremo la serie sulla cloud landing zone per esplorare un contesto affascinante ma spesso ignorato... le Service Control Policies (SCP)! Le SCP sono potenti, ma ci sono alcune precauzioni e trucchi per farle funzionare efficacemente con ogni diverso tipo di policy IAM. In questo post del blog, vedremo come interagisce l'intero ecosistema IAM e come possiamo sfruttare efficacemente gli strumenti per implementare una strategia IAM nella nostra landing zone.
C'è molto da dire, quindi iniziamo subito!
Non voglio tediarti con tutti i dettagli su AWS Organizations in modo da poter mantenere il nostro focus sul flusso IAM. Se ti serve, consulta prima uno dei migliaia di articoli sul web o controlla QUESTO che ho scritto.
Quindi, andiamo a coprire le basi (per i più pigri di voi, saltate pure a dopo il grafico, c'è un pratico riassunto in punti). Prima di passare direttamente alle interazioni, dobbiamo capire che strumenti abbiamo a disposizione nella nostra strategia IAM:
Come potreste già intuire, esiste una differenza fondamentale tra queste policy, ed è illustrata nel diagramma dall'azione che collega la policy alle effettive autorizzazioni.
NOTA: Permission Boundaries e Service Control Policies NON conferiscono ALCUNA autorizzazione.
Un'identità può accedere a una risorsa solo attraverso le policy basate sull'identità e sulle risorse. Le Permission Boundaries e le Service Control Policies possono solo limitare le autorizzazioni menzionate in precedenza. Ciò significa che abbiamo bisogno di una policy basata sull'identità o sulla risorsa che consente esplicitamente l'autorizzazione per permettere all'elaboratore di valutare positivamente la policy.
In breve, le Identity-based e le Resource-based policies definiscono chi può accedere alle risorse e quali azioni possono eseguire. Le Permission boundaries e le Service Control Policies limitano la portata di tali autorizzazioni, garantendo che le entità non possano eseguire azioni non autorizzate.
Vediamo ora una rappresentazione visiva delle nostre policy: iniziamo vedendo come funziona in un singolo account, e poi vediamo come le cose cambiano aggiungendo AWS Organizations all'equazione.
Sì, so che le icone differiscono dal framework di AWS, ma per favore abbiate pazienza; voglio evidenziare le differenze e il fatto che stiamo lavorando con policy fondamentalmente diverse.
Come potete vedere, i tre elementi che possiamo utilizzare sono le Identity-based e le Resource-based policies, e le Permission boundaries:
Come possiamo vedere, mentre le policy che entrano e escono dall'Identità e dalle Risorse concedono l'accesso, le Permission Boundaries limitano invece quel set di autorizzazioni.
È di fatto impossibile concedere autorizzazioni aggiuntive tramite l'uso delle Permission Boundaries.
Quando integriamo il servizio AWS Organizations, acquisiamo la capacità di utilizzare le Service Control Policies per avere un maggiore controllo sul nostro ambiente:
Il comportamento è praticamente lo stesso delle Permission Boundaries, ma vedremo presto che ha una leggera differenza
Quindi, per riassumere brevemente:
Il flusso di valutazione delle policy prevede l'uso di un motore che analizza tutte le policy viste in precedenza e determina se l'azione specifica deve essere consentita o negata.
Qui ho sintetizzato la logica per comprendere meglio il flusso decisionale:
È interessante notare che le autorizzazioni basate su risorse e identità sono valutate al centro del flusso di valutazione. Attorno ad esse, vengono valutati SCP e PB, che abbiamo raggruppato in policy di controllo.
Al di la delle Resource-based policy e delle Session policies, si scopre che il flusso è piuttosto semplice; il trucco è concentrarsi sui casi limite.
Le politiche basate sulle risorse comportano un rifiuto quando il Principal che effettua la richiesta è diverso dal Principal a cui concediamo l'accesso attraverso la policy basata sulle risorse. Ho evidenziato i casi interessati nello schema proposto da AWS a questo link.
Le Resource-based policy portano a un deny quando il Principal che effettua la richiesta è diverso dal Principal cui concediamo l'accesso attraverso la Resource-based policy.
Ho evidenziato il caso interessato nello schema proposto da AWS a questo link.
Anche in questo caso, è più semplice di quanto sembri. Le Session policies entrano in gioco solo quando sono presenti.
Se non le utilizzi nella tua richiesta, non dovresti preoccuparti, ma quando arriva il momento in cui le usi, devi ricordare quanto segue:
Fino ad ora, abbiamo considerato solo l'accesso nello stesso account, ma cosa succederebbe se dovessimo valutare anche l'accesso tra account diversi? È più semplice di quanto sembri: la richiesta viene valutata sulle policy e le autorizzazioni dal punto di vista di entrambi gli account e consentita solo se entrambi sono valutati positivamente!
Se ci pensi, è più restrittivo dell'accesso singolo. Poiché le autorizzazioni AWS partono da un deny implicito, è necessario impostare esplicitamente le autorizzazioni su entrambi gli account prima di valutare la richiesta come un allow.
Dopo aver capito quali sono i fattori coinvolti nella decisione di permettere o negare una richiesta, possiamo passare a come interagiscono.
Ciò ha portato a due scenari pratici, uno con e uno senza policy basate su risorse. Il punto principale qui è capire che l'unico caso in cui le autorizzazioni effettive possono superare quelle dell'intersezione complessiva è quando sono coinvolte le Resource-based policy.
Quando sono coinvolte le Resource-based policies, se valutate come allow, si prende la decisione finale prima che vengano valutate le Identity-based policies, le Permission Boundaries e le Session policies nel flusso di valutazione della policy. Ciò comporta il rilascio di autorizzazioni che possono superare quelle esplicitamente consentite da tali politiche.
L'ultima cosa da dire riguarda le Service Control Policies e il fatto che possono essere ereditate.
Stranamente, questo non funziona come ci si aspetterebbe (ma è meglio così, fidati, tra poco capirai il perchè).
Quando si pensa all'ereditarietà, di solito in programmazione, ma anche in altri campi, si pensa alla configurazione del genitore che viene trasmessa al figlio. Se applichiamo questo concetto alle SCP, alle unità organizzative e agli account, si potrebbe definire le SCP a livello di root e poi ereditare tutto. Beh, NON funziona così.
Poiché le dichiarazioni DENY sono valutate per prime, in pratica, solo le dichiarazioni DENY sono ereditate.
Se si nega un servizio in una SCP, non c'è modo di concederlo in una OU o un account di livello inferiore. Quindi, quando viene valutata una SCP, ci sono effettivamente solo due SCP che concorrono all'esito:
Da questa prospettiva, si può notare che le dichiarazioni ALLOW non vengono ereditate ma devono essere esplicitamente impostate nella SCP dell'Account o dell'Organizational Unit. Questo accade per motivi di sicurezza, in quanto vogliamo esplicitamente definire i confini degli account e delle Organization Unit per evitare autorizzazioni implicite troppo lasche.
Con una strategia di deny, le azioni sono consentite per impostazione predefinita attraverso una SCP di FullAccess gestita direttamente da AWS. È necessario attaccare quella SCP a tutti gli account e alle OU e specificare quali servizi e azioni sono vietati:
Questo è il modo in cui AWS Organizations è configurato per impostazione predefinita in modo che gli amministratori degli account possano delegare tutti i servizi e le azioni fino a quando non si crea e si attacca una SCP che nega un servizio specifico.
Il vantaggio di questo approccio è che gli statement deny richiedono meno manutenzione perché non è necessario aggiornarli quando AWS aggiunge nuovi servizi, ed è supportato out-of-the-box. Inoltre, è possibile limitare l'accesso a risorse specifiche o definire le condizioni per le quali le SCP sono in vigore.
Questo è un ottimo modo per iniziare per le organizzazioni più piccole che devono agire rapidamente e non hanno requisiti rigorosi per la governance e la sicurezza.
Con la strategia Allow, devi rimuovere la SCP FullAWSAccess gestita da AWS. Ora tutte le azioni per tutti i servizi sono implicitamente negate e devi creare una SCP che esplicitamente permetta solo i servizi e le azioni che vuoi consentire. Questo caso è lo stesso schema della valutazione dell'ereditarietà.
Il vantaggio di questo approccio è che hai più controllo su ciò che è consentito. Poiché tutto viene implicitamente negato, questo modo è più facile da ridurre lo scope dei confini effettivi di un account. Poiché i permessi Deny sono ereditati, non è necessario specificarli ovunque.
Tuttavia, richiede più manutenzione poiché devi consentire manualmente ogni servizio (e questo include i nuovi servizi). E ci sono alcune limitazioni sugli statement Allow: gli elementi delle risorse possono avere solo un'entrata ”*” e non possono avere una Condition.
Il valore di questo approccio si può notare quando una grande parte dell'organizzazione potrebbe non avere bisogno di tutti i servizi ma potrebbe avere alcuni servizi richiesti da pochi per casi d'uso specifici. In questo scenario, è più semplice aumentare i permessi e soddisfare i requisiti di sicurezza e governance consentendo allo stesso tempo flessibilità ed eccezioni.
Vediamo ora queste SCP in azione, ecco alcuni esempi per poter immaginare meglio come appare una SCP in un caso di utilizzo concreto
In questo caso, abbiamo creato una SCP per negare tutto tranne le modifiche che passano attraverso le pipeline. Il caso d'uso è quello di creare un account solo per l'automazione in cui non è consentita alcuna azione manuale, ma le modifiche vengono sempre distribuite tramite pipeline.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyAllExceptPipelines",
"Effect": "Deny",
"NotAction": [
"codepipeline:*",
"codebuild:*",
"codecommit:*",
"codedeploy:*",
"codestar:*",
"cloudformation:*",
"iam:*",
"s3:*",
"logs:*",
"cloudwatch:*",
"cloudtrail:*",
"codestar:*",
"codestar-notification:*",
"codeartifact:*",
"kms:*",
"tag:*",
"access-analyzer:*",
"codestar-connections:*",
"ssm:GetParameter*",
"sts:*",
"events:*"
],
"Resource": "*",
"Condition": {
"StringNotLike": {
"aws:PrincipalArn": [
"arn:aws:iam::MY-ACCOUNT-ID:role/MY-ROLE"
]
}
}
}
]
}
In questo caso, abbiamo creato una SCP per proteggere tutti i backup effettuati tramite AWS Backup dalla cancellazione. Si noti che sia S3 che i Backup vault sono protetti e il servizio non può essere disattivato.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyS3BackupDelete",
"Action": [
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:DeleteObjectTagging",
"s3:DeleteBucket"
],
"Resource": [
"arn:aws:s3:::MY-S3-BACKUP*/*"
],
"Effect": "Deny"
},
{
"Sid": "DenyBackupDelete",
"Action": [
"backup:DeleteBackupVault",
"backup:DeleteBackupVaultAccessPolicy",
"backup:PutBackupVaultAccessPolicy"
],
"Resource": [
"arn:aws:backup:*:*:backup-vault:MY-BACKUP-VAULT"
],
"Effect": "Deny",
"Condition": {
"StringNotLike": {
"aws:PrincipalARN": "arn:aws:iam::*:role/MY-EXECUTION-ROLE"
}
}
},
{
"Sid": "DenyBackupTurnoffService",
"Action": [
"backup:UpdateRegionSettings"
],
"Resource": [
"*"
],
"Effect": "Deny",
"Condition": {
"StringNotLike": {
"aws:PrincipalARN": [
"arn:aws:iam::*:role/MY-EXECUTION-ROLE"
]
}
}
}
]
}
Congratulazioni, sei riuscito ad arrivare alla fine del post del blog! Siamo passati dal flusso di valutazione delle policy all'effettiva implementazione degli SCP, passando attraverso la comprensione di tutti i dettagli che concorrono all'interazione tra policy e limiti.
Dai vari esempi di SCP che abbiamo visto, come per qualsiasi strumento di governance, la loro implementazione è strettamente legata alla struttura e al funzionamento di ogni azienda. Pertanto, credo che questa conoscenza debba essere ben interiorizzata e ampiamente compresa all'interno di ciascuna organizzazione.
Ora sei sulla strada per diventare un esperto; ci vediamo la prossima volta e fammi sapere come sta andando il tuo viaggio nel cloud!
Com'è andato il vostro viaggio nelle Service Control Policy? Fateci sapere nei commenti!
È il momento di ringraziare Nico e il resto del team di Noovolari Leapp.
Per saperne di più sul progetto open-source, visitate il GitHub repository (e lasciate una star se vi piace!), oppure approfondite sul sito o sul blog.
A presto su Proud2beCloud!