K8S:将 runAsUser 权限传递给在容器内创建的文件
K8S: Pass the runAsUser permission to files created inside container
假设我有以下 yaml:
spec:
securityContext:
fsGroup: 5678
serviceAccountName: some-account
volumes:
- name: secrets
secret:
secretName: data-secrets
- name: secrets-sftp-passwd-key
secret:
secretName: sftp-passwd-key
containers:
- name: sftp
securityContext:
runAsUser: 1234
runAsGroup: 5678
image: "some/some"
imagePullPolicy: always
ports:
- name: tcp-sftp
containerPort: 22
volumeMounts:
- name: secrets-sftp-passwd-key
mountPath: /etc/sftp/secret/
- name: data
mountPath: "/var/data"
env:
- name: "SFTP_USER"
value: "some_user"
- name: "SFTP_PASSWD"
value: "password-1"
我正在尝试 运行 容器 sftp
与 runAsUser
和 runAsGroup
。图像的入口点脚本应该采用 SFTP_USER、SFTP_PASSWD 并使用此输入创建某些密码和组文件。这些文件应该在 /var/data 文件夹中创建。在此之后,应该以 1234 用户身份使用这些密码和组文件启动 proftpd 进程。容器以 1234 用户身份启动。但这些文件的权限为 root:5678。我收到以下错误:
unable to set UID to 0, current UID: 1234
镜像入口点脚本如下:
echo "Starting to create password file"
PASSWORD=123456
echo $PASSWORD | /usr/bin/ftpasswd --passwd --file=/var/data/ftpd.passwd --name=virtual --uid=1234 --gid=5678 --home=/var/data/ --shell=/bin/bash --stdin
echo "Password file created"
/usr/bin/ftpasswd --group --name=--group --name=virtual --file=/var/data/ftpd.group --gid=5678 --member=1234
proftpd -n -4 -c /var/data/proftpd.conf --> This line is throwing the above error.
这里出了什么问题?为什么它试图将 UID 设置为 0?我的印象是提供 runAsUser
、runAsGroup
和 fsGroup
将确保 /var/data 文件夹具有 1234 的正确所有权。
正在通过以下 code 打印您遇到的错误:
if (geteuid() != daemon_uid) {
pr_log_pri(PR_LOG_ERR, "unable to set UID to %s, current UID: %s",
pr_uid2str(permanent_pool, daemon_uid),
pr_uid2str(permanent_pool, geteuid()));
exit(1);
}
您看到这个是因为您的容器用户 ID 不等于 daemon_uid
。
如果您继续寻找 daemon_uid
,您会发现以下行:
uid_t *uid = (uid_t *) get_param_ptr(main_server->conf, "UserID", FALSE);
daemon_uid = (uid != NULL ? *uid : PR_ROOT_UID);
这意味着如果配置中未提供 UserID
,则代码会将 PR_ROOT_UID
值分配给 daemon_uid
,该值似乎为 0(根 ID)。
这就是前面提到的 if 语句生成此错误消息的原因。
看看 example config 如何提供用户 ID。
假设我有以下 yaml:
spec:
securityContext:
fsGroup: 5678
serviceAccountName: some-account
volumes:
- name: secrets
secret:
secretName: data-secrets
- name: secrets-sftp-passwd-key
secret:
secretName: sftp-passwd-key
containers:
- name: sftp
securityContext:
runAsUser: 1234
runAsGroup: 5678
image: "some/some"
imagePullPolicy: always
ports:
- name: tcp-sftp
containerPort: 22
volumeMounts:
- name: secrets-sftp-passwd-key
mountPath: /etc/sftp/secret/
- name: data
mountPath: "/var/data"
env:
- name: "SFTP_USER"
value: "some_user"
- name: "SFTP_PASSWD"
value: "password-1"
我正在尝试 运行 容器 sftp
与 runAsUser
和 runAsGroup
。图像的入口点脚本应该采用 SFTP_USER、SFTP_PASSWD 并使用此输入创建某些密码和组文件。这些文件应该在 /var/data 文件夹中创建。在此之后,应该以 1234 用户身份使用这些密码和组文件启动 proftpd 进程。容器以 1234 用户身份启动。但这些文件的权限为 root:5678。我收到以下错误:
unable to set UID to 0, current UID: 1234
镜像入口点脚本如下:
echo "Starting to create password file"
PASSWORD=123456
echo $PASSWORD | /usr/bin/ftpasswd --passwd --file=/var/data/ftpd.passwd --name=virtual --uid=1234 --gid=5678 --home=/var/data/ --shell=/bin/bash --stdin
echo "Password file created"
/usr/bin/ftpasswd --group --name=--group --name=virtual --file=/var/data/ftpd.group --gid=5678 --member=1234
proftpd -n -4 -c /var/data/proftpd.conf --> This line is throwing the above error.
这里出了什么问题?为什么它试图将 UID 设置为 0?我的印象是提供 runAsUser
、runAsGroup
和 fsGroup
将确保 /var/data 文件夹具有 1234 的正确所有权。
正在通过以下 code 打印您遇到的错误:
if (geteuid() != daemon_uid) {
pr_log_pri(PR_LOG_ERR, "unable to set UID to %s, current UID: %s",
pr_uid2str(permanent_pool, daemon_uid),
pr_uid2str(permanent_pool, geteuid()));
exit(1);
}
您看到这个是因为您的容器用户 ID 不等于 daemon_uid
。
如果您继续寻找 daemon_uid
,您会发现以下行:
uid_t *uid = (uid_t *) get_param_ptr(main_server->conf, "UserID", FALSE);
daemon_uid = (uid != NULL ? *uid : PR_ROOT_UID);
这意味着如果配置中未提供 UserID
,则代码会将 PR_ROOT_UID
值分配给 daemon_uid
,该值似乎为 0(根 ID)。
这就是前面提到的 if 语句生成此错误消息的原因。
看看 example config 如何提供用户 ID。