Учётные данные роли инстанса всплывают в журнале аудита с внешнего адреса. Что настроено неверно?
События аудита показывают вызовы API хранилища одной ролью инстанса с его собственного адреса и, спустя минуты, с постороннего публичного адреса. Профиль инстанса привязан к веб-приложению, которое загружает переданные пользователем URL.
Ограничения:
- Опции метаданных инстанса и политика роли приведены ниже в текущем виде.
- Предлагайте только изменения конфигурации — переписать приложение в это окно нельзя.
- Каждое изменение должно проверяться по одной лишь конфигурации.
ts=2026-04-11T09:14:02Z principal=AROA…:i-0af31 event=GetObject sourceIP=10.0.4.19 userAgent=aws-sdk-python
ts=2026-04-11T09:21:48Z principal=AROA…:i-0af31 event=ListBuckets sourceIP=203.0.113.77 userAgent=aws-cli/2.15
ts=2026-04-11T09:22:10Z principal=AROA…:i-0af31 event=GetObject sourceIP=203.0.113.77 userAgent=aws-cli/2.15
instance metadata options: HttpTokens=optional HttpPutResponseHopLimit=2 HttpEndpoint=enabled
role policy statement: Effect=Allow Action=s3:* Resource=*
Назовите мисконфигурацию и дайте план исправления.
Инстанс всё ещё принимает бестокенный протокол метаданных v1 и несёт роль с wildcard, поэтому дефект подделки запросов дал прочитать учётные данные роли и переиграть их вне хоста — выдаёт это чужой адрес. Требуйте IMDSv2 и hop limit в единицу, сузьте роль.
- ✗Принимать чужой адрес источника за NAT-шлюз, а не за переигранные учётки
- ✗Оставлять HttpTokens в optional, раз IMDSv2 описан как обратно совместимый
- ✗Чинить только опции метаданных, оставляя wildcard-роль на месте
- →Каким запросом по журналу найти все роли инстансов, использованные вне ваших диапазонов?
- →Почему hop limit равный единице важен, даже когда токены уже обязательны?
Чужой публичный адрес, вызывающий API от имени той же роли инстанса, означает, что учётные данные роли были получены на инстансе и переиграны снаружи. Возможным это сделали две настройки: HttpTokens=optional оставляет доступным бестокенный протокол метаданных v1, до которого дотягивается дефект подделки запросов в приложении, а HttpPutResponseHopLimit=2 позволяет обратиться к нему даже из контейнера. Политика s3:* на * превращает утечку одной учётки в доступ ко всему хранилищу аккаунта.
Исправление — конфигурацией:
# 1. Требовать сессионный токен (IMDSv2) и убрать лишний сетевой прыжок
aws ec2 modify-instance-metadata-options --instance-id i-0af31 \
--http-tokens required --http-put-response-hop-limit 1 --http-endpoint enabled
# 2. Отозвать уже выданные сессии роли (политика с условием по времени выдачи)
aws iam put-role-policy --role-name app-instance-role \
--policy-name RevokeOlderSessions --policy-document file://revoke-older-sessions.json
# 3. Сузить права роли до конкретного бакета и конкретных действий
# вместо Action s3:* / Resource *
Дальше — детект: алерт на использование роли инстанса с адреса вне ваших диапазонов, инвентаризация инстансов с HttpTokens=optional через сканирование конфигураций и запрет создавать роли с wildcard-ресурсом на уровне организации.