Impedire gli aggiornamenti delle risorse stack
Quando si crea uno stack, sono consentite tutte le operazioni di aggiornamento su tutte le risorse. Per impostazione predefinita, chiunque abbia le autorizzazioni per aggiornare lo stack può aggiornare tutte le risorse nello stack. Durante un aggiornamento, alcune risorse potrebbero richiedere un’interruzione o essere completamente sostituite, generando nuovi ID fisici o uno storage completamente nuovo. È possibile impedire che le risorse stack vengano involontariamente aggiornate o eliminate durante un aggiornamento dello stack utilizzando le policy stack. Una policy stack è un documento JSON che definisce le azioni di aggiornamento che possono essere eseguite su risorse definite.
Dopo aver impostato una policy stack, tutte le risorse nello stack vengono protette per impostazione predefinita. Per permettere gli aggiornamenti di risorse specifiche, è necessario specificare una dichiarazione Allow esplicita per tali risorse nella policy stack. È possibile definire una sola policy stack per stack, ma è possibile proteggere più risorse all’interno di una singola policy. Una policy stack si applica a tutti gli utenti CloudFormation che tentano di aggiornare lo stack. Non è possibile associare policy stack diverse a utenti diversi.
Una policy stack si applica solo durante gli aggiornamenti dello stack. Non fornisce i controlli di accesso, come per esempio una policy AWS Identity and Access Management (IAM). Utilizzare una policy stack solo come meccanismo a prova di errore per evitare gli aggiornamenti accidentali di specifiche risorse stack. Per controllare l’accesso alle risorse o alle operazioni AWS, utilizza IAM.
Argomenti
Esempio di policy stack
L’esempio di stack policy seguente impedisce gli aggiornamenti della risorsa ProductionDatabase:
{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" }, { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "LogicalResourceId/ProductionDatabase" } ] }
Quando si imposta una policy stack, tutte le risorse vengono protette per impostazione predefinita. Per permettere gli aggiornamenti di tutte le risorse, aggiungiamo una dichiarazione Allow che permette tutte le azioni su tutte le risorse. Anche se la dichiarazione Allow specifica tutte le risorse, la dichiarazione esplicita Deny la sostituisce per la risorsa con l’ID logico ProductionDatabase. Questa dichiarazione Deny impedisce tutte le azioni di aggiornamento, come per esempio la sostituzione o l’eliminazione, sulla risorsa ProductionDatabase.
L’elemento Principal è necessario, ma supporta solo il carattere jolly (*), il che significa che la dichiarazione si applica a tutti i principali.
Nota
Durante un aggiornamento stack, CloudFormation aggiorna automaticamente le risorse che dipendono da altre risorse aggiornate. Ad esempio, CloudFormation aggiorna una risorsa che fa riferimento a una risorsa aggiornata. CloudFormation non apporta modifiche fisiche, come per esempio l’ID delle risorse, alle risorse aggiornate automaticamente, ma se una policy stack è associata a tali risorse, devi avere l’autorizzazione per aggiornarle.
Definizione di una policy stack
Quando si crea uno stack, non è impostata nessuna policy stack, quindi sono consentite tutte le operazioni di aggiornamento su tutte le risorse. Per proteggere le risorse stack dalle operazioni di aggiornamento, definire una policy stack e quindi impostarla sullo stack. Una policy stack è un documento JSON che definisce le operazioni di aggiornamento stack CloudFormation che gli utenti CloudFormation possono eseguire e le risorse a cui si applicano le operazioni. Si imposta la policy stack al momento della creazione di uno stack, specificando un file di testo che contiene la policy stack o digitandola. Quando si imposta una policy stack sullo stack, qualsiasi aggiornamento non esplicitamente consentito viene negato per impostazione predefinita.
Una policy stack si definisce in cinque elementi: Effect, Action, Principal, Resource e Condition. Il seguente pseudo codice mostra la sintassi di policy stack.
{ "Statement" : [ { "Effect" : "Deny_or_Allow", "Action" : "update_actions", "Principal" : "*", "Resource" : "LogicalResourceId/resource_logical_ID", "Condition" : { "StringEquals_or_StringLike" : { "ResourceType" : [resource_type, ...] } } } ] }
Effect-
Determina se le azioni specificate vengono negate o consentite sulla/e risorsa/e specificata/e. È possibile specificare solo
DenyoAllow, come per esempio:"Effect" : "Deny"Importante
Se una policy stack include istruzioni sovrapposte (sia consentendo sia negando gli aggiornamenti di una risorsa), una dichiarazione
Denysostituisce sempre una dichiarazioneAllow. Per garantire che una risorsa venga protetta, utilizzare una dichiarazioneDenyper tale risorsa. - Azione
-
Specifica le operazioni di aggiornamento che sono negate o consentite:
- Update:Modify
-
Specifica le operazioni di aggiornamento durante le quali le risorse potrebbero non avere interruzioni o avere alcune interruzioni durante l’applicazione delle modifiche. Tutte le risorse mantengono i loro ID fisici.
- Update:Replace
-
Specifica le operazioni di aggiornamento durante le quali le risorse vengono ricreate. CloudFormation crea una nuova risorsa con gli aggiornamenti specificati poi elimina la risorsa precedente. Poiché la risorsa viene ricreata, l’ID fisico della nuova risorsa potrebbe essere diverso.
- Update:Delete
-
Specifica le operazioni di aggiornamento durante le quali le risorse vengono rimosse. Gli aggiornamenti che rimuovono completamente le risorse da un modello stack richiedono questa operazione.
- Aggiorna:*
-
Specifica tutte le operazioni di aggiornamento. L’asterisco è una carta jolly che rappresenta tutte le operazioni di aggiornamento.
L’esempio seguente mostra come specificare solo le operazioni di sostituzione ed eliminazione:
"Action" : ["Update:Replace", "Update:Delete"]Per permettere tutte le operazioni di aggiornamento tranne una, utilizzare
NotAction. Per esempio, per permettere tutte le operazioni di aggiornamento tranneUpdate:Delete, utilizzareNotAction, come illustrato in questo esempio:{ "Statement" : [ { "Effect" : "Allow", "NotAction" : "Update:Delete", "Principal": "*", "Resource" : "*" } ] } - Principale
-
L’elemento
Principalspecifica l’entità a cui si applica la policy. Tale elemento è necessario ma supporta solo il carattere jolly (*), il che significa che la policy si applica a tutti i principali. - Risorsa
-
Specifica gli ID logici delle risorse a cui si applica la policy. Per specificare i tipi di risorse, utilizza l’elemento
Condition.Per specificare una singola risorsa, utilizzare il suo ID logico. Ad esempio:
"Resource" : ["LogicalResourceId/myEC2instance"]È possibile utilizzare un carattere jolly con gli ID logici. Per esempio, se si utilizza un prefisso comune di ID logico per tutte le risorse correlate, è possibile specificarle tutte con un carattere jolly:
"Resource" : ["LogicalResourceId/CriticalResource*"]È inoltre possibile utilizzare un elemento
Notcon le risorse. Per esempio, per permettere gli aggiornamenti di tutte le risorse tranne una, utilizzare un elementoNotResourceper proteggere tale risorsa:{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "NotResource" : "LogicalResourceId/ProductionDatabase" } ] }Quando si imposta una policy stack, qualsiasi aggiornamento non esplicitamente consentito viene negato. Consentendo gli aggiornamenti di tutte le risorse ad eccezione della risorsa
ProductionDatabase, si rifiutano gli aggiornamenti alla risorsaProductionDatabase. - Condizioni
-
Specifica il tipo di risorsa a cui si applica la policy. Per specificare gli ID logici di risorse specifiche, utilizzare l’elemento
Resource.È possibile specificare un tipo di risorsa, come per esempio tutte le istanze database EC2 e RDS, come mostrato nell’esempio seguente:
{ "Statement" : [ { "Effect" : "Deny", "Principal" : "*", "Action" : "Update:*", "Resource" : "*", "Condition" : { "StringEquals" : { "ResourceType" : ["AWS::EC2::Instance", "AWS::RDS::DBInstance"] } } }, { "Effect" : "Allow", "Principal" : "*", "Action" : "Update:*", "Resource" : "*" } ] }La dichiarazione
Allowconcede le autorizzazioni di aggiornamento a tutte le risorse e la dichiarazioneDenynega gli aggiornamenti di EC2 e delle istanze database RDS. La dichiarazioneDenysostituisce sempre le operazioni di permesso.È possibile utilizzare un carattere jolly con i tipi di risorse. Per esempio, è possibile rifiutare le autorizzazioni di aggiornamento a tutte le risorse Amazon EC2, come per esempio istanze, gruppi di sicurezza e sottoreti, utilizzando un carattere jolly, come mostrato nell’esempio seguente:
"Condition" : { "StringLike" : { "ResourceType" : ["AWS::EC2::*"] } }Bisogna utilizzare la condizione
StringLikequando si utilizzano i caratteri jolly.
Impostazione di una policy stack
È possibile utilizzare la console o la AWS CLI per applicare una policy stack quando si crea uno stack. È possibile anche utilizzare la AWS CLI per applicare una policy stack a uno stack esistente. Dopo l’applicazione di una policy stack, non è possibile rimuoverla dallo stack, ma è possibile utilizzare la AWS CLI per modificarla.
Le policy stack si applicano a tutti gli utenti CloudFormation che tentano di aggiornare lo stack. Non è possibile associare policy stack diverse a utenti diversi.
Per informazioni sulla scrittura delle policy stack, consulta Definizione di una policy stack.
Per impostare una policy stack quando si crea uno stack (console)
Apri la console di CloudFormation all’indirizzo https://console.aws.amazon.com/cloudformation
. -
Sulla barra di navigazione nella parte superiore della schermata, seleziona la Regione AWS in cui creare lo stack.
-
Nella pagina Stack CloudFormation, scegliere Crea stack.
-
Nella procedura guidata Crea stack, nella pagina Configura opzioni stack, espandere la sezione Avanzate, quindi scegliere Policy stack.
-
Specificare la policy dello stack:
-
Per scrivere una policy direttamente nella console, scegliere Inserisci policy stack e quindi la policy di stack direttamente nel campo di testo.
-
Per usare una policy definita in un file separato, scegliere Carica un file, quindi Scegli file per selezionare il file contenente la policy di stack.
-
Per impostare una policy stack quando creai uno stack (AWS CLI)
-
Utilizza il comando create-stack con l’opzione
--stack-policy-bodyper digitare in una policy modificata o l’opzione--stack-policy-urlper specificare un file contenente la policy.
Per impostare una policy stack su uno stack esistente (solo AWS CLI)
-
Utilizza il comando set-stack-policy con l’opzione
--stack-policy-bodyper digitare in una policy modificata o l’opzione--stack-policy-urlper specificare un file contenente la policy.Nota
Per aggiungere una policy a uno stack esistente, è necessario disporre dell’autorizzazione all’operazione CloudFormation SetStackPolicy.
Aggiornamento delle risorse protette
Per aggiornare le risorse protette, creare una policy temporanea che sovrascriva la policy stack e permetta gli aggiornamenti di tali risorse. Specificare la policy di sostituzione quando si aggiorna lo stack. La policy di sostituzione non modifica in modo permanente la policy stack.
Per aggiornare le risorse protette, bisogna avere l’autorizzazione a utilizzare l’operazione CloudFormation SetStackPolicy. Per informazioni sull’impostazione delle autorizzazioni CloudFormation, consulta Controlla l’accesso a CloudFormation con AWS Identity and Access Management.
Nota
Durante un aggiornamento stack, CloudFormation aggiorna automaticamente le risorse che dipendono da altre risorse aggiornate. Ad esempio, CloudFormation aggiorna una risorsa che fa riferimento a una risorsa aggiornata. CloudFormation non apporta modifiche fisiche, come per esempio l’ID delle risorse, alle risorse aggiornate automaticamente, ma se una policy stack è associata a tali risorse, è obbligatorio avere l’autorizzazione per aggiornarle.
Per aggiornare una risorsa protetta (console)
Aprire la console di CloudFormation all’indirizzo https://console.aws.amazon.com/cloudformation
. -
Selezionare lo stack che si desidera aggiornare, selezionare Operazioni stack, poi Aggiorna stack.
-
Se non è stato modificato il modello di stack, selezionare Utilizza modello corrente, quindi fare clic su Avanti. Se è stato modificato il modello, selezionare Sostituisci modello corrente e specificare la posizione del modello aggiornato nella sezione Specificare modello:
-
Per un modello memorizzato localmente nel computer, selezionare Carica un file modello. Scegliere Scegli file per accedere al file e selezionarlo e fare clic su Avanti.
-
Per un modello archiviato in un bucket Amazon S3, selezionare URL Amazon S3. Inserire o incollare l’URL per il modello e fare clic su Successivo.
Se disponi di un modello in un bucket con controllo delle versioni abilitato, puoi indicare una versione specifica di modello allegando
?versionId=all’URL. Per ulteriori informazioni, consulta Working with objects in a versioning-enabled bucket nella Guida per l’utente di Amazon Simple Storage Service.version-id
-
-
Se il modello contiene parametri, nella pagina Specifica dettagli stack immettere o modificare i valori di parametro, quindi selezionare Avanti.
CloudFormation popola ciascun parametro con il valore attualmente impostato nello stack, tranne i parametri dichiarati con l’attributo
NoEcho. È possibile utilizzare i valori correnti per questi parametri scegliendo Utilizza valore esistente.Per ulteriori informazioni sull’utilizzo di
NoEchoper mascherare le informazioni sensibili e sull’utilizzo dei parametri dinamici per gestire i segreti, consulta la best practice Non incorporare le credenziali nei modelli. -
Specificare una policy di stack di sostituzione.
-
Nella pagina Configura opzioni stack, nella sezione Opzioni avanzate, selezionare Policy stack.
-
Selezionare Carica un file.
-
Fare clic su Scegli file e passare al file che contiene le policy di stack di sostituzione o digitare una policy.
-
Scegli Successivo.
Le policy di sostituzione devono specificare una dichiarazione
Allowper le risorse protette che si desidera aggiornare. Per esempio, per aggiornare tutte le risorse protette, specificare una policy di sostituzione temporanea che permetta tutti gli aggiornamenti:{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }Nota
CloudFormation applica la policy di sostituzione soltanto durante tale aggiornamento. La policy di sostituzione non modifica in modo permanente la policy stack. Per modificare una policy stack, consulta Modifica di una policy stack .
-
-
Esaminare le informazioni stack e le modifiche inviate.
Verificare di aver inviato le informazioni corrette, come i valori dei parametri o l’URL del modello corretti. Se il modello contiene risorse IAM, scegliere Acconsento che questo modello possa creare risorse IAM per specificare che si desidera utilizzare risorse IAM nel modello. Per ulteriori informazioni, consulta Accettazione delle risorse IAM nei modelli CloudFormation.
Nella sezione Visualizza un’anteprima delle modifiche, verificare che CloudFormation apporti tutte le modifiche attese. Ad esempio, controlla che CloudFormation aggiunga, elimini e modifichi le risorse che intendevi aggiungere, eliminare o modificare. CloudFormation genera questa anteprima mediante la creazione di un set di modifiche per lo stack. Per ulteriori informazioni, consulta Aggiornare gli stack CloudFormation utilizzando i set di modifiche.
-
Se le modifiche sono quelle desiderate, fare clic su Aggiorna.
Nota
A questo punto, è possibile visualizzare il set di modifiche per rivedere gli aggiornamenti proposti più accuratamente. Per eseguire questa operazione, fai clic su Visualizza set di modifiche anziché Aggiorna. CloudFormation visualizza il set di modifiche generato in base agli aggiornamenti. Quando si è pronti per eseguire l’aggiornamento dello stack, fare clic su Esegui.
CloudFormation visualizza la pagina Dettagli stack per lo stack. Ora lo stack è nello stato
UPDATE_IN_PROGRESS. Al termine dell’aggiornamento dello stack, CloudFormation imposta lo stato dello stack suUPDATE_COMPLETE.Se l’aggiornamento dello stack non va a buon fine, CloudFormation esegue automaticamente il rollback delle modifiche e imposta lo stato dello stack su
UPDATE_ROLLBACK_COMPLETE.
Per aggiornare una risorsa protetta (AWS CLI)
-
Utilizza il comando update-stack con l’opzione
--stack-policy-during-update-bodyper digitare in una policy modificata o l’opzione--stack-policy-during-update-urlper specificare un file contenente la policy.Nota
CloudFormation applica la policy di sostituzione soltanto durante tale aggiornamento. La policy di sostituzione non modifica in modo permanente la policy stack. Per modificare una policy stack, consulta Modifica di una policy stack .
Modifica di una policy stack
Per proteggere le risorse aggiuntive o per rimuovere la protezione dalle risorse, modificare la policy stack. Per esempio, quando si aggiunge un database che si desidera proteggere allo stack, aggiungere una dichiarazione Deny per quel database alla policy stack. Per modificare la policy, bisogna avere l’autorizzazione a utilizzare l’operazione SetStackPolicy.
Utilizzare la AWS CLI per modificare le policy stack.
Per modificare una policy stack (AWS CLI)
-
Utilizza il comando set-stack-policy con l’opzione
--stack-policy-bodyper digitare in una policy modificata o l’opzione--stack-policy-urlper specificare un file contenente la policy.
Non è possibile eliminare una policy stack. Per rimuovere tutta la protezione da tutte le risorse, si modifica la policy per permettere esplicitamente tutte le operazioni su tutte le risorse. La policy seguente permette tutti gli aggiornamenti su tutte le risorse:
{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }
Ulteriori esempi di policy stack
Le policy di esempio seguenti mostrano come impedire gli aggiornamenti di tutte le risorse stack e di risorse specifiche e come impedire tipologie specifiche di aggiornamenti.
Impedire gli aggiornamenti di tutte le risorse stack
Per impedire gli aggiornamenti di tutte le risorse stack, la policy seguente specifica una dichiarazione Deny per tutte le operazioni di aggiornamento su tutte le risorse.
{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }
Impedire gli aggiornamenti di una singola risorsa
La policy seguente nega tutte le operazioni di aggiornamento sul database con l’ID logico MyDatabase. Essa consente tutte le operazioni di aggiornamento su tutte le altre risorse stack con una dichiarazione Allow. La dichiarazione Allow non si applica alla risorsa MyDatabase perché la dichiarazione Deny sostituisce sempre le operazioni di permesso.
{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "LogicalResourceId/MyDatabase" }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }
È possibile ottenere lo stesso risultato dell’esempio precedente utilizzando un rifiuto per default. Quando si imposta una policy stack, CloudFormation nega qualsiasi aggiornamento che non è esplicitamente consentito. La policy seguente consente gli aggiornamenti di tutte le risorse ad eccezione della risorsa ProductionDatabase, che viene rifiutata per default.
{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "NotResource" : "LogicalResourceId/ProductionDatabase" } ] }
Importante
Vi è rischio nell’utilizzo di un rifiuto per default. Se si dispone di una dichiarazione Allow altrove nella policy (come per esempio una dichiarazione Allow che utilizza un carattere jolly), è possibile concedere inconsapevolmente l’autorizzazione all’aggiornamento di risorse per le quali non lo si voleva. Poiché un rifiuto esplicito sostituisce qualsiasi operazione di permesso, è possibile fare in modo che una risorsa venga protetta utilizzando una dichiarazione Deny.
Impedire gli aggiornamenti di tutte le istanze di un tipo di risorsa
La policy seguente rifiuta tutte le operazioni di aggiornamento nel tipo di risorsa RDS dell’istanza database. Essa consente tutte le operazioni di aggiornamento su tutte le altre risorse stack con una dichiarazione Allow. La dichiarazione Allow non si applica alle risorse RDS dell’istanza database poiché una dichiarazione Deny sostituisce sempre le operazioni di permesso.
{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "*", "Condition" : { "StringEquals" : { "ResourceType" : ["AWS::RDS::DBInstance"] } } }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }
Impedire gli aggiornamenti di sostituzione per un’istanza
La policy seguente rifiuta gli aggiornamenti che causerebbero una sostituzione dell’istanza con l’ID logico MyInstance. Essa consente tutte le operazioni di aggiornamento su tutte le altre risorse stack con una dichiarazione Allow. La dichiarazione Allow non si applica alla risorsa MyInstance perché la dichiarazione Deny sostituisce sempre le operazioni di permesso.
{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:Replace", "Principal": "*", "Resource" : "LogicalResourceId/MyInstance" }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }
Impedire gli aggiornamenti degli stack nidificati
La policy seguente rifiuta tutte le operazioni di aggiornamento nel tipo di risorsa stack CloudFormation (stack nidificati). Essa consente tutte le operazioni di aggiornamento su tutte le altre risorse stack con una dichiarazione Allow. La dichiarazione Allow non si applica alle risorse stack CloudFormation poiché la dichiarazione Deny sostituisce sempre le operazioni di permesso.
{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "*", "Condition" : { "StringEquals" : { "ResourceType" : ["AWS::CloudFormation::Stack"] } } }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }