博客 / 詳情

返回

以非 root 運行 RustFS 容器,讓實例運行更安全

隨着 RustFS 的持續走熱,越來越多的用户開始關注並使用 RustFS,而且在整個過程中提出了很多關鍵問題。其中在 [Start the container using a non-root user #804
](https://github.com/rustfs/rustfs/issues/804)中,whg517 用户提出,從安全最佳實踐角度出發,RustFS 在容器化運行狀態下(包括 docker 部署和 k8s 部署),RustFS 實例應該以非 root 用户運行,並且添加更多安全加固措施。

截屏2025-11-13 13.03.15.png

以非 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 錯誤:

截屏2025-11-13 13.10.51.png

為此,受影響用户可遵循下面的方法進行問題修復並升級。

注意:此變更僅影響容器化運行用户,對於通過腳本或者二進制安裝的用户,不受此影響。而且僅影響 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

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 進程運行的用户:

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

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:https://github.com/rustfs/rustfs 提 Issue 或 PR。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.