Monday, November 9, 2020

What I learned about Kubernetes - Security ( PKI with TLS Certificates)

                 ဒီ article ကတော့ Security introduction article ရဲ့ အဆက်ဖြစ်ပြီး Kubernetes components တွေအချင်းချင်း ဘယ်လိုမျိုး securely communicate လုပ်နေကြလဲဆိုတာ ပြောပြမှာဖြစ်ပါတယ်။ Kubernetes components တွေဆိုတာကတော့ kube-api server, kubelet, kube-scheduler, kube-controller and etcd စတဲ့ components တွေဖြစ်ပါတယ်။

                ဒီ Components တွေထဲမှာမှ kube-api server က အဓိကကျပြီး သူ့ကို ဆက်သွယ်ပြီးလုပ်ဆောင်ရတဲ့ အခါမှာ secure ဖြစ်စေဖို့အတွက် Kubernetes သည် PKI (Public Key Infrastructure) encryption with TLS certificate method ကို အသုံးပြုပါတယ်။

So, What is PKI ?

                ဒီတော့ PKI အကြောင်းလေး နည်းနည်းလေးပြောချင်ပါတယ်။ PKI ဆိုတာ က Public Key Infrastructure လို့ ခေါ်ပြီး network communication တွေမှာ secure ဖြစ်စေဖို့ အတွက်အသုံးပြုပါတယ်။ Kubernetes သည် PKI မှာ ပါဝင်တဲ့ asymmetric encryption method ကိုအသုံးပြုပါတယ်။ Asymmetric encryption method ဆိုတာက တစ်ဖက်နဲ့ တစ်ဖက် network ပေါ်မှာ ဆက်သွယ်တဲ့ လမ်းကြောင်းတစ်လျှောက်မှာ data တွေကို secure ဖြစ်အောင်ပြုလုပ်ပေးပါတယ်။ 

                ဘယ်လိုလုပ်ပေးလဲဆိုတော့ asymmetric encryption က public key and private key ဆိုပြီး key နှစ်ခု ကို generate ထုတ်ပေးပါတယ်။ Public key/Private key ဆိုတာက data ပို့တဲ့အခါ public key နဲ့ encyrpt လုပ်ထား ခဲ့ရင် ၎င်း data ကို decrypt ပြန်လုပ်ဖို့အတွက် private key ရှိမှသာ decrypt လုပ်နိုင်မှာဖြစ်ပါတယ်။  



                          ဥပမာအနေနဲ့  တစ်ဖက်နဲ့ တစ်ဖက် ပထမဆုံး ဆက်သွယ်တဲ့အခါမှာ နှစ်ဖက်စလုံးက သူတို့ရဲ့ public key ကို exchange လုပ်ကြပါတယ်။ ပြီးတဲ့နောက် data တွေကို ပို့တဲ့အခါမှာ တစ်ဖက် က ပေးပို့ထားတဲ့ public key နဲ့ encrypt လုပ်ပြီး ပို့ပါတယ်။ Data က တစ်ဖက်ကို ရောက်သွားတဲ့အချိန်မှာ တစ်ဖက် က အဲ့ဒီ data ကို ကြည့်ဖို့အတွက် သူ့ရဲ့ private key  ကိုအသုံးပြုပြီး decrypt လုပ်ပြီး ကြည့်ပါတယ်။ ဒီနေရာမှာ ကြားထဲကနေ တစ်ယောက်ယောက် က data တွေကို ရသွားခဲ့သည့်တိုင်အောင် သူ့ဆီမှာ data တွေကို decrypt လုပ်ဖို့အတွက် private key လိုအပ်ပါတယ်။ ဒါက Kubernetes ရဲ့ components တွေ ဆက်သွယ်ရာမှာ အသုံးပြုတဲ့ နည်းလမ်း ဖြစ်ပါတယ်။


TLS Certificate 

                    ဒီတော့ Public key and Private key ကို အသုံးပြုပြီး secure ဖြစ်အောင်လုပ်တာတော့ ဟုတ်ပြီ ဒါပေမယ့် ကိုယ်ဆက်သွယ်နေတဲ့ တစ်ဖက်က လူက တစ်ကယ်ဆက်သွယ်ရမည့်သူ ဟုတ်မဟုတ် ဆိုတာ ဘယ်လိုမျိုး ဆုံးဖြတ်မလဲ?​ ဘာလို့လဲဆိုတော့ ဒီ Public and Private key က တစ်ခြား thrid party ကလဲ generate လုပ်နိုင်ပြီး ကိုယ့်ဆီကို လာရောက်ပြီး ဆက်သွယ်တာလဲ ဖြစ်နိုင်တယ်။ ဥပမာ အနေနဲ့ ကိုယ် connection establish ဖြစ်နေတဲ့ site က တစ်ကယ့် authentic ဖြစ်တဲ့ "WebSite" လား ဒါမဟုတ် third party က နေ fake လုပ်ထားတဲ့  "Website" ကြီးလားဆိုတာ သိဖို့ရန်အတွက် ကြားထဲမှာ စစ်မှန်ကြောင်း ကို ပြသဖို့ "Certifiate" ဆိုတဲ့ method ကို အသုံးပြုကြပါတယ်။

