Можно смонтировать ключ и сертификат в контейнер postgres, а для postgres использовать их оттуда. Но вам придется столкнуться с проблемой с владельцем и разрешениями server.key
.
Из Документации PostgreSQL по этому вопросу :
В системах Unix разрешения на server.key должны запрещать любые
доступ к миру или группе; добиться этого командой chmod 0600
server.key. Кроме того, файл может принадлежать пользователю root и иметь
групповой доступ на чтение (то есть 0640 разрешений).
Это означает, что вы должны:
- Установите владельца файла
server.key
либо root
, либо postgres
.
- В зависимости от владельца файла 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
на обоих из них.
Это означает, что либо нужно:
- Измените
UID:GID
файла server.key
после того, как мы запустим контейнер, когда том уже смонтирован.
- Измените
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