Диагностируйте отказ доступа

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

Введение

Читатель отчётов возвращает AccessDenied после переноса политики. Вы изучите вызывающую сторону, запрошенное действие, ресурс и оператор запрета, исправляя по одному несоответствию и сохраняя ограниченную область читателя.

Сначала выполните работу Предоставьте читателю отчётов минимальные привилегии, чтобы освоить поля политик и явный Deny. Эта новая VM подготавливает default для администрирования и reader для задачи. Работайте в /home/labex/project и сравнивайте сохранённую политику с фактическим чтением в AWS View.

Связь с сертификацией

Сертификация Задача экзамена Практика
Solutions Architect – Associate (SAA-C03) Задача 1.1 Диагностика авторизации и проверка границ доступа.
Developer – Associate (DVA-C02) Задача 2.1 Диагностика авторизации и проверка границ доступа.
CloudOps Engineer – Associate (SOA-C03) Задача 4.1 Диагностика авторизации и проверка границ доступа.
Security – Specialty (SCS-C03) Задача 4.2 Базовая практика: Диагностика авторизации и проверка границ доступа.
Data Engineer – Associate (DEA-C01) Задача 4.2 Базовая практика: Диагностика авторизации и проверка границ доступа.

Обзор лабораторной работы

Концептуальная схема: Проверьте вызывающую сторону, действие, полный ARN объекта и подходящий Deny, затем исправьте и повторно проверьте только необходимое чтение S3.

Подтвердите вызывающую сторону и исправьте запрошенное действие

На этом шаге вы отделите ошибку идентичности от несоответствия политики, затем исправите действие Allow. Одна и та же команда с разными учётными данными может дать разный результат авторизации.

В перенесённой политике несколько несоответствий. После исправления одного поля запрос может оставаться запрещённым другим полем или явным Deny. После каждого изменения проверяйте сохранённый документ и повторяйте тот же запрос читателя; неизменный AccessDenied сам по себе не показывает, было ли это отдельное исправление правильным.

Порядок исследования отказа чтения отчёта в этой работе.

cd /home/labex/project
aws sts get-caller-identity --query Arn --output text
aws sts get-caller-identity --profile reader --query Arn --output text

Ожидайте user/iam05-operator и user/report-reader. Задача отчётности использует читателя, а не оператора. Подтвердите существование объекта как оператор, затем воспроизведите отказ задачи как читатель.

aws s3api get-object \
  --bucket labex-iam05-reports \
  --key reports/today.txt operator-report.txt
cat operator-report.txt
aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/today.txt reader-before.txt || true

Оператор получает Daily orders: 145; читатель — AccessDenied. Отсутствующий ключ или сбой подключения потребовали бы другого исследования. || true позволяет этому ожидаемо неуспешному запросу завершиться во вставленной последовательности.

Выведите политики читателя и прочитайте сохранённый документ. Это запросы оператора об идентичности задачи, а не попытки одолжить задаче доступ оператора.

aws iam list-user-policies --user-name report-reader
aws iam get-user-policy \
  --user-name report-reader \
  --policy-name LabReport \
  --query PolicyDocument

Allow называет s3:ListBucket, а ошибка — GetObject. ListBucket перечисляет имена объектов и использует ARN бакета; он не скачивает байты объекта. Измените только Action в Allow на GetObject, сохранив текущие Resource и Deny, чтобы отдельно диагностировать следующее несоответствие.

cat > repair-policy.json <<'JSON'
{"Version":"2012-10-17","Statement":[
  {"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports"},
  {"Effect":"Deny","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/reports/*"}
]}
JSON
aws iam put-user-policy \
  --user-name report-reader \
  --policy-name LabReport \
  --policy-document file://repair-policy.json
aws iam get-user-policy \
  --user-name report-reader \
  --policy-name LabReport \
  --query PolicyDocument
aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/today.txt reader-action-fix.txt || true

Он всё ещё возвращает AccessDenied. Action теперь правильный, но исправление одного поля не гарантирует прохождение всех применимых проверок.

Сопоставьте полный ARN объекта

На этом шаге вы исправите Resource, сохранив оператор запрета. GetObject применяется к ARN объекта, который включает ключ. ARN бакета arn:aws:s3:::labex-iam05-reports не соответствует arn:aws:s3:::labex-iam05-reports/reports/today.txt.

Замените Resource в Allow точным ARN сегодняшнего объекта. Не используйте * для всех бакетов или ключей; у задачи один необходимый вход.

cat > repair-policy.json <<'JSON'
{"Version":"2012-10-17","Statement":[
  {"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/reports/today.txt"},
  {"Effect":"Deny","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/reports/*"}
]}
JSON
aws iam put-user-policy \
  --user-name report-reader \
  --policy-name LabReport \
  --policy-document file://repair-policy.json
aws iam get-user-policy \
  --user-name report-reader \
  --policy-name LabReport \
  --query PolicyDocument
aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/today.txt reader-resource-fix.txt || true

Снова ожидайте AccessDenied. Теперь Allow соответствует и Action, и Resource, поэтому изучите оставшийся оператор. Его Deny также соответствует GetObject для reports/*, включая сегодня. Соответствующий явный Deny имеет приоритет над Allow; перемещение Allow ниже в документе не может отменить его.

Исправьте Deny без расширения доступа

На этом шаге вы исправите область перенесённого Deny и подтвердите минимальное исправление. Предполагаемая защита охраняет частные данные; она не должна запрещать вход задачи отчётности. Сохраните точный Allow чтения и сузьте Deny до private/* вместо удаления защиты или добавления более широких разрешений.

cat > repair-policy.json <<'JSON'
{"Version":"2012-10-17","Statement":[
  {"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/reports/today.txt"},
  {"Effect":"Deny","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/private/*"}
]}
JSON
aws iam put-user-policy \
  --user-name report-reader \
  --policy-name LabReport \
  --policy-document file://repair-policy.json
aws s3api get-object \
  --profile reader \
  --bucket labex-iam05-reports \
  --key reports/today.txt today.txt
cat today.txt

Ожидайте Daily orders: 145. Проверьте соседние ресурсы как тот же читатель; завершённое исправление не должно расширять его область.

aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/yesterday.txt yesterday-denied.txt || true
aws s3api get-object --profile reader --bucket labex-iam05-reports --key private/payroll.txt payroll-denied.txt || true
aws s3api get-object --profile reader --bucket labex-iam05-reference --key reference.txt reference-denied.txt || true

Все три должны вернуть AccessDenied. Необходимое разрешение чтения также не должно авторизовать запись. Попробуйте предоставленную замену, затем проверьте неизменность исходных байтов отчёта.

aws s3api put-object --profile reader --bucket labex-iam05-reports --key reports/today.txt --body upload.txt || true
aws s3api get-object \
  --profile reader \
  --bucket labex-iam05-reports \
  --key reports/today.txt today.txt
cat today.txt
aws iam get-user-policy \
  --user-name report-reader \
  --policy-name LabReport \
  --query PolicyDocument

Ожидайте AccessDenied для PutObject и неизменённое Daily orders: 145. Теперь AWS View показывает сегодня как Readable, а другие ресурсы — Denied. Изучение политики объясняет исправление; фактические запросы демонстрируют эффект.

Минимальное исправление политики восстанавливает только нужное чтение. Пример: сегодняшний отчёт читается с исходными байтами, а вчерашний, частные данные и эталонный ресурс остаются запрещёнными. Сохранённая политика сохраняет частный Deny и точный Allow отчёта.

Отзовите исправление и удалите собственные данные

На этом шаге вы удалите LabReport и докажете отзыв доступа, пока отчёт ещё существует. Затем удалите только собственный бакет отчётов и его три ключа.

aws iam delete-user-policy --user-name report-reader --policy-name LabReport
aws iam list-user-policies --user-name report-reader
aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/today.txt revoked.txt || true

Ожидайте пустой список политик и AccessDenied. Отзыв политики и удаление данных — отдельные проверки. Оставьте эталонный бакет без изменений.

aws s3api delete-object --bucket labex-iam05-reports --key reports/today.txt
aws s3api delete-object --bucket labex-iam05-reports --key reports/yesterday.txt
aws s3api delete-object --bucket labex-iam05-reports --key private/payroll.txt
aws s3api list-objects-v2 --bucket labex-iam05-reports

Проверьте KeyCount: 0 в успешном аутентифицированном ответе и отсутствие оставшихся записей объектов в Contents.

aws s3api delete-bucket --bucket labex-iam05-reports
aws s3api list-buckets --query 'Buckets[].Name'
aws s3api get-object --bucket labex-iam05-reference --key reference.txt reference.txt
cat reference.txt

Остаётся только эталонный бакет с Platform reference: keep. Сбои сервиса не доказывают удаление. Подготовленные идентичности освобождаются при завершении среды; политика задачи и собственные данные упражнения удалены.

Резюме

Вы подтвердили вызывающую сторону, сравнили неуспешную операцию с Action в Allow, сопоставили полный ARN объекта и исправили перекрывающий явный Deny. Промежуточные отказы помогли найти оставшиеся препятствия. Итоговый читатель мог читать только нужный отчёт и не мог записывать его или читать посторонние данные. Вы отозвали исправленное разрешение и завершили ограниченную очистку. Используйте ту же идентичность и проверяйте успешные и запрещённые запросы при диагностике доступа.

Подробнее см. в документации AWS: Диагностика ошибок отказа в доступе IAM.