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

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

Введение

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

Используйте изученные в AWS Foundations понятия вызывающей идентичности и ARN и скачивание объектов из S3. Эта новая VM подготавливает CLI и две идентичности: default управляет упражнением; reader представляет задачу. Работайте в /home/labex/project и сравнивайте запросы с AWS View вверху.

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

Сертификация Задача экзамена Практика
Cloud Practitioner (CLF-C02) Задача 2.3 Политики IAM, область действий и ресурсов, минимальные привилегии.
Solutions Architect – Associate (SAA-C03) Задача 1.1 Политики IAM, область действий и ресурсов, минимальные привилегии.
Developer – Associate (DVA-C02) Задача 2.1 Политики IAM, область действий и ресурсов, минимальные привилегии.
CloudOps Engineer – Associate (SOA-C03) Задача 4.1 Политики IAM, область действий и ресурсов, минимальные привилегии.
Security – Specialty (SCS-C03) Задача 4.2 Базовая практика: Политики IAM, область действий и ресурсов, минимальные привилегии.
Data Engineer – Associate (DEA-C01) Задача 4.2 Базовая практика: Политики IAM, область действий и ресурсов, минимальные привилегии.
DevOps Engineer – Professional (DOP-C02) Задача 6.1 Базовая практика: Политики IAM, область действий и ресурсов, минимальные привилегии.
Solutions Architect – Professional (SAP-C02) Задача 2.3 Базовая практика: Политики IAM, область действий и ресурсов, минимальные привилегии.

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

Концептуальная схема: Политика идентификации IAM разрешает читателю только сегодняшний отчёт в S3, защищая другие отчёты и данные о зарплате.

Предоставьте читателю доступ к отчётам

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

В S3 вы уже скачивали содержимое объектов. Здесь задача отчётности должна выполнять такое же скачивание от собственной ограниченной идентичности: оператор меняет разрешения, а читатель проверяет результат. Данные подготовлены, чтобы вы могли сосредоточиться на авторизации.

AWS Identity and Access Management (IAM) управляет тем, какая идентичность может выполнять действие с ресурсом. Минимальные привилегии предоставляют только то, что нужно задаче.

Профиль AWS CLI выбирает учётные данные и настройки; он не предоставляет разрешений. Здесь default — оператор упражнения, а reader выбирает report-reader. Сначала подтвердите обе идентичности. --profile reader выбирает задачу для одной команды. get-caller-identity сообщает идентичность вызывающей стороны, не выводя учётные данные.

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

ARN по умолчанию заканчивается на user/iam01-operator. Используйте этот профиль оператора для администрирования политик; профиль читателя используйте при проверке задачи. Оператор этой работы подготовлен для администрирования. Приложение отчётности в рабочей среде использовало бы ограниченную роль, которую вы отработаете позже.

aws sts get-caller-identity --profile reader --query Arn --output text

ARN читателя заканчивается на user/report-reader. ARN, или Amazon Resource Name, идентифицирует ресурс. Для объекта S3 он включает бакет и полный ключ объекта; один ARN бакета не определяет объект внутри него.

У читателя изначально нет политики. Проверьте чтение до предоставления каких-либо разрешений:

aws s3api get-object --profile reader --bucket labex-iam01-reports --key reports/today.txt before.txt || true

Ожидайте AccessDenied, а не скачивание отчёта. || true позволяет этой намеренно неуспешной команде завершиться, не останавливая вставленную последовательность команд. Прочитайте ошибку: сбой подключения не доказывает отказ IAM.

Политика JSON использует три основных поля: Effect — Allow или Deny; Action называет операцию сервиса; Resource ограничивает ARN, на которые может действовать операция. s3:GetObject разрешает чтение байтов объекта. * ниже соответствует ключам объектов в префиксе reports/, включая сегодня и вчера. Он не соответствует private/ или другому бакету. Version выбирает язык политики, а не версию отчёта.

Следующий here-document записывает строки между маркерами JSON в report-policy.json. > заменяет этот локальный файл, а маркер в кавычках не позволяет оболочке раскрывать его содержимое.

