Docker

Kubernetes 容器混亂文件所有者

  • April 25, 2019

我有一個執行 Kubernetes 的 Debian 盒子,在那裡我得到了我所有的生產環境,有近 50 個部署。我的問題是,在其中一個以非特權使用者身份執行 Odoo 伺服器的 pod 中,一些文件(不是全部)是以 root 使用者作為所有者創建的。

這是我的部署 yaml:

---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
 namespace: odoo
 name: app
spec:
 selector:
   matchLabels:
     app: odoo
 strategy:
   type: Recreate
 template:
   metadata:
     labels:
       app: odoo
   spec:
     securityContext:
       fsGroup: 1000
     containers:
     - name: odoo
       image: my-odoo
       command:
       - /docker-entrypoint.sh
       imagePullPolicy: IfNotPresent
       ports:
       - containerPort: 80
         name: odoo
       - containerPort: 110
         name: pop3
       - containerPort: 995
         name: pop3s
       - containerPort: 25
         name: smtp
       - containerPort: 993
         name: imaps
       volumeMounts:
       - name: home
         mountPath: /home
       - name: maildir
         mountPath: /var/mail
     volumes:
       - name: maildir
         hostPath:
           path: /mnt/odoo/maildir
       - name: home
         hostPath:
           path: /mnt/odoo/home

在我的入口點腳本中,我使用 supervisord 執行 odoo,這是我的 conf:

[group:odoo]
programs = odoo-web, odoo-monitor, odoo-beat, odoo-worker-default-0, odoo-worker-cdr-1, odoo-worker-notifications-2, odoo-worker-default-notifications-3

[program:odoo-web]
user = odoo
directory = /home/odoo/var/run
command = /home/odoo/bin/odoo-bin --proxy-mode


[program:odoo-worker-default-0]
user = odoo
directory = /home/odoo/var/run
command = /home/odoo/bin/odoo-bin celery worker -l INFO -n default-0@%%h -c4 -Q odoo-10.0.default

[program:odoo-worker-cdr-1]
user = odoo
directory = /home/odoo/var/run
command = /home/odoo/bin/odoo-bin celery worker -l INFO -n cdr-1@%%h -c1 -Q odoo-10.0.cdr

[program:odoo-worker-notifications-2]
user = odoo
directory = /home/odoo/var/run
command = /home/odoo/bin/odoo-bin celery worker -l INFO -n notifications-2@%%h -c2 -Q odoo-10.0.notifications

[program:odoo-worker-default-notifications-3]
user = odoo
directory = /home/odoo/var/run
command = /home/odoo/bin/odoo-bin celery worker -l INFO -n default-notifications-3@%%h -c2 -Q odoo-10.0.default,odoo-10.0.notifications


[program:odoo-beat]
user = odoo
directory = /home/odoo/var/run
command = /home/odoo/bin/odoo-bin celery beat -s /home/odoo/var/celerybeat-schedule

[program:odoo-monitor]
user = odoo
directory = /home/odoo/var/run
command = /home/odoo/bin/odoo-bin celery flower`

如您所見,所有程序都以使用者 odoo 的身份執行,其 uid 為 1000。

我的底層 docker 文件系統是 overlay2。

誰能告訴我為什麼我在非根程序創建的文件中搞砸了所有者?

好吧,我找到了一種解決方法:我用來執行 odoo 的使用者可以在沒有密碼的情況下執行 sudo。我已經刪除了。現在文件沒有獲得錯誤的權限,因此它可能是 Odoo 或其中一個依賴項或 python 本身中的錯誤,如果在 sudoers 中指定了 NOPASSWD,則允許普通使用者成為超級使用者 sudo。

正如 評論中提到的user1330614 :

我注意到我用來執行 odoo 的使用者sudo無需密碼即可。我已經刪除了。現在文件沒有獲得錯誤的權限,因此它可能是 Odoo 或其中一個依賴項或 python 本身中的一個錯誤,它允許普通使用者成為超級使用者sudo,如果NOPASSWDsudoers.

然而,蒂姆霍金建議測試目前容器使用者,因為:

您斷言 Odoo 伺服器 pod 以非特權身份執行,但您沒有在 runAsUser任何地方設置,因此它們可能仍以 root 身份執行:

  • kubectl exec -ti進入你的容器
  • 執行id並查看 uid/gid 是什麼。

引用自:https://serverfault.com/questions/955992