用trivy掃描KBOM

KBOM = Kubernetes Bills Of Material,就是 Kubernetes 的物料清單。

trivy 是由 Aqua Security 所開發的一個掃描工具,現在支援了 KBOM,可以依據 Kubernetes 務料清單裡的軟體來進行掃描,並產出報告。

安裝可以從 https://github.com/aquasecurity/trivy 來下載安裝,有提供以下方式

  • Container image
  • Debian package
  • RPM package
  • Homebrew

安裝好以後,就可以使用了。

那要掃描 KBOM ,要先產出 kbom.json,用以下指令就可以產出。這邊要注意,執行 trivy 的電腦上必須已經放置 ~/.kube/config ,這樣 trivy 才能存取到 k8s cluster。

trivy k8s cluster --format cyclonedx --output kbom.json

有了 kbom.json 以後,就可以用以下指令產出報告

trivy sbom kbom.json

我的 k8s 報告如下

2024-02-18T15:29:26.693+0800	INFO	Vulnerability scanning is enabled
2024-02-18T15:29:26.694+0800	INFO	Detected SBOM format: cyclonedx-json
2024-02-18T15:29:26.720+0800	WARN	No OS package is detected. Make sure you haven't deleted any files that contain information about the installed packages.
2024-02-18T15:29:26.721+0800	WARN	e.g. files under "/lib/apk/db/", "/var/lib/dpkg/" and "/var/lib/rpm"
2024-02-18T15:29:26.721+0800	INFO	Detected OS: ubuntu
2024-02-18T15:29:26.721+0800	WARN	This OS version is not on the EOL list: ubuntu 22.04.3
2024-02-18T15:29:26.721+0800	INFO	Detecting Ubuntu vulnerabilities...
2024-02-18T15:29:26.721+0800	INFO	Number of language-specific files: 3
2024-02-18T15:29:26.722+0800	INFO	Detecting kubernetes vulnerabilities...
2024-02-18T15:29:26.728+0800	INFO	Detecting gobinary vulnerabilities...

kbom.json (ubuntu 22.04.3)

Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)


 (gobinary)

Total: 3 (UNKNOWN: 0, LOW: 0, MEDIUM: 3, HIGH: 0, CRITICAL: 0)

┌──────────────────────────────────┬─────────────────────┬──────────┬────────┬───────────────────┬────────────────┬──────────────────────────────────────────────────────────┐
│             Library              │    Vulnerability    │ Severity │ Status │ Installed Version │ Fixed Version  │                          Title                           │
├──────────────────────────────────┼─────────────────────┼──────────┼────────┼───────────────────┼────────────────┼──────────────────────────────────────────────────────────┤
│ github.com/containerd/containerd │ CVE-2023-25153      │ MEDIUM   │ fixed  │ 1.6.15            │ 1.5.18, 1.6.18 │ containerd: OCI image importer memory exhaustion         │
│                                  │                     │          │        │                   │                │ https://avd.aquasec.com/nvd/cve-2023-25153               │
│                                  ├─────────────────────┤          │        │                   │                ├──────────────────────────────────────────────────────────┤
│                                  │ CVE-2023-25173      │          │        │                   │                │ containerd: Supplementary groups are not set up properly │
│                                  │                     │          │        │                   │                │ https://avd.aquasec.com/nvd/cve-2023-25173               │
│                                  ├─────────────────────┤          │        │                   ├────────────────┼──────────────────────────────────────────────────────────┤
│                                  │ GHSA-7ww5-4wqc-m92c │          │        │                   │ 1.6.26, 1.7.11 │ containerd allows RAPL to be accessible to a container   │
│                                  │                     │          │        │                   │                │ https://github.com/advisories/GHSA-7ww5-4wqc-m92c        │
└──────────────────────────────────┴─────────────────────┴──────────┴────────┴───────────────────┴────────────────┴──────────────────────────────────────────────────────────┘

從報告可以看出軟體元件的版本跟漏洞報告。

如果不產出 kbom.json ,也可以用另外一個方式掃描

trivy k8s cluster --scanners vuln --report summary

不過這指令在我的 k8s cluster,會有問題,我猜想是我 k8s cluster 不夠力的關係,就先這樣吧。

trivy 也有 operator 可以安裝,有機會再來看看怎麼使用。

參考資料

sitespeed.io 取得網站效能

來源:https://www.sitespeed.io/

專案已經提供了用容器啟動的方式,所以蠻容易的

docker run --rm -v "$(pwd):/sitespeed.io" sitespeedio/sitespeed.io:32.2.0 https://www.sitespeed.io/

執行完成後,會在當前目錄產生 sitespeed-result 目錄,目錄裡就有你需要的效能報告。

有需要撰寫自訂腳本測試的,可以參考 https://www.sitespeed.io/documentation/sitespeed.io/scripting/

效能報告以網頁呈現,用瀏覽器就可以開啟。

如何檢查GitOps Manifests

Kubernetes 主要會用這幾種檔案格式:

  1. YAML
  2. Kustomize
  3. Helm Chart

在使用前,是否可以檢查呢?以下就分別來介紹

YAMLint

YAML 可以使用 yamllint 來檢查,在 RHEL9 裡可以直接安裝 yamllint 。

sudo yum install yamllint

用以下指令檢查

yamllint service.yml

可以使用 -f 來指定輸出格式。

Kustomize

kustomize 可以用 kustomize build 來檢查。

kustomize build path/to/folder

Red Hat 有寫一個輔助腳本:validate_manifest.sh

Helm

helm 本身有提供 subcommand 來檢查:helm lint

helm lint Chart.yaml

參考資料

電影流水帳(2023/05/01~2023/12/31)

Jennifer Connelly
Jennifer Connelly

一次寫完。2023年共看了21部電影。

Top Gun: Maverick

下檔以後,沒多久 HBO 就上映了,而且還重播了好幾次。

Maverick 回來當教官,帶著一群年輕人訓練,後來一起出了任務。訓練的過程裡,因為有個學員是上一集已故同伴的兒子,所以故事有帶到這個心結。後來在出任務以後,順理成章的解了這個心結,也順利完成任務。

飛行畫面真的屌,珍妮佛·康納莉跟莫妮卡·巴巴羅真的漂亮。後來也因為莫妮卡·巴巴羅的關係,看了她跟阿諾爺爺一起演的 FUBAR 。

Wall-E

之前一直都沒完整看過,想說來完整看過一遍。

Wall-E 是個清理機器人,持續在清理地球。清理地球的原因是因為地球被污染得很嚴重,人類搭乘太空船出去旅行,就留下機器人持續的在運作。Wall-E 維持著規律的生活,很好的照顧著自己 (這是不是在告訴我們要維持規律生活、正常飲食,來好好照顧自己呢?) 。

某天,外出的太空船派出 Eve 探索機器人回地球探索,Wall-E 看到 Eve ,就愛上了 Eve。Eve 發現了植物,將植物帶回,Wall-E 也跟著回去,回到了太空船。

原本依照前人留下的指示,如果探索機器人在地球發現植物,那麼就表示太空船可以回到地球了。可是太空船的電腦卻因為之前的另外一道命令,決定要抹滅有植物這件事情,所以就展開了一場植物爭奪戰。雖然太空船電腦想隱瞞,但船長還是得知了這件事情,也做出了決定,要回到地球。最終,船長順利的處理了太空船電腦,複寫了原本的指令,要回去地球,可是 Wall-E 的電路板損壞了。Eve 知道 Wall-E 在地球有留下備料,所以在太空船回到地球以後,趕緊找出零件替換上去。Wall-E 在換上零件以後,就回復運作了,但卻沒有之前的記憶,Eve 很難過。可是在 Eve 碰觸 Wall-E 以後,Wall-E 回想起了之前的一切,想起他喜愛的 Eve,有了一個美好的結局。

Boss Level

很有趣的題材,因為第四台重播的關係,我看了兩三次才完整看完。

女主角在為一家公司研發一種可以逆轉時間的技術,但他發現主管居心叵測,怕技術被濫用,所以就把這技術用在她前夫身上。

她前夫開始莫名其妙的被殺掉,然後回到起床的時間點,一直重複。他慢慢克服被殺,或者說躲掉被殺,推進到後面的時間,才了解事情的原委。在了解原因之後,他救回了前妻,然後避免了這技術被該公司主管使用。最後皆大歡喜。

Polar

一個要退休的殺手,因為公司不想付龐大的退休金給殺手,因而起了壞心,想把他滅口,這樣就不用付錢了。哪知道,這殺手太厲害,反倒把來殺他的殺手都幹掉了。最後殺手退休,終於能過平靜的日子。

급 공무원

我的特務女友,這片我忘記劇情了,印象中是一部歡樂的動作片。

看了維基百科,大致想起來了。女主角是情報員,因為某些原因離開了兩情相悅的男友。三年後,再度遇到一起,這男主角(或女主角)一直以為自己是被甩,所以相互有芥蒂。直到因為發現彼此都不尋常,才知道都是情報員。最後就聯手順利解決案件,一個歡樂的結局。

Bullet Train

這是發生在火車上的故事,一群殺手相互因為各自的原因,一起廝殺,蠻陰錯陽差的。這部電影蠻好看的,動作跟劇情都蠻不錯的,最後也算是好結局,該留下的人留下了。

Ant-Man and the Wasp: Quantumania

蟻人3,太多特效了,少了前兩集放大縮小的樂趣,很可惜。

故事大致是黃蜂女媽媽隱藏了量子領域的一些事情,而蟻人的女兒進到量子領域,大夥一起進去救她,卻發現了量子領域被征服者康征服的事情,然後跟裡面的反抗軍聯手打倒征服者康。

千と千尋の神隠し

看了不下數十次,這部電影是我跟太太在婚前一起到長春戲院看的第一部宮崎駿電影。天啊,都 20 幾年前的事情了。

ハウルの動く城

霍爾的移動城堡,記得這部也是進電影院看的,對城堡那個門特別有印象,切換以後,開個門就是一個新天地,實在是很方便。再來就是女主角在被咒語變老之後,會因為心境跟當時情況的不同,時而年輕,時而變為年老,這點也很有趣。這點暗示了境由心生,你自己決定了你自己的年紀、你自己的心情,不要因為外在而持續的感到沮喪跟無力。

紅の豚

一個神秘卻有豬頭的飛行員,非常厲害。故事是講他因為飛機被擊落,然後去找人幫忙做了新飛機,在這過程認識了可愛、富有活力的女機師,因而被吸引。

作飛機的這段讓人印象深刻,因為作飛機需要人力,在戰亂的時代,男人都出外打仗,只剩下女人,所以作飛機都是女人來幫手。

還有一段也有很有趣,就是小朋友校外旅行,飛機被迫降落,然後其實很善良的海賊們就載著這群小朋友回家,真的很可愛。

The Flash

DC 宇宙裡知名的事件,閃點。之前在動畫裡看過了,所以大概知道劇情。簡單的說,就是閃電俠因為遺憾,想回到過去救自己老媽,結果卻導致時間錯亂。

這故事很容易可以讓人帶入同理心,因為人都會有懊悔、想改變過去的那種感覺。

這部電影算是蠻忠實地呈現,也因為這樣的故事,很容易可以跟其他部電影作連結,因為時間錯亂了,人物跟故事線是可以隨意找的。

故事本身就好看,電影也拍的不錯,唯一的缺點大概就是特效吧,我覺得是瑕不掩瑜啦。

電影流水帳(2023/04/01~2023/04/30)

a woman in a pink bodysuit posing for a picture, tumblr, magic realism, leeloo, nadezhda tikhomirova,  wes anderson
  • The Swan(IMDB, Wikipedia),台譯:天鵝之翼。
  • The Rat Catcher (IMDB, Wikipedia),台譯:殺鼠之鼠。
  • The Wonderful Story of Henry Sugar (IMDB, Wikipedia),台譯:亨利。休格的神奇故事。
  • Poison (IMDB, Wikipedia),台譯:心腹之毒。

先說一下,這四部短片並不是在4月的時候看的唷,但不管了,就先這樣吧。

說真的,當初在 Netflix 上看到「亨利。休格的神奇故事」時,沒有很想看。但後來看到有人介紹說這是短片,想說才幾分鐘,可以來看看。想不到一看之下,根本就無法自拔,想要一次看完。故事的表現採用話劇、舞台劇的形式來演出,和一般的電影不一樣,很有意思。

The Wonderful Story of Henry Sugar

這個是講亨利。休格去練習一種技術,讓他可以打牌賺大錢的技術,花了許多時間練習,然後成功。只是到了最後他發現自己學會的這項技術應該要幫助更多的人,所以就把用這技術賺到的錢都捐出去。

The Rat Catcher

這故事是講殺鼠人的故事,殺鼠人對老鼠非常熟悉,只是這次出馬卻沒能殺死老鼠,他非常惱怒。為了證明自己,他示範不用手跟腳殺掉老鼠,但後來很冏的逃離了。

The Swan

這故事有點哀傷,一個小男孩被兩個大孩子欺負,躲到了樹上。兩個大孩子在樹下等,並用言語逼迫他,後來小男孩變成天鵝飛走了。

Poison

一個躺在床上的人,以為毒蛇在自己身上,不敢亂動,就打了電話請人來幫忙。這人來看了以後,又找了醫生來幫忙。結果,根本沒有蛇,真的是虛驚一場。

為 yum repository 指定 proxy

要設定讓 yum 可以使用指定的 proxy 伺服器,可以在 /etc/yum.conf 的 [main] 區段裡增加 proxy 設定即可

[main]
proxy=http://<proxy_server>:3128

那如果是個別的 repository 要使用不同的 proxy 伺服器,可以怎麼做呢?
原本以為會很麻煩的,但意想不到簡單,因為有支援此設定。
就在 repository 的區段裡增加 proxy 設定就可以:

[repo]
name=baseos
baseurl=http://yumrepo.example.com/baseos
enabled=1
gpgcheck=0
proxy=http://<proxy_server>:3128

參考資料

bash script取亂數

在 bash script 裡,可以用 ${RANDOM} 取亂數,例如

echo "random number: ${RANDOM}"

就會出現一個隨機的數字。

那如果想限制在 20~40 這個範圍內的話,可以怎麼做呢?這時候可以用 bash 的 % ,取餘數的運算子來做,例如

echo "random number(0~10): $((20 + RANDOM % 20))"

參考資料

git repository搬家

若有需要將整個 repository 從 A 搬到 B ,單純的 git clone 跟 git push 是不夠的,因為還有 branches, tags 等等的。

所以得這樣作。

首先在目的端,例如 github/gitlab ,建立一個空的 repository。

接著要處理來源端的 repository,在 clone 時加上 --mirror

git clone --mirror git@example.com:repo1.git

git clone 完成會有一個 repo1 的資料夾,進入 repo1 的資料夾,執行以下指令把所有 branches, tags 資訊都拉取回來,然後加入新的遠端,並進行推送

git fetch --all
git remote add target git@<新的repository>
git push target --mirror

這樣就大功告成了。

參考資料

BIND+DNS over HTTPs

說明一下為什麼會要這樣作。

因為環境關係,DNS protocol 出不去,只有 A 主機可以透過 HTTP 出去。

因此方案如下:

  1. A 電腦安裝 squid,其他主機可將 HTTP proxy 設定為 A 主機,這樣 HTTP 請求就可透過 A 主機出去。
  2. 環境內原有 B 主機已經安裝 BIND,此主機就安裝 cloudflare 提供的 cloudflared ,使用 DNS over HTTPs 方式,讓 DNS 查詢可以用 HTTP 請求,透過 A 主機去查詢。

安裝與設定

cloudflared 蠻好安裝的,就一個執行檔,下載以後,改個權限就可以執行了 (安裝方式)

那如果要用 systemd 來啟動,也很容易,安裝方式裡就有提供範例:

[Unit]
Description=DNS over HTTPS (DoH) proxy client
Wants=network-online.target nss-lookup.target
Before=nss-lookup.target

[Service]
Environment=http_proxy=http://<proxy>:3128
Environment=https_proxy=http://<proxy>:3128
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
DynamicUser=yes
ExecStart=/usr/local/bin/cloudflared proxy-dns --port 5533

[Install]
WantedBy=multi-user.target

設定好,用 firewall-cmd 設定好防火牆 (TCP 5533) 以後,就可以去調整 BIND 的設定 /etc/named.conf

修改既有的 forwarder 設定

forwarders { 127.0.0.1 port 5533; };

重新啟動 named 以後,就可以試試看了。

流程大致如下

--[DNS查詢]--> B 主機(53/UDP) ----> B 主機(5533/TCP) --[HTTP]--> A 主機(3128/TCP) --> 外部

參考資料

Kubernetes刪除資源卡在Terminating

資料來源:

整理一下,若遇到刪除不了,一定是有原因。以 Namespace 來說,通常是有些資源刪除不掉,這時候要花點耐心去找。

若不想等,就是加上 --grace-period=0 --force ,強制來做。

Pod 也是類似的作法。

若還是不行,可以把 finalizer 清掉,以下是 pod 的例子,但 namespace 也可以用。

kubectl patch pod <pod>-p '{"metadata":{"finalizers":null}}'

最後一招,終極的作法,是直接存取 etcd ,這個會看是用哪個容器平台而有不同的作法。像 OpenShift ,etcd 是以 pod 形式存在,所以需要進到 etcd 的 pod 裡,用 etcdctl 去查詢跟刪除。

雖然通常都是建議不要,但難免會遇到這種情況,就參考看看。