惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
爱范儿
爱范儿
V
Visual Studio Blog
The Register - Security
The Register - Security
P
Proofpoint News Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
Y
Y Combinator Blog
M
MIT News - Artificial intelligence
大猫的无限游戏
大猫的无限游戏
L
LangChain Blog
The Cloudflare Blog
Hugging Face - Blog
Hugging Face - Blog
Microsoft Azure Blog
Microsoft Azure Blog
T
Threatpost
P
Proofpoint News Feed
美团技术团队
A
About on SuperTechFans
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
MongoDB | Blog
MongoDB | Blog
C
Check Point Blog
Vercel News
Vercel News
L
Lohrmann on Cybersecurity
N
News and Events Feed by Topic
宝玉的分享
宝玉的分享
T
Tor Project blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Spread Privacy
Spread Privacy
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cisco Blogs
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cyberwarzone
Cyberwarzone
C
Cybersecurity and Infrastructure Security Agency CISA
S
Security @ Cisco Blogs
AWS News Blog
AWS News Blog
SecWiki News
SecWiki News
I
InfoQ
PCI Perspectives
PCI Perspectives
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hacker News - Newest:
Hacker News - Newest: "LLM"
Latest news
Latest news
Stack Overflow Blog
Stack Overflow Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
H
Help Net Security
B
Blog RSS Feed
H
Hacker News: Front Page
雷峰网
雷峰网
Know Your Adversary
Know Your Adversary

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Подмена субъекта в Keycloak: не кнопка, а модель безопасности
Миша Пименова · 2026-06-02 · via Все публикации подряд на Хабре

6 мин

6.1K

Запрос «а дайте саппорту возможность заходить под пользователем» почти всегда звучит как простая фича. На практике это изменение в модели авторизации, аудита и ответственности. В терминах Keycloak задача формулируется не как «войти под пользователем», а как «разрешить субъекту A получить токен, в котором он будет субъектом Б, с контролируемыми правами и прозрачным аудитом». Это принципиально важно, потому что Keycloak оперирует токенами, клиентами и правами на их выпуск, а не кнопками на экране.

Почему встроенная подмена субъекта — не решение

В админ-консоли Keycloak есть функция подмены субъекта, которая позволяет завершить текущую административную сессию, создать сессию пользователя и переключить контекст работы так, будто действия выполняются уже от его имени.

Для разработки и тестирования это удобно. Для реализации — проблемно. Основные узкие места:

  • теряется информация об инициаторе действий;

  • в логах остаётся только пользователь;

  • аудит становится неполным;

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

Корректный подход: обмен ключами доступа

Keycloak предоставляет механизм обмена ключами доступа, который решает задачу на уровне протокола.

Как это работает

Клиент (например, администратор) с активным ключом доступа совершает следующие действия:

  • отправляет запрос на /protocol/openid-connect/token;

  • указывает grant_type=urn:ietf:params:oauth:grant-type:token-exchange;

  • передаёт: subject_token (текущий ключ доступа сотрудника); requested_subject (ID пользователя); опционально scope и audience.

Keycloak в этот момент:

  • проверяет права клиента;

  • сверяет разрешения на подмену субъекта;

  • выпускает новый ключ доступа с другим sub.

Основные настройки в Keycloak

С Keycloak всё как с хорошей техникой: снаружи может казаться, что сейчас нажмём пару кнопок — и всё заработает. Но если речь про обмен ключами доступа, внутри уже начинается территория правил, ограничений и аккуратных настроек.

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

1. Разрешение обмена ключами доступа для клиента

Сначала нужно подготовить сам клиент. Без этого функция token-exchange просто не взлетит, даже если дальше всё настроено правильно.

В настройках клиента:

  • включите сервисные учётные записи (Service Accounts), если используется серверная часть;

  • настройте разрешения клиента (Client Permissions);

  • разрешите token-exchange.

2. Политики и разрешения

Дальше начинается самое важное: определить, кто вообще может запускать обмен ключами доступа и в каких случаях. Здесь лучше сразу задавать правила явно.

Через сервисы авторизации (Authorization Services):

  • создайте политику (policy) — например, ролевую (role-based) с ролью поддержки;

  • создайте разрешение для token-exchange;

  • Ограничьте, кто может выполнять обмен и для каких пользователей он доступен, при необходимости — через атрибуты (attributes).

