sudo -i 用于“nologin”帐户

sudo -i 用于“nologin”帐户

我有一个帐户

grafana:x:494:494:Grafana User:/tmp:/sbin/nologin

我想用它来运行容器。如果我做

jsmith$ sudo -u grafana -s TMPDIR=/bs XDG_DATA_HOME=/bs XDG_CONFIG_DIR=/bs podman run --network-config-dir=/bs -it alpine

我得到:“无法 chdir 到 /home/jsmith:权限被拒绝”。如果我首先 chdir 到 grafana 可写的目录,我可以运行命令 OK。但是,我想从启动脚本启动它而不更改目录,即使用单个命令。我不知道怎么办。设置 HOME 没有帮助。我只能通过使用来解决这个问题

jsmith$ sudo su -l -s /bin/bash -c 'XDG_DATA_HOME=/bs XDG_CONFIG_DIR=/bs podman run --network-config-dir=/bs -it alpine' grafana

但这似乎是迂回的。

答案1

在我看来,这可以通过两种方式实现:

第一种方法是更改​​帐户,以便能够登录:

grafana:x:494:494:Grafana User:/tmp:/bin/bash

这可能是一个潜在的安全风险,因此如果您不希望这样做,您可以考虑使用 systemd 单元文件来启动它,而不是启动脚本。

将其保存到 /etc/systemd/system/[mycontainer].service:(将 mycontainer 替换为适合您的名称。)

[Unit]
Description=Run Container
AssertPathExists=/bs

[Service]
User=grafana
Group=grafana
Environment="XDG_DATA_HOME=/bs"
Environment="XDG_CONFIG_DIR=/bs"
Environment="TMPDIR=/bs"
ExecStart=podman run --network-config-dir=/bs -it alpine
Nice=5
# Uncomment this if you want the container to be started on boot, otherwise don't
#[Install]
#WantedBy=multi-user.target  

然后运行systemctl enable mycontainer就可以使用systemctl start mycontainersystemctl stop mycontainer管理它了。

有关 Systemd 单位的更多信息,我发现非常有帮助。

答案2

运行无根 Podman 时,Podman 默认将其容器和容器镜像存储在主目录中。

目录/tmp任何用户都可以写,所以最好让用户格拉法纳有自己的主目录。

$ sudo useradd grafana -s /sbin/nologin -c "Grafana User"
$ grep grafana /etc/passwd
grafana:x:1025:1025:Grafana User:/home/grafana:/sbin/nologin
$ sudo systemd-run --machine=test1@ \
                    --quiet \
                    --user \
                    --collect \
                    --pipe \
                    --wait \
                       podman \
                         run \
                         --rm \
                         docker.io/library/alpine echo hello
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
Copying blob 8921db27df28 done
Copying config 042a816809 done
Writing manifest to image destination
Storing signatures
hello
$

我看到文字了“你好”在命令的输出中echo hello

测试效果很好。

另一个测试

如果你想/tmp作为主目录,但让 Podman 仅使用例如/var/bs,您可能可以通过传递与中相同的环境变量来使其工作回答作者:@Anuril。

我添加了选项

  -E XDG_DATA_HOME=/var/bs \
  -E XDG_CONFIG_DIR=/var/bs \
  -E TMPDIR=/var/bs \

到上面的 systemd-run 命令,但该命令失败了

ERRO[0000] stat /tmp/.config/containers/storage.conf: permission denied

然后我也尝试添加

  -E HOME=/var/bs \

但该命令失败并显示错误消息:

Error relocating /bin/echo: RELRO protection failed: Permission denied

详情请参阅:

$ useradd test2 -s /sbin/nologin -c "Grafana User" -d /tmp
$ grep test2 /etc/passwd
test2:x:1026:1026:Grafana User:/tmp:/sbin/nologin
$ sudo mkdir /var/bs
$ sudo chown test2:test2 /var/bs
$ sudo systemd-run \
                    -E XDG_DATA_HOME=/var/bs \
                    -E XDG_CONFIG_DIR=/var/bs \
                    -E TMPDIR=/var/bs \
                    -E HOME=/var/bs \
                    --machine=test2@ \
                    --quiet \
                    --user \
                    --collect \
                    --pipe \
                    --wait \
                       podman \
                         run \
                         --rm \
                         docker.io/library/alpine echo hello
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
Copying blob 8921db27df28 done  
Copying config 042a816809 done  
Writing manifest to image destination
Storing signatures
Error relocating /lib/ld-musl-x86_64.so.1: RELRO protection failed: Permission denied
Error relocating /bin/echo: RELRO protection failed: Permission denied
$

我不知道为什么它失败了。

相关内容