Comment empêcher / pare-feu les appels à l'API de métadonnées d'instance AWS EC2?

14

L' API de métadonnées d'instance AWS EC2 fournit de nombreuses fonctionnalités utiles. N'importe qui sur l'instance EC2 réelle peut appeler http://169.254.169.254/et voir les métadonnées de l'instance à partir de laquelle l'appel a été effectué. La sécurité de l'API est telle qu'elle vérifie uniquement que l'appel provient de l'instance. Par conséquent, si j'autorise quelqu'un à exécuter du code sur mon instance, je voudrais savoir comment bloquer au mieux l'accès à cette URL particulière tout en conservant moi-même l'accès.

Comme point culminant, j'ai été surpris de constater que l'API Metadata est également accessible via http://instance-data/(que j'ai trouvé par accident quelque part).

Je suis en mesure d'inspecter les URL appelées par tout le code exécuté sur cette instance, mais je suppose que ce n'est pas une bonne approche étant donné les adresses IPv6 (éventuellement), ou certains codages URI étranges qui se résoudraient en IP de métadonnées (169.254 .169.254), ou certaines URL non documentées (il semble) comme http://instance-data/.

Tristan
la source

Réponses:

25

Pare-feu le désactiver.

iptables -A OUTPUT -m owner ! --uid-owner root -d 169.254.169.254 -j DROP

Cette règle interdit à tout utilisateur autre que l'utilisateur root d'ouvrir des connexions à 169.254.169.254.

Michael Hampton
la source
Cela n'empêchera-t-il pas l'utilisation "normale" de ce service. Typiquement, le service est appelé par / obo l'utilisateur EC2 qui n'est presque jamais la racine.
Sam-T
@ Sam-T Si vous avez besoin de l'utilisateur ec2 pour y accéder, vous pouvez certainement écrire une règle pour le permettre également.
Michael Hampton
Si vous empêchez au niveau du pare-feu de n'autoriser que root, vous ne savez pas comment l'activer pour l'utilisateur EC2 (je ne sais pas). Par utilisateur EC2 - je veux dire celui qui a démarré l'instance - ma compréhension est que les métadonnées sont accessibles par cet utilisateur EC2 (et tout autre) sur l'instance. Pourriez-vous donner un exemple
Sam-T