{"id":1354,"date":"2020-04-30T18:04:16","date_gmt":"2020-04-30T16:04:16","guid":{"rendered":"https:\/\/blog.besharp.it\/?p=1354"},"modified":"2021-03-17T15:15:25","modified_gmt":"2021-03-17T14:15:25","slug":"aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro","status":"publish","type":"post","link":"https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/","title":{"rendered":"AWS CloudFormation – AWS IAM: come delegare il deploy in modo sicuro"},"content":{"rendered":"

Giorno dopo giorno sempre pi\u00f9 aziende si affacciano con interesse al mondo del cloud computing, molte delle quali si interrogano su come effettivamente possa aiutare il proprio business e su quali problemi di sicurezza si possono introdurre. Una delle maggiori preoccupazioni dei pi\u00f9 tecnici \u00e8 come garantire il maggior grado di libert\u00e0 possibile offerto dall\u2019agilit\u00e0 che tali tecnologie mettono a disposizione senza introdurre per\u00f2 falle nella sicurezza.<\/span><\/p>\n

Tra gli argomenti pi\u00f9 caldi troviamo sicuramente il concetto di Infrastructure as Code (IaC) che di fatto permette di gestire le proprie risorse in cloud tramite sistemi di templating, aprendo quindi il vaso di Pandora di astrazione, ripetibilit\u00e0 e riproducibilit\u00e0 dell\u2019infrastruttura stessa ma fornendo anche strumenti a supporto di attivit\u00e0 di Disaster Recovery.<\/span><\/p>\n

Cos\u2019\u00e8 AWS CloudFormation?<\/span><\/h2>\n

In questo articolo andremo a porre la lente di ingrandimento sul servizio di AWS chiamato AWS CloudFormation (che per brevit\u00e0 chiameremo\u2026 CloudFormation).<\/span><\/p>\n

CloudFormation permette di creare, aggiornare e gestire le risorse presenti all\u2019interno del proprio AWS Cloud Environment tramite l\u2019utilizzo di template scritti in JSON o YAML in cui \u00e8 possibile descrivere risorsa per risorsa la propria infrastruttura.<\/span><\/p>\n

Solo da questa breve descrizione, una serie di domande \u00e8 immediata: come posso gestire chi deploya cosa? Ma soprattutto, se posso gestire tutte le risorse, posso gestire anche i permessi? Se posso gestire i permessi, come posso delegare l\u2019utilizzo di CloudFormation prevenendo fenomeni di privilege escalation?<\/span><\/p>\n

Per rispondere a queste domande occorre prima introdurre un altro servizio: AWS Identity Access Management.<\/span><\/p>\n

Cos\u2019\u00e8 AWS IAM?<\/span><\/h2>\n

AWS Identity and Access Management (IAM) \u00e8 il servizio di AWS che permette di gestire la totalit\u00e0 dei permessi all\u2019interno del proprio AWS Cloud Environment. Per farla breve, affinch\u00e8 vada a buon fine una qualsiasi azione (che sia su Console, da CLI o tramite SDK) \u00e8 necessario che sia esplicitamente scritta all\u2019interno di una policy collegata alla propria \u201cutenza\u201d (che sia un effettivo AWS IAM User piuttosto che un AWS IAM Role cambia poco in questa declinazione. Discorso differente se si parla di validit\u00e0 delle credenziali in uso, dove l\u2019utilizzo del secondo ne permette anche un\u2019automatica rotazione).<\/span><\/p>\n

Use Case<\/span><\/h2>\n

Ora che conosciamo quali sono gli strumenti a nostra disposizione, caliamoci in una situazione verosimile: abbiamo creato un template per CloudFormation che genera un\u2019infrastruttura composta da un\u2019istanza EC2 pre-configurata (attraverso un Amazon Machine Image) che deve poter accedere ad un bucket S3. Essendo una infrastruttura semplice, vogliamo rendere indipendenti gli sviluppatori in modo tale che possano deployare questo template senza disturbare il team di Security ma al contempo garantendo la totale sicurezza.<\/span><\/p>\n

\"\"<\/p>\n

I pi\u00f9 lungimiranti sapranno certamente che per deployare tale infrastruttura \u00e8 necessaria la creazione di uno IAM Role, ma dobbiamo escludere la possibilit\u00e0 che lo sviluppatore possa crearsi un ruolo con permessi da amministratore da assumere per evitare i soliti \u201cnoiosi\u201d messaggi di \u201cAccess Denied\u201d e \u201cForbidden\u201d.<\/span><\/p>\n

Senza Permission Boundaries<\/span><\/h2>\n

Il template che andremo a deployare \u00e8 il seguente:<\/span><\/p>\n

---\r\nAWSTemplateFormatVersion: '2010-09-09'\r\nDescription: |\r\n CloudFormation and IAM Permission Boundaries Demo\r\n \r\n \r\n################################################################################\r\n#                                  Metadata                                    #\r\n################################################################################\r\nMetadata:\r\n \r\n AWS::CloudFormation::Interface:\r\n   ParameterGroups:\r\n     - Label: {default: 'Required parameters'}\r\n       Parameters:\r\n         - VpcId\r\n         - AmiId\r\n         - KeyName\r\n         - SubnetId\r\n     - Label: {default: 'Optional parameters'}\r\n       Parameters:\r\n         - NameSpace\r\n         - ProjectName\r\n         - Environment\r\n \r\n \r\n################################################################################\r\n#                                Parameters                                    #\r\n################################################################################\r\nParameters:\r\n \r\n NameSpace:\r\n   Type: String\r\n   Default: 'besharp'\r\n \r\n ProjectName:\r\n   Type: String\r\n   Default: 'permission-boundaries-demo'\r\n \r\n Environment:\r\n   Type: String\r\n   Default: 'dev'\r\n  VpcId:\r\n   Type: AWS::EC2::VPC::Id\r\n \r\n SubnetId:\r\n   Type: AWS::EC2::Subnet::Id\r\n \r\n AmiId:\r\n   Type: AWS::EC2::Image::Id\r\n \r\n KeyName:\r\n   Type: AWS::EC2::KeyPair::KeyName\r\n \r\n \r\n################################################################################\r\n#                                 Conditions                                   #\r\n################################################################################\r\nConditions: {}\r\n \r\n \r\n################################################################################\r\n#                                  Mappings                                    #\r\n################################################################################\r\nMappings: {}\r\n \r\n \r\n################################################################################\r\n#                                  Resources                                   #\r\n################################################################################\r\nResources:\r\n \r\n #################################### S3 ####################################\r\n S3Bucket:\r\n   Type: AWS::S3::Bucket\r\n   Properties:\r\n     BucketName: !Sub 'com.${NameSpace}.${ProjectName}'\r\n     Tags:\r\n       - Key: Name\r\n         Value: !Sub '${NameSpace}-${ProjectName}'\r\n       - Key: Owner\r\n         Value: 'name.surname@besharp.it'\r\n \r\n ################################### EC2 ####################################\r\n EC2Instance:\r\n   Type: AWS::EC2::Instance\r\n   Properties:\r\n     IamInstanceProfile: !Ref IAMInstanceProfile\r\n     ImageId: !Ref AmiId\r\n     InstanceType: t3a.micro\r\n     KeyName: !Ref KeyName\r\n     NetworkInterfaces:\r\n       - AssociatePublicIpAddress: 'true'\r\n         DeviceIndex: '0'\r\n         GroupSet:\r\n           - !Ref EC2SecurityGroup\r\n         SubnetId: !Ref SubnetId\r\n     Tags:\r\n       - Key: Name\r\n         Value: !Sub '${NameSpace}-${ProjectName}'\r\n       - Key: Owner\r\n         Value: 'name.surname@besharp.it'\r\n \r\n EC2SecurityGroup:\r\n   Type: AWS::EC2::SecurityGroup\r\n   Properties:\r\n     GroupName: !Sub '${NameSpace}-${ProjectName}-ec2'\r\n     GroupDescription: !Sub 'Security Group for ${NameSpace}-${ProjectName}-ec2'\r\n     VpcId: !Ref VpcId\r\n     Tags:\r\n       - Key: Name\r\n         Value: !Sub '${NameSpace}-${ProjectName}-ec2'\r\n       - Key: Owner\r\n         Value: 'name.surname@besharp.it'\r\n \r\n ################################### IAM ####################################\r\n IAMInstanceProfile:\r\n   Type: AWS::IAM::InstanceProfile\r\n   Properties:\r\n     Roles:\r\n       - !Ref IAMRole\r\n     InstanceProfileName: !Sub '${NameSpace}-${ProjectName}'\r\n \r\n IAMRole:\r\n   Type: AWS::IAM::Role\r\n   Properties:\r\n     RoleName: !Sub '${NameSpace}-${ProjectName}'\r\n     AssumeRolePolicyDocument:\r\n       Version: '2012-10-17'\r\n       Statement:\r\n         - Effect: Allow\r\n           Principal:\r\n             Service: ec2.amazonaws.com\r\n           Action: sts:AssumeRole\r\n     Path: '\/'\r\n     Policies:\r\n       - PolicyName: 'EC2Access'\r\n         PolicyDocument:\r\n           Version: '2012-10-17'\r\n           Statement:\r\n             - Effect: 'Allow'\r\n               Action:\r\n                 - 's3:GetObject'\r\n               Resource: !Sub '${S3Bucket.Arn}\/*'\r\n     Tags:\r\n       - Key: Name\r\n         Value: !Sub '${NameSpace}-${ProjectName}'\r\n       - Key: Owner\r\n         Value: 'name.surname@besharp.it'\r\n \r\n \r\n################################################################################\r\n#                                   Outputs                                    #\r\n################################################################################\r\nOutputs:\r\n \r\n StackName:\r\n   Description: 'Stack name.'\r\n   Value: !Sub '${AWS::StackName}'\r\n<\/pre>\n

Al suo interno sono presenti le informazioni per creare:
\nBucket S3
\nIstanza EC2 + Security Group
\nRuolo IAM + Instance Profile<\/p>\n

Allo sviluppatore \u00e8 stata attaccata la seguente policy per poter deployare questo template:<\/p>\n

{\r\n   \"Version\": \"2012-10-17\",\r\n   \"Statement\": [\r\n       {\r\n           \"Sid\": \"CloudFormationReadAccess\",\r\n           \"Effect\": \"Allow\",\r\n           \"Action\": [\r\n               \"cloudformation:DescribeStacks\",\r\n               \"cloudformation:ListChangeSets\",\r\n               \"cloudformation:ListExports\",\r\n               \"cloudformation:ListImports\",\r\n               \"cloudformation:ListStacks\"\r\n           ],\r\n           \"Resource\": \"*\"\r\n       },\r\n       {\r\n           \"Sid\": \"CloudFormationWriteAccess\",\r\n           \"Effect\": \"Allow\",\r\n           \"Action\": [\r\n               \"cloudformation:CreateStack\",\r\n               \"cloudformation:DeleteStack\",\r\n               \"cloudformation:TagResource\",\r\n               \"cloudformation:UpdateStack\",\r\n               \"cloudformation:ValidateTemplate\"\r\n           ],\r\n           \"Resource\": \"*\"\r\n       },\r\n       {\r\n           \"Sid\": \"EC2ReadAccess\",\r\n           \"Effect\": \"Allow\",\r\n           \"Action\": [\r\n               \"ec2:DescribeImages\",\r\n               \"ec2:DescribeInstances\",\r\n               \"ec2:DescribeKeyPairs\",\r\n               \"ec2:DescribeSecurityGroupReferences\",\r\n               \"ec2:DescribeSecurityGroups\",\r\n               \"ec2:DescribeSubnets\",\r\n               \"ec2:DescribeVpcs\"\r\n           ],\r\n           \"Resource\": \"*\"\r\n       },\r\n       {\r\n           \"Sid\": \"EC2WriteAccess\",\r\n           \"Effect\": \"Allow\",\r\n           \"Action\": [\r\n               \"ec2:AssociateIamInstanceProfile\",\r\n               \"ec2:AuthorizeSecurityGroupEgress\",\r\n               \"ec2:AuthorizeSecurityGroupIngress\",\r\n               \"ec2:CreateSecurityGroup\",\r\n               \"ec2:CreateTags\",\r\n               \"ec2:DeleteSecurityGroup\",\r\n               \"ec2:DeleteTags\",\r\n               \"ec2:RevokeSecurityGroupEgress\",\r\n               \"ec2:RevokeSecurityGroupIngress\",\r\n               \"ec2:RunInstances\",\r\n               \"ec2:StartInstances\",\r\n               \"ec2:StopInstances\",\r\n               \"ec2:TerminateInstances\"\r\n           ],\r\n           \"Resource\": \"*\"\r\n       },\r\n       {\r\n           \"Sid\": \"IAMReadAccess\",\r\n           \"Effect\": \"Allow\",\r\n           \"Action\": [\r\n               \"iam:GetInstanceProfile\",\r\n               \"iam:GetRole\",\r\n               \"iam:GetRolePolicy\"\r\n           ],\r\n           \"Resource\": \"*\"\r\n       },\r\n       {\r\n           \"Sid\": \"IAMWriteAccess\",\r\n           \"Effect\": \"Allow\",\r\n           \"Action\": [\r\n               \"iam:AddRoleToInstanceProfile\",\r\n               \"iam:CreateInstanceProfile\",\r\n               \"iam:CreateRole\",\r\n               \"iam:DeleteInstanceProfile\",\r\n               \"iam:DeleteRole\",\r\n               \"iam:DeleteRolePolicy\",\r\n               \"iam:PassRole\",\r\n               \"iam:PutRolePolicy\",\r\n               \"iam:RemoveRoleFromInstanceProfile\",\r\n               \"iam:TagRole\",\r\n               \"iam:UntagRole\"\r\n           ],\r\n           \"Resource\": \"*\"\r\n       },\r\n       {\r\n           \"Sid\": \"S3WriteAccess\",\r\n           \"Effect\": \"Allow\",\r\n           \"Action\": [\r\n               \"s3:CreateBucket\",\r\n               \"s3:DeleteBucket\",\r\n               \"s3:PutBucketTagging\"\r\n           ],\r\n           \"Resource\": \"*\"\r\n       }\r\n   ]\r\n}\r\n<\/pre>\n

Connettendoci all\u2019istanza EC2 creata, possiamo verificare che effettivamente possa scaricare oggetti dal bucket S3 appena creato:<\/p>\n

ubuntu@ec2-demo:~$ aws s3 cp s3:\/\/com.besharp.permission-boundaries-demo\/if-you-download-me-you-are-fine .\r\n \r\ndownload: s3:\/\/com.besharp.permission-boundaries-demo\/if-you-download-me-you-are-fine to .\/if-you-download-me-you-are-fine\r\nubuntu@ec2-demo:~$ cat if-you-download-me-you-are-fine\r\ntest-ok\r\n<\/pre>\n

E che non possa, ad esempio, creare altri bucket:<\/p>\n

ubuntu@ec2-demo:~$ aws s3api create-bucket --bucket can-i-create-it\r\n \r\nAn error occurred (AccessDenied) when calling the CreateBucket operation: Access Denied\r\n<\/pre>\n

A questo punto, lo sviluppatore potrebbe (a prescindere dalla buona o cattiva fede) voler modificare i permessi del ruolo associato alla macchina per poter effettuare operazioni che di norma non \u00e8 autorizzato ad eseguire (o addirittura crearsi un ruolo di amministrazione da assumere). La risorsa relativa allo IAM Role pu\u00f2 essere modificata cos\u00ec:<\/p>\n

 \r\n IAMRole:\r\n   Type: AWS::IAM::Role\r\n   Properties:\r\n     RoleName: !Sub '${NameSpace}-${ProjectName}'\r\n     AssumeRolePolicyDocument:\r\n       Version: '2012-10-17'\r\n       Statement:\r\n         - Effect: Allow\r\n           Principal:\r\n             Service: ec2.amazonaws.com\r\n           Action: sts:AssumeRole\r\n     Path: '\/'\r\n     Policies:\r\n       - PolicyName: 'AdministratorAccess'\r\n         PolicyDocument:\r\n           Version: '2012-10-17'\r\n           Statement:\r\n             - Effect: 'Allow'\r\n               Action:\r\n                 - '*'\r\n               Resource: '*'\r\n     Tags:\r\n       - Key: Name\r\n         Value: !Sub '${NameSpace}-${ProjectName}'\r\n<\/pre>\n

In tal modo, ad esempio, l\u2019istanza pu\u00f2 scaricare oggetti dal bucket, ma anche crearne di altri (senza contare che, con la policy modificata rozzamente come da esempio, di fatto, ha permessi di amministratore all\u2019interno dell\u2019account):<\/p>\n

ubuntu@ec2-demo:~$ aws s3 cp s3:\/\/com.besharp.permission-boundaries-demo\/if-you-download-me-you-are-fine .\r\n \r\ndownload: s3:\/\/com.besharp.permission-boundaries-demo\/if-you-download-me-you-are-fine to .\/if-you-download-me-you-are-fine\r\nubuntu@ec2-demo:~$ cat if-you-download-me-you-are-fine\r\ntest-ok\r\nubuntu@ec2-demo:~$ aws s3api create-bucket --bucket can-i-create-it\r\n{\r\n   \"Location\": \"\/can-i-create-it\"\r\n}\r\n<\/pre>\n

Chiaramente la preoccupazione principale non \u00e8 data solamente dal fatto che lo sviluppatore possa acquisire permessi non previsti, ma anche dall\u2019effettivo aumento della superficie attaccabile da malintenzionati. Non \u00e8 nuovo infatti il concetto di privilege escalation, nel quale una persona anche esterna all\u2019azienda va a sfruttare dei permessi inutilmente ampi per predisporre il terreno fertile ad un attacco organizzato.<\/p>\n

Con Permission Boundaries<\/h2>\n

I permission boundaries non sono altro che delle policy IAM da attaccare un’entit\u00e0 IAM per circoscriverne i permessi. Infatti, i permessi effettivi saranno l\u2019intersezione di quelli garantiti dalle normali IAM policy con quelli garantiti dalla policy di permission boundary. Di per s\u00e9 non vanno a risolvere particolari problemi, ma di fatto \u00e8 possibile obbligare lo sviluppatore a dover agganciare il permission boundary specificato qualora voglia creare un ruolo.<\/p>\n

La parte relativa a IAM della policy dello sviluppatore diventa quindi:<\/p>\n

{\r\n           \"Sid\": \"IAMPermissionBoundaryWriteAccess\",\r\n           \"Effect\": \"Allow\",\r\n           \"Action\": [\r\n               \"iam:CreateRole\",\r\n               \"iam:PutRolePolicy\",\r\n               \"iam:UpdateRole\",\r\n               \"iam:UpdateRoleDescription\"\r\n           ],\r\n           \"Resource\": \"arn:aws:iam::111122223333:role\/dev-namespace\/*\",\r\n           \"Condition\": {\r\n               \"StringEquals\": {\r\n                   \"iam:PermissionsBoundary\": \"arn:aws:iam::111122223333:policy\/besharp-permission-boundary-demo\"\r\n               }\r\n           }\r\n       },\r\n       {\r\n           \"Sid\": \"IAMPassRoleAccess\",\r\n           \"Effect\": \"Allow\",\r\n           \"Action\": [\r\n               \"iam:PassRole\"\r\n           ],\r\n           \"Resource\": \"arn:aws:iam::111122223333:role\/dev-namespace\/*\"\r\n       },\r\n       {\r\n           \"Sid\": \"IAMWriteAccess\",\r\n           \"Effect\": \"Allow\",\r\n           \"Action\": [\r\n               \"iam:AddRoleToInstanceProfile\",\r\n               \"iam:CreateInstanceProfile\",\r\n               \"iam:DeleteInstanceProfile\",\r\n               \"iam:DeleteRole\",\r\n               \"iam:DeleteRolePolicy\",\r\n               \"iam:RemoveRoleFromInstanceProfile\",\r\n               \"iam:TagRole\",\r\n               \"iam:UntagRole\"\r\n           ],\r\n           \"Resource\": \"*\"\r\n       },\r\n<\/pre>\n

Se al momento della creazione del ruolo da parte di CloudFormation non \u00e8 presente il permission boundary, la creazione fallir\u00e0.
\n\"\"
\nPer agganciare il permission boundary allo IAM role dell\u2019istanza, la risorsa va modificata come segue:<\/p>\n

IAMRole:\r\n   Type: AWS::IAM::Role\r\n   Properties:\r\n     RoleName: !Sub '${NameSpace}-${ProjectName}'\r\n     PermissionsBoundary: !Ref PermissionBoundaryArn\r\n     AssumeRolePolicyDocument:\r\n       Version: '2012-10-17'\r\n       Statement:\r\n         - Effect: Allow\r\n           Principal:\r\n             Service: ec2.amazonaws.com\r\n           Action: sts:AssumeRole\r\n     Path: '\/dev-namespace\/'\r\n     Policies:\r\n       - PolicyName: 'AdministratorAccess'\r\n         PolicyDocument:\r\n           Version: '2012-10-17'\r\n           Statement:\r\n             Effect: 'Allow'\r\n             Action:\r\n                - '*'\r\n             Resource: '*'\r\n     Tags:\r\n       - Key: Name\r\n         Value: !Sub '${NameSpace}-${ProjectName}'\r\n       - Key: Owner\r\n         Value: 'name.surname@besharp.it'\r\n<\/pre>\n

Nota: per rendere il tutto pi\u00f9 sicuro e limitare l\u2019azione particolarmente sensibile di iam:PassRole \u00e8 stato aggiunto anche il concetto di Path, che essenzialmente va ad identificare un namespace per gli sviluppatori all\u2019interno di IAM<\/p>\n

Agganciando il permission boundary, la creazione avr\u00e0 successo e i permessi dell\u2019istanza (e di qualunque altro ruolo lo sviluppatore voglia creare) saranno limitati.<\/p>\n

ubuntu@ec2-demo:~$ aws s3 cp s3:\/\/com.besharp.permission-boundaries-demo\/if-you-download-me-you-are-fine .\r\n \r\ndownload: s3:\/\/com.besharp.permission-boundaries-demo\/if-you-download-me-you-are-fine to .\/if-you-download-me-you-are-fine\r\nubuntu@ec2-demo:~$ cat if-you-download-me-you-are-fine\r\ntest-ok\r\nubuntu@ec2-demo:~$ aws s3api create-bucket --bucket can-i-create-it\r\n \r\nAn error occurred (AccessDenied) when calling the CreateBucket operation: Access Denied\r\n<\/pre>\n

Nella configurazione presentata \u00e8 chiaro come il permission boundary diventi la risorsa sotto controllo del team di sicurezza, il quale pu\u00f2 concordare l\u2019insieme massimo di permessi attribuibili ad una determinata risorsa. Una volta individuati tali permessi, AWS IAM garantir\u00e0 che l\u2019entit\u00e0 IAM associata ad una risorsa non possa effettuare azioni non previste.<\/p>\n

Conclusioni<\/h2>\n

Abbiamo visto come, grazie ad una semplice modifica dei permessi dello sviluppatore, si possa limitare forzatamente i permessi attribuibili ad una entit\u00e0 IAM. Tale approccio spesso identifica lo sviluppatore come delegated admin<\/strong>. In tal modo \u00e8 possibile aumentare l\u2019indipendenza degli sviluppatori, riducendo il numero di task giornalieri che le poche persone con ampi permessi all\u2019interno dell\u2019AWS Cloud Environment devono evadere senza andare per\u00f2 a introdurre compromessi sulla sicurezza.<\/p>\n

Soddisfatti? \ud83d\ude42 se avete curiosit\u00e0 o desiderate fare due chiacchiere in merito a questo o a soluzioni simili, non esitate a scriverci nei commenti o a contattarci<\/a>!<\/p>\n","protected":false},"excerpt":{"rendered":"

Giorno dopo giorno sempre pi\u00f9 aziende si affacciano con interesse al mondo del cloud computing, molte delle quali si interrogano […]<\/p>\n","protected":false},"author":12,"featured_media":1356,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[241],"tags":[356,275,277,279,253],"yoast_head":"\nAWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro - Proud2beCloud Blog<\/title>\n<meta name=\"description\" content=\"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro\" \/>\n<meta property=\"og:description\" content=\"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/\" \/>\n<meta property=\"og:site_name\" content=\"Proud2beCloud Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-04-30T16:04:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-03-17T14:15:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.besharp.it\/wp-content\/uploads\/2020\/05\/copertine-blog_cloudformation_IAM-35.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1668\" \/>\n\t<meta property=\"og:image:height\" content=\"1250\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Andrea Franzoso\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro\" \/>\n<meta name=\"twitter:description\" content=\"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/blog.besharp.it\/wp-content\/uploads\/2020\/05\/copertine-blog_cloudformation_IAM-35.png\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andrea Franzoso\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/\",\"url\":\"https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/\",\"name\":\"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro - Proud2beCloud Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.besharp.it\/it\/#website\"},\"datePublished\":\"2020-04-30T16:04:16+00:00\",\"dateModified\":\"2021-03-17T14:15:25+00:00\",\"author\":{\"@id\":\"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/9647d047f231a6f8283d954006664316\"},\"description\":\"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro.\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.besharp.it\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AWS CloudFormation – AWS IAM: come delegare il deploy in modo sicuro\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.besharp.it\/it\/#website\",\"url\":\"https:\/\/blog.besharp.it\/it\/\",\"name\":\"Proud2beCloud Blog\",\"description\":\"il blog di beSharp\",\"alternateName\":\"Proud2beCloud Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.besharp.it\/it\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/9647d047f231a6f8283d954006664316\",\"name\":\"Andrea Franzoso\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/02cc70e60399821d51728f60ce0cf539?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/02cc70e60399821d51728f60ce0cf539?s=96&d=mm&r=g\",\"caption\":\"Andrea Franzoso\"},\"description\":\"DevOps Engineer e Solution Architect di beSharp, mi occupo del design, dell'implementazione e della gestione a lungo termine di infrastrutture in Cloud. Appassionato di gaming, motori e problem solving di qualsiasi genere!\",\"url\":\"https:\/\/blog.besharp.it\/it\/author\/andrea-franzoso\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro - Proud2beCloud Blog","description":"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/","og_locale":"it_IT","og_type":"article","og_title":"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro","og_description":"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro","og_url":"https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/","og_site_name":"Proud2beCloud Blog","article_published_time":"2020-04-30T16:04:16+00:00","article_modified_time":"2021-03-17T14:15:25+00:00","og_image":[{"width":1668,"height":1250,"url":"https:\/\/blog.besharp.it\/wp-content\/uploads\/2020\/05\/copertine-blog_cloudformation_IAM-35.png","type":"image\/png"}],"author":"Andrea Franzoso","twitter_card":"summary_large_image","twitter_title":"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro","twitter_description":"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro","twitter_image":"https:\/\/blog.besharp.it\/wp-content\/uploads\/2020\/05\/copertine-blog_cloudformation_IAM-35.png","twitter_misc":{"Scritto da":"Andrea Franzoso","Tempo di lettura stimato":"9 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/","url":"https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/","name":"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro - Proud2beCloud Blog","isPartOf":{"@id":"https:\/\/blog.besharp.it\/it\/#website"},"datePublished":"2020-04-30T16:04:16+00:00","dateModified":"2021-03-17T14:15:25+00:00","author":{"@id":"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/9647d047f231a6f8283d954006664316"},"description":"AWS CloudFormation - AWS IAM: come delegare il deploy in modo sicuro.","breadcrumb":{"@id":"https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.besharp.it\/it\/aws-cloudformation-aws-iam-come-delegare-il-deploy-in-modo-sicuro\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.besharp.it\/it\/"},{"@type":"ListItem","position":2,"name":"AWS CloudFormation – AWS IAM: come delegare il deploy in modo sicuro"}]},{"@type":"WebSite","@id":"https:\/\/blog.besharp.it\/it\/#website","url":"https:\/\/blog.besharp.it\/it\/","name":"Proud2beCloud Blog","description":"il blog di beSharp","alternateName":"Proud2beCloud Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.besharp.it\/it\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/9647d047f231a6f8283d954006664316","name":"Andrea Franzoso","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/02cc70e60399821d51728f60ce0cf539?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/02cc70e60399821d51728f60ce0cf539?s=96&d=mm&r=g","caption":"Andrea Franzoso"},"description":"DevOps Engineer e Solution Architect di beSharp, mi occupo del design, dell'implementazione e della gestione a lungo termine di infrastrutture in Cloud. Appassionato di gaming, motori e problem solving di qualsiasi genere!","url":"https:\/\/blog.besharp.it\/it\/author\/andrea-franzoso\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/posts\/1354"}],"collection":[{"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/comments?post=1354"}],"version-history":[{"count":0,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/posts\/1354\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/media\/1356"}],"wp:attachment":[{"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/media?parent=1354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/categories?post=1354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/tags?post=1354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}