Podman容器安全实践与镜像签名指南
立即解锁
发布时间: 2025-08-26 00:07:58 阅读量: 1 订阅数: 4 


Podman for DevOps: 重新构想容器化技术
### Podman容器安全实践与镜像签名指南
#### 1. 无root权限容器运行与subuid和subgid
现代Linux发行版使用`shadow-utils`包的一个版本,它依赖于两个文件:`/etc/subuid`和`/etc/subgid`。这两个文件用于确定哪些用户ID(UID)和组ID(GID)可用于映射用户命名空间。每个用户的默认分配是65536个UID和65536个GID。
可以运行以下简单命令来检查在无root权限容器中`subuid`和`subgid`的分配情况:
```bash
$ id
uid=1000(alex) gid=1000(alex) groups=1000(alex),10(wheel)
$ podman run alpine cat /proc/self/uid_map /proc/self/gid_map
```
输出结果如下:
```plaintext
0 1000 1
1 100000 65536
0 1000 1
1 100000 65536
```
从输出可以看出,这两个文件表明,它们从当前运行容器的用户的UID/GID(即1000)开始映射UID和GID 0。之后,从100000开始映射UID和GID 1,直到165536(通过起始点100000加上默认范围65536计算得出)。
#### 2. 避免以UID 0运行容器
容器运行时可以被指示以不同于最初创建容器的用户ID来运行容器内的进程,这与无root权限容器的情况类似。以非root用户身份运行容器进程有助于提高安全性,例如,在容器中使用无特权用户可以限制容器内外的攻击面。
默认情况下,`Dockerfile`和`Containerfile`可能将默认用户设置为root(即UID = 0)。为避免这种情况,可以在构建文件中使用`USER`指令,例如`USER 1001`,以指示`Buildah`或其他容器构建工具使用该特定用户(UID为1001)来构建和运行容器镜像。如果要强制使用特定的UID,则需要调整计划用于运行容器的任何文件、文件夹或挂载的权限。
下面以Nginx容器为例,介绍如何将现有镜像调整为以标准用户运行:
1. **创建Nginx配置文件**
```bash
$ cat hello-podman.conf
server {
listen 80;
location / {
default_type text/plain;
expires -1;
return 200 'Hello Podman user!\nServer address:
$server_addr:$server_port\n';
}
}
```
该配置文件定义了监听端口(80)和请求到达服务器时返回的内容消息。
2. **创建Dockerfile**
```bash
$ cat Dockerfile
FROM docker.io/library/nginx:mainline-alpine
RUN rm /etc/nginx/conf.d/*
ADD hello-podman.conf /etc/nginx/conf.d/
```
此`Dockerfile`包含三个指令:
- `FROM`:选择官方Nginx镜像。
- `RUN`:清除配置目录中的任何默认配置示例。
- `ADD`:复制刚刚创建的配置文件。
3. **使用Buildah构建容器镜像**
```bash
$ buildah bud -t nginx-root:latest -f .
```
4. **运行容器**
```bash
$ podman run --name myrootnginx -p 127.0.0.1::80 -d nginx-root
```
5. **查找随机选择的本地端口**
```bash
$ podman port myrootnginx 80
```
6. **测试容器化的Web服务器**
```bash
$ curl localhost:38029
```
7. **检查容器运行的用户**
```bash
$ podman ps | grep root
$ podman exec 364ec7f5979a id
```
结果显示容器以root用户身份运行。
为了更改用户,需要进行以下修改:
1. **更改Nginx服务器配置中的监听端口**
```bash
$ cat hello-podman.conf
server {
listen 8080;
location / {
default_type text/plain;
expires -1;
return 200 'Hello Podman user!\nServer address:
$server_addr:$server_port\n';
}
}
```
不能使用低于1024的端口与无特权用户。
2. **编辑Dockerfile**
```bash
$ cat Dockerfile
FROM docker.io/library/nginx:mainline-alpine
RUN rm /etc/nginx/conf.d/*
ADD hello-podman.conf /etc/nginx/conf.d/
RUN chmod -R a+w /var/cache/nginx/ \
&& touch /var/run/nginx.pid \
&& chmod a+w /var/run/nginx.pid
EXPOSE 8080
USER nginx
```
这里修复了Nginx服务器上主要文件和文件夹的权限,暴露了新的8080端口,并将默认用户设置为Nginx用户。
3. **构建新的容器镜像**
```bash
$ buildah bud -t nginx-user:latest -f .
```
4. **运行新容器**
```bash
$ podman run --name myusernginx -p 127.0.0.1::8080 -d nginx-user
```
5. **查找随机选择的本地端口并测试Web服务器**
```bash
$ podman port myusernginx 8080
$ curl 127.0.0.1:42209
```
6. **检查容器运行的用户**
```bash
$ podman ps | grep user
$ podman exec
```
0
0
复制全文
相关推荐










