kamaok

Untitled

Oct 12th, 2021 (edited)
510
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
YAML 14.07 KB | None | 0 0
  1. Вопрос/проблема:
  2. Под создается успешно несмотря на то,что для всех service account для namespace feature-1 и namespace default действует
  3. PodSecurityPolicy с именем default, в которой запрещено создавать привиллегированные поды
  4.  
  5. # kubectl --as=system:serviceaccount:default:myuser -n feature-1 create -f- <<EOF
  6. apiVersion: v1
  7. kind: Pod
  8. metadata:
  9.   name: privileged
  10. spec:
  11.   containers:
  12.     - name: pause
  13.       image: k8s.gcr.io/pause
  14.       securityContext:
  15.         privileged: true
  16. EOF
  17.  
  18.  
  19. Аналогично, запрещено создавать поды в namespace feature-1 с
  20.  - hostNetwork: true
  21.  - hostPID: true
  22.  - hostPath отличным от "/opt/k8svolumes"
  23.  
  24. Но под успешно создается
  25. # kubectl --as=system:serviceaccount:default:myuser -n feature-1 create -f- <<EOF
  26. apiVersion: v1
  27. kind: Pod
  28. metadata:
  29.   name: hackers-pod
  30. spec:
  31.   containers:
  32.   - command: ["/bin/bash", "-c", "sleep 100000"]
  33.     image: debian
  34.     name: hackers-pod
  35.     volumeMounts:
  36.     - mountPath: /host
  37.       name: host
  38.   hostNetwork: true
  39.   hostPID: true
  40.   tolerations:
  41.   - effect: NoSchedule
  42.     operator: Exists
  43.   nodeSelector:
  44.     node-role.kubernetes.io/master: ""
  45.   volumes:
  46.   - hostPath:
  47.       path: /
  48.       type: Directory
  49.     name: host
  50. EOF
  51.  
  52.  
  53.  
  54. # kubectl get sa -n default
  55. NAME            SECRETS   AGE
  56. default         1         101d
  57. myuser     1         60d
  58.  
  59. # kubectl get sa -n feature-1
  60. NAME      SECRETS   AGE
  61. default   1         62d
  62.  
  63. Видно, что несмотря на то, что под запускается с service account default и как для default-аккаунта, таки и для аккаунта myuser
  64. должна использоваться psp с именем default, которая запрещает запуск подов
  65. Однако почему-то используется psp с именем system, которая ожидаемо разрешает запуск привиллегироваонного пода
  66.  
  67. # kubectl get pod privileged -o yaml | grep -Ew 'serviceAccount|serviceAccountName|psp'
  68.     kubernetes.io/psp: system
  69.   serviceAccount: default
  70.   serviceAccountName: default
  71.  
  72. # kubectl get pod hackers-pod -o yaml | grep -Ew 'serviceAccount|serviceAccountName|psp'
  73.     kubernetes.io/psp: system
  74.   serviceAccount: default
  75.   serviceAccountName: default
  76.  
  77. Тут ожидаемо service account myuser, созданный в namespace default имеет доступ к psp default, для которой создана rolebinding  в namespace-ах default и feature-1
  78. # kubectl --as=system:serviceaccount:default:myuser auth can-i use podsecuritypolicy/default  2>/dev/null
  79. yes
  80. # kubectl --kubeconfig ~/.kube/myuser  auth can-i use podsecuritypolicy/default  2>/dev/null
  81. yes
  82.  
  83.  
  84. Тут непонятно почему service account который сушествует в namespace default имеет доступ к psp, для которых созданы rolebinding  в namespace-ах, в которых пользователь не имеет доступ (kube-system,lens-metrics,ingress-nginx)
  85.  
  86. # kubectl --as=system:serviceaccount:default:myuser auth can-i use podsecuritypolicy/system  2>/dev/null
  87. yes
  88. # kubectl --kubeconfig ~/.kube/myuser  auth can-i use podsecuritypolicy/system  2>/dev/null
  89. no
  90.  
  91. # kubectl --as=system:serviceaccount:default:myuser auth can-i use podsecuritypolicy/default-hostnetwork  2>/dev/null
  92. yes
  93. # kubectl --kubeconfig ~/.kube/myuser auth can-i use podsecuritypolicy/default-hostnetwork  2>/dev/null
  94. no
  95.  
  96.  
  97. # kubectl --as=system:serviceaccount:default:myuser auth can-i use podsecuritypolicy/default-monitoring  2>/dev/null
  98. yes
  99. # kubectl --kubeconfig ~/.kube/myuser  auth can-i use podsecuritypolicy/default-monitoring  2>/dev/null
  100. no
  101.  
  102.  
  103.  
  104. Подготовительные действия:
  105. Addmission controller в настройках kube-api-севрера включен на всех master-серверах
  106. # grep PodSecurityPolicy /etc/kubernetes/manifests/kube-apiserver.yaml
  107.     - --enable-admission-plugins=NodeRestriction,PodSecurityPolicy
  108.  
  109. Поды с kube-api перезапущены автоматически после добавления PodSecurityPolicy в конфиг kube-api(/etc/kubernetes/manifests/kube-apiserver.yaml)
  110. После перезапуска в логах видно, что включен PodSecurityPolicy
  111. # kubectl logs kube-apiserver-XXX -n kube-system | head -n 7  | grep PodSecurityPolicy
  112. I1011 22:08:34.851037       1 plugins.go:158] Loaded 13 mutating admission controller(s) successfully in the following order: NamespaceLifecycle,LimitRanger,ServiceAccount,NodeRestriction,TaintNodesByCondition,PodSecurityPolicy,Priority,DefaultTolerationSeconds,DefaultStorageClass,StorageObjectInUseProtection,RuntimeClass,DefaultIngressClass,MutatingAdmissionWebhook.
  113. I1011 22:08:34.851068       1 plugins.go:161] Loaded 11 validating admission controller(s) successfully in the following order: LimitRanger,ServiceAccount,PodSecurityPolicy,Priority,PersistentVolumeClaimResize,RuntimeClass,CertificateApproval,CertificateSigning,CertificateSubjectRestriction,ValidatingAdmissionWebhook,ResourceQuota.
  114.  
  115.  
  116.  
  117. Для всех system:authenticated во всех namespace-ах использовать PSP default (реализовано через ClusterRoleBinding psp-default)
  118.  
  119. Для всех service account-ов через указание группы system:serviceaccounts для namespace feature-1 использовать PSP default (реализовано через RoleBinding psp-default-feature-1)
  120.  
  121. Для всех service account-ов через указание группы system:serviceaccounts для namespace default использовать PSP default (реализовано через RoleBinding psp-default-default)
  122.  
  123. Для всех system:serviceaccounts|system:authenticated для namespace kube-system использовать PSP system (реализовано через RoleBinding psp-system)
  124.  
  125. Для всех system:serviceaccounts|system:authenticated для namespace ingress-nginx использовать PSP psp-default-hostnetwork (реализовано через RoleBinding psp-default-hostnetwork-ingress-nginx)
  126.  
  127. Для всех system:serviceaccounts для namespace lens-metrics использовать PSP psp-default-monitoring (реализовано через RoleBinding psp-default-monitoring-lens-metrics)
  128.  
  129.  
  130. Проверка созданных необходимых объектов:
  131. # kubectl get psp
  132. NAME                  PRIV    CAPS   SELINUX    RUNASUSER   FSGROUP    SUPGROUP   READONLYROOTFS   VOLUMES
  133. default               false          RunAsAny   RunAsAny    RunAsAny   RunAsAny   false            configMap,emptyDir,projected,secret,downwardAPI,persistentVolumeClaim,hostPath
  134. default-hostnetwork   false          RunAsAny   RunAsAny    RunAsAny   RunAsAny   false            configMap,emptyDir,projected,secret,downwardAPI,persistentVolumeClaim
  135. default-monitoring    false          RunAsAny   RunAsAny    RunAsAny   RunAsAny   false            configMap,emptyDir,projected,secret,downwardAPI,persistentVolumeClaim,hostPath
  136. system                true    *      RunAsAny   RunAsAny    RunAsAny   RunAsAny   false            *
  137.  
  138. # kubectl get clusterrole | grep psp
  139. psp-default                                                            2021-10-11T16:47:06Z
  140. psp-default-hostnetwork                                                2021-10-11T16:33:48Z
  141. psp-default-monitoring                                                 2021-10-11T19:58:20Z
  142. psp-system                                                             2021-10-11T16:41:13Z
  143.  
  144. # kubectl get clusterrolebindings.rbac.authorization.k8s.io | grep psp
  145. psp-default   ClusterRole/psp-default   17h
  146.  
  147. # kubectl get rolebindings.rbac.authorization.k8s.io -A | grep psp
  148. feature-1              psp-default-feature-1                               ClusterRole/psp-default                               17h
  149. ingress-nginx          psp-default-hostnetwork-ingress-nginx               ClusterRole/psp-default-hostnetwork                   14h
  150. kube-system            psp-system                                          ClusterRole/psp-system                                17h
  151. lens-metrics           psp-default-monitoring-lens-metrics                 ClusterRole/psp-default-monitoring                    17h
  152. default                psp-default-default                                 ClusterRole/psp-default                               17h
  153.  
  154.  
  155.  
  156.  
  157. Использовались следующие конфигурации для создания объектов psp,clusterrole,clusterrolebinding,rolebinding
  158.  
  159. ### Default
  160.  
  161. ---
  162. kind: PodSecurityPolicy
  163. apiVersion: policy/v1beta1
  164. metadata:
  165.   name: default
  166. spec:
  167.   privileged: false
  168.   hostNetwork: false
  169.   hostIPC: false
  170.   hostPID: false
  171.   seLinux:
  172.     rule: RunAsAny
  173.   supplementalGroups:
  174.     rule: RunAsAny
  175.   runAsUser:
  176.     rule: RunAsAny
  177.   fsGroup:
  178.     rule: RunAsAny
  179.   volumes:
  180.    - 'configMap'
  181.     - 'emptyDir'
  182.     - 'projected'
  183.     - 'secret'
  184.     - 'downwardAPI'
  185.     - 'persistentVolumeClaim'
  186.     - 'hostPath'
  187.   allowedHostPaths:
  188.     - pathPrefix: "/opt/k8svolumes"
  189.       readOnly: false
  190. ---
  191. kind: ClusterRole
  192. apiVersion: rbac.authorization.k8s.io/v1
  193. metadata:
  194.   name: psp-default
  195. rules:
  196.   - apiGroups:
  197.      - policy
  198.     resources:
  199.      - podsecuritypolicies
  200.     verbs:
  201.      - use
  202.     resourceNames:
  203.      - default
  204. ---
  205. kind: RoleBinding
  206. apiVersion: rbac.authorization.k8s.io/v1
  207. metadata:
  208.   name: psp-default-feature-1
  209.   namespace: feature-1
  210. roleRef:
  211.   kind: ClusterRole
  212.   name: psp-default
  213.   apiGroup: rbac.authorization.k8s.io
  214. subjects:
  215.   - kind: Group
  216.     name: system:serviceaccounts
  217.     apiGroup: rbac.authorization.k8s.io
  218. ---
  219. kind: RoleBinding
  220. apiVersion: rbac.authorization.k8s.io/v1
  221. metadata:
  222.   name: psp-default-default
  223.   namespace: default
  224. roleRef:
  225.   kind: ClusterRole
  226.   name: psp-default
  227.   apiGroup: rbac.authorization.k8s.io
  228. subjects:
  229.   - kind: Group
  230.     name: system:serviceaccounts
  231.     apiGroup: rbac.authorization.k8s.io
  232.  
  233.  
  234. ---
  235. kind: ClusterRoleBinding
  236. apiVersion: rbac.authorization.k8s.io/v1
  237. metadata:
  238.   name: psp-default
  239. roleRef:
  240.   kind: ClusterRole
  241.   name: psp-default
  242.   apiGroup: rbac.authorization.k8s.io
  243. subjects:
  244.   - kind: Group
  245.     apiGroup: rbac.authorization.k8s.io
  246.     name: system:authenticated
  247.  
  248.  
  249.  
  250. ### System
  251.  
  252. ---
  253. kind: PodSecurityPolicy
  254. apiVersion: policy/v1beta1
  255. metadata:
  256.   name: system
  257. spec:
  258.   privileged: true
  259.   allowPrivilegeEscalation: true
  260.   hostNetwork: true
  261.   hostPID: true
  262.   hostIPC: true
  263.   hostPorts:
  264.     - min: 0
  265.       max: 65535
  266.   seLinux:
  267.     rule: RunAsAny
  268.   supplementalGroups:
  269.     rule: RunAsAny
  270.   runAsUser:
  271.     rule: RunAsAny
  272.   fsGroup:
  273.     rule: RunAsAny
  274.   volumes:
  275.    - '*'
  276.   allowedCapabilities:
  277.    - '*'
  278. ---
  279. kind: ClusterRole
  280. apiVersion: rbac.authorization.k8s.io/v1
  281. metadata:
  282.   name: psp-system
  283. rules:
  284.   - apiGroups:
  285.      - policy
  286.     resources:
  287.      - podsecuritypolicies
  288.     verbs:
  289.      - use
  290.     resourceNames:
  291.      - system
  292. ---
  293. kind: RoleBinding
  294. apiVersion: rbac.authorization.k8s.io/v1
  295. metadata:
  296.   name: psp-system
  297.   namespace: kube-system
  298. roleRef:
  299.   kind: ClusterRole
  300.   name: psp-system
  301.   apiGroup: rbac.authorization.k8s.io
  302. subjects:
  303. # Authorize all authenticated users in a namespace:
  304.   - kind: Group
  305.     apiGroup: rbac.authorization.k8s.io
  306.     name: system:authenticated
  307. # Authorize all service accounts in a namespace:
  308.   - kind: Group
  309.     apiGroup: rbac.authorization.k8s.io
  310.     name: system:serviceaccounts
  311.  
  312.  
  313. ### Monitroring
  314.  
  315. ---
  316. kind: PodSecurityPolicy
  317. apiVersion: policy/v1beta1
  318. metadata:
  319.   name: default-monitoring
  320. spec:
  321.   privileged: false
  322.   hostNetwork: false
  323.   hostPID: true
  324.   hostIPC: false
  325.   seLinux:
  326.     rule: RunAsAny
  327.   supplementalGroups:
  328.     rule: RunAsAny
  329.   runAsUser:
  330.     rule: RunAsAny
  331.   fsGroup:
  332.     rule: RunAsAny
  333.   volumes:
  334.    - 'configMap'
  335.     - 'emptyDir'
  336.     - 'projected'
  337.     - 'secret'
  338.     - 'downwardAPI'
  339.     - 'persistentVolumeClaim'
  340.     - 'hostPath'
  341. ---
  342. kind: ClusterRole
  343. apiVersion: rbac.authorization.k8s.io/v1
  344. metadata:
  345.   name: psp-default-monitoring
  346. rules:
  347.   - apiGroups:
  348.      - policy
  349.     resources:
  350.      - podsecuritypolicies
  351.     verbs:
  352.      - use
  353.     resourceNames:
  354.      - default-monitoring
  355. ---
  356. kind: RoleBinding
  357. apiVersion: rbac.authorization.k8s.io/v1
  358. metadata:
  359.   name: psp-default-monitoring-lens-metrics
  360.   namespace: lens-metrics
  361. roleRef:
  362.   kind: ClusterRole
  363.   name: psp-default-monitoring
  364.   apiGroup: rbac.authorization.k8s.io
  365. subjects:
  366.  # Authorize all service accounts in a namespace:
  367.   - kind: Group
  368.     apiGroup: rbac.authorization.k8s.io
  369.     name: system:serviceaccounts
  370.  
  371.  
  372. ### Hostnetwork
  373.  
  374. ---
  375. kind: PodSecurityPolicy
  376. apiVersion: policy/v1beta1
  377. metadata:
  378.   name: default-hostnetwork
  379. spec:
  380.   privileged: false
  381.   hostNetwork: true
  382.   hostIPC: false
  383.   hostPID: false
  384.   seLinux:
  385.     rule: RunAsAny
  386.   supplementalGroups:
  387.     rule: RunAsAny
  388.   runAsUser:
  389.     rule: RunAsAny
  390.   fsGroup:
  391.     rule: RunAsAny
  392.   volumes:
  393.    - 'configMap'
  394.     - 'emptyDir'
  395.     - 'projected'
  396.     - 'secret'
  397.     - 'downwardAPI'
  398.     - 'persistentVolumeClaim'
  399. ---
  400. kind: ClusterRole
  401. apiVersion: rbac.authorization.k8s.io/v1
  402. metadata:
  403.   name: psp-default-hostnetwork
  404. rules:
  405.   - apiGroups:
  406.      - policy
  407.     resources:
  408.      - podsecuritypolicies
  409.     verbs:
  410.      - use
  411.     resourceNames:
  412.      - default-hostnetwork
  413. ---
  414. kind: RoleBinding
  415. apiVersion: rbac.authorization.k8s.io/v1
  416. metadata:
  417.   name: psp-default-hostnetwork-ingress-nginx
  418.   namespace: ingress-nginx
  419. roleRef:
  420.   kind: ClusterRole
  421.   name: psp-default-hostnetwork
  422.   apiGroup: rbac.authorization.k8s.io
  423. subjects:
  424.  # Authorize all service accounts in a namespace:
  425.   - kind: Group
  426.     apiGroup: rbac.authorization.k8s.io
  427.     name: system:serviceaccounts
  428.   # Or equivalently, all authenticated users in a namespace:
  429.   - kind: Group
  430.     apiGroup: rbac.authorization.k8s.io
  431.     name: system:authenticated
  432.  
Add Comment
Please, Sign In to add comment