Развертывание postgresql docker с ssl-сертификатом и ключом с томами - PullRequest
1 голос
/ 09 марта 2019

Я пытаюсь развернуть контейнер postgresql.Я пытаюсь поместить ssl сертификат и ключ в контейнер, используя тома, но я не могу получить права доступа правильно.Файлы должны быть доступны для чтения пользователю postgres контейнера, но также имеют ограниченные разрешения (600).

Возможно ли использовать тома или мне придется переопределить Dockerfile для этого?

Спасибо.

1 Ответ

4 голосов
/ 09 марта 2019

Можно смонтировать ключ и сертификат в контейнер postgres, а для postgres использовать их оттуда. Но вам придется столкнуться с проблемой с владельцем и разрешениями server.key.

Из Документации PostgreSQL по этому вопросу :

В системах Unix разрешения на server.key должны запрещать любые доступ к миру или группе; добиться этого командой chmod 0600 server.key. Кроме того, файл может принадлежать пользователю root и иметь групповой доступ на чтение (то есть 0640 разрешений).

Это означает, что вы должны:

  1. Установите владельца файла server.key либо root, либо postgres.
  2. В зависимости от владельца файла server.key вам необходимо будет соответственно установить разрешения 600 или 640 для него. ( Обновление: Здесь подразумевается, что владельцем группы файла является группа, которая содержит пользователя postgres, как и группа по умолчанию postgres)

Если вы работаете с хоста Windows, вам будет трудно с этим. Потому что разрешения для любого файла тома, который вы отображаете в контейнер, будут -rwxr-xr-x (755), а владельцем будет root. И вы не сможете изменить это, пока файл монтируется из ваших томов Windows. Если вы попытаетесь использовать chmod для файла, он просто потерпит молчание.

Если вы, с другой стороны, находитесь на хосте Linux, это можно сделать с минимальными усилиями. Разрешения от хост-системы будут сохранены в образе. И владение тоже будет, буквально. Под этим я подразумеваю, что числовой владелец и владелец группы server.key будут сохранены, когда их объем будет отображен в контейнере. Между хостом и контейнером они совместно используют ACL linux, поэтому они просто наблюдают за одинаковыми свойствами файлов. (Владелец, владелец группы, разрешения). Таким образом, если ваш локальный пользователь Linux на хост-компьютере имеет UID:GID 1000:1000, и вы создаете файл server.key, тогда для UID:GID этого файла также будет установлено значение 1000:1000. Если затем сопоставить файл с контейнером и наблюдать его изнутри - он также просто увидит 1000:1000. Это означает, что мы можем контролировать UID:GID как внутри, так и снаружи контейнера, при сопоставлении с хостом linux.

Примечание. Нет необходимости иметь пользователя с UID, который вы назначаете в качестве владельца файла, разрешено устанавливать несуществующих UID:GID владельцев файлов.

В производном образе postgres alpine пользователь / группа postgres имеет UID:GID 70:70. На производной debian postgres UID:GID равен 999:999. И не исключая, root имеет 0:0 на обоих из них.

Это означает, что либо нужно:

  1. Измените UID:GID файла server.key после того, как мы запустим контейнер, когда том уже смонтирован.
  2. Измените UID:GID файла server.key до того, как запустим контейнер

Поскольку установка этого параметра после запуска контейнера подразумевает вмешательство в сценарии запуска образа postgres - давайте выберем их установку перед запуском контейнера. В локальной файловой системе, откуда вы их монтируете.

Установка 600 разрешений и postgres в качестве владельца server.key

Если вы используете производную alpine, вам необходимо изменить владельца / группу на 70:70. Если вы используете производную debian, то 999:999.

Возможно, на вашем хосте нет пользователя, например, UID: 70, но это не проблема.

Пример:

chown 70:70 server.key # 70:70 for alpine, 999:999 for debian
chmod 600 server.key

Установка 640 разрешений и root в качестве владельца server.key

Этот пример также для альпийского изображения

Пример:

chown 0:70 server.key
chmod 640 server.key

В этот момент вам пора. Вам просто нужно сопоставить ключ и сертификат с контейнером и запустить postgres, как всегда.

Решение (linux / unix / macOS)

Я включу здесь фрагмент сценария, который сделает все это за вас для альпийской производной.В этом примере будет установлен корневой владелец server.key и владелец группы postgres.

# generate the server.key and server.crt
openssl req -new -text -passout pass:abcd -subj /CN=localhost -out server.req
openssl rsa -in privkey.pem -passin pass:abcd -out server.key
openssl req -x509 -in server.req -text -key server.key -out server.crt

# set postgres (alpine) user as owner of the server.key and permissions to 600
chown 0:70 server.key
chmod 640 server.key

# start a postgres docker container, mapping the .key and .crt into the image.
docker run -d --name postgres \ 
  -v "$PWD/server.crt:/var/lib/postgresql/server.crt:ro" \
  -v "$PWD/server.key:/var/lib/postgresql/server.key:ro" \
  postgres:11-alpine \
  -c ssl=on \
  -c ssl_cert_file=/var/lib/postgresql/server.crt \
  -c ssl_key_file=/var/lib/postgresql/server.key

Надеюсь, это все прояснит?

Источник ключа, генерирующего ключ, и сертификат - эта суть .

Создание образа самостоятельно (решение Windows)

Я приведу небольшое руководство о том, как вы можете создать образ самостоятельно, поэтомучто вы можете иметь контейнер базы данных postgres с помощью ssl.Это будет работать и в Windows.

Вот Dockerfile, который сделает это за вас:

Dockerfile

FROM postgres:11-alpine

# On Windows root will own the files, and they will have permissions 755
COPY server.key /var/lib/postgresql/server.key
COPY server.crt /var/lib/postgresql/server.crt

# update the privileges on the .key, no need to touch the .crt  
RUN chmod 600 /var/lib/postgresql/server.key
RUN chown postgres:postgres /var/lib/postgresql/server.key

Постройте образс:

docker build -t mypg:01 .

И запустить с:

docker run -d --name postgres mypg:01 \
  -c ssl=on -c ssl_cert_file=/var/lib/postgresql/server.crt \
  -c ssl_key_file=/var/lib/postgresql/server.key
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...