Rootless-контейнеры под прицелом: что выдаёт SSH-доступ

📋 Кратко

Rootless-контейнер снижает последствия компрометации, но не делает SSH-доступ безопасным сам по себе. При подключении раскрываются параметры сервера, имя учётной записи, признаки среды и сведения о доступных полномочиях. Разбираем, чем отличается вход на хост от входа в контейнер, почему приватный ключ нельзя передавать процессу и какие настройки проверять в первую очередь.

⏱ 6 минут чтения│сложность

Rootless-контейнер запускается без привилегий администратора. Он использует пользовательские пространства имён и отдельное отображение идентификаторов. Такой режим уменьшает последствия ошибки внутри приложения. Но он не отменяет риск утечки ключей и доступа к связанным сервисам.

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

Главная мысль: rootless ограничивает привилегии контейнера, но не скрывает сам факт доступа. SSH раскрывает технические признаки среды, а ошибка в архитектуре может открыть ключ, сокет агента или служебные данные.

Rootless снижает последствия компрометации узла
Rootless снижает последствия компрометации узла

🔍 Что такое rootless-контейнер

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

Изоляция ограничивает права, но не секреты
Изоляция ограничивает права, но не секреты

Rootless-режим запускает контейнер от имени обычного пользователя. Он не требует привилегий администратора. Внутренний пользователь контейнера получает отдельное отображение идентификаторов. Поэтому root внутри контейнера не равен root на хосте.

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

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

🧱 Какие границы создаёт rootless-режим

Rootless-контейнер работает в пользовательском пространстве. Его права отличаются от прав системного контейнера. Это влияет на доступ к файловой системе, сетевым функциям и ресурсам узла.

SSH раскрывает следы инфраструктуры и связей
SSH раскрывает следы инфраструктуры и связей

Ограничения появляются и у средств управления. Podman работает без постоянного управляющего демона. Buildah создаёт образы, а Skopeo копирует, проверяет и подписывает их. Для запуска контейнеров применяются совместимые с OCI средства.

Среда выполнения crun даёт дополнительные возможности для rootless-контейнеров. Она помогает управлять запуском без привилегий администратора. Но сам рантайм не защищает секреты, которые уже передали процессу.

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

🔐 Что раскрывает SSH-подключение

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

Каждый дополнительный вход расширяет поверхность атаки
Каждый дополнительный вход расширяет поверхность атаки

Во время согласования видны поддерживаемые криптографические алгоритмы. Они помогают понять особенности конфигурации сервера. Косвенные признаки могут указывать на операционную систему и роль узла.

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

Важно: отпечаток открытого ключа можно показывать при проверке сервера. Приватный ключ, содержимое ssh-agent и файл authorized_keys требуют отдельной защиты.

Соберите журналы входов и сопоставьте их со временем подключений. Отдельно отметьте повторяющиеся отпечатки и учётные записи.

🧭 Чем отличается вход на хост от входа в контейнер

SSH-доступ к хосту открывает сессию операционной системы. Дальше пользователь может обращаться к средствам управления контейнерами. Объём доступа зависит от прав учётной записи и настроек среды.

Доступ к операции безопаснее передачи приватного ключа
Доступ к операции безопаснее передачи приватного ключа

Вход внутрь контейнера по SSH — другая схема. Приложению обычно не нужен отдельный SSH-сервер внутри образа. Такой сервер добавляет ещё одну точку входа и усложняет контроль.

Третий вариант — подключение к служебному контейнеру через средства управления рантаймом. В этом случае SSH не обязан работать внутри контейнера. Нужно отдельно контролировать права на управляющий интерфейс.

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

🎯 Какие признаки указывают на контейнерную среду

Контейнер может выдавать себя нестандартным именем узла. Дополнительным признаком становится необычный сетевой адрес. В совокупности эти данные показывают, что сессия проходит не на обычной рабочей станции.

Контроль начинается с инвентаризации и журналирования
Контроль начинается с инвентаризации и журналирования

Среду также выдают переменные окружения и смонтированные каталоги. Важны сведения о группах контроля ресурсов и пользовательских пространствах имён. Характерные пути к данным рантайма дополняют картину.

