RustFS 重要变更,让容器化部署更安全
随着 RustFS 的持续走热,越来越多的用户开始关注并使用 RustFS,而且在整个过程中提出了很多关键问题。其中在 Start the container using a non-root user #804中,whg517 用户提出,从安全最佳实践角度出发,RustFS 在容器化运行状态下(包括 docker 部署和 k8s 部署),RustFS 实例应该以非 root 用户运行,并且添加更多安全加固措施。

以非 root 运行容器是业界的安全最佳实践共识,因此 RustFS 修改了 Dockerfile,具体包括:
- 创建 UID 和 GID 均为
1000的用户rustfs; - rustfs 进程以
rustfs用户启动; - 针对 k8s 部署,还增强了
securityContext部分内容;
上述变更在 1.0.0-alpha.68 版本正式生效。在版本发布后,我们在 GitHub Issue 上看到有用户从 1.0.0-alpha.67 升级到 1.0.0-alpha.68 出现了 permission denied 错误:

为此,受影响用户可遵循下面的方法进行问题修复并升级。
注意 :此变更仅影响容器化运行用户,对于通过脚本或者二进制安装的用户,不受此影响。而且仅影响 1.0.0-alpha.67 及之前版本的用户,后续版本不受影响。
Kubernetes 用户
对于 Kubernetes 用户,此次变更不受影响,因为在 Helm chart 编写之初就增加了 securityContext 部分内容,而且在 pod 中通过 initContainer 来对 /data 和 logs 目录的权限进行了修改(USER 和 GROUP 均为 1000),此次升级变更不会导致 Kubernetes 用户出现 permission denied 错误。
Docker 用户
对于使用 docker run 或者使用 docker compose 的用户来说,修复该错误的核心原理就是将 RustFS 使用的 /data 和 /logs 两个目录的用户和群组修改为 1000 即可。过程如下:
- 回滚至
1.0.0-alpha.67版本
用户可以先会滚至 1.0.0-alpha.67 版本,然后进入到容器中,将 /data 和 /logs 目录的用户和群组从 root 更改至 1000:
bash
docker exec -it rustfs sh
chown -R 1000:1000 /data/
chown -R 1000:1000 /logs/
ls -ld /data/
drwxr-x--- 5 1000 1000 4096 Nov 12 04:06 /data/
ls -ld /logs/
drwxr-x--- 5 1000 1000 4096 Nov 12 04:06 /logs/
- 升级至
1.0.0-alpha.68
直接升级到 1.0.0-alpha.68(或 latest,当前 latest 就是 68 版本)即可。升级成功之后可查看 rustfs 日志并查看 rustfs 进程运行的用户:
bash
docker exec -it rustfs sh
/ $ id
uid=1000(rustfs) gid=1000(rustfs) groups=1000(rustfs)
/ $ whoami
rustfs
/ $ ps
PID USER TIME COMMAND
1 rustfs 0:15 /usr/bin/rustfs /data
36 rustfs 0:00 sh
8057 rustfs 0:00 ps
/ $ ls -ld /data/
drwxr-x--- 5 rustfs rustfs 4096 Nov 12 04:06 /data/
/ $ ls -ld /logs/
drwxr-xr-x 2 rustfs rustfs 4096 Nov 13 04:07 /logs/
RustFS 的安装
目前 RustFS 支持多种安装方式
- 二进制下载安装或脚本安全
- Docker 安装
- Helm Chart 安装
安装方式和步骤可查看 RustFS 官网。
如果您想使用 docker 安装,可参考如下 docker-compose.yml:
yaml
services:
rustfs:
image: rustfs/rustfs:1.0.0-alpha.68
container_name: rustfs
hostname: rustfs
environment:
# Use service names and correct disk indexing (1..4 to match mounted paths)
- RUSTFS_VOLUMES=/data
- RUSTFS_ADDRESS=0.0.0.0:9000
- RUSTFS_CONSOLE_ENABLE=true
- RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001
- RUSTFS_ACCESS_KEY=rustfsadmin
- RUSTFS_SECRET_KEY=rustfsadmin
- RUSTFS_CMD=rustfs
ports:
- "9000:9000" # API endpoint
- "9001:9001" # Console
volumes:
- data:/data
- logs:/logs
healthcheck:
test:
[
"CMD",
"sh", "-c",
"curl -f http://localhost:9000/health && curl -f http://localhost:9001/health"
]
interval: 10s
timeout: 5s
retries: 3
start_period: 30s
networks:
- rustfs
networks:
rustfs:
driver: bridge
name: rustfs
volumes:
data:
driver: local
logs:
driver: local
欢迎大家使用 RustFS 作为对象存储系统,目前 RustFS 还在持续研发迭代中,如果您有任何问题,可以通过 GitHub:github.com/rustfs/rust... 提 Issue 或 PR。