Введение
Вы обслуживаете тот же загрузчик в новой среде. Политика назначений принимает любой URL, а HTTP-клиент следует перенаправлениям. Ограничьте эту функцию одним фиксированным адресом каталога, сохранив изображения и законного потребителя службы запасов.
Вы выполните небольшое объяснённое изменение Python. Workstation отправляет запросы, App Policy редактирует файл, действительно загружаемый App. Знание Python не требуется. Подготовленные данные используют управляемые имена и изолированные сети; политика относится только к этим адресам, а не обещает универсальную защиту от SSRF.
Разрешить только утверждённое назначение
На этом шаге ограничьте действующую политику утверждённым адресом магазина. Список разрешений точно определяет допустимый ввод, отклоняя остальные значения. Деловое правило:
Чтобы начать этот шаг, выберите вкладку Workstation в интерфейсе лабораторной работы.
| Схема | Имя хоста | Порт | Назначение |
|---|---|---|---|
http |
catalog.test |
8000 |
Изображения товаров |
Перейдите на вкладку Workstation. Изучите разобранный URL. Разбор разделяет адрес на поля, но не решает, безопасны ли они:
Перед выполнением следующей команды перейдите на вкладку Workstation.
python3 imagectl.py parse http://catalog.test:8000/leaf.png
Ожидаются scheme: http, hostname: catalog.test и port: 8000. Без явного HTTP-порта используется 80, который не разрешён. Попробуйте текущее небезопасное поведение:
python3 imagectl.py probe http://internal.test:8000/status
probe выполняет тот же настоящий исходящий запрос, что и импорт, но не сохраняет запись импорта. До исправления ожидается HTTP 200.
Перейдите на вкладку App Policy, открывающую рабочую область хоста с policy.py. App монтирует этот каталог и загружает помощник при каждом запросе. Откройте файл терминальным редактором:
Перед выполнением следующей команды перейдите на вкладку App Policy.
nano policy.py
Пока сохраните FOLLOW_REDIRECTS = True. Замените только строку return True на:
return (p.scheme, p.hostname, p.port or 80) == ("http", "catalog.test", 8000)
Сохраните четыре начальных пробела: Python помещает инструкции внутрь функции с помощью отступов. p = urlsplit(url) получает разобранные поля. Скобки группируют три значения в кортеж; == сравнивает весь кортеж. Выражение возвращает логическое значение True или False. p.port or 80 подставляет обычный HTTP-порт, если порт не указан. Текст в кавычках — строка, 8000 — число.
Сохраните через Ctrl+O, нажмите Enter и выйдите через Ctrl+X. Вернитесь на вкладку Workstation. Выполните:
Перед выполнением следующей команды перейдите на вкладку Workstation.
python3 imagectl.py probe http://catalog.test:8000/leaf.png
python3 imagectl.py probe http://internal.test:8000/status
Изображение должно вернуть HTTP 200; Internal — HTTP 403 с destination denied. 502 означает сбой получения, часто из-за ошибки редактирования; это не корректный отказ политики. Перейдите на вкладку App Policy, снова откройте nano policy.py, исправьте написание и отступы, сохраните. Перед повторной проверкой вернитесь на Workstation. Перезапуска нет: каждый запрос загружает сохранённую политику.
Запретить перенаправления и проверить обе стороны
На этом шаге закройте оставшийся путь перенаправления и проверьте сохранение обычной работы. Перейдите на вкладку Workstation. Попробуйте перенаправление Catalog после исправления адресатов:
Чтобы начать этот шаг, выберите вкладку Workstation в интерфейсе лабораторной работы.
Перед выполнением следующей команды перейдите на вкладку Workstation.
python3 imagectl.py probe http://catalog.test:8000/redirect
Оно всё ещё возвращает JSON Internal: HTTP-клиент следует перенаправлению после первоначальной проверки. Магазину нужны только прямые URL изображений, поэтому выбрана политика отказа от любых перенаправлений.
Перейдите на вкладку App Policy. Откройте тот же действующий файл:
Перед выполнением следующей команды перейдите на вкладку App Policy.
nano policy.py
Замените FOLLOW_REDIRECTS = True на FOLLOW_REDIRECTS = False. Переменная выбирает подготовленный HTTP-обработчик, отклоняющий перенаправления. Сохраните проверку назначения. Нажмите Ctrl+O, Enter, затем Ctrl+X.
Вернитесь на вкладку Workstation. Проверьте запрещённые случаи по одному:
Перед выполнением следующей команды перейдите на вкладку Workstation.
python3 imagectl.py probe http://catalog.test:8000/redirect
python3 imagectl.py probe https://catalog.test:8000/leaf.png
python3 imagectl.py probe http://catalog.test:8001/leaf.png
Для перенаправления ожидается HTTP 422 с redirect denied, для обоих неправильных адресов — HTTP 403. https — другой протокол; изменение одного порта также меняет конечную точку. Ошибка соединения или 502 не является нужным отказом.
Наконец импортируйте допустимое изображение и проверьте независимого потребителя запасов:
python3 imagectl.py fetch http://catalog.test:8000/leaf.png normal
python3 imagectl.py direct http://app.test:8000/health
Оба должны вернуть HTTP 200; проверка состояния должна включать inventory: synthetic-ready. Перейдите на вкладку Image Importer и обновите страницу, чтобы увидеть зелёную картинку. Блокировка всего, остановка Internal или правка неиспользуемой копии не выполняют цель. Если изображение не работает, перейдите на вкладку App Policy, восстановите разрешённый кортеж, затем вернитесь на Workstation и повторите разрешённый импорт; при сбое состояния сохраните внутреннюю связность App. Исправление ограничивает фиксированные адресаты и перенаправления этой функции, сохраняя сетевой доступ законного потребителя инвентаря.

Для будущих двух адресов Python сравнивает кортеж с множеством через in, например (p.scheme, p.hostname, p.port or 80) in {("http", "one.test", 8000), ("http", "two.test", 8001)}. Фигурные скобки содержат две полные альтернативы. Разрешены только перечисленные сочетания, а перекрёстные пары хоста и порта отклоняются. В следующем задании будет своя таблица.
Резюме
Вы сравнили полные кортежи назначений, отключили перенаправления и проверили запрещённые запросы, сохранив изображения и службу запасов. Эти меры относятся к фиксированным управляемым идентификаторам служб.



