Вопрос или проблема
У меня есть папка 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 обычно служит для ограничения записи на уровне контейнера, важно помнить о правах доступа на уровне файловой системы, которые могут повлиять на доступность записи в подкаталогах. Убедитесь, что права настроены правильно, чтобы избежать нарушений безопасности. Если вы исправите права или управлять пользователями в контейнере, ваша цель по ограничению записи должна быть достигнута.