gpt4 book ai didi

postgresql - 使用 ssl 证书和带卷的 key 部署 postgresql docker

转载 作者:行者123 更新时间:2023-11-29 11:39:23 36 4
gpt4 key购买 nike

我正在尝试部署 postgresql 容器。我正在尝试使用卷将 ssl 证书和 key 放入容器中,但我无法获得正确的权限。这些文件需要容器的 postgres 可读用户,但也有有限的权限( 600 )。

是否可以使用卷,还是我必须为此覆盖 Dockerfile?

谢谢。

最佳答案

可以将 key 和证书挂载到 postgres 容器中,并且 postgres 从那里使用它们。但是您将不得不面对 server.key 的所有者和权限的问题。 .

来自 PostgreSQL Documentation on this subject :

On Unix systems, the permissions on server.key must disallow any access to world or group; achieve this by the command chmod 0600 server.key. Alternatively, the file can be owned by root and have group read access (that is, 0640 permissions).



这意味着您必须:
  • 设置所有者server.key文件到 rootpostgres .
  • 根据 server.key 文件的所有者,您必须分别设置 600640权限。 ( 更新: 在这里暗示,文件的组所有者是包含 postgres 用户的组,就像默认的 postgres 组一样)

  • 如果您在 Windows 主机上工作,您将很难解决这个问题。因为映射到容器的卷中任何文件的权限都是 -rwxr-xr-x ( 755 ),所有者将是 root .只要文件是从 Windows 卷挂载的,您就无法更改此设置。如果您尝试使用 chmod在文件上,它只会默默地失败。

    另一方面,如果您在 linux 主机上,则可以轻松完成此操作。来自主机系统的权限将保留到镜像中。所有权也将几乎没有。我的意思是, server.key 的数字所有者和组所有者。当它们被卷映射到容器中时将被保留。在主机和容器之间,它们共享 linux ACL,因此它们只是观察文件的相同属性。 (所有者、组所有者、权限)。因此,如果您在主机上的本地 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:GID999:999 .不出所料,root 有 0:0在他们两个上。

    这意味着要么必须:
  • 更改 UID:GID文件 server.key 当卷已经安装时,我们启动容器。
  • 更改 UID:GID文件 server.key 之前 我们启动容器

  • 由于在容器启动后设置此项,将意味着篡改 postgres 镜像的启动脚本 - 让我们选择在启动容器之前设置它们。在您挂载它们的本地文件系统中。

    设置 600权限和 postgres作为 server.key 的所有者

    如果您要使用 alpine派生,你需要把owner/group改成 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 的所有者

    这个例子也适用于 Alpine 图像

    示例:

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

    在这一点上,你很高兴。您只需要将 key 和证书映射到容器中,然后像往常一样启动 postgres。

    解决方案(linux/unix/macOS)

    我将在此处包含一个脚本片段,它将为您为 alpine 派生完成所有这些工作。此示例将设置 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

    我希望这能解决问题吗?

    key 生成 key 和证书的来源是 this gist .

    自己构建镜像(Windows 解决方案)

    我将包含一个关于如何自己构建镜像的小指南,以便您可以拥有一个带有 ssl 的 postgres 数据库容器。这也适用于 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

    关于postgresql - 使用 ssl 证书和带卷的 key 部署 postgresql docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55072221/

    36 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com