DevOps
CICD
K8s
Docker
今天筆者想介紹K8s
中的TLS
,也就是Transport Layer Security
。K8s
中的TLS
說實在滿複雜的,所以筆者想先從基礎的TLS
開始講起,先有個概念後會比較好延伸。如果你已經了解TLS
了,那麼就直接跳過前面的介紹吧!那我們開始囉~
TLS
存在的目的只有一個,那就是"確保Client
和Server
的訊息傳輸是安全的"。這句話看起來像廢話 (事實上就是),但要達到這個目的其實要確實做到兩件事:
Server
是非偽造的舉個例子,當有個User要存取某個Web Application
,需要輸入帳號密碼等使用者資訊,這些資訊會以明文(plain text
)的方式在網路中傳輸,因此Hacker很容易可以取得這些資料。為了預防這個情況發生,我們會將資料加密,例如random產生一個key
然後以XOR等方式加密資料後傳輸,如此即使Hacker真的取得傳輸資料,他取得的也是加密後的資料,無法做任何事。但是Web Server
收到的資料同時也是加密後的資料,它一樣無法解讀,因此User必須將key也傳給Web Server
,Web Server
收到加密資料及key
後再進行解密。
這種傳送加密資料,並以相同的key進行加密及解密的方法,就是經典的"對稱式加密(Symmetric Encryption)"
但是問題來了,Hacker既然可以取得加密資料,當然也有辦法取得你的key
阿,畢竟是在同一個網路上做傳輸的,沒道理他取不到吧。因此,對稱式加密顯而易見的缺點就是,要是這把鑰匙被中間人竊聽到了,那之後所有攔截到的加密訊息,都能被輕易破解,因為它加解密的方法都是同一把key
。為了解決這個問題,就有了所謂 "非對稱式加密(Asymmetric Encryption)"。
"非對稱式加密(Asymmetric Encryption)" 就是每個使用者都擁有"一對金鑰",一把
Public Key
,一把Private Key
。
你可以把Public Key
想像成是一個鎖(lock
),而Private Key
是用來解這把鎖的鑰匙(key
)。鎖是大家都可以來解的,所以它是public,而鑰匙卻只有我有,所以是private的。
(這種說法不是很嚴謹,因為事實上兩把都是key
,並沒有一定是誰解誰,這樣舉例只是方便大家理解~)
我們以SSH當作例子,當Client
想要access目標Server
時,Client
會產生一對金鑰。輸入ssh-keygen
會產生兩個檔案: id_rsa
和id_rsa.pub
,分別是Private Key
和 Public Key(lock)
。
接著將目標Server
以Public Key
lock住,確保它是安全的。作法通常是在Server
的~/.ssh/authorized_keys
中用Public Key
加入一個entry。
$ vim ~/.ssh/authorized_keys
ssh-rsa <public key> <user-name>
這時Client
即可透過Private Key
存取Server
$ ssh -i id_rsa <user-name>@<server-name>
Successfully Logged In!
剛剛我們提到TLS
的安全需要確保傳輸的資料是加密且無法被破解的,那麼要如何辦到呢?我們以剛剛的Web Applcation
當作例子,有Client
和目標Server
,Client
產生一把Symmetric Key
(以下簡稱CK
),Server
則產生一對金鑰,即一個Private Key
(以下簡稱SK
) 和一個 Public Key
(以下簡稱PK
)。
要注意,
Public Key
是公開在網路上的,理論上所有人都知道,而Private Key
只有擁有者知道
當Client
以https存取網站時,即得到Web Server
公開的PK
Client
將CK
以PK
加密,並將加密後的CK
傳送至Server
Server
將加密的CK
以SK
解密,得到原先的CK
Client
將要傳送的機密資料以CK
加密後傳送到Server
Server
將資料以CK
解密後,即可得到原始資料這樣的作法就可以保證Hacker無法破解資料,為啥呢?
因為在整個資料傳輸及金鑰交換的過程中,Hacker只能取得以下東西
Server
的PK
PK
加密後的CK
CK
加密後的資料如此一來,Hacker無法得到CK
(Hacker雖然得到加密後的CK
,但是沒有SK
就無法破解),當然也無法破解原始資料拉~
但是Hacker也不是省油的燈呀,它可能會產生類似的一組SK
跟PK
,然後將你的目的地位址導到Hacker的Fake Server
,然後用一樣的流程得到你的資料。那要怎麼防止這個情況發生呢? 其實就是一開始獲得PK
的方式啦,只要我們確認這個PK
是來自真實Server
而非Fake Server
,那就可以確保傳輸的安全性。至於要如何確認,就是讓Server
在給Client
這個PK
時,不要直接給PK
,而是透過Certificate
的方式,而PK
則放在其中。這個Certificate
會包含一些資訊,像是Server
的PK
、Server
的位址等。
但是你可能會想,Hacker也可能會偽造Certificate
阿,那不就沒用了?沒錯,所以Certificate
的"簽章(signature
)"就變得非常重要。誰創建這個Certificate
,誰就必須在上面簽章。所以假的Certificate
上面就是Hacker的數位簽章喔~
大部分的Web Browser
都有 Certificate Validation Mechanism
,所以當你在瀏覽https網站時,常常在URL前會有個"Not secure"的提醒,就是因為Browser
認為這個Certificate
可能是假的,在警告你喔~
那麼,要如何得知那些Certificate
是合法的,哪些是不合法的呢?這就是CA(Certificate Authority)
的工作啦~
CA
通常是世界上知名的組織,他們可以為你的Certificate
簽章和認證,藉此保證你Certificate
的合法性。著名的CA
像是:
Server
會先產生CSR(Certificate Singing Request)
到CA
請求簽章,CA
會檢查CSR
中的資訊,若認定Server
為合法則會為其簽章,並送回Certificate
至Server
。至此,Server
即擁有Browser
認定合法的Certificate
了。
若Hacker想產生一組相同的合法
Certificate
,到CA
這關就會卡關啦~
至於CA
是如何判定你是不是合法用戶,這就是它們自己的方法了,筆者也不是很清楚,有興趣的朋友再自己研究囉!
可是還有個問題,Browser
要怎麼認定這個Certificate
是經由合法CA
簽章的,而不是Fake CA
呢? 答案是CA
自己也會有一組金鑰啦~所有合法CA
的Public Key
會內嵌在Browser
中,而Private Key
則由CA
自己保存。這樣一來Brower
就可以透過這一組金鑰來驗證Certificate
是不是由真實CA
簽章的囉~
綜合以上這些流程,包含CA、Server、Client、Certificate
等等的,就是所謂的
PKI(Public Key Infrastructure)。
總結一下上述的流程,我們一共會有三組金鑰:
Server Certificates
: 確保傳輸資料安全Root Certificates
: 為Server Certificates簽章Server Certificates
: Client的認證
Public Key
的檔名通常是*.crt
,*.pem
,例如:
- server.crt
- server.pem
- client.crt
- client.pem
Private Key
的檔名通常是*.key
,*-key.pem
,例如:
- server.key
- server-key.pem
- client.key
- client-key.pem
在K8s
集群中,Control Plane
和Node
間、Node
和Node
間及Administrator
和Control Plane
之間的連線傳輸都必須確保是安全的,因此他們之間都必須建立TLS
連線。K8s
中會用到的Certificates
有 Client Certificates
及 Server Certificates
。我們分別列出此兩種Certificates
會用到的key
及crt
,以及他們分別屬於那些元件。要記住,一個元件不一定只有Server
或Client
的身分,它也可能同時兼具。例如apiserver
,它既是admin
、kube-scheduler
、controller-manager
及kube-proxy
下達指令的對象(作為Server
),亦是向etcd
發出request的Client
。K8s
中的Certificates
和key
一共有下列這些:
觀察
kube-apiserver
的設定檔可以發現K8s
認證所需的key和csr會放在/etc/kubernetes/pki
目錄下
今天算是比較general的介紹一下TLS
的流程以及K8s
中TLS
的元件有哪些,筆者覺得有個概念即可,有機會後面做題目時再講的細一點。好啦,今天就到這裡啦~ 謝謝大家~
簡介 SSL、TLS 協定
基礎密碼學(對稱式與非對稱式加密技術)
Manage TLS Certificates in a Cluster
PKI Bootcamp - What is a PKI?
PKI certificates and requirements
You can find me on