Том Docker, смонтированный как :ro, все еще записываемый.

Вопрос или проблема

У меня есть папка data в корне файловой системы

arthur@debian:~$ ls -la /data
total 36
drwxr-xr-x  9 root   root            4096 13 дек 09:45 .
drwxr-xr-x 21 root   root            4096 13 дек 10:08 ..
drwxr-xr-x  2 root   root            4096 15 июн  2020 500g2
drwxr-xr-x  6 root   root            4096 16 ноя 18:20 quad_1
drwxr-sr-x  5 arthur arthur          4096 13 дек 13:29 tera_1
drwxrwxr-x  6 root   root            4096  7 дек 00:00 tera_2
drwxr-xr-x  5 root   root            4096 18 сент 21:32 tera_3
drwxr-xr-x  6 root   root            4096  5 мая  2021 tera_4

Я хочу смонтировать всю директорию как том docker, но контейнер должен иметь доступ только для чтения. Поэтому я использовал :ro

sudo docker run -it --name testcontainer -v /data:/internal_data:ro --rm alpine:latest /bin/sh

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

/ # touch /internal_data/test
touch: /internal_data/test: Read-only file system        # Ок, запись в контейнер запрещена
/ # touch /internal_data/tera_1/test                     # Это сработало
/ # touch /internal_data/tera_2/test                     # Это сработало
/ # touch /internal_data/500g2/test                      
touch: /internal_data/500g2/test: Read-only file system # Ок, запись в контейнер запрещена
/ #

Ответ или решение

Docker Volume Mounted as :ro, but Still Writable: Анализ проблемы

Введение

При использовании Docker важно правильно настроить монтирование томов для обеспечения безопасности и защиты данных. Одним из способов ограничения доступа контейнера к данным является использование параметра :ro (только для чтения) во время монтирования тома. Однако иногда возникают случаи, когда контейнеры, монтируемые с флагом :ro, все еще могут записывать данные в определенные директории. В данной статье мы разберем, почему это происходит и как можно решить данную проблему.

Описание проблемы

Вы столкнулись с ситуацией, когда при попытке создать файл в каталоге, смонтированном с параметром :ro, контейнер успешно записывает данные в некоторые подкаталоги:

/ # touch /internal_data/test                      # Ошибка: Read-only file system
/ # touch /internal_data/tera_1/test               # Успешно
/ # touch /internal_data/tera_2/test               # Успешно
/ # touch /internal_data/500g2/test                # Ошибка: Read-only file system

Причины

1. Права доступа к файлам и каталогам:

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

   drwxr-sr-x  5 arthur arthur          4096 Dec 13 13:29 tera_1
   drwxrwxr-x  6 root   root            4096 Dec  7 00:00 tera_2

2. Изоляция контейнера:

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

Решения

1. Проверка и изменение прав доступа:

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

   sudo chmod -R 555 /data

Этот набор прав (r-x для всех) запретит запись для всех пользователей.

2. Создание нового Docker образа:

В некоторых случаях, более надежным подходом может быть создание собственного Docker образа с добавлением соответствующих команд, которые поддерживают управление правами доступа в ваших каталогах.

3. Параметры запуска Docker:

Убедитесь, что вы не запускаете контейнер от имени пользователя, которому разрешен доступ в эти подкаталоги. Вы можете запустить контейнер с флагом --user, установив его на 0 (корень), что предотвратит возможности записи:

   sudo docker run -it --name testcontainer --user 0 -v /data:/internal_data:ro --rm alpine:latest /bin/sh

Заключение

Хотя использование параметра :ro при монтировании каталогов в Docker обычно служит для ограничения записи на уровне контейнера, важно помнить о правах доступа на уровне файловой системы, которые могут повлиять на доступность записи в подкаталогах. Убедитесь, что права настроены правильно, чтобы избежать нарушений безопасности. Если вы исправите права или управлять пользователями в контейнере, ваша цель по ограничению записи должна быть достигнута.

Оцените материал
Добавить комментарий

Капча загружается...