Docker Возможности eCryptfs и Cgroup - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь смонтировать том 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?

...