隨着 RustFS 的持續走熱,越來越多的用户開始關注並使用 RustFS,而且在整個過程中提出了很多關鍵問題。其中在 [Start the container using a non-root user #804
](https://github.com/rustfs/rustfs/issues/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:
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。