对于应该以非 root 身份运行的 docker 映像(基于 alpine),我有两个要求:
docker run --user {uid}:{gid}
FUSE 的fusermount
命令需要用户在 中输入有效的条目/etc/passwd
,否则它不会挂载文件系统。鉴于我在构建时不知道用户的 UID/GID,我无法adduser
在构建时调用。我也无法在运行时执行此操作,因为用户没有适当的权限。
到目前为止,我发现了两种感觉不合适/不安全的解决方案
当添加chmod 555 /etc/passwd
到 Dockerfile 时,我可以在运行时执行
echo "someuser:x:${my_uid}:$(id -g)::/tmp:/sbin/nologin" >> /etc/passwd
Run Code Online (Sandbox Code Playgroud)
这完成了定影安装的工作。不幸的是,我没有找到一种方法可以在运行时将 passwd 文件更改回只读状态,如果没有这种方法,我就会担心有人可能会滥用它来重新获得 root 权限。虽然我找不到一种简单的方法来使用打开的 passwd 文件进行某些攻击(虽然我能够直接在 /etc/passwd 中为所有用户添加/修改密码和配置,然后通过 更改用户login
,但 alpine 不允许这样做用户 root (既不是 vialogin
也不是 via su
)。但我想有人比我更聪明,不知何故整个解决方案感觉像是一个相当肮脏的黑客。有没有人有具体的想法如何使用容器内的可写 passwd 文件在容器内获得不适当的权限?
通过引入 DUID 和 DGID 作为环境变量并将 …
我正在尝试获取Docker网络列表并使用Docker HTTP API 1.24按名称对其进行过滤。
出于某种原因,过滤器的文档非常差,整个Docker文档中的唯一示例就是这个示例(并且可以正常工作):
GET /networks?filters={"type":{"custom":true}} HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
令人困惑的是,这个孤独的示例似乎与过滤器的官方Docker符号相矛盾:
map[string][]string
在这里讨论:https : //stackoverflow.com/a/28055631/4486909
API规范也没有太大帮助:
Query parameters:
filters - JSON encoded network list filter. The filter value is one of:
driver=<driver-name> Matches a network’s driver.
id=<network-id> Matches all or part of a network id.
label=<key> or label=<key>=<value> of a network label.
name=<network-name> Matches all or part of a network name.
type=["custom"|"builtin"] Filters networks by type.
Run Code Online (Sandbox Code Playgroud)
http://docs.master.dockerproject.org/engine/reference/api/docker_remote_api_v1.24/#/list-networks
这些不过滤任何内容,返回netwroks的完整列表。
curl -vg -X GET "v1.24/networks" --data-urlencode 'filters={"name":["MyNetwork"]}'
curl -vg -X GET "v1.24/networks" --data-urlencode …
Run Code Online (Sandbox Code Playgroud)