Я пытаюсь смонтировать том eCryptfs на работающем контейнере после некоторого теста с привилегированным режимом root и , все работает отлично, но теперь я собираюсь ограничить все доступ по соображениям безопасности и .. без привилегированного режима все cra sh.
Так что же на самом деле делает привилегированный режим ..
Относится к docker документации: https://docs.docker.com/engine/reference/commandline/run/
Флаг --privileged дает все возможности контейнеру, а также подъемам все ограничения, налагаемые контроллером cgroup устройства . Другими словами, контейнер может делать почти все, что может делать хост. Этот флаг существует, чтобы разрешить особые варианты использования, например, запуск Docker в Docker.
После некоторого теста я получил следующие результаты:
- root и привилегированный режим (OK)
- no- root и привилегированный режим (OK)
- root и без привилегированного режима (KO)
- root и без привилегированного режима и все возможности (KO)
- no- root и без привилегированного режима и только необходимые возможности (KO ) <== Я хочу это </li>
Я даю все возможности , и я думаю, что проблема заключается в ограничениях , введенных контроллером cgroup устройства , я Не знаете, как решить эту проблему, и как я могу вручную "снять" необходимое ограничение?
Я понимаю, что мне нужен доступ к частям ядра:
- связка ключей для хранения / получения ключа шифрования / знака * 10 77 *
- Файловая система для монтирования тома.
Первое сообщение об ошибке появляется при использовании ecryptfs-add-passphrase
ecryptfs-add -passphrase
Ошибка: вставка ключа в цепочку ключей сеанса пользователя не удалась [-1]
Информация: проверьте системный журнал для получения дополнительной информации от libecryptfs
cat / var / log / messages
9 января 13:44:08 1e3c26af2f52 syslog.info syslogd запущен: BusyBox v1.31.1
9 января 13:44:12 1e3c26af2f52 пользователь .err: keyctl_search завершилась неудачно: операция недопустима r c = [-1]
Второе сообщение об ошибке появляется, когда мы используем mount
mount -t ecryptfs -o key = passphrase: passphrase_passwd = $ {mountphrase}, no_sig_cache = yes, verbose = no, ecryptfs_sig = $ {sig}, ecryptfs_cipher = aes, ecryptfs_key_bytes = 16, ecryptfs_passthrough = no, ecryptfs_enable * encryptionname_c / tmp / encryp = 11 / tmpp = = 1112 * Невозможно связать KEY_SPEC_USER_KEYRING с KEY_SPEC_SESSION_KEYRING; что-то не так с вашей связкой ключей ядра. Вы встроили поддержку хранения ключей в свое ядро? mount: разрешение отклонено (вы root?)
Если я устраню первую ошибку, я думаю, что вторая будет go удалена (за исключением случая, когда придет другая), из-за возможности или доступа к ядру ограничение.
если вы хотите проверить:
Dockerfile
----------------------------------------------------------
FROM alpine:latest AS encrypt
RUN apk update && apk upgrade
RUN apk add gnupg ecryptfs-utils nano sudo
RUN addgroup docker.worker && \
adduser -G docker.worker -D -h /home/docker.worker -s /bin/nologin docker.worker
# in this context we got the script below
COPY /home/docker.worker .
RUN echo "docker.worker ALL=(root) NOPASSWD:/bin/mount" >> /etc/sudoers
RUN mkdir -p /tmp/encrypt
RUN chown -R docker.worker:docker.worker /home/docker.worker /tmp/encrypt
RUN chmod -R 700 /home/docker.worker /tmp/encrypt
USER docker.worker:docker.worker
WORKDIR /home/docker.worker
# For the moment go to ash but after its another bin
ENTRYPOINT ["/bin/ash","-c"]
Сценарий создает том eCryptfs на / tmp / encrypt и монтирует их.
$ ./mount /tmp/encrypt
----------------------------------------------------------
#!/bin/ash
#Set this variable to your mount passphrase. Ideally you'd get this from $1 input so that the actual value isn't stored in bash script. That would defeat the purpose.
mountphrase='YOURMOUNTPASSPHRASE'
#Add tokens into user session keyring
printf "%s" "${mountphrase}" | ecryptfs-add-passphrase > tmp.txt
#Now get the signature from the output of the above command
sig=`tail -1 tmp.txt | awk '{print $6}' | sed 's/\[//g' | sed 's/\]//g'`
rm -f tmp.txt #Remove temp file
mount -t ecryptfs -o key=passphrase:passphrase_passwd=${mountphrase},no_sig_cache=yes,verbose=no,ecryptfs_sig=${sig},ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_passthrough=no,ecryptfs_enable_filename_crypto=no $1 $1
Окружение:
Linux VMAlpine 4.19.80-0-vanilla #1-Alpine SMP Fri Oct 18 11:27:53 UTC 2019 x86_64 Linux
Client:
Version: 18.09.8-ce
API version: 1.39
Go version: go1.12.6
Git commit: 0dd43dd87fd530113bf44c9bba9ad8b20ce4637f
Built: Sat Jul 20 15:20:06 2019
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 18.09.8-ce
API version: 1.39 (minimum version 1.12)
Go version: go1.12.6
Git commit: 0dd43dd87fd530113bf44c9bba9ad8b20ce4637f
Built: Sat Jul 20 15:19:08 2019
OS/Arch: linux/amd64
Experimental: false
Связано:
Использование ecryptfs внутри Docker без --privileged. Подходящее значение для --device?