3. Ограничение области доступа

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

Для этого:

  • используйте клиентские области доступа (client scopes);

  • ограничивайте роли;

  • не передавайте лишние утверждения (claims).

Архитектура взаимодействия

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

Если разложить процесс по шагам, сценарий выглядит так:

  • Сотрудник авторизуется и получает ключ доступа, где subject = support user.

  • На экране запускается действие «работать как пользователь».

  • Серверная часть отправляет запрос на обмен ключа и получает новый, где subject = target user.

  • После этого серверная часть использует новый ключ для запросов к сервисам.

Самое важное: не терять инициатора

На этом месте всё обычно выглядит обманчиво просто: ключ обменяли, доступ получили, сценарий работает. Но именно тут часто и прячется главная проблема.

По умолчанию новый ключ подменяет субъект. А если заранее не продумать, как сохранять информацию об инициаторе, очень быстро теряется контекст: кто именно запустил действие, от чьего имени оно произошло и что потом с этим делать в логах и разборе инцидентов.

Решение

Чтобы не потерять инициатора, стоит использовать:

  • утверждение act (claim act);

  • или пользовательские утверждения (claims) через сопостовители протокола (protocol mappers).

Пример структуры:

Или в пользовательском варианте:

Ведение журнала событий и аудит

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

Минимальный набор выглядит так:

  • логировать, кто инициировал действие;

  • логировать, от чьего имени выполнялось действие;

  • фиксировать время;

  • фиксировать само действие;

  • показывать режим подмены субъекта в интерфейсе;

  • хранить такие события отдельно в журнале аудита, а не только в журнале приложения.

Без этого подмена субъекта — это уже не удобный инструмент, а потеря управляемости.

Режим должен быть виден сразу

Здесь лучше не надеяться на внимательность пользователя. Если человек работает от чужого имени, экран должен говорить об этом прямо.

Для этого обычно рекомендуют:

  • добавить баннер вроде «Вы действуете как пользователь X»;

  • предусмотреть заметную кнопку выхода из этого режима;

  • визуально отличать такую сессию от обычной.

Это снижает риск ошибок и делает работу заметно прозрачнее.

Частая ошибка

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

Проблема обычно в одном или сразу в нескольких местах:

  • не передали утверждение об инициаторе (actor claim);

  • не настроили аудит;

  • не развели события в логах.

И вот тут начинается самое неприятное: исправлять такую историю после запуска долго, дорого и неудобно. Поэтому такие вещи лучше закладывать сразу, а не оставлять на потом.

Если в продукте уже назрели сложные сценарии доступа, роли, аудит и действия от имени пользователя, Mish поможет спроектировать это так, чтобы система оставалась безопасной, прозрачной и управляемой не только на запуске, но и в поддержке.

Альтернатива: без полной подмены субъекта

На практике подмена субъекта нужна не всегда. Во многих сценариях можно решить задачу аккуратнее и безопаснее, не подменяя личность пользователя целиком.

Подход может быть таким:

  • сотрудник поддержки остаётся собой;

  • серверная часть получает target_user_id;

  • проверяет права;

  • выполняет действия в контексте данных пользователя, но не от его имени.

Плюсы этого подхода в том, что он проще в реализации, безопаснее и прозрачнее в логах. Минусы в том, что он не подходит для проверки интерфейса и не всегда позволяет воспроизвести поведение клиента один в один.

Когда подмена субъекта действительно нужна

Использовать эту функцию стоит только тогда, когда без нее действительно не обойтись. Например:

  • если нужно точно воспроизвести поведение пользователя;

  • если важен полный контекст — роли, атрибуты, сессии;

  • если иначе нельзя нормально диагностировать проблему.

Во всех остальных случаях разумно сначала посмотреть в сторону более безопасных альтернатив.

Итог

Подмена субъекта в Keycloak — это не мелочь и не быстрый обходной приём. Это полноценная часть модели безопасности, и относиться к ней лучше именно так.

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

Если вы не хотите собирать такие механики по частям и потом дорого исправлять архитектурные просчёты, приходите в Mish — поможем продумать логику доступа, поведение интерфейсов и техническую реализацию как единую систему.

Это нарушение базового требования непрерывность идентичности субъекта.