ref: https://www.cyberark.com/resources/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions
本篇文章是一個基礎分享文,整個主軸圍繞於 Authentication 與 Authorization 兩大塊,同時透過這兩大概念的介紹來分享一些會可能會有資安問題的設定
開頭作者探討了 Kubernetes 的架構,並且將 API Server 這個重點核心拿來出探討,提到為了存取 Kubernetes API,使用者必須要經過三個階段的處理,分別是
Authentication, Authorization 以及 Admission Control
接者用一個簡單的流程來說明上述三者的差異,假設今天有一個 Client 想要請求 API Server 幫忙創建一個 Pod 的物件。
首先 API Server 會針對該請求進行 Authentication 的檢查,通常情況下會使用 Certificate, Tokens, Basic Authentication(username/password) 來判別。
如果通過後,則會進入到 Authorization 的階段,該階段要判別發送當前 Request 的 Client 是否擁有創建 Pod 的權限,如果有權限就會把相關操作交給後續的 Admission Control 來處理。
文章中舉了一個名為 AlwaysPullImages 的 Admission Controller,該 Controller 對於一個多用戶的 Kubernetes Cluster 來說特別有用,主要是用來確保使用者 A 想要使用的 Private Image 不能被使用者 B 存取。
試想一個情況,假設今天使用者 A 順利於 NodeA 上抓取了自己的 Private Image,那使用者 B 假如很剛好知道這個 Image 的名稱,是不是有機會就可以不需要相關權限直接使用 NodeA 上的 Image?
所以這個 Admission Controller 就是用來避免這個問題的。
接者作者從 Authentication 與 Authorization 中個挑選一個方式來介紹並且講解這兩者如何結合的。
Authentication 使用的是 Service Account Token,管理會事先於 Kubernetes 內創立一個相關的 Service Account,並且把該 SA(Service Account) 的 Token 給交給 Client(Kubeconfig 也可)
Client 發送 HTTPS 請求到 API Server 的時候就可以夾帶這個 Token 的資訊,這樣 API Server 就會去檢查該 Token 是否存在於 Cluster 內。
事實上當每個 Pod 被創立後, Kubernetes 預設情況下就會將該 namespace 下的 service account 資訊給掛載到該 Pod 內的 "/var/run/secrets/kubernetes.io/serviceaccount" 這個路徑
這樣該 Pod 就可以使用該 Service Account Token 的資訊與 API Server 溝通。
Authorization 則是使用 RBAC 的方式來處理, RBAC 由三個部分組成,分別是 Role(代表可以針對 Cluster 進行什麼樣類型的操作,譬如 create pod, delete pod), Subject(你是誰,譬如 Service Account), RoleBinding(用來將 Role 與 Subject 給綁定)
管理員要創建並且管理這些叢集的話,就要好好的去設計這三個物件的關係,來確保最後的 Client 可以擁有剛剛好符合其需求的權限,千萬不要為了懶散而給予過多權限。
接者作者列舉了五種 Risky permissions 的可能情境
1. Listing secrets
大部分的應用程式開發者都會使用 secret 的物件來管理一些機密資訊,如帳號密碼,憑證等,所以一個擁有 list secrets 的 service account 其實是相對危險的。
非必要的話,不要讓管理員以外的任何使用者有這個權限,特別是使用 ClusterRole/ClusterRoleBinding 時要特別注意
2. Creating a pod with a privileged service account
假設今天有一個攻擊者已經獲得一個可以創建 pod 的 service account,那該攻擊者已經可以很順利的於叢集內創建 Pod 去進行基本操作(譬如挖礦)
如果攻擊者很巧地又知道目標 namespace 內存在一個很強的 service account,它就有辦法讓他創立的 Pod 去使用這個很強的 Service Account 並且進行更多後續操作
3. Impersonating privileged accounts
作者提到 Impersonating 這個 Role 裡面的動作要特別小心使用,擁有這個權限的使用者可以輕鬆化身為其他的使用者/群組
舉例來說,一個擁有 Impersonating -> users/group 的 serviceaccount 是沒有辦法看到任何 secrets 的物件。
但是攻擊者只要使用的時候加上 --as=null --as-group=system:master 則就會變成如 master 般的上帝擁有這些權限
因此這種權限設定上要特別小心
4. Reading a secret – brute-forcing token IDs
5. Creating privileged RoleBindings
後續兩個有興趣的可以參考全文,都是滿有趣的一些想法,值得閱讀擴展自己的認知
server 憑證 在 iThome Facebook 的最讚貼文
Kubernetes 1.22是今年的第2個更新版本,有許多新功能進入穩定階段,包括伺服器端應用(Server-side Apply,SSA)、外部憑證提供程式,以及開源分散式儲存etcd升級至3.5.0版本,另外,創建臨時容器的API,也在Kubernetes 1.22有所變化
#看更多 https://www.ithome.com.tw/news/146092
server 憑證 在 矽谷牛的耕田筆記 Facebook 的最佳貼文
Ref: https://security.googleblog.com/2021/06/introducing-slsa-end-to-end-framework.html
今天要探討的是一個由 Google Blog 於上個月所推廣的軟體安全性框架,該框架名為 SLSA,全名則是 Supply Chain Levels for Software Artifacts,中文部分我不知道該怎麼翻譯才可以精準達到意思,所以建議就唸英文就好了。
該框架的目的是希望於整個軟體生產鏈中能夠進一步的去提升且確保所有產物的完整性(Integrity 這個詞該怎麼翻呢..)。
文章中用了一個很簡易的流程來清楚的解釋到底何謂 Software Supply Chain 以及整個流程中可能會有什麼問題。
Software Supply Chain 一個範例譬如
1. 開發者撰寫程式碼,並且提交到遠方的 SCM Repository
2. SCM Repo 因為程式碼改變,所以觸發相關的 CI/CD 流程
3. CI/CD 建置結束後則需要打包整個程式碼,產生最後的 Package.
4. 產生後的 Packet 則可以正式上場使用
文章認為上述的流程中有兩個不同類別的安全性問題,分別是
1. Source Integrity
2. Build Integrity.
Source Integrity 這邊主要是針對 Source Code 相關的問題,譬如
1. 開發者是否有意的故意塞入一些會不懷好意的程式碼到 SCM Repo 內。
範例: Linux Hypocrite commits, 之前美國某大學研究團隊基於研究嘗試上傳一些不太好的程式碼而影響的討論風波
2. SCM 的管理平台是否可能被惡意攻擊
範例: PHP 事件: 之前自架的 PHP Git Server 被攻擊者惡意攻擊並且塞入兩筆不懷好意的 Commit
而 Build Integrity 本身則是有更多不同的面向,譬如
1. SCM 觸發 CI/CD 過程是否有可能有問題
範例: Webmin 事件,攻擊者去修改團隊的建置系統去使用沒有被 SCM 所記錄的修改檔案。
2. CI/CD 建置系統本身被攻擊
範例: SolarWinds 事件,攻擊者攻破建置系統去安裝一些軟體來修改整的建置流程
3. CI/CD 建置過程中引用到錯誤的 Dependency
4. 攻擊者上傳一些惡意產物到應該只有 CI/CD 系統才可以存取的場所。
... 等
目前來說, SLSA 還處於非常早期階段,經由業界的共識來思考每個領域有什麼好的措施與指引來避免與偵測系統是否被攻破。其最終目標狀態是希望能夠根據環境自動產生出一套可整合到系統中的產物,並且最後可以給出 SLSA 憑證來給平台或是建置後的 Package。
對 SLSA 這個專案有興趣看看的請參考原始連結,內容不長但是頗有趣的
server 憑證 在 閱讀文章- 精華區FreeBSD 的推薦與評價
* 本文可以任意轉載,但是請不要篡名。
* 有錯誤的地方,煩請告知,謝謝。
當你想為您的伺服器建立 SSL 連線時 (ex. web, smtp, pop3, imap ...),
您首先需要製作一些憑證給伺服器以及客戶端使用。
假如您不需要花錢去申請公正憑證中心所簽發的憑證 (ex. VeriSign ...),
您就可以使用如下的方式自行當做憑證中心簽發憑證給自行使用。
發行憑證流程:
1.使用者建立 Private Key,使用所建立的 Private Key 產生憑證申請書送至憑證中心。
2.憑證中心收到憑証申請書後,使用憑證中心的憑證對使用者的憑證申請書做簽名,
完成簽發憑證。
建立憑證都需要三個步驟:
1. 建立 Private Key。
2. 使用 Private Key 產生憑證申請書。
3. 為憑證申請書簽名做簽發憑證。
所以您需要:
‧產生根憑證 (Root CA)。(簽發伺服器憑證用。)
要先建立根憑證的 Private Key。
產生根憑證的申請書。
使用根憑證本身簽發根憑證。(因為您是憑證鍊的最高等級)
‧產生伺服器憑證。
建立伺服器憑證的 Private Key。
產生伺服器憑證的申請書。
使用根憑證簽發伺服器憑證。
‧在製作之前,有幾點要注意:
請自行更改所有的輸入、輸出檔名及路徑,放在 /usr/local/CA 是個不錯的選擇 。
所有的 Private Key 請妥善保存,不可外洩,
否則其它人可以冒名簽發憑證,或者解碼被加密的資料。
根憑證的 Private Key 在製作時請一定要設定密碼。(不用做伺服器憑證)
根憑證的憑證名稱 (Common Name) 請填上發行人或單位名稱 (ex. ISU CNA Root CA)。
(不用做伺服器憑證)
伺服器憑證的憑證名稱 (Common Name) 請填上主機的全名 (ex. mail.cna.isu.edu.tw)。
憑證申請書填寫方法請見作法之後說明。
日後需要重新簽發或者製做其它的伺服器憑證,
只需要重覆做產生伺服器憑證的動作就可以了。 (除非根憑證過期才需要重做根憑證。)
製作好的憑證在使用上可能會出現「憑證無效」、「憑證無法驗證」等的訊息。
因為這些憑證的簽發者不是客戶端所已知且被信任的,
所以您需要將 RootCA.crt 發散出去給需要用到這些憑證的使用者。
在 Internet Explorer 上,下載根憑證後開啟可以將憑證匯入系統之內,
日後此根憑證所簽發的憑證都會被信任。
注意:發散的是憑證檔 (.crt, ex. RootCA.crt),
不是 Private Key (.key, ex. RootCA.key) 檔。
‧根憑證 (Root CA) 作法:
‧建立根憑證的 Private Key
# 在此步驟請務必要設定密碼!
openssl genrsa -des3 -out RootCA.key 2048
# 讓其它人無法讀寫 Private Key 檔。
chmod og-rwx RooCA.key
‧產生根憑證的申請書
# 請參考後面所提供的範例,Common Name 請不要填 Hostname。
# (不用做伺服器憑證)
# 在這要輸入產生根憑證 Private Key 時所設定的密碼。
openssl req -new -key RootCA.key -out RootCA.req
‧使用根憑證本身簽發根憑證
# 在這要輸入產生根憑證 Private Key 時所設定的密碼。
# -days 設定根憑證的有效期限。(3650 ~= 十年)
openssl x509 -req -days 3650 -sha1 -extensions v3_ca \
-signkey RootCA.key -in RootCA.req -out RootCA.crt
# 刪除申請書。(憑證已經簽發完成)
rm -f RootCA.req
‧伺服器憑證作法:
‧建立伺服器憑證的 Private Key
# 伺服器憑證不設定密碼。(否則開機啟動時會停住要求使用者輸入密碼。)
openssl genrsa -out HostCA.key 2048
# 讓其它人無法讀寫 Private Key 檔。
chmod og-rwx HostCA.key
‧產生伺服器憑證的申請書
# 請參考後面所提供的範例,Common Name 請填上 Hostname。
openssl req -new -key HostCA.key -out HostCA.req
‧使用根憑證簽發伺服器憑證
# 在這要輸入產生根憑證 Private Key 時所設定的密碼。
# -days 設定根憑證的有效期限。(365 ~= 一年)
# CAserial 是憑證序號檔。
# CAcreateserial 是前面所指定的序號檔不在時自動建立之。
openssl x509 -req -days 365 -sha1 -extensions v3_req \
-CA RootCA.crt -CAkey RootCA.key -CAserial RootCA.srl -CAcreateserial \
-in HostCA.req -out HostCA.crt
# 刪除申請書。(憑證已經簽發完成)
rm -f HostCA.req
‧憑證申請書填寫方法
/usr/local/CA# openssl req -new -key RootCA.key -out RootCA.req
Enter pass phrase for RootCA.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
# 填入TW 代表 Taiwan
Country Name (2 letter code) [AU]:TW
# TW 的全名 Taiwan
State or Province Name (full name) [Some-State]:Taiwan
# 城市名
Locality Name (eg, city) []:Kaohsiung Country
# 組織名稱 (公司名稱)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:I-Shou University
# 單位名稱 (部門名稱)
Organizational Unit Name (eg, section) []:Campus Network Association
# 憑證名稱 (請注意先前所提到有關根憑證與伺服器憑證的注意事項)
Common Name (eg, YOUR name) []:CNA Root CA
# 填入連絡信箱
Email Address []:[email protected]
# 以下請都按 [Enter] 跳過,不需要用到。
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
... <看更多>