Question : There are a number of Kubernetes objects created inside the omega, citadel and eden-prime namespaces. However, several suspicious/abnormal operations have been observed in these namespaces!.
For example, in the citadel namespace, the application called webapp-color is constantly changing! You can see this for yourself by clicking on the citadel-webapp link and refreshing the page every 30 seconds. Similarly there are other issues with several other objects in other namespaces.
To understand what's causing these anomalies, you would be required to configure auditing in Kubernetes and make use of the Falco tool.
Inspect the issues in detail by clicking on the icons of the interactive architecture diagram in the lab and complete the tasks to secure the cluster. Once done click on the Check button to validate your work.
Solution:
1. Lets first check the K8 cluster to proceed ahead with solution.
| 
   root@controlplane
  ~ ➜  kubectl get nodes NAME           STATUS   ROLES                  AGE     VERSION controlplane   Ready   
  control-plane,master  
  4m49s   v1.23.0 root@controlplane ~ ➜ root@controlplane ~ ➜ kubectl get all -A NAMESPACE     NAME                                      
  READY   STATUS              RESTARTS        AGE citadel       pod/webapp-color                           0/1     ContainerCreating   0               3s eden-prime    pod/eden-fe-77574c68cd-mmtg2               1/1     Running             0               4m15s eden-prime    pod/eden-software1                         1/1     Running             0               4m15s eden-prime    pod/eden-software2                         1/1     Running             0               4m15s eden-prime    pod/eden-software3                         1/1     Running             0               4m15s kube-system   pod/coredns-64897985d-s55wd                1/1     Running             0               4m32s kube-system   pod/coredns-64897985d-vrh62                1/1     Running             0               4m32s kube-system   pod/etcd-controlplane                      1/1     Running             0               4m49s kube-system   pod/kube-apiserver-controlplane            1/1     Running             0               4m49s kube-system  
  pod/kube-controller-manager-controlplane   1/1    
  Running             0               4m52s kube-system   pod/kube-proxy-v5jtm                       1/1     Running             0               4m33s kube-system   pod/kube-scheduler-controlplane            1/1     Running             0               4m49s kube-system   pod/weave-net-9wkn8                        2/2     Running             1 (4m29s ago)   4m33s omega         pod/omega-fe-678c4ccf75-pxvft              1/1     Running             0               4m14s omega         pod/omega-software4                        1/1     Running             0               4m14s omega         pod/omega-software5                        1/1     Running             0               4m14s omega         pod/omega-software6                        1/1     Running             0               4m14s 
 NAMESPACE     NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE citadel       service/webapp-color   NodePort   
  10.108.71.29   <none>        8080:32192/TCP           4m17s default       service/kubernetes     ClusterIP   10.96.0.1      <none>        443/TCP                  4m51s kube-system   service/kube-dns       ClusterIP   10.96.0.10     <none>        53/UDP,53/TCP,9153/TCP   4m49s 
 NAMESPACE     NAME                        DESIRED   CURRENT  
  READY   UP-TO-DATE   AVAILABLE  
  NODE SELECTOR            AGE kube-system   daemonset.apps/kube-proxy   1        
  1         1       1            1           kubernetes.io/os=linux   4m49s kube-system   daemonset.apps/weave-net    1        
  1         1       1            1           <none>                   4m38s 
 NAMESPACE     NAME                       READY   UP-TO-DATE   AVAILABLE  
  AGE eden-prime    deployment.apps/eden-fe    1/1    
  1            1           4m15s kube-system   deployment.apps/coredns    2/2    
  2            2           4m50s omega         deployment.apps/omega-fe   1/1    
  1            1           4m14s 
 NAMESPACE     NAME                                 
  DESIRED   CURRENT   READY  
  AGE eden-prime    replicaset.apps/eden-fe-77574c68cd    1        
  1         1       4m15s kube-system   replicaset.apps/coredns-64897985d     2        
  2         2       4m33s omega        
  replicaset.apps/omega-fe-678c4ccf75  
  1         1         1       4m14s root@controlplane ~ ➜  | 
 
2. Let's move to /etc/kubernetes/ and create YAML file named audit-policy.yaml then create single rule policy to record events according to question.
| 
   root@controlplane
  ~ ➜ vi  /etc/kubernetes/audit-policy.yaml root@controlplane ~ ➜ cat /etc/kubernetes/audit-policy.yaml apiVersion:
  audit.k8s.io/v1 # This is required. kind: Policy # Don't generate
  audit events for all requests in RequestReceived stage. omitStages:   - "RequestReceived" rules: - level:
  Metadata   resources:   - resources: ["pods",
  "configmaps"]   namespaces: ["omega",
  "citadel", "eden-prime"] root@controlplane ~ ➜  | 
 
3. Lets modify kube-apiserver YAML file to use volume called audit and mount only file.
| 
   root@controlplane
  ~ ➜  vi 
  /etc/kubernetes/manifests/kube-apiserver.yaml  root@controlplane
  ~ ➜ cat 
  /etc/kubernetes/manifests/kube-apiserver.yaml apiVersion: v1 kind: Pod metadata:   annotations:    
  kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint:
  192.168.121.109:6443   creationTimestamp: null   labels:     component: kube-apiserver     tier: control-plane   name: kube-apiserver   namespace: kube-system spec:   containers:   - command:     - kube-apiserver     - --advertise-address=192.168.121.109     - --allow-privileged=true     - --authorization-mode=Node,RBAC     -
  --audit-policy-file=/etc/kubernetes/audit-policy.yaml     - --audit-log-path=/var/log/kubernetes/audit/audit.log     -
  --client-ca-file=/etc/kubernetes/pki/ca.crt     -
  --enable-admission-plugins=NodeRestriction     - --enable-bootstrap-token-auth=true     -
  --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt     - --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt     -
  --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key     - --etcd-servers=https://127.0.0.1:2379     -
  --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt     - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key     -
  --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname     -
  --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt     -
  --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key     -
  --requestheader-allowed-names=front-proxy-client     -
  --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt     -
  --requestheader-extra-headers-prefix=X-Remote-Extra-     -
  --requestheader-group-headers=X-Remote-Group     -
  --requestheader-username-headers=X-Remote-User     - --secure-port=6443     -
  --service-account-issuer=https://kubernetes.default.svc.cluster.local     - --service-account-key-file=/etc/kubernetes/pki/sa.pub     -
  --service-account-signing-key-file=/etc/kubernetes/pki/sa.key     - --service-cluster-ip-range=10.96.0.0/12     -
  --tls-cert-file=/etc/kubernetes/pki/apiserver.crt     -
  --tls-private-key-file=/etc/kubernetes/pki/apiserver.key     image: k8s.gcr.io/kube-apiserver:v1.23.0     imagePullPolicy: IfNotPresent     livenessProbe:       failureThreshold: 8       httpGet:         host: 192.168.121.109         path: /livez         port: 6443         scheme: HTTPS       initialDelaySeconds: 10       periodSeconds: 10       timeoutSeconds: 15     name: kube-apiserver     readinessProbe:       failureThreshold: 3       httpGet:         host: 192.168.121.109         path: /readyz         port: 6443         scheme: HTTPS       periodSeconds: 1       timeoutSeconds: 15     resources:       requests:         cpu: 250m     startupProbe:       failureThreshold: 24       httpGet:         host: 192.168.121.109         path: /livez         port: 6443         scheme: HTTPS       initialDelaySeconds: 10       periodSeconds: 10       timeoutSeconds: 15     volumeMounts:     - mountPath: /etc/ssl/certs       name: ca-certs       readOnly: true     - mountPath: /etc/ca-certificates       name: etc-ca-certificates       readOnly: true     - mountPath: /etc/kubernetes/pki       name: k8s-certs       readOnly: true     - mountPath:
  /usr/local/share/ca-certificates       name: usr-local-share-ca-certificates       readOnly: true     - mountPath: /usr/share/ca-certificates       name: usr-share-ca-certificates       readOnly: true     - mountPath:
  /etc/kubernetes/audit-policy.yaml       name: audit       readOnly: true     - mountPath: /var/log/kubernetes/audit/       name: audit-log       readOnly: false   hostNetwork: true   priorityClassName: system-node-critical   securityContext:     seccompProfile:       type: RuntimeDefault   volumes:   - hostPath:       path: /etc/ssl/certs       type: DirectoryOrCreate     name: ca-certs   - hostPath:       path: /etc/ca-certificates       type: DirectoryOrCreate     name: etc-ca-certificates   - hostPath:       path: /etc/kubernetes/pki       type: DirectoryOrCreate     name: k8s-certs   - hostPath:       path: /usr/local/share/ca-certificates       type: DirectoryOrCreate     name: usr-local-share-ca-certificates   - hostPath:       path: /usr/share/ca-certificates       type: DirectoryOrCreate     name: usr-share-ca-certificates   - name: audit     hostPath:       path: /etc/kubernetes/audit-policy.yaml       type: File   - name: audit-log     hostPath:       path: /var/log/kubernetes/audit/       type: DirectoryOrCreate status: {} root@controlplane
  ~ ➜  | 
 
4. Create a YAML file with all the parameters, Kindly do the changes as per task you can copy from GitLab https://gitlab.com/nb-tech-support/devops.git
( Refer Below Video for more clarity )
5. Click on Finish & Confirm to complete the task successfully
Happy Learning!!!!
Apart from this if you need more clarity, I have made a tutorial video on this, please go through and share your comments. Like and share the knowledge
0 Comments