Предоставление читателю отчёта ограниченного доступа

AWSBeginner
Практиковаться сейчас

Введение

Потребителю отчёта нужен один закрытый отчёт, а не весь доступ оператора к хранилищу. Вы предоставите его независимой идентичности 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 использует идентичность оператора для просмотра хранилища; предварительный просмотр объекта там не доказывает, что читатель может получить к нему доступ. 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, проверили разрешённые и запрещённые запросы независимым читателем, отозвали разрешение без удаления данных отчёта и удалили только собственное хранилище.