Введение
Раскрытый ключ поддержки отозван. Сервис доступен, но задача сводки не может аутентифицироваться: в её закрытой конфигурации остался прежний секрет. Пакет daily всё ещё ожидает сводки.
Вы изучите области разрешений, выдадите замену, обновите закрытую конфигурацию worker и выполните реальную бизнес-задачу. Также проверите запрет доступа к каталогу клиентов и работоспособность независимого монитора. Эта работа предоставляет собственное состояние после сдерживания, не используя предыдущую VM.
Проверить ключ только для чтения
На этом шаге вы отличите недействительный ключ от действительного с недостаточными правами. Новая среда начинается после сдерживания: key_support_old отозван, задача использует его прежний секрет, пакет daily не обработан. Файлы и VM предыдущей работы не нужны. Ключи и токены оператора относятся к этой VM; получите значения здесь, не используйте данные прежнего окружения.
Workstation — терминал обслуживания в /home/labex/project/repository. Integration работает под keyworker в /home/labex/project. Key Manager — интерфейс обслуживания провайдера. Учебный API расположен на http://127.0.0.1:8000; его синтетическое поведение специально для этого курса.
Scope, или область разрешений, позволяет именованную операцию. Минимальные привилегии дают только необходимые задаче операции, оставляя остальные недоступными. Программа читает обращения и публикует сводки, но не читает каталог клиентов.
| Операция | Требуемая область | Нужна задаче? |
|---|---|---|
GET /v1/tickets |
tickets:read |
Да: вход |
POST /v1/summaries |
summaries:write |
Да: выход |
GET /v1/customers |
customers:read |
Нет |
GET /v1/health |
health:read |
Нет: отдельный монитор |
GET /v1/results |
tickets:read |
Просмотр полученных сводок |
Распознать ошибку разрешений
Подготовленный демонстрационный ключ только для чтения действителен, но не разрешает публикацию. В Workstation отправьте запрос публикации. curl -X POST выбирает запись; -H задаёт заголовки, -d — тело JSON, -s скрывает прогресс, -w показывает статус. Пустого объекта {} достаточно: провайдер отклоняет разрешение раньше проверки тела: Заголовок Content-Type: application/json сообщает сервису, что тело имеет формат JSON.
curl -s -w '\nHTTP %{http_code}\n' -X POST -H 'Authorization: Bearer lab_demo_read_only' -H 'Content-Type: application/json' -d '{}' http://127.0.0.1:8000/v1/summaries
{"error":"Missing scope","required":"summaries:write"}
HTTP 403
Здесь 403 означает успешную аутентификацию, но отсутствие нужной области. В отличие от него, 401 отвергает сам ключ. Ключ чтения не выполнит задачу чтения и записи, а полный доступ избыточен. Замене нужны две бизнес-области из таблицы.
Выдать отдельную замену
На этом шаге вы выдадите отдельную замену с двумя областями, выбранными ранее. Её секрет вы сохраните закрыто на следующем шаге. Имя служит удобной меткой; разрешения определяют только области.
Выдать отдельный ключ
В Workstation покажите токен оператора командой cat, выводящей файл:
cat /home/labex/.config/keylab/operator-token
В Key Manager введите его в Operator token, нажмите Sign in, затем Open Key Manager. Аутентификация оператора отделена от ключей приложений. Убедитесь, что key_support_old уже имеет статус Revoked.
В Issue a key задайте Name как Support summary replacement. Отметьте только tickets:read и summaries:write, затем нажмите Issue key. Появятся несекретный ID и Secret shown once. Скопируйте секрет, начинающийся с lab_key_, перед уходом со страницы. Провайдер хранит хеш, а не восстанавливаемый секрет. Хеш — односторонний отпечаток: он позволяет сравнить переданное значение, не показывая сохранённый оригинал.
Если значение потеряно, отзовите неиспользованный ключ по ID и выдайте другой. Не возвращайтесь к раскрытому значению и не расширяйте права для исправления ошибки копирования.
Сохранить закрытую конфигурацию выполнения
На этом шаге вы сохраните замену в закрытом файле служебной учётной записи и проверите права доступа. Все следующие команды выполняйте в Integration.
Конфигурация выполнения — файл, который читает работающая программа. Worker читает /home/labex/project/runtime/job.ini при каждом запуске, поэтому перезапуск сервиса не нужен. Пример репозитория — другой файл. В Integration покажите текущую конфигурацию:
cat /home/labex/project/runtime/job.ini
[integration]
api_key = lab_key_support_exposed
Не сохраняйте секреты в репозитории и истории команд. Bash read принимает значение по приглашению: -r сохраняет буквальные символы, -s скрывает ввод, -p печатает приглашение. API_KEY — временная переменная оболочки. Выполните команду в Integration, вставьте секрет по приглашению и нажмите Enter. Ввод не отображается:
read -r -s -p 'Replacement key: ' API_KEY
printf выводит форматированный текст. \n создаёт переносы строк, %s вставляет значение, двойные кавычки сохраняют его одним аргументом, > заменяет указанный файл. Существующий закрытый файл принадлежит keyworker, пользователю этого терминала:
printf '[integration]\napi_key = %s\n' "$API_KEY" > /home/labex/project/runtime/job.ini
Установите права командой chmod. Режим 600 разрешает чтение и запись только владельцу; группа и остальные аккаунты не имеют доступа:
chmod 600 /home/labex/project/runtime/job.ini
ls -l показывает владельца и права, не раскрывая секрет:
ls -l /home/labex/project/runtime/job.ini
Найдите -rw------- и владельца keyworker. Размер и дата могут отличаться. Одна переменная не обновляет файл; сохранение конфигурации заставляет следующий запуск worker использовать новый ключ.
Оставьте этот терминал Integration открытым. API_KEY принадлежит этой оболочке, а не всем терминалам. Следующий шаг использует её для независимых запросов, затем удаляет. Если закроете или переподключите терминал, повторите этот шаг с текущим секретом из job.ini, показанным командой cat выше.
Выполнить и проверить бизнес-задачу
На этом шаге вы обработаете ожидающий пакет daily и проверите разрешённые и запрещённые действия. Worker подготовлен: оставьте /opt/keylab/worker.py неизменным. Задача — восстановить ключ, а не переделать программу для обхода аутентификации.
В Integration запустите назначенный пакет:
python3 /opt/keylab/worker.py daily
Read batch: daily (3 items)
{"batch":"daily","count":3,"subjects":["Reset password","Invoice copy","Delivery question"]}
Received batch: daily
Receiving key ID: ...
ID получателя должен совпасть с ID замены в Key Manager. При 401 проверьте, что сохранён секрет активной замены. При 403 сравните области с таблицей. При необходимости отзовите неверно ограниченный ключ, выдайте правильный, обновите закрытый файл и повторите пакет. Повтор заменяет принимающую запись, не создавая дубликаты сводки.
Проверить фактический принимающий сервис
Продолжайте в том же терминале Integration. Переменная API_KEY предыдущего шага ещё доступна; повторно вводить однократно показанный секрет не нужно.
Используйте конечную точку результатов только для чтения. Конвейер | передаёт ответ следующей программе; python3 -m json.tool запускает форматировщик JSON с удобными отступами:
curl -s -H "Authorization: Bearer $API_KEY" http://127.0.0.1:8000/v1/results | python3 -m json.tool
Найдите daily, три темы внутри payload и key_id замены. Запись поступает из принимающего API, а не из локального файла успеха. Backend также записывает, каким ключом прочитаны исходные данные.
Теперь запросите запрещённый каталог клиентов:
curl -s -w '\nHTTP %{http_code}\n' -H "Authorization: Bearer $API_KEY" http://127.0.0.1:8000/v1/customers
{"error":"Missing scope","required":"customers:read"}
HTTP 403
Ожидаемый отказ подтверждает ограничение ключа. Удалите временную переменную командой unset, когда она больше не нужна; сохранённый файл выполнения останется неизменным:
unset API_KEY
В Workstation убедитесь, что старый ключ не работает, а монитор исправен:
curl -s -w '\nHTTP %{http_code}\n' -H 'Authorization: Bearer lab_key_support_exposed' http://127.0.0.1:8000/v1/tickets
{"error":"Invalid or revoked key"}
HTTP 401
curl -s -w '\nHTTP %{http_code}\n' -H 'Authorization: Bearer lab_key_monitor_only' http://127.0.0.1:8000/v1/health
{"status":"ok","integration":"monitor"}
HTTP 200
Наконец, git status --short кратко перечисляет изменённые и неотслеживаемые файлы репозитория:
git status --short
При следовании инструкции вывода нет: изменён только закрытый файл выполнения. Никогда не помещайте замену в пример или коммит. Как показала первая работа, история сохраняет секреты после исчезновения видимых строк.
Резюме
Вы различили ошибку аутентификации и нехватку разрешений, выбрали пару областей чтения и записи, закрыто сохранили однократно показанный секрет и завершили ожидающую сводку. Проверили принимающую запись, отказ старому ключу, запрет доступа к клиентам и доступность монитора. Полезная ротация восстанавливает законную работу и убирает доступ раскрытого ключа.



