kubeaudit

網址:https://github.com/Shopify/kubeaudit

可以用來稽核 kubernetes 叢集的工具,檢查的項目有

  • 確保容器以非 root 身份執行
  • 確保容器的根目錄是唯讀
  • 移除有危險的 capability
  • 不執行 privileged
  • 陸續增加中

安裝

直接從 github release 下載二進位檔案,然後放到 /usr/local/bin 就可以了。

使用

有三種模式

  • Manifest mode
  • Local mode
  • Cluster mode

Manifest mode

Manifest mode 就是掃檔案,意思是如果你有寫好的 yaml 檔案,kubeaudit 可以直接掃 yaml 檔案

kubeaudit all -f "/path/to/manifest.yml"

掃完會輸出掃描結果。

需要修正的話,可以用 autofix 來自動修正。

kubeaudit autofix -f "/path/to/manifest.yml"

怕改爛的話,可以輸出到另外一個檔案

kubeaudit autofix -f "/path/to/manifest.yml" -o "/path/to/fixed"

Cluster mode

Cluster mode 就是掃描當前的 Kubernetes 叢集,不要加上 -f 參數就可以

kubeaudit all

Local mode

Local mode 是在你管理多座 kubernetes 叢集時,可以指定 kubeconfig 跟 context,例如

kubeaudit all --kubeconfig "/path/to/config" --context my_cluster

設定

大部份掃描工具都會提供設定,讓開發者可以決定要掃描哪些項目,kubeaudit 也有,格式是 yaml 。

enabledAuditors:
  # Auditors are enabled by default if they are not explicitly set to "false"
  apparmor: false
  asat: false
  capabilities: true
  deprecatedapis: true
  hostns: true
  image: true
  limits: true
  mounts: true
  netpols: true
  nonroot: true
  privesc: true
  privileged: true
  rootfs: true
  seccomp: true
auditors:
  capabilities:
    # add capabilities needed to the add list, so kubeaudit won't report errors
    allowAddList: ['AUDIT_WRITE', 'CHOWN']
  deprecatedapis:
    # If no versions are specified and the'deprecatedapis' auditor is enabled, WARN
    # results will be genereted for the resources defined with a deprecated API.
    currentVersion: '1.22'
    targetedVersion: '1.25'
  image:
    # If no image is specified and the 'image' auditor is enabled, WARN results
    # will be generated for containers which use an image without a tag
    image: 'myimage:mytag'
  limits:
    # If no limits are specified and the 'limits' auditor is enabled, WARN results
    # will be generated for containers which have no cpu or memory limits specified
    cpu: '750m'
    memory: '500m'
  • enabledAuditors 是要啟用的稽核項目
  • auditors 下方則是每個稽核項目的設定

總結

透過使用 kubeaudit 這個工具,可以稽核 kubernetes 叢集,避免放上有危險的設定,是很實用的工具。

microk8s使用自建的mirror registry

文件在這邊:How to work with a private registry

設定方法很簡單,設定檔案位置在 /var/snap/microk8s/current/args/certs.d/ ,每個 registry server 都有一個對應的目錄,裏面會有 hosts.toml 。例如 docker.io ,目錄就是

/var/snap/microk8s/current/args/certs.d/docker.io ,hosts.toml 的內容是
server = "https://docker.io"

[host."https://registry-1.docker.io"]
  capabilities = ["pull", "resolve"]

要改為 mirror registry,就變為

server = "https://docker.io"

[host."http://your_registry_server/v2"]
  capabilities = ["pull", "resolve"]
  override_path = true

關鍵在於 [host.””] 裡的 server 位置還有 override_path = true

修改完成以後,重新啟動 microk8s 即可。

sudo snap restart microk8s

基本設定方法就是這樣。之前在看的時候因為眼花,一直想說為什麼會有 “‘ | sudo tee -a /var/snap/microk8s/current/args/certs.d/k8s.gcr.io/hosts.toml” 這一段,後來仔細看,才知道文件裡貼的是一個指令。

以後改為這樣,就可以不用去外部拉取,加快拉取 image 速度了。

ubuntu的apt與gpg

最近因為在 Ubuntu 更新的時候,老是出現 gpg pub key 錯誤,有問題的套件庫是 hashicorp 跟 yarn 的套件庫,今天終於下定決心處理。

第一個找到的是這篇:How to configure HashiCorp repository

處理方法是這樣的,先下載 gpg key,然後用 sudo gpg 匯入

wget --quiet --output-document - https://apt.releases.hashicorp.com/gpg | \
  sudo gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/hashicorp-archive-keyring.gpg --import

然後檢查 /usr/share/keyrings/hashicorp-archive-keyring.gpg

ls -l /usr/share/keyrings/hashicorp-archive-keyring.gpg

permission 結果應該要是 644 。

接著檢查 source list 檔案,裏面會有 signed-by 的字串

deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com jammy main

基本上這樣就解決了,yarn 的處理方式也一樣。

wget --quiet --output-document - https://dl.yarnpkg.com/debian/pubkey.gpg | sudo gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/yarnkey.gpg --import

只是這邊做完,還是有問題,後來才靈機一動想到要檢查 /usr/share/keyrings/yarnkey.gpg 的 permission,發現是 600,用 chmod 改為 644 以後,apt update 就沒問題了。

[Linux]加入多個使用者到指定群組

要把使用者加入群組裡,可以用 usermod -aG group1 user1

那要一次把多個使用者加入群組的話,有什麼指令可以使用呢?這時候可以使用 gpasswd

gpasswd -M user1,user2,user3 group1

這樣子就可以了。

參考資料來自這裡:https://unix.stackexchange.com/questions/248426/

這串討論裡還有提到使用 for loop + usermod 的解決方法,但都不如上面那行來的簡潔、有力。

以後就知道可以用 gpasswd 了。

電影流水帳(2022/10/01~2022/11/30)

A defaced subway advertisement for the movie “The Hitman’s Bodyguard” (2017) spotted in the Cortlandt Street subway station in Lower Manhattan.
The Hitman’s Bodyguard

The Hitman’s Bodyguard

娛樂性很高的片,有動作、有槍戰、有嘴賤的鬥嘴,也有搞笑,蠻歡樂的。

Michael 是個保鏢,但因為某次陰錯陽差,要保護的對象被幹掉了,他從鼎鼎大名的 3A 等級,落到很差的等級,只能接一些零星的案子過活。Vladislav 是某獨裁國家的總統,利用他的權力跟金錢,引起國際動亂,被國際法庭起訴。而 Darius 是個殺手,受雇殺了很多人,被捕入獄,CIA 需要他出庭作證 Vladislav 的罪行。

Vladislav 怎麼可能會放過能出庭指證他的人?於是他找了殺手,幹掉每個 CIA 找來出庭的証人,這次當然也不放過 Darius 。CIA 派了大批人馬保護 Darius,但 Vladislav 找來的殺手太厲害,CIA 的人都被幹掉,裏面認識 Michael 的 Amelia ,是 Michael 的前女友,他知道 Michael 很可靠,就把 Darius 托付給 Michael,要 Michael 保護 Darius ,送他安全出庭。Michael 跟 Amelia 談好條件,就接下這任務了。

一個是保鏢,一個是殺手,行事上本就南轅北轍、風格迥異,一路上打打鬧鬧,幹掉 Vladislav 派來的所有人。到了後來安全送 Darius 到目的地的時候,Darius 才告訴 Michael,當時害他落入差評的事件,就是他剛好看到要暗殺的對象,順手幹掉的。Michael 超不爽,就跟 Darius 鬧翻了。後來,Michael 靜下心來聽進 Darius 勸告,回頭到法庭上去幫忙 Darius 避免被 Vladislav 的人暗殺,兩人最終握手言和,平安落幕。

讓子彈飛

買官的故事,在第四台看了好幾次的片段,這次總算用 Netflix 看完。

馬邦德買了個官,在上任途中,被張麻子伏擊,為了保命,馬邦德謊稱馬邦德死了,自己是師爺,說張麻子可以頂替這位子上任。張麻子始終也沒說自己是張麻子,馬邦德也不知道這位是張麻子,于是乎,張麻子就這樣上任了。

到了縣城,張麻子發現張麻子只是個恍子,真正的權力是在黃四郎這個富翁身上。黃四郎、張麻子、馬邦德就在這樣的情況下,相互探底、勾心鬥角,想要探出彼此的底細。經過幾次衝突跟協調以後,黃四郎跟張麻子達成協議,黃四郎出錢讓縣長張麻子去打土匪張麻子,一行人浩浩蕩蕩出發,在半路上,縣長張麻子被假的土匪張麻子給伏擊了,打了一場以後,縣長張麻子逮住假土匪,問供以後,得知黃四郎真的就是背後的那隻手。縣長張麻子超不爽了,就回去縣城發錢、發彈藥,想要發起反抗。透過替身黃四郎,才真正的鼓動起縣城的人一同反抗,攻入黃四郎豪宅。最後黃四郎家財散盡,落入窘況,張麻子等人也散伙,不再當土匪。

Molly’s Game

半敘事、類似紀錄片的手法來拍 Molly 的故事,我還滿喜歡這樣的電影,第四台帶到時,會被帶進劇情裡。

Molly 從小時候起,父親就栽培她做一個滑雪選手,Molly 對父親的嚴苛不滿,去大學念法律以後就不再回家。她邊唸書邊打工,透過打工的事務所,她了解了地下賭盤的生態,從而發現這很好賺。後來打工的事務所解僱她,她就自己出來作地下賭盤。生意愈做愈大,看了很多名人、富翁的揮霍跟起落,在經歷過許多之後,她被起訴、扣押,她出了書,找律師 Charlie 幫忙。Charlie 本來是不想幫忙的,但因為女兒還有書裡講的事情實在是很吸引他,就決定幫了忙。Charlie 跟 Molly 幾次訪談與取得 Molly 第一手資料以後,了解了整個事情的經過,明白 Molly 是有在用心保護每個賭客的。最終 Molly 跟 Charlie 在法庭上取得了優勢,不被起訴。Molly 後來跟父親和解,不做賭盤了,回頭滑雪。

銀魂

看這部真人電影之前,建議先看過漫畫或動畫比較好,後面有些部份若沒看漫畫或動畫,真的比較沒辦法投入。人物的還原度我覺得蠻高的,蠻多地方很搞笑,但現在我卻想不起來故事在講什麼。

故事記得是在講妖刀紅櫻的事情,打造紅櫻的村田鐵矢的妹妹村田鐵子委託萬事屋阿銀去調查妖刀的事情,正巧街上也頻傳有人被殺掉的事件,阿銀就展開調查。後來發現妖刀跟之前昔日同窗還有鬼兵隊有關係,為了阻止他們,就打了起來,後面就不太記得了。

trivy-operator

Trivy 是 AquaSecurity 開發的工具,它可以掃描漏洞與有問題的設定檔,而且這工具有開源出來,真的是很佛心。

Trivy 有提供 CLI ,可以搭配 CI 作映像檔掃描,它也有提供 Operator ,可以安裝到 Kubernetes/OpenShift 裡,在佈署容器以後,他會自動的掃描,並產出漏洞報告。

安裝

安裝相當簡單,這邊使用 helm 來安裝,主要是因為這樣好管理。安裝步驟是參考這份文件:Helm – Trivy Operator

加入 helm repository

helm repo add aqua https://aquasecurity.github.io/helm-charts/
helm repo update

安裝

helm install trivy-operator aqua/trivy-operator \
  --namespace trivy-system \
  --create-namespace \
  --set="trivy.ignoreUnfixed=true" \
  --version 0.10.1

檢查

helm list -n trivy-system
kubectl get deployment -n trivy-system

應該會看到以下的輸出

$ helm list -n trivy-system
NAME                 NAMESPACE           REVISION    UPDATED                                 STATUS      CHART                       APP VERSION
trivy-operator   trivy-system    1           2021-01-27 20:09:53.158961 +0100 CET    deployed    trivy-operator-0.10.1   0.10.1

$ kubectl get deployment -n trivy-system
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
trivy-operator   1/1     1            1           11m

使用

安裝完成以後,Trivy 會自動開始對所有 deployment/daemonset/pod 等的 image 去做掃描。

可以用以下指令去看掃描報告的列表,報告有兩種,一種是安全漏洞的 (vulnerabilityreports) ,一種是稽核的 (configauditreports)

kubectl get vulnerabilityreports -A -o wide
kubectl get configauditreports -A -o wide

後續佈署上去的,也會自動掃描。

要看報告內容,可以用 get/describe 來察看

kubectl get vulnerabilityreport replicaset-nginx-5fbc65fff-nginx -o yaml
kubectl describe configauditreport replicaset-nginx-5fbc65fff

報告預設是 24 小時後刪除,然後重新掃描,如果要調整,可以修改 trivy-operator 這個 deployment 裡的 OPERATOR_SCANNER_REPORT_TTL 環境變數。

後續

後續延伸的議題是 trivy 的掃描依據是什麼呢?若在封閉的環境下,能否使用?若可以使用,又該如何更新呢?

結論

感謝 AquaSecurity 提供的這個工具,讓容器平台能更安全。

kubectl scale

看完這篇 Using Kubectl Scale 所整理的。

基本使用方式

kubectl scale --replicas=3 deployment/nginx-hello

有條件的 scale,可以指定只有在已經有 n 個 pod 的情況下,才去 scale,例如

kubectl scale --current-replicas=3 --replicas=5 deployment/demo-deployment

這就是說,只有在目前已經有 3 個 pod 的情況下,才做 scale。這可以避免在資源已經不足的情況下還去做 scale,讓整個 k8s 叢集更加不穩定。

對多個資源做 scale

kubectl scale --replicas=5 deployment/app deployment/database

對 default 這個 namespace 裡所有可以 scale 的資源去做 scale

kubectl scale --all --replicas=5 --namespace=default deployment

也可以用 selector 去篩選,例如針對所有 app-name=demo-app 的 deployment 去做 scale

kubectl scale --replicas=5 --selector=app-name=demo-app deployment

要做 scale 還有其他方法:

  1. 更動 yaml 裡的 spec.replicas
  2. 使用 HPA (Horizontal Pod Autoscaling)

最佳實踐

  • 避免經常性的做 scale
  • scale 到 0 的時候,表示應用程式會停止服務
  • 確定選到正確的資源做 scale
  • 使用 --current-replicas 來避免意外。

yq

jq 這個工具可以用查詢語法去查詢 json 檔案裡的指定內容,很方便。基本上 yaml 可以直接轉換為 json ,因此若先把 yaml 轉換為 json,再用 jq 查詢也是可以的。

只是多了一道轉換,是稍嫌麻煩一點,那麼 yaml 檔案是不是也有類似的工具呢?

答案是有的,我找到兩個實作,一個是使用 python 實作,一個是使用 go 實作。

查詢語法跟 jq 很相似,這部份可以參考 jq https://stedolan.github.io/jq/

microk8s升級

使用過 OpenShift 跟 Kubernetes ,對於升級這件事情,就會比較小心。關於升級這件事情,可以參考 Kubernetes 升級 FAQ

microk8s 這部份蠻簡單的,官方的文件很清楚:Upgrading MicroK8s

單個節點

用 snap 更新就可以

sudo snap refresh microk8s --channel=1.21/stable

多個節點

Kubernetes 本身允許某些節點的版本較低 (service skew),這邊就一個節點、一個節點處理。

文件沒有提到順序,我的想法是先升級 master 節點,再升級 worker 節點,步驟都一樣。

先把 pod 都趕出來

microk8s kubectl drain <node> --ignore-daemonsets

用以下指令確認除了 daemonset 以外的 pod 都已經被終止。

microk8s kubectl get po -A -o wide

然後更新

sudo snap refresh microk8s --channel=1.21/stable

再用以下指令去確認 node 都升級完成

microk8s.kubectl get node

最後再將 node 設置為可以調度

microk8s kubectl uncordon <node>

這邊有篇實例可以參考:https://microk8s.io/docs/upgrade-cluster

RHEL8 系統憑證管理

RHEL8 管理系統 SSL 憑證,首先要安裝 ca-certificates 套件

yum install ca-certificates

這個套件主要是外部的憑證,會定期更新,若是在連線到外部有遇到憑證問題,通常更新這個套件就可以解決。

如果有需要安裝自簽憑證,可以複製到以下這兩個憑證路徑:

  • /etc/pki/ca-trust/source/anchors
  • /usr/share/pki/ca-trust-source/anchors

/etc/pki/ca-trust 的權限比較高。

複製完成,執行

update-ca-trust

要察看目前有放了哪些憑證,可以用 trust 指令

trust list

前面提到的複製、執行 update-ca-trust ,也可以用以下指令替代

trust anchor <path.to/certificate.crt>

參考資料