Комментарии 12
И ни слова о PSP. Странно.
Частично такую проблему можно решить с помощью PSP: kubernetes.io/docs/concepts/policy/pod-security-policy/#volumes-and-file-systems, а именно AllowedHostPaths. Однако это тоже не защита от симлинков. Мы добавим данный комментарий в статью.
Спасибо.
Проблема только лишь в том, что не нужно разрешать HostPath.
Выпиливаем HostPath — и уязвимость исчезает.
Действительно же — контейнеру нефиг что-либо делать на файловой системе хоста.
А вот как при этом организовать локальный сторидж верно — вопрос, который остаётся за кадром.
Сейчас нет возможности проверить: а классический chroot имеет подобную багофичу?
Здесь дело не в chroot, а в том что мы одну и ту же символьную ссылку маунтим два раза: внутри контейнера мы переписываем ссылку на /etc/shadow
, а читаем её уже с помощью kubectl logs
. Выхода за пределы chroot jail не происходит.
Прочитать /etc/shadow
хоста изнутри пода не получится.
Все дело в том, что не нужно позволять кому-попало маунтить что-угодно с хостов.
Нормальный подход в данной ситуации:
- с помощью PodSecurityPolicy запрещаем запуск подов под рутом;
- с помощью PodSecurityPolicy запрещаем все volume кроме ConfigMap, Secret, PersistentVolumeClaim + какие вам необходимы, но не HostPath/Local;
- с помощью RBAC запрещаем пользователю создавать PersistentVolume, по требованию создаем для него.
Если уж заговорили про безопасность, то добавить к перечисленному еще и ResourceQuota и NetworkPolicy.
Выход за пределы pod'а в Kubernetes через монтирование логов