{"id":5726,"date":"2023-03-31T12:00:15","date_gmt":"2023-03-31T10:00:15","guid":{"rendered":"https:\/\/blog.besharp.it\/?p=5726"},"modified":"2023-03-31T15:06:04","modified_gmt":"2023-03-31T13:06:04","slug":"iam-policy-e-service-control-policies-scps-come-gestire-in-modo-sicuro-accessi-e-permessi-allinterno-di-una-landing-zone-su-aws","status":"publish","type":"post","link":"https:\/\/blog.besharp.it\/it\/iam-policy-e-service-control-policies-scps-come-gestire-in-modo-sicuro-accessi-e-permessi-allinterno-di-una-landing-zone-su-aws\/","title":{"rendered":"IAM Policy e Service Control Policies (SCPs): come gestire in modo sicuro accessi e permessi all\u2019interno di una Landing Zone su AWS"},"content":{"rendered":"\n
Bentornati su Proud2beCloud! <\/em><\/p>\n\n\n\n Oggi vi presentiamo un’uscita speciale: direttamente dal blog di <\/em>Noovolari Leapp<\/a> dedicato a IAM, Nicol\u00f2 Marchesi – Nico per gli amici! \ud83d\ude42 – ci guider\u00e0 alla scoperta di uno degli aspetti-chiave per una strategia multi-account di successo su AWS.<\/em><\/p>\n\n\n\n Vi abbiamo gi\u00e0 parlato in questa serie<\/a> 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. <\/em><\/p>\n\n\n\n Nella sua implementazione, tuttavia, occorre prestare particolare attenzione ad alcuni aspetti. Uno di questi \u00e8 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\u00f2 che sa sull’argomento. In particolare, oggi ci parler\u00e0 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. <\/em><\/p>\n\n\n\n Parola a Nico! <\/em><\/p>\n\n\n\n Ciao compagni di cloud! <\/p>\n\n\n\n Oggi approfondiremo la serie sulla cloud landing zone<\/strong> 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<\/strong>. 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.<\/p>\n\n\n\n C’\u00e8 molto da dire, quindi iniziamo subito!<\/p>\n\n\n\n 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<\/a> che ho scritto.<\/p>\n\n\n\n Quindi, andiamo a coprire le basi (per i pi\u00f9 pigri di voi, saltate pure a dopo il grafico, c’\u00e8 un pratico riassunto in punti). Prima di passare direttamente alle interazioni, dobbiamo capire che strumenti abbiamo a disposizione nella nostra strategia IAM:<\/p>\n\n\n\n Come potreste gi\u00e0 intuire, esiste una differenza fondamentale tra queste policy, ed \u00e8 illustrata nel diagramma dall’azione che collega la policy alle effettive autorizzazioni.<\/p>\n\n\n\n NOTA: Permission Boundaries e Service Control Policies NON conferiscono ALCUNA autorizzazione.<\/em><\/p>\n\n\n\n Un’identit\u00e0 pu\u00f2 accedere a una risorsa solo attraverso le policy basate sull’identit\u00e0 e sulle risorse. Le Permission Boundaries e le Service Control Policies possono solo limitare le autorizzazioni menzionate in precedenza. Ci\u00f2 significa che abbiamo bisogno di una policy basata sull’identit\u00e0 o sulla risorsa che consente esplicitamente l’autorizzazione per permettere all’elaboratore di valutare positivamente la policy.<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n In breve, le Identity-based e le Resource-based policies definiscono chi pu\u00f2 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\u00e0 non possano eseguire azioni non autorizzate.<\/p>\n\n\n\n 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.<\/p>\n\n\n\n S\u00ec, 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.<\/p>\n\n\n\n Come potete vedere, i tre elementi che possiamo utilizzare sono le Identity-based e le Resource-based policies, e le Permission boundaries:<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n Come possiamo vedere, mentre le policy che entrano e escono dall’Identit\u00e0 e dalle Risorse concedono l’accesso, le Permission Boundaries limitano invece quel set di autorizzazioni.<\/p>\n\n\n\n \u00c8 di fatto impossibile concedere autorizzazioni aggiuntive tramite l’uso delle Permission Boundaries.<\/p>\n\n\n\n Quando integriamo il servizio AWS Organizations, acquisiamo la capacit\u00e0 di utilizzare le Service Control Policies per avere un maggiore controllo sul nostro ambiente:<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n Il comportamento \u00e8 praticamente lo stesso delle Permission Boundaries, ma vedremo presto che ha una leggera differenza<\/p>\n\n\n\n Quindi, per riassumere brevemente:<\/p>\n\n\n\n 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.<\/p>\n\n\n\n Qui ho sintetizzato la logica per comprendere meglio il flusso decisionale:<\/p>\n\n\n\n \u00c8 interessante notare che le autorizzazioni basate su risorse e identit\u00e0 sono valutate al centro del flusso di valutazione. Attorno ad esse, vengono valutati SCP e PB, che abbiamo raggruppato in policy di controllo.<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n Al di la delle Resource-based policy e delle Session policies, si scopre che il flusso \u00e8 piuttosto semplice; il trucco \u00e8 concentrarsi sui casi limite.<\/p>\n\n\n\n Le politiche basate sulle risorse comportano un rifiuto quando il Principal che effettua la richiesta \u00e8 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<\/a><\/strong>.<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n Le Resource-based policy portano a un deny quando il Principal che effettua la richiesta \u00e8 diverso dal Principal cui concediamo l’accesso attraverso la Resource-based policy.<\/p>\n\n\n\n Ho evidenziato il caso interessato nello schema proposto da AWS a questo link<\/a><\/strong>.<\/p>\n\n\n\n Anche in questo caso, \u00e8 pi\u00f9 semplice di quanto sembri. Le Session policies entrano in gioco solo quando sono presenti.<\/p>\n\n\n\n Se non le utilizzi nella tua richiesta, non dovresti preoccuparti, ma quando arriva il momento in cui le usi, devi ricordare quanto segue:<\/p>\n\n\n\n Fino ad ora, abbiamo considerato solo l’accesso nello stesso account, ma cosa succederebbe se dovessimo valutare anche l’accesso tra account diversi? \u00c8 pi\u00f9 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!<\/p>\n\n\n\n Se ci pensi, \u00e8 pi\u00f9 restrittivo dell’accesso singolo. Poich\u00e9 le autorizzazioni AWS partono da un deny implicito, \u00e8 necessario impostare esplicitamente le autorizzazioni su entrambi gli account prima di valutare la richiesta come un allow.<\/p>\n\n\n\n Dopo aver capito quali sono i fattori coinvolti nella decisione di permettere o negare una richiesta, possiamo passare a come interagiscono.<\/p>\n\n\n\n Ci\u00f2 ha portato a due scenari pratici, uno con e uno senza policy basate su risorse. Il punto principale qui \u00e8 capire che l’unico caso in cui le autorizzazioni effettive possono superare quelle dell’intersezione complessiva \u00e8 quando sono coinvolte le Resource-based policy<\/strong>.<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n 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\u00f2 comporta il rilascio di autorizzazioni che possono superare quelle esplicitamente consentite da tali politiche.<\/p>\n\n\n\n L’ultima cosa da dire riguarda le Service Control Policies e il fatto che possono essere ereditate.<\/p>\n\n\n\n Stranamente, questo non funziona come ci si aspetterebbe (ma \u00e8 meglio cos\u00ec, fidati, tra poco capirai il perch\u00e8).<\/p>\n\n\n\n Quando si pensa all’ereditariet\u00e0, 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\u00e0 organizzative e agli account, si potrebbe definire le SCP a livello di root e poi ereditare tutto. Beh, NON funziona cos\u00ec.<\/p>\n\n\n\n Poich\u00e9 le dichiarazioni DENY sono valutate per prime, in pratica, solo le dichiarazioni DENY sono ereditate<\/strong>.<\/p>\n\n\n\n Se si nega un servizio in una SCP, non c’\u00e8 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:<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n Da questa prospettiva, si pu\u00f2 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.<\/p>\n\n\n\n Con una strategia di deny, le azioni sono consentite per impostazione predefinita attraverso una SCP di FullAccess gestita direttamente da AWS. \u00c8 necessario attaccare quella SCP a tutti gli account e alle OU e specificare quali servizi e azioni sono vietati:<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n Questo \u00e8 il modo in cui AWS Organizations \u00e8 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.<\/p>\n\n\n\n Il vantaggio di questo approccio \u00e8 che gli statement deny richiedono meno manutenzione<\/strong> perch\u00e9 non \u00e8 necessario aggiornarli quando AWS aggiunge nuovi servizi, ed \u00e8 supportato out-of-the-box. Inoltre, \u00e8 possibile limitare l’accesso a risorse specifiche o definire le condizioni per le quali le SCP sono in vigore.<\/p>\n\n\n\n Questo \u00e8 un ottimo modo per iniziare per le organizzazioni pi\u00f9 piccole che devono agire rapidamente e non hanno requisiti rigorosi per la governance e la sicurezza.<\/p>\n\n\n\n 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 \u00e8 lo stesso schema della valutazione dell’ereditariet\u00e0.<\/p>\n\n\n\n Il vantaggio di questo approccio \u00e8 che hai pi\u00f9 controllo su ci\u00f2 che \u00e8 consentito<\/strong>. Poich\u00e9 tutto viene implicitamente negato, questo modo \u00e8 pi\u00f9 facile da ridurre lo scope dei confini effettivi di un account. Poich\u00e9 i permessi Deny sono ereditati, non \u00e8 necessario specificarli ovunque.<\/p>\n\n\n\n Tuttavia, richiede pi\u00f9 manutenzione poich\u00e9 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 \u201d*\u201d<\/strong> e non possono avere una Condition.<\/p>\n\n\n\n Il valore di questo approccio si pu\u00f2 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, \u00e8 pi\u00f9 semplice aumentare i permessi e soddisfare i requisiti di sicurezza e governance consentendo allo stesso tempo flessibilit\u00e0 ed eccezioni.<\/p>\n\n\n\n Vediamo ora queste SCP in azione, ecco alcuni esempi per poter immaginare meglio come appare una SCP in un caso di utilizzo concreto<\/p>\n\n\n\n In questo caso, abbiamo creato una SCP per negare tutto tranne le modifiche che passano attraverso le pipeline. Il caso d’uso \u00e8 quello di creare un account solo per l’automazione in cui non \u00e8 consentita alcuna azione manuale, ma le modifiche vengono sempre distribuite tramite pipeline.<\/p>\n\n\n\n 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\u00f2 essere disattivato.<\/p>\n\n\n\n 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.<\/p>\n\n\n\n Dai vari esempi di SCP che abbiamo visto, come per qualsiasi strumento di governance, la loro implementazione \u00e8 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.<\/p>\n\n\n\n Ora sei sulla strada per diventare un esperto; ci vediamo la prossima volta e fammi sapere come sta andando il tuo viaggio nel cloud!<\/p>\n\n\n\n <\/p>\n\n\n\n Com’\u00e8 andato il vostro viaggio nelle Service Control Policy? Fateci sapere nei commenti!<\/em><\/p>\n\n\n\n \u00c8 il momento di ringraziare Nico e il resto del team di Noovolari Leapp<\/em>.<\/p>\n\n\n\n Per saperne di pi\u00f9 sul progetto open-source, visitate il GitHub repository<\/a> (e lasciate una star se vi piace!), oppure approfondite sul sito<\/a> o sul blog<\/a>.<\/em><\/p>\n\n\n\n A presto su Proud2beCloud<\/strong>!<\/p>\n","protected":false},"excerpt":{"rendered":" Bentornati su Proud2beCloud! Oggi vi presentiamo un’uscita speciale: direttamente dal blog di Noovolari Leapp dedicato a IAM, Nicol\u00f2 Marchesi – […]<\/p>\n","protected":false},"author":1,"featured_media":5720,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[471],"tags":[277,587,567,583,634,636],"class_list":["post-5726","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-security-identity","tag-aws-identity-and-access-management-iam","tag-aws-organizations-it","tag-landing-zone-it","tag-multi-account-strategy-it","tag-noovolari-leapp-it","tag-service-control-policies-scps-it"],"yoast_head":"\n
\n\n\n\n
\n\n\n\nPolicy<\/h2>\n\n\n\n
\n
Avvertenze<\/h2>\n\n\n\n
<\/figure><\/div>\n\n\n
Rappresentazione visiva dell’interazione tra le policy<\/strong><\/h2>\n\n\n\n
Singolo account (senza Organizzazioni)<\/strong><\/h3>\n\n\n\n
<\/figure><\/div>\n\n\n
Struttura dell’organizzazione<\/strong><\/h3>\n\n\n\n
<\/figure><\/div>\n\n\n
\n
\n
\n
\n
\n
\n
Il flusso di valutazione<\/h1>\n\n\n\n
<\/figure><\/div>\n\n\n
Con le politiche basate sulle risorse<\/strong><\/h3>\n\n\n\n
<\/figure><\/div>\n\n\n
Con le policy basate su risorse<\/strong><\/h3>\n\n\n\n
Con le Session policies<\/strong><\/h3>\n\n\n\n
\n
Nota a margine sull’accesso multi account<\/strong><\/h2>\n\n\n\n
Intersezioni di autorizzazioni<\/strong><\/h2>\n\n\n\n
<\/figure><\/div>\n\n\n
Riguardo all’ereditariet\u00e0 delle SCP<\/strong><\/h2>\n\n\n\n
\n
<\/figure><\/div>\n\n\n
Strategia di deny<\/h3>\n\n\n\n
<\/figure><\/div>\n\n\n
Strategia Allow<\/strong><\/h2>\n\n\n\n
Solo un paio di esempi<\/strong><\/h2>\n\n\n\n
Pipeline only account<\/h3>\n\n\n\n
{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"DenyAllExceptPipelines\",\n \"Effect\": \"Deny\",\n \"NotAction\": [\n \"codepipeline:*\",\n \"codebuild:*\",\n \"codecommit:*\",\n \"codedeploy:*\",\n \"codestar:*\",\n \"cloudformation:*\",\n \"iam:*\",\n \"s3:*\",\n \"logs:*\",\n \"cloudwatch:*\",\n \"cloudtrail:*\",\n \"codestar:*\",\n \"codestar-notification:*\",\n \"codeartifact:*\",\n \"kms:*\",\n \"tag:*\",\n \"access-analyzer:*\",\n \"codestar-connections:*\",\n \"ssm:GetParameter*\",\n \"sts:*\",\n \"events:*\"\n ],\n \"Resource\": \"*\",\n \"Condition\": {\n \"StringNotLike\": {\n \"aws:PrincipalArn\": [\n \"arn:aws:iam::MY-ACCOUNT-ID:role\/MY-ROLE\"\n ]\n }\n }\n }\n ]\n}<\/code><\/pre>\n\n\n\n
Backup protection<\/h3>\n\n\n\n
{\n\t\"Version\": \"2012-10-17\",\n\t\"Statement\": [\n\t\t{\n\t\t\t\"Sid\": \"DenyS3BackupDelete\",\n\t\t\t\"Action\": [\n\t\t\t\t\"s3:DeleteObject\",\n\t\t\t\t\"s3:DeleteObjectVersion\",\n\t\t\t\t\"s3:DeleteObjectTagging\",\n\t\t\t\t\"s3:DeleteBucket\"\n\t\t\t],\n\t\t\t\"Resource\": [\n\t\t\t\t\"arn:aws:s3:::MY-S3-BACKUP*\/*\"\n\t\t\t],\n\t\t\t\"Effect\": \"Deny\"\n\t\t},\n\t\t{\n\t\t\t\"Sid\": \"DenyBackupDelete\",\n\t\t\t\"Action\": [\n\t\t\t\t\"backup:DeleteBackupVault\",\n\t\t\t\t\"backup:DeleteBackupVaultAccessPolicy\",\n\t\t\t\t\"backup:PutBackupVaultAccessPolicy\"\n\t\t\t],\n\t\t\t\"Resource\": [\n\t\t\t\t\"arn:aws:backup:*:*:backup-vault:MY-BACKUP-VAULT\"\n\t\t\t],\n\t\t\t\"Effect\": \"Deny\",\n\t\t\t\"Condition\": {\n\t\t\t\t\"StringNotLike\": {\n\t\t\t\t\t\"aws:PrincipalARN\": \"arn:aws:iam::*:role\/MY-EXECUTION-ROLE\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"Sid\": \"DenyBackupTurnoffService\",\n\t\t\t\"Action\": [\n\t\t\t\t\"backup:UpdateRegionSettings\"\n\t\t\t],\n\t\t\t\"Resource\": [\n\t\t\t\t\"*\"\n\t\t\t],\n\t\t\t\"Effect\": \"Deny\",\n\t\t\t\"Condition\": {\n\t\t\t\t\"StringNotLike\": {\n\t\t\t\t\t\"aws:PrincipalARN\": [\n\t\t\t\t\t\t\"arn:aws:iam::*:role\/MY-EXECUTION-ROLE\"\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t]\n}<\/code><\/pre>\n\n\n\n
Conclusioni<\/strong><\/h2>\n\n\n\n