Введение
Потребителю отчёта нужен один закрытый отчёт, а не весь доступ оператора к хранилищу. Вы предоставите его независимой идентичности IAM ограниченный доступ, проверите фактические запросы, затем отзовёте разрешение, сохранив данные отчёта.
Опирайтесь на знания о ссылках на ресурсы и чтении объектов S3. Вы должны понимать Action и Resource в IAM; доверие ролей, профили экземпляров и личные ключи доступа не нужны. Обе идентичности CLI подготовлены в этой новой среде.
Связь с сертификацией
| Сертификация | Задача экзамена | Практика |
|---|---|---|
| Cloud Practitioner (CLF-C02) | Задачи 2.3 и 3.1 | Управление политикой идентичности с минимальными привилегиями через воспроизводимую конфигурацию инфраструктуры. |
| Developer – Associate (DVA-C02) | Задача 3.3, навык 3.3.4 | Базовая практика развёртывания определения инфраструктуры. |
| DevOps Engineer – Professional (DOP-C02) | Задача 2.1 | Базовая практика управления ресурсами через определение IaC. |
| Solutions Architect – Associate (SAA-C03) | Задача 1.1 | Базовая практика ограничения политики читателя IAM и оценки разрешённого и запрещённого доступа. |

Подготовка отчёта и наблюдение за читателем
На этом шаге вы создадите хранилище отчёта и увидите исходное отсутствие доступа у действительного независимого читателя.
Идентичность CLI по умолчанию управляет инфраструктурой. Предоставленный профиль reader принадлежит независимому пользователю IAM report-reader; его доступ не заимствуется у оператора. Создание хранилища не авторизует этого пользователя автоматически. Выбор профиля меняет идентичность, подписывающую запрос AWS, а не сам ресурс.
Создайте хранилище отчёта в подготовленном корневом каталоге:
cd /home/labex/project/reader-access
cat > main.tf <<'EOF'
resource "aws_s3_bucket" "reports" {
bucket = "terraform-reader-reports"
}
resource "aws_s3_object" "report" {
bucket = aws_s3_bucket.reports.id
key = "reports/current.csv"
content = "orders,12\n"
content_type = "text/csv"
}
EOF
terraform init
terraform plan
Ожидайте два добавления. Примените изменения и введите yes:
terraform apply
Попробуйте прочитать отчёт независимым читателем. || true позволяет продолжить выполнение блока команд после намеренной ошибки; это не превращает запрос в успешное чтение.
aws s3api \
get-object \
--profile reader \
--bucket terraform-reader-reports \
--key reports/current.csv \
reader-report.csv || true
Ожидайте AccessDenied. Идентичность действительна, но у неё нет подходящего разрешения. Сохраняйте отдельный объект team-reference-reports/keep.txt закрытым на протяжении всей лабораторной работы. AWS View использует идентичность оператора для просмотра хранилища; предварительный просмотр объекта там не доказывает, что читатель может получить к нему доступ.

Разрешение чтения только нужного отчёта
На этом шаге вы используете ссылки на ресурсы для построения политики идентичности IAM и проверите как разрешённое, так и запрещённое чтение.
Встроенная политика идентичности прикрепляется непосредственно к одному пользователю и разрешает ему действия. s3:GetObject применяется к ARN объекта, а не к ARN бакета. jsonencode превращает значение Terraform в корректный JSON, поэтому можно использовать обычные ссылки HCL на ресурсы вместо ручного построения экранированной JSON-строки.
Создайте policy.tf. Имя читателя относится к подготовленным данным среды; целевой ARN политики объединяет ARN созданного бакета и ключ фактического объекта.
cat > policy.tf <<'EOF'
resource "aws_iam_user_policy" "reader" {
name = "ReadReport"
user = "report-reader"
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = "s3:GetObject"
Resource = "${aws_s3_bucket.reports.arn}/${aws_s3_object.report.key}"
}]
})
}
EOF
terraform plan
План добавляет одну политику, сохраняя бакет и отчёт. Примените её и введите yes:
terraform apply
Прочитайте целевой объект с тем же профилем читателя:
aws s3api \
get-object \
--profile reader \
--bucket terraform-reader-reports \
--key reports/current.csv \
reader-report.csv
cat reader-report.csv
Ожидайте orders,12. Теперь используйте ту же идентичность для постороннего закрытого объекта:
aws s3api \
get-object \
--profile reader \
--bucket team-reference-reports \
--key keep.txt \
unrelated-report.txt || true
Ожидайте AccessDenied, а не загруженные эталонные данные. Эта политика разрешает только чтение отчёта; она не должна разрешать запись или удаление отчётов. Широкие шаблоны действий или ресурсов могут открыть непредусмотренный доступ, даже если целевое чтение работает. Проверка анализирует семантику политики средствами сервиса и выполняет фактическое разрешённое и запрещённое чтение; она не требует определённой структуры JSON. Эквивалентные выражения со строками или списками и префикс, ограниченный отчётами, могут удовлетворять задаче, не предоставляя новых действий.
Отзыв разрешения без удаления данных
На этом шаге вы удалите политику через Terraform и докажете, что доступ меняется, а отчёт сохраняется.
Удаление блока ресурса предлагает удалить соответствующий управляемый ресурс. Удалите только policy.tf, оставив конфигурацию хранилища без изменений:
rm policy.tf
terraform plan -out=revoke.tfplan
terraform show revoke.tfplan
Ожидайте удаление одной политики без удаления бакета или объекта. Примените этот сохранённый артефакт:
terraform apply revoke.tfplan
Повторите целевое чтение тем же читателем:
aws s3api \
get-object \
--profile reader \
--bucket terraform-reader-reports \
--key reports/current.csv \
after-revoke.csv || true
Ожидайте AccessDenied. Отзыв разрешения не удаляет уже загруженный локальный файл, а наличие reader-report.csv не доказывает, что новый запрос авторизован. Запросите сохранённый отчёт с идентичностью оператора по умолчанию:
aws s3api \
get-object \
--bucket terraform-reader-reports \
--key reports/current.csv \
retained-report.csv
cat retained-report.csv
Отчёт по-прежнему содержит orders,12. Вы изменили границу авторизации, не меняя данные. О различии между Action и Resource читайте в документации по элементам политик IAM.
Удаление собственного хранилища отчёта
На этом шаге вы очистите хранилище после завершения проверок доступа и отзыва разрешения.
Удалите оставшиеся ресурсы этой корневой конфигурации и введите yes:
terraform destroy
Бакет и объект отчёта удаляются; предоставленный читатель и эталонный отчёт команды принадлежат подготовленной среде и не входят в состояние этой корневой конфигурации. Изучите итоговое сопоставление и сохранённый эталонный отчёт:
terraform state list
aws s3api \
list-buckets \
--query 'Buckets[].Name'
aws s3api \
head-object \
--bucket team-reference-reports \
--key keep.txt \
--query ContentLength
Список ресурсов в состоянии пуст, а эталонный отчёт сохранён. Оставьте обе подготовленные идентичности CLI настроенными до завершения заключительной проверки.
Резюме
Вы использовали jsonencode и ссылки на ресурсы для определения политики идентичности IAM, проверили разрешённые и запрещённые запросы независимым читателем, отозвали разрешение без удаления данных отчёта и удалили только собственное хранилище.