Различия в правах помогают понять границу между контейнером и хостом. Один и тот же идентификатор пользователя может выглядеть по-разному внутри разных пространств имён. Поэтому вывод команды не всегда описывает реальные права на узле.

Проверьте, какие имена, пути и переменные доступны процессу. Сократите их до необходимого минимума.

⚠️ Почему доступный ключ остаётся проблемой

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

Rootless-режим не меняет этого правила. Он ограничивает привилегии контейнера, но не отменяет права самого приложения. Если ключ доступен пользователю контейнера, атакующий может попытаться использовать его в рамках этих прав.

Отдельный риск создаёт SSH-агент. Сокет агента позволяет процессу обращаться к операциям аутентификации. При этом приватный ключ может не покидать агент. Но доступ к сокету всё равно требует строгого контроля.

Проверьте, не попал ли приватный ключ в образ, том или переменную окружения. Также проверьте, какие процессы видят SSH_AUTH_SOCK.

🛠️ Архитектура без передачи приватного ключа

Безопаснее разделить использование доступа и хранение секрета. Процесс получает возможность выполнить нужную SSH-операцию. Сам приватный ключ остаётся за пределами контейнера.

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

Обычное монтирование SSH_AUTH_SOCK может не подойти процессу с другим non-root UID. Rootless Docker использует отображение UID и GID. Из-за этого сокет может существовать, но оставаться недоступным нужному процессу.

Сначала определите, какой процесс выполняет SSH-операцию. Затем проверьте владельца сокета, группу и фактические права доступа.

🔒 Как контролировать SSH-доступ в контейнере

Начните с отказа от SSH-сервера внутри контейнера. Для управления контейнером используйте штатные средства рантайма. Это уменьшает число служб и упрощает анализ журналов.

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

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

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

Минимальный контроль: отдельная учётная запись, разные ключи для разных ролей, отсутствие приватных ключей в образах, проверка SSH-агента и журналирование каждого входа.

📊 Что проверять после подключения

Один факт входа не доказывает компрометацию. Нужно отделить признаки обычной сессии от действий, которые меняют состояние среды. Время подключения сопоставляют с командами и обращениями к сервисам.

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

Отдельно проверяйте доступ к сокету агента. Важны также права на каталоги с данными рантайма. Запись в журнале не показывает всех возможностей процесса, поэтому нужны данные о конфигурации.

Зафиксируйте эталонные параметры контейнера. При каждом изменении сравнивайте их с предыдущим состоянием.

🧪 Практический чек-лист для команды

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

  • Определите владельца каждого контейнера и процесса.
  • Проверьте режим запуска: rootless или с привилегиями администратора.
  • Найдите приватные ключи в образах, томах и переменных окружения.
  • Проверьте доступ контейнеров к SSH-агенту и его сокету.
  • Сравните отпечатки открытых ключей на разных узлах.
  • Проверьте файл authorized_keys и историю его изменений.
  • Уберите SSH-сервер из образов, где он не нужен.
  • Сопоставьте журналы входов с фактическими задачами приложения.

После проверки оформите отдельный список разрешённых действий. Для каждой учётной записи укажите срок действия доступа и владельца.

Повторяйте проверку после обновления образа и изменения монтирований. Не считайте rootless-режим заменой контролю секретов.

✅ Итог: что выдаёт SSH-доступ

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

Rootless-контейнер снижает последствия компрометации. Он использует пользовательские пространства имён и запускается без привилегий администратора. Но доступный процессу ключ, сокет агента или управляющий интерфейс остаются риском.

Защитная модель строится вокруг минимальных прав. Процесс получает только нужную SSH-операцию. Приватный ключ хранится отдельно, а все изменения фиксируются в журналах.

Сделайте сегодня: удалите ненужный SSH-сервер из контейнеров, проверьте доступ к SSH-агенту и найдите повторно используемые ключи. Затем сопоставьте эти данные с журналами входов.

📚 Читайте также

📖 Термины

Container Security · IAM (Identity and Access Management) · SSH · Threat Hunting · Индикаторы компрометации (IoC)

🔗 Источники