RustFS 重要变更,让容器化部署更安全

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 来对 /datalogs 目录的权限进行了修改(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。

相关推荐
xuejianxinokok2 小时前
深入了解RUST迭代器 - 惰性、可组合的处理
后端·rust
xcLeigh3 小时前
Rust入门:基础语法应用
开发语言·rust·编程·教程·基础语法
Kapaseker3 小时前
深入 Rust 迭代器(下)
rust
alwaysrun11 小时前
Rust中元组详解
rust·元组·tuple·解构
ftpeak11 小时前
Tauri开发手记——1.开发环境
rust·tauri
百锦再20 小时前
第14章 智能指针
android·java·开发语言·git·rust·go·错误
John_Rey21 小时前
API 设计哲学:构建健壮、易用且符合惯用语的 Rust 库
网络·算法·rust
勤奋的小小尘21 小时前
第六篇: Rust 中的"静态方法"(关联函数)
rust
勤奋的小小尘21 小时前
第七篇: Rust 多线程与并发编程详解
rust