cat > report-policy.json <<'JSON'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::labex-iam01-reports/reports/*"
    }
  ]
}
JSON

Одна лишь запись файла не авторизует читателя. put-user-policy прикрепляет встроенную политику — политику, хранящуюся непосредственно у этого пользователя. --policy-name определяет её имя; повторное использование имени позже обновляет её. file:// сообщает CLI, что документ нужно прочитать из локального файла.

aws iam put-user-policy \
  --user-name report-reader \
  --policy-name ReportRead \
  --policy-document file://report-policy.json

Успешное обновление обычно ничего не выводит. Теперь запросите отчёты с учётными данными читателя. Последний аргумент — локальный файл назначения.

aws s3api get-object \
  --profile reader \
  --bucket labex-iam01-reports \
  --key reports/today.txt today.txt
cat today.txt

Ожидайте Daily orders: 145. Поля ответа S3, например ETag, идентифицируют скачанный объект; сам файл содержит байты отчёта.

aws s3api get-object \
  --profile reader \
  --bucket labex-iam01-reports \
  --key reports/yesterday.txt yesterday.txt

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

Ограничьте ресурс сегодняшним отчётом

На этом шаге вы замените разрешение префикса одним ARN объекта и докажете недоступность остальных ресурсов. Неявный запрет означает, что ни одна применимая политика не разрешает запрос. Отдельный Deny для каждого постороннего объекта не нужен.

После сужения политики читатель может скачать сегодняшний отчёт, но не может читать другие объекты или загружать изменения.

Замените локальную политику. Единственное изменение — Resource: точный ключ reports/today.txt заменяет reports/*.

cat > report-policy.json <<'JSON'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::labex-iam01-reports/reports/today.txt"
    }
  ]
}
JSON

Обновите ту же встроенную политику у того же читателя. Редактирование файла не обновляет IAM, пока вы не отправите эту команду.

aws iam put-user-policy \
  --user-name report-reader \
  --policy-name ReportRead \
  --policy-document file://report-policy.json

Прочитайте сохранённую политику. --query PolicyDocument выбирает документ из ответа; он не меняет разрешения.

aws iam get-user-policy \
  --user-name report-reader \
  --policy-name ReportRead \
  --query PolicyDocument

Проверьте, что Resource заканчивается на reports/today.txt. Затем снова проверьте читателя.

aws s3api get-object \
  --profile reader \
  --bucket labex-iam01-reports \
  --key reports/today.txt today.txt

Нужный отчёт по-прежнему скачивается. Каждый следующий запрос должен завершиться AccessDenied, поскольку ARN его объекта не соответствует разрешению.

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

Эти объекты существуют; оператор может их читать. Ответ NoSuchKey указал бы на отсутствующий объект, а эти ошибки разрешений демонстрируют границу ресурсов читателя. В AWS View сегодняшний объект имеет статус Readable, а остальные три — Denied. Это представление выполняет фактические запросы чтения от имени того же читателя.

Читатель ограничен одним отчётом. Пример: читаем только сегодняшний отчёт; остальные существующие объекты запрещены. Документ слева — сохранённая политика IAM.

Отличите явный запрет от отсутствующего разрешения

На этом шаге вы явно защитите частный префикс и проверите границу действий. Явный запрет — это соответствующий запросу оператор Deny. Он имеет приоритет над Allow из другой применимой политики идентичности. Порядок операторов не позволяет Allow отменить его.

Добавьте второй оператор, сохранив точное разрешение чтения. s3:* соответствует всем действиям S3, но этот Deny ограничен объектами под префиксом private/ этого бакета. Он не запрещает доступ к сегодняшнему отчёту.

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

Deny усиливает частную границу. Чтобы увидеть его приоритет, временно прикрепите второе разрешение чтения для этого бакета. Это контролируемая проверка; удалите его сразу после неё.

cat > temporary-read.json <<'JSON'
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam01-reports/*"}]}
JSON
aws iam put-user-policy \
  --user-name report-reader \
  --policy-name TemporaryRead \
  --policy-document file://temporary-read.json
aws s3api get-object --profile reader --bucket labex-iam01-reports --key private/payroll.txt payroll-denied.txt || true

Ожидайте AccessDenied, хотя TemporaryRead разрешает этот ключ. Соответствующий явный Deny побеждает. Удалите временное разрешение для восстановления минимальных привилегий.

aws iam delete-user-policy --user-name report-reader --policy-name TemporaryRead

Разрешение чтения не позволяет запись. upload.txt — предоставленная неутверждённая замена. put-object пытается сохранить её байты по сегодняшнему ключу, и читателю должно быть отказано.

aws s3api put-object --profile reader --bucket labex-iam01-reports --key reports/today.txt --body upload.txt || true

Ожидайте AccessDenied для PutObject; не считайте отсутствующие файлы или сбои сервиса этим результатом. Снова прочитайте сегодняшний отчёт, чтобы подтвердить, что неудачная запись не изменила его.

aws s3api get-object \
  --profile reader \
  --bucket labex-iam01-reports \
  --key reports/today.txt today.txt
cat today.txt

Он должен по-прежнему содержать Daily orders: 145. Прочитайте итоговую политику и подтвердите узкий Allow и частный Deny.

aws iam get-user-policy \
  --user-name report-reader \
  --policy-name ReportRead \
  --query PolicyDocument

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

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

Используйте оператора по умолчанию для удаления ReportRead. delete-user-policy удаляет встроенную политику по имени.

aws iam delete-user-policy --user-name report-reader --policy-name ReportRead
aws iam list-user-policies --user-name report-reader

Ожидайте пустого PolicyNames. Пока отчёт ещё существует, проверьте, что читатель потерял доступ.

aws s3api get-object --profile reader --bucket labex-iam01-reports --key reports/today.txt revoked.txt || true

Ожидайте AccessDenied. Теперь удалите три точных собственных ключа как оператор. Эталонный бакет относится к подготовленным ресурсам платформы и должен остаться целым.

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

Проверьте, что KeyCount равен 0, а в Contents нет объектов. Этот успешный аутентифицированный ответ показывает пустоту собственного бакета перед удалением.

aws s3api delete-bucket --bucket labex-iam01-reports
aws s3api list-buckets --query 'Buckets[].Name'

Остаётся только labex-iam01-reference. Подтвердите его исходные байты:

aws s3api get-object --bucket labex-iam01-reference --key reference.txt reference.txt
cat reference.txt

Ожидайте Platform reference: keep. Теперь AWS View показывает No inline policy и Reports bucket removed. Сбой сервиса отображался бы как недоступность, а не успешная очистка. Временные подготовленные идентичности освобождаются при завершении вашей учебной среды; вы удалили созданные учащимся разрешения и данные упражнения, сохранив посторонний подготовленный ресурс.

Резюме

Вы прикрепили и изменили политику идентичности IAM, использовали Action и Resource для ограничения задачи отчётности, сравнили неявные и явные запреты и доказали, что разрешение чтения не авторизует запись. Вы отозвали политику и удалили только собственные данные. Проверяйте и предполагаемый успех, и запрещённые операции при каждом пересмотре доступа; одна сохранённая политика не доказывает правильную авторизацию приложения.

Подробнее см. в документации AWS: Типы политик и операторы разрешений IAM.