mTLS နဲ့ Service Mesh

Service Mesh အကြောင်းပြောရင် mTLS မပါလို့မဖြစ်ဘူး။ mTLS ဆိုတာ mutual TLS ကိုခေါ်တာဖြစ်တယ်။ ရိုးရိုး TLS နဲ့ mTLS ဘာကွာလဲဆိုရင် ရိုးရိုး TLS မှာ client ကပဲ server ရဲ့ identity ကိုစစ်တာဖြစ်ပြီး server ကတော့ဒီ client ဘယ်သူလဲ စိတ်ဝင်စားလေ့မရှိပါဘူး။

စိတ်မဝင်စားဘူးဆိုတာ TLS protocol က connection level မှာအလုပ်လုပ်တာမို့ ဒီ protocol ကိုသုံးကြတဲ့ပုံစံအရ server က client ကိုပြန်စစ်မေးလေ့မရှိတဲ့သဘောကို ပြောတာပါပဲ။ လက်တွေ့မှာတော့ authentication, authorization လုပ်နိုင်ဖို့ web app (server side app) တွေက client ဘယ်သူဘယ်ဝါ​ဖြစ်တယ်ဆိုတာ သိနိုင်မယ့် အထောက်အထားကို တောင်းပါတယ်။ ဥပမာ JWT token တွေကိုမြင်ကြည့်ပါ။

အပေါ်မှာတုန်းကပြောခဲ့သလိုပဲ microservice architecture မှာတခုထက်မကတဲ့ app တွေကို network ပေါ်မှာဖြန့်ထားဖို့ဖြစ်လာပြီး system လည်ပတ်နိုင်ဖို့အတွက်လည်း အဲဒီ app တွေအချင်းချင်း ဆက်သွယ်အလုပ်လုပ်နေရတယ်။ ဒီပုံစံက network security ကို အကြီးကြီး မေးခွန်းထုတ်စရာဖြစ်လာတယ်ပေါ့။

ဥပမာ ဆိုပါတော့။ တကယ်လို့ cart app က AWS ရဲ့မြောက်အမေရိကတိုက်က EC2 host တခုပေါ်မှာရှိပြီး user service က AWS စင်ကာပူဒေသရဲ့ EC2 စက်ပေါ်မှာရှိတယ်ဆိုရင် သူတို့နှစ်ခုကြားက traffic က AWS ရဲ့ network တလျှောက်မှာ plain text တွေအဖြစ် ရှိနေမယ်။ ဆိုလိုချင်တာက host ပေါ်ကစလို့လမ်းတလျှောက် ဘယ်သူပဲဖွင့်ဖတ်ဖတ် ဖတ်လို့ရနေမယ်ဆိုတဲ့သဘောပဲ။

ဒီတော့ နံပါတ်တစ် authenticity မရှိဘူး။ ဘယ်သူက ကိုယ့်ကိုဆက်သွယ်တာလဲဆိုတဲ့ identity မရှိဘူး။ ဥပမာ user က သူ့ဆီ user info လာတောင်းတာက cart ဖြစ်ကြောင်းသိရဖို့ဆိုရင် application level မှာ token mechanism ထည့်ထားရလိမ့်မယ်။ ဒါကမလွယ်ဘူး။ federated token စနစ်လိုမျိုး decentralized ပုံစံကိုသုံးတယ်ဆိုရင်တောင်မှ service တွေအကုန်လုံးအတွက် manage လုပ်ဖို့ rotate လုပ်ဖို့ စဥ်းစားရမယ်။ ဒုတိယအချက်က application level မှာအပေါ်ကလိုဖြေရှင်းနိုင်လို့ authenticity ရှိစေဦးတော့။ ကိုယ်တို့ confidentiality မရှိသေးဘူး။ ဘယ်သူမဆို request ကိုကြားဖြတ် token ကိုယူပြီး မသမာတဲ့တခြား request တွေလျှောက်ပို့လို့ရတယ်။ နံပါတ်သုံး integrity မရှိဘူး။ request ထဲမှာဘာပါလဲ အကုန်မြင်နေရတာဖြစ်လို့ ပြင်ချင်ရာပြင်ပြီး ပို့နိုင်တယ်။ data တွေက client ကပို့လိုက်တဲ့မူရင်းအတိုင်းပါလို့ ဘယ်သူမှ အာမမခံနိုင်ဘူး။

ကျွန်တော်တို့ အဲဒီအတွက် connection level မှာ encryption လုပ်ပေးနိုင်မယ့် protocol တခု လိုအပ်တယ်။ ဖြစ်ချင်တော့ application တွေက HTTP ကိုသုံးကြတာများတယ်။ HTTP ဆိုတာ TCP အပေါ်မှာအခြေခံတာ။ အဲဒီတော့ TCP အတွက်ဆိုရင် TLS ကကျယ်ကျယ်ပြန့်​ပြန့်ရှိပြီးသား အဖြေတခုဖြစ်တယ်။

ပထမဆုံး mesh က Linkerd ပေမယ့် Linkerd ရဲ့ version 1 မှာ mTLS ပါမလာခဲ့ဘူး။ တကယ်တမ်းကျ mTLS ကိုစမိတ်ဆက်ပေးခဲ့တာက Istio project ပါ။ နောက်တော့မှ Linkerd ရဲ့ version 2 မှာ mTLS ပါလာခဲ့တယ်။ mTLS ပါတော့ ဘာတွေကောင်းသွားလဲဆိုရင် service တွေအချင်းချင်းကြားမှာ Authentication ရော၊ Authorization ပါလုပ်နိုင်သွားစေတယ်။ endpoint တခုချင်းစီ ပိတ်လို့ရသလို header တွေအပေါ်မူတည်ပြီး ဘယ် service တွေကသာ ဘယ် service ကိုခေါ်ခွင့်ရှိပါတယ်ဆိုတာမျိုး လုပ်လို့ရသွားစေတယ်။