Recupero dei metadati dell'istanza - Amazon Elastic Compute Cloud

Recupero dei metadati dell'istanza

Dal momento che i metadati dell'istanza sono disponibili dall'istanza in esecuzione, non devi utilizzare la console Amazon EC2 o AWS CLI. Ciò può risultare utile quando sta scrivendo script da eseguire dall'istanza. Ad esempio, puoi accedere all'indirizzo IP locale dell'istanza dai metadati dell'istanza per gestire una connessione a un'applicazione esterna.

I metadati dell'istanza sono suddivisi in categorie. Per una descrizione di ciascuna categoria di metadati dell'istanza, consulta Categorie di metadati dell'istanza.

Per visualizzare tutte le categorie dei metadati dell'istanza dall'interno di un'istanza in esecuzione, utilizza l'URI seguente.

http://169.254.169.254/latest/meta-data/

L'indirizzo IP 169.254.169.254 è un indirizzo link-local ed è valido solo dall'istanza. Per ulteriori informazioni, consulta Indirizzo link-local su Wikipedia.

Il formato del comando è diverso, a seconda che si utilizzi IMDSv1 o IMDSv2. Per impostazione predefinita, puoi utilizzare entrambi i servizi di metadati dell'istanza. Per richiedere l'utilizzo di IMDSv2, consulta Usa IMDSv2.

Puoi anche utilizzare uno strumento quale cURL, come mostrato nell'esempio seguente.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/

Non verrà addebitato alcun costo per le richieste HTTP utilizzate per recuperare i metadati dell'istanza e i dati utente.

Considerations

Per evitare problemi con il recupero dei metadati dell'istanza, considerare quanto segue:

  • I kit SDK AWS utilizzano le chiamate IMDSv2 per impostazione predefinita. Se la chiamata IMDSv2 non riceve alcuna risposta, l'SDK ritenta la chiamata e, se ancora non riesce, utilizza IMDSv1. Ciò può comportare un ritardo. In un ambiente container, se il limite di hop è 1, la risposta IMDSv2 non viene restituita perché andare al container è considerato un hop di rete aggiuntivo. Per evitare il processo di fallback di IMDSv1 e il ritardo risultante, in un ambiente container si consiglia di impostare il limite di hop su 2. Per ulteriori informazioni, consulta Configurazione delle opzioni dei metadati dell'istanza.

  • Per IMDSv2, devi utilizzare /latest/api/token durante il recupero del token. L’emissione di richieste PUT a qualsiasi percorso specifico della versione, ad esempio /2021-03-23/api/token, farà sì che il servizio metadati restituisca l’errore 403 Non consentito. Questo è il comportamento previsto.

Risposte e messaggi di errore

Tutti i metadati dell'istanza vengono restituiti come testo (tipo di contenuto HTTP text/plain).

Una richiesta relativa a una risorsa di metadati specifica restituisce il valore appropriato o un codice di errore HTTP 404 - Not Found se la risorsa non è disponibile.

Una richiesta relativa a una risorsa di metadati generica (l'URI termina con /) restituisce l'elenco delle risorse disponibili o un codice di errore HTTP 404 - Not Found se la risorsa specificata non è disponibile. Le voci dell'elenco si trovano su righe distinte che terminano con caratteri di avanzamento riga (ASCII 10).

Per richieste effettuate mediante Servizio di metadati dell'istanza Versione 2, possono essere restituiti i seguenti codici di errore HTTP:

  • 400 - Missing or Invalid Parameters – La richiesta PUT non è valida.

  • 401 - Unauthorized – La richiesta GET utilizza un token non valido. L'operazione consigliata è quella di generare un nuovo token.

  • 403 - Forbidden – La richiesta non è consentita o il servizio di metadati dell'istanza è disattivato.

Esempi di recupero di metadati dell'istanza

Recupero delle versioni disponibili dei metadati dell'istanza

Questo esempio recupera le versioni disponibili dei metadati dell'istanza. Queste versioni non sono necessariamente correlate a una versione dell'API Amazon EC2. Le versioni precedenti sono disponibili in presenza di script basati sulla struttura e sulle informazioni presenti in una versione precedente.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/ 1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 2007-12-15 2008-02-01 2008-09-01 2009-04-04 2011-01-01 2011-05-01 2012-01-12 2014-02-25 2014-11-05 2015-10-20 2016-04-19 2016-06-30 2016-09-02 latest
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/ 1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 2007-12-15 2008-02-01 2008-09-01 2009-04-04 2011-01-01 2011-05-01 2012-01-12 2014-02-25 2014-11-05 2015-10-20 2016-04-19 2016-06-30 2016-09-02 latest

Recupero degli elementi di metadati di primo livello

Questo esempio recupera gli elementi di metadati di primo livello. Per ulteriori informazioni, consulta Categorie di metadati dell'istanza.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/ ami-id ami-launch-index ami-manifest-path block-device-mapping/ events/ hostname iam/ instance-action instance-id instance-life-cycle instance-type local-hostname local-ipv4 mac metrics/ network/ placement/ profile public-hostname public-ipv4 public-keys/ reservation-id security-groups services/
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/ ami-id ami-launch-index ami-manifest-path block-device-mapping/ events/ hostname iam/ instance-action instance-id instance-type local-hostname local-ipv4 mac metrics/ network/ placement/ profile public-hostname public-ipv4 public-keys/ reservation-id security-groups services/

Gli esempi seguenti consentono di recuperare i valori di alcuni degli elementi di metadati di primo livello che sono stati ottenuti nell'esempio precedente. Le richieste IMDSv2 utilizzano il token memorizzato che è stato creato nel comando di esempio precedente, ipotizzando che non sia scaduto.

IMDSv2
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/ami-id ami-0abcdef1234567890
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/ami-id ami-0abcdef1234567890

 

IMDSv2
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/reservation-id r-0efghijk987654321
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/reservation-id r-0efghijk987654321

 

IMDSv2
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/local-hostname ip-10-251-50-12.ec2.internal
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/local-hostname ip-10-251-50-12.ec2.internal

 

IMDSv2
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/public-hostname ec2-203-0-113-25.compute-1.amazonaws.com
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-hostname ec2-203-0-113-25.compute-1.amazonaws.com

Recupero dell'elenco di chiavi pubbliche disponibili

Questo esempio recupera l'elenco delle chiavi pubbliche disponibili.

IMDSv2
[ec2-user ~]$ `curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/public-keys/ 0=my-public-key
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/ 0=my-public-key

Visualizzazione dei formati in cui è disponibile la chiave pubblica 0

Questo esempio mostra i formati in cui è disponibile la chiave pubblica 0.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/public-keys/0/ openssh-key
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/ openssh-key

Recupero della chiave pubblica 0 (nel formato di chiave OpenSSH)

Questo esempio recupera la chiave pubblica 0 (nel formato di chiave OpenSSH).

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6 b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ 21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4 nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6 b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ 21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4 nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key

Recupero dell'ID della sottorete per un'istanza

In questo esempio viene recuperato l'ID della sottorete per un'istanza.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id subnet-be9b61d7
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id subnet-be9b61d7

Throttling delle query

Il throttling (limitazione delle richieste) delle query viene applicato al servizio di metadati dell'istanza in base all'istanza, ovvero vengono applicate restrizioni al numero di connessioni simultanee da un'istanza al servizio di metadati dell'istanza.

Se utilizzi il servizio di metadati dell'istanza per recuperare le credenziali di sicurezza AWS, evita di eseguire query per recuperare le credenziali durante ogni transazione o simultaneamente da un numero elevato di thread o processi in quanto questa operazione potrebbe causare il throttling. Consigliamo invece di memorizzare le credenziali nella cache fino all'approssimarsi della relativa data di scadenza.

In caso di throttling durante l'accesso al servizio di metadati dell'istanza, riprova a eseguire la query con un approccio basato sul backoff esponenziale.

Limitazione dell'accesso al servizio di metadati dell'istanza

Puoi valutare se utilizzare regole firewall locali per disabilitare l'accesso al servizio di metadati dell'istanza da alcuni processi o da tutti.

Nota

Istanze costruite sul sistema Nitro IMDS potrebbe essere raggiungibile dalla tua rete quando un'appliance di rete all'interno del VPC, ad esempio un router virtuale, inoltra i pacchetti all'indirizzo IMDS e il controllo dell'origine/della destinazione predefinito sull'istanza è disabilitato. Per evitare che un'origine esterna al VPC raggiunga IMDS, si consiglia di modificare la configurazione dell'appliance di rete per eliminare i pacchetti con l'indirizzo IP di destinazione IMDS 169.254.169.254.

Utilizzo di iptables per limitare l'accesso

L'esempio seguente utilizza iptables Linux e il relativo modulo owner per impedire al server Web Apache (basato sul suo ID utente di installazione predefinito di apache) di accedere a 169.254.169.254. Utilizza una regola di rifiuto per rifiutare tutte le richieste dei metadati dell'istanza (IMDSv1 o IMDSv2) da qualsiasi processo in esecuzione come tale utente.

$ sudo iptables --append OUTPUT --proto tcp --destination 169.254.169.254 --match owner --uid-owner apache --jump REJECT

Oppure, puoi valutare di consentire l'accesso solo a utenti o gruppi particolari, utilizzando regole che autorizzano. Le regole che autorizzano potrebbero essere più facili da gestire dal punto di vista della sicurezza, perché richiedono di prendere una decisione sul software che deve poter accedere ai metadati dell'istanza. Se utilizzi regole che autorizzano, è meno probabile che venga accidentalmente concesso al software l'accesso al servizio di metadati (a cui non intendevi accedere) se in seguito modifichi il software o la configurazione su un'istanza. Puoi anche combinare l'utilizzo dei gruppi con le regole che autorizzano, in modo da poter aggiungere e rimuovere utenti da un gruppo autorizzato senza la necessità di modificare la regola firewall.

L'esempio seguente impedisce a tutti i processi di accedere al servizio di metadati dell'istanza, tranne a quelli in esecuzione nell'account utente trustworthy-user.

$ sudo iptables --append OUTPUT --proto tcp --destination 169.254.169.254 --match owner ! --uid-owner trustworthy-user --jump REJECT
Nota
  • Per utilizzare regole firewall locali, è necessario adattare i comandi dell'esempio precedente in base alle proprie esigenze.

  • Per impostazione predefinita, le regole iptables non vengono mantenute tra riavvii del sistema. Possono essere rese persistenti utilizzando funzionalità del sistema operativo non descritte in questo argomento.

  • Il modulo owner iptables corrisponde all'appartenenza al gruppo solo se il gruppo è quello primario di un determinato utente locale. Altri gruppi non corrispondono.

Utilizzo di PF o IPFW per limitare l'accesso

Se utilizzi FreeBSD o OpenBSD, puoi anche valutare l'utilizzo di PF o IPFW. Gli esempi seguenti limitano l'accesso al servizio di metadati dell'istanza al solo utente root.

PF

$ block out inet proto tcp from any to 169.254.169.254
$ pass out inet proto tcp from any to 169.254.169.254 user root

IPFW

$ allow tcp from any to 169.254.169.254 uid root
$ deny tcp from any to 169.254.169.254
Nota

L'ordine dei comandi PF e IPFW è importante. PF è preimpostato sull'ultima regola corrispondente e IPFW è preimpostato sulla prima regola corrispondente.