So, What is certificate?

            Certificate ဆိုတာ အပြင်မှာနားလည်ထားကြသလိုပဲ​ မှန်ကန်ကြောင်း ဥပမာ ဒီ Exam ကို အောင်မြင်တာ မှန်ကန်ကြောင်း ထောက်ခံပေးတဲ့ အထောက်အထားတစ်ခုပဲဖြစ်ပါတယ်။ ဒါကို reference ယူပြီးတော့  IT မှာကျတော့ Digital Certifiate အနေနဲ့  Security ပိုင်းမှာ အသုံးပြုကြပါတယ်။ 

What is CA (Certificate Authority)

            ဒီလိုတစ်ဖက်နဲ့တစ်ဖက် သည် စစ်မှန်ကြောင်း ကို certificate ထုတ်ပေးဖို့ အတွက် CA က တာဝန်ယူပေးပါတယ်။ ဒီတော့  CA ကနေ certificate ကို ထုတ်ပေးဖို့အတွက် ကိုယ်တွေဖက်က ဘာတွေလုပ်ပေးရမလဲဆိုတော့ 

၁. အရင်ဆုံး Private key generate လုပ်ရမယ်

၂. CA ကနေ certificate ထုတ်ပေးရန်အတွက် CSR "Certificate Signing Request" လုပ်ပါမယ်

၃. ရောက်ရှိလာတဲ့ CSR ကို CA ကနေ မှ သူ့ရဲ့ Private Key နဲ့ signed လုပ်ပြီး စစ်မှန်ကြောင်း ထောက်ခံတဲ့ "Digital Certificate" တစ်ခု ပြန်ထုတ်ပေးပါတယ်။

            ဒီနေရာမှာ CA (Certificate Authority) ဆိုတာ CA service ကို ပေးတဲ့  Public CA i.e godaddy, DigiCert, VeriSign ရှိသလို ကိုယ့် internal အချင်းချင်း အသုံးပြုဖို့ Sefl-Signed CA အမျိုးအစားတွေလဲရှိပါတယ်။ 

                Kubernetes မှာဆိုလိုရှိရင်လဲ အချင်းချင်း ဆက်သွယ်ရာမှာ certificate ကို အသုံးပြုဖို့အတွက် Kubernetes cluster တစ်ခုမှာ အနည်းဆုံး CA (Certificate Authority) Server တစ်ခုရှိဖို့လိုအပ်ပါတယ်။ ဒီ CA ကနေမှတစ်ဆင့် trusted certificate တွေကို issue ထုတ်ပေးမှာဖြစ်ပါတယ်။ အခု ပြောပြနေတဲ့ ဒီ certificate ပိုင်းတွေက Kubernetes cluster တစ်ခုကို kubeadm နဲ့ တည်ဆောက်ထားတာဆိုရင် auto generate လုပ်ထား ပြီးသားဖြစ်ပါတယ်။


How to create a certificate and authenticate to access the kube-api server?

                အိုကေ အဲ့တော့ certificate file တစ်ခု ရဖို့အရင်ဆုံး ဒီမှာတော့ openssl program ကိုအသုံးပြုပြီး private key တစ်ခု စဖွဲ့ပါတယ်။ openssl အပြင် "easyrsa" , "cfssl" program တွေကိုလဲ​အသုံးပြုနိုင်ပါတယ်။                       ပြီးနောက် ၎င်း private key နဲ့ CA (Certificate Authority) ကို CSR (Certificate Signing Request) ပို့ပါမှာ။ CA ကမှ သူ့ရဲ့ private key နဲ့ signed လုပ်ပြီး certificate တစ်ခု ထုတ်ပေးပါတယ်။ CA issues ထုတ်ပေးလိုက်တဲ့ certificate ကို အသုံးပြုပြီးတော့ kube-api server ကို access လုပ်မှာဖြစ်ပါတယ်။ အောက်ပုံတွေမှာဆိုရင် kube-api server ကို access လုပ်ရန်အတွက်. "kadmin" ဆိုတဲ့ user တစ်ယောက်အတွက် Certificate generate လုပ်ပေးမှာဖြစ်ပါတယ်။


                    အောက်ပုံမှာဆိုရင် certificate ကို authentication အနေနဲ့ အသုံးပြုပြီး kube-api server ရဲ့ namespaces api ကို access လှမ်းလုပ်နိုင်တာဖြစ်ပါတယ်။





                အောက်ပုံမှာက ဒီ Certificate ကို အသုံးပြုပြီး access လုပ်ဖို့အတွက်  Kube-api server ရဲ့ config file ထဲမှာ  လောလောဆယ် authorization mode ကို = AlwaysAllow ပုံစံထားပြီး ပြသသွားတာဖြစ်ပါတယ်။ တစ်ကယ်တန်း AlwaysAllow မဟုတ်ပဲ # (comment) ပိတ်ထားတဲ့ configuration အတိုင်းဆိုရင် တစ်ခြား steps တွေ ထပ်လုပ်ဖို့လိုအပ်ပါတယ်။ ဒီ Steps တွေကိုတော့ နောက် article တွေမှာ ဆက်လက်ရှင်းပြသွားပမယ်။            




 That's it 😊


Pls Like and Subscribe to Our Root Of Info FB Page and Youtube Channel


https://www.facebook.com/rootofinfo


https://www.youtube.com/channel/UCkOi7WxhUBKONv3uD0CvuWw?view_as=subscriber


Thank you!!!

Share:

0 comments:

Post a Comment