podman 以无根用户 运行的mongo容器 秘钥keyfile校验不过


问题:普通用户 用podman 创建的mongdb容器  需要校验keyfile 但容器内的keyfile文件是root权限,导致keyfile校验是权限不够问题,以下方法都试过  暂时都不行,以后找到方法再更新

最新!!最终解决办法已找到:通过ps -ef |grep mongo,可以查看mongo进程的用户ID,比如是100998,只需要将keyfile文件的所有者改为100998即可。


ChatGPT 说:
ChatGPT
当使用 Podman 运行 MongoDB 容器并启用 keyfile 认证时,如果 keyfile 文件是以 root 权限存在于容器中,而 Podman 是以非 root 模式运行的,MongoDB 可能因为无法访问该文件而启动失败。这是由于 Podman 无根模式下用户权限隔离的设计导致的。

为了解决这个问题,你可以通过调整 keyfile 的权限或用户 ID 映射来确保 Podman 无根容器能够正确访问 keyfile 文件。以下是一些可能的解决方法:

1. 修改 keyfile 文件的权限
最直接的解决方案是调整容器内的 keyfile 文件权限,使其对容器内的非 root 用户可读。MongoDB 需要 keyfile 的权限为 600 或更严格,因此你可以将文件的所有者设置为容器内的 MongoDB 进程用户,并确保权限正确。

步骤:
启动 MongoDB 容器时挂载 keyfile:

使用 podman 启动 MongoDB 容器时,可以将本地的 keyfile 文件挂载到容器中。
bash
复制代码
podman run -d \
  --name mongodb \
  -v /path/to/keyfile:/data/configdb/keyfile:Z \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=secret \
  mongo --auth --keyFile /data/configdb/keyfile
:Z 表示 Podman 将为该文件设置合适的 SELinux 标签(如果启用 SELinux)。

设置正确的文件权限:

挂载文件后,进入容器并手动调整 keyfile 的权限。
bash
复制代码
podman exec -it mongodb bash
chmod 600 /data/configdb/keyfile
chown mongodb:mongodb /data/configdb/keyfile
chmod 600 将权限设为仅允许 MongoDB 进程用户读取该文件。

验证文件权限是否正确:

确保文件所有权和权限已经正确设置。
bash
复制代码
ls -l /data/configdb/keyfile
输出应类似于:

bash
复制代码
-rw------- 1 mongodb mongodb 261 Oct 15 12:34 /data/configdb/keyfile
2. 使用 Podman 的用户命名空间映射
如果调整文件权限后仍然无法解决问题,你可以考虑使用 Podman 的 用户命名空间映射 功能,映射容器内 MongoDB 用户的 UID 到主机系统上的一个非 root 用户。这样可以避免 root 权限问题,同时保持文件访问的安全性。

步骤:
查找 MongoDB 容器内部 MongoDB 用户的 UID: 你可以使用 Podman 的 exec 命令进入容器,查找 MongoDB 用户的 UID。

bash
复制代码
podman exec -it mongodb bash
id mongodb
输出可能类似于:

bash
复制代码
uid=999(mongodb) gid=999(mongodb)
启动容器时指定 UID 映射: 使用 Podman 启动 MongoDB 容器时,指定 UID 映射,将容器内 MongoDB 用户的 UID 映射为主机系统上的非 root 用户。

bash
复制代码
podman run -d \
  --name mongodb \
  --uidmap 999:1000:1 \
  -v /path/to/keyfile:/data/configdb/keyfile:Z \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=secret \
  mongo --auth --keyFile /data/configdb/keyfile
上述命令将容器内的 UID 999(MongoDB 用户)映射到主机上的 UID 1000(普通用户)。

3. 使用无根容器和卷权限
Podman 支持无根容器,但无根容器在挂载本地文件时可能会遇到权限问题,因为容器中的进程权限低于主机上的 root 权限。可以通过以下步骤确保无根容器能够正确访问挂载的卷:

确保挂载目录和文件的所有权正确: 在主机系统上,将挂载目录和文件的所有者设置为与 Podman 容器内的用户 ID 匹配的用户。

bash
复制代码
sudo chown 1000:1000 /path/to/keyfile
chmod 600 /path/to/keyfile
假设你将容器内 MongoDB 用户的 UID 映射为 1000(或其他 UID),则确保文件的所有者是该 UID。

使用 --userns=keep-id 保持 UID 映射: 启动容器时使用 --userns=keep-id 参数,保持当前用户的 UID 映射,从而确保容器能够访问主机文件系统。

bash
复制代码
podman run -d \
  --name mongodb \
  --userns=keep-id \
  -v /path/to/keyfile:/data/configdb/keyfile:Z \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=secret \
  mongo --auth --keyFile /data/configdb/keyfile
这种方式可以确保无根容器能够正确访问主机上的文件。

4. 使用 root 模式启动 MongoDB
如果不介意以 root 权限运行容器,最简单的解决方法是直接以 root 模式运行容器,而不依赖无根容器模式。

bash
复制代码
sudo podman run -d \
  --name mongodb \
  -v /path/to/keyfile:/data/configdb/keyfile:Z \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=secret \
  mongo --auth --keyFile /data/configdb/keyfile
这种方法会让容器中的 MongoDB 以 root 权限运行,并且可以轻松访问所有文件,但这降低了安全性。

总结
为了使 Podman 的 MongoDB 容器能够正确访问 keyfile 文件,你可以采取以下几种解决方案:

调整文件权限:确保 keyfile 文件权限正确,且容器内的 MongoDB 用户能够访问该文件。
使用用户命名空间映射:通过 Podman 的用户命名空间映射功能,确保 MongoDB 容器的用户 ID 能够映射到主机上的非 root 用户。
调整无根容器权限:在无根模式下,确保主机上的文件和目录具有合适的权限。
以 root 模式运行:如果安全性不是主要考虑因素,可以直接以 root 模式运行 MongoDB 容器,避免权限问题。
你可以根据实际需求选择最适合的方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值