Linux Server Hardening
Server Hardening ဆိုတာဘာလဲ
လွယ်လွယ်ပြောရရင်တော့ Linux Systems ကို Attack လုပ်ရခက်အောင် security မြှင့်တာ၊ သုံးထားတဲ့ library တွေမှာ vulnerability တွေရှိရင် အဲသည့်အားနည်းချက်ကို အသုံးချမခံရအောင် upgrade လုပ်တာပါပဲ။
ဘယ်လို လုပ်ကြမလဲ? အောက်က အချက် ၉ ချက်ကို လုပ်ကြည့်ကြမယ်။ ဒါဖြင့် သည်အချက်ကိုးချက်ပဲလား လုံလောက်ပြီလား၊ ဘယ်လုံလောက်ပါ့မလဲ သည့်ထက်သည့်ထက်မက အများကြီးရှိဦးမှာပေါ့။ ကျွန်တော်ပြောမယ့်အထဲမှာတော့ အောက်က အချက်တွေပဲ ပါသေးတယ်။
၁. Linux System Remote Login (SSHD) service ကို Harden လုပ်တာ။
၂. Security Upgrade လုပ်တာ။
၃. Root user account ပိတ်တာ။
၄. Swap Space (virtual ram) လိုအပ်သလောက်ပေးတာ။
၅. မလိုအပ်တဲ့ compliers တွေကို ပိတ်တာ။
၆. Fail2ban သုံးပြီး systems ကို Attack လုပ်တဲ့ IP တွေကို ban တာ။
၇. Kernel parameter တွေပြင်တာ။
၈. Logwatch ကိုအသုံးပြုတာ။
၉. Systems Attack အလုပ်ခံရတဲ့အခါ နဲ့ Logwatch ကနေ email ပို့ပေးဖို့လုပ်တာ။
ကျွန်တော် အခုသည် tutorials မှာ သုံးထားတဲ့ Linux Distors က Rocky Linux 8 ပါ။ Centos 7, Ubuntu , Oracle Linux တွေနဲ့လည်း အလုပ်လုပ်ပါတယ်။ package install လုပ်တာတော့ ကျွန်တော်တို့ သုံးတဲ့ Distros ပေါ်မူတည်ပြီး နည်းနည်းကွဲမှာပေါ့။
၁. SSH Remote Login Hardening
သည်အပိုင်းမှာ ssh hardening နဲ့ ssh connection အတွက် whitelist network ကိုပဲ allow ပေးတာကို လုပ်ကြည့်ကြပါ့မယ်။ ssh connection အတွက် whitelist network ကိုပဲ allow ပေးတဲ့နေရာမှာ ပုံမှန်အားဖြင့် ကျွန်တော်တို့ firewall ကို စစဉ်းစားကြမှာပေါ့။ cloud တွေနဲ့ on-prem မှာတော့ security group မှာ firewall rule ရေးရမှာ ဖြစ်ပေမယ့် အခု ကျွန်တော်တို့က ဆာဗာ level ကနေပဲ စဉ်းစားမှာ ဖြစ်ပါတယ်။ ဆာဗာထဲမှာလည်း firewalld (or) iptables ကိုသုံးပြီး ရေးလို့ရပေမယ့် အခုတော့ hosts ACL က ရေးတာကိုပဲ လုပ်မှာ ဖြစ်ပါတယ်။
Hosts Access Control Files က /etc/hosts.allow နဲ့ /etc/hosts.deny ဆိုတဲ့ နေရာနှစ်ခုမှာ ရှိပါတယ်။ အလုပ် ဘယ်လိုလုပ်လဲဆိုတော့ - hosts ကို access လုပ်တဲ့အခါမှာ ပထမဦးဆုံး hosts.allow ဖိုင်မှာ access လုပ်မယ့် ဆားဗစ် (daemon - ဥပမာ sshd) နဲ့ အသုံးပြုမယ့် client အတွဲကို သွားဖတ်ပါတယ်။ အဲသည့်မှာ ကိုက်ညီရင် allow ခွင့်ပြုပေးပါတယ်။ မကိုက်ညီဘူးဆိုရင် hosts.deny ကိုဆက်ဖတ်ပါတယ်။ hosts.deny rule ထဲမှာ ညိနေတာရှိရင် deny လုပ်ပါတယ်။ hosts.deny နဲ့ hosts.allow တွေမှာ config တွေမထည့်ထားဘူး empty ဆို hosts acl ကို မသုံးဘူးဆိုတဲ့ အဓိပ္ပါယ်ပါ။ Default အနေနဲ့ ဖိုင်တွေထဲမှာ ဘာမှမရှိတဲ့အတွက် default အနေနဲ့ကတော့ မသုံးထားဘူးပေါ့။
အခု ကျွန်တော်တို့က Hosts ACL ကိုသုံးမှာဖြစ်တဲ့အတွက် /etc/hosts.allow နဲ့ /etc/hosts.deny ကိုပြင်ကြပါမယ်။ Syntax example (ဘယ်လိုရေးရလဲဆိုတာ)ကို ကြည့်ချင်ရင် manual file (man hosts.deny) ဖွင့်ဖတ်ပြီးတော့သော်လည်းကောင်း၊ သို့မဟုတ် ဖိုင်ကို direct ပြင်ရင်သော်လည်းကောင်း ဥပမာ ပေးထားတဲ့ ရေးထုံးကို တွေ့ရပါလိမ့်မယ်။
Example: ALL: LOCAL @some_netgroup
ALL က ဘယ် services မဆို
LOCAL က . dot character မပါတဲ့ ဘယ် hosts မဆို
@some_netgroup က @sign ပါတဲ့ နက်ဝက်တခုခုပေါ့။
ALL: .foobar.edu EXCEPT terminalserver.foobar.edu
ALL ဘယ် services မဆို
.foobar.edu (.foodbar.edu) က ဘယ်ဟာကိုမဆို
ချွင်းချက်အနေနဲ့ terminalserver.foobard.edu
ရေးတဲ့ပုံစံတွေက အမျိုးမျိုးရှိပါတယ်။ ကျွန်တော်တို့က ကျွန်တော်တို့ရဲ့ public IP ဒါမှမဟုတ် ကျွန်တော်တို့ private network က လာတဲ့ hosts တွေကိုပဲ sshd services ကိုပေးချိတ်မယ်။ အဲ့သည့်နက်ဝက်ကလာတာမှ မဟုတ်ရင် sshd ကို လာချိတ်ရင် ban မယ်ဆို သည်လိုရေးလို့ရပါတယ်။
ကျွန်တော်တို့ allow ပေးမယ့် private network (subnet)က 192.168.0.0/24 ဆိုပါစို့။
Public IP က 99.99.99.99 ဆိုပါစို့။
ပထမဦးဆုံး hosts.allow ဖိုင်ကို အရင်ပြင်ကြပါ့မယ်
$ sudo vim /etc/hosts.allow
Example Syntax -
ALL: LOCAL @some_netgroup
ALL: က any services ကျွန်တော်တို့က sshd ကို allow ပေးမယ် 192.168.0.0/24 network နဲ့ 99.99.99.99 ကိုမဟုတ်လား သည်လိုရေးလို့ရပါတယ်။
sshd: 192.168.0.0/24 99.99.99.99

:wq နဲ့ ဖိုင်ကို save ခဲ့ပါ။
ဒါဆိုရင် sshd services ကို 192.168.0.0 network နဲ့ 99.99.99.99 (ဥပမာအနေနဲ့သုံးတာ သက်သက်ပါ) ကို allow ပေးပြီးပါပြီ။
ဒါပြီးရင် hosts.deny ဖိုင်မှာ deny rule အတွက်သွားရေးပါမယ်။
$ sudo vim /etc/hosts.deny
sshd: ALL ဆိုပြီးရေးပေးလိုက်ပ့ါမယ်။
သည်လိုဆိုရင် sshd service ကို ဘယ်နက်ဝက်ကနေမဆို ခေါ်လို့မရတော့ဘူးဆိုတဲ့ အဓိပ္ပာယ်ပါ။ local (သည်စက်ကနေပဲ ssh ကိုသုံးပြီး) ကနေလည်း ဝင်လို့မရတော့ပါဘူး။ ဒါပေမယ့် ကျွန်တော်တို့ allow ပေးခဲ့တဲ့ 192.168.0.0/24 network ကနေနဲ့ public IP ကနေတော့ ဝင်လို့ရရမှာပေါ့။ ကျွန်တော်တို့ :wq နဲ့ ဖိုင်ကို သိမ်းပြီး စစ်ကြည့်ရအောင်ပါ။

$ ssh zarne@localhost (or) ssh zarne@127.0.0.1 ကိုသုံးပြီး ကျွန်တော်တို့ အခု harden လုပ်လိုက်တဲ့စက်ထဲကို ပြန်ဝင်ကြည့်ရအောင်ပါ။ ကျွန်တော်တို့ အောက်က error return ကိုရပြီး စက်ထဲဝင်လို့မရတာကို တွေ့ရပါလိမ့်မယ်။
ssh_exchange_identification: read: Connection reset by peer
ဒါဆို host.deny rule မှာ local ကိုတော့ ချွင်းချက်အနေနဲ့ထားပေးပါဆိုပြီး ရေးပြီး စမ်းကြည့်ရအောင်ပါ။
$ sudo vim /etc/hosts.deny
sshd: ALL except local
:wq

ဒါပြီးရင် သည်စက်ထဲကိုပဲ loopback IP ကိုသုံးပြီး ပြန်ဝင်ကြည့်ပါ။ ရတာကို တွေ့ရပါမယ်။
$ ssh zarne@localhost (or) ssh zarne@127.0.0.1
တခု သတိထားရမှာက sshd ကိုမှားပိတ်မိလိုက်ရင် ဆာဗာထဲကို သည်စက်ထဲကို sshd နဲ့ ပြန်ဝင်လို့မရနိုင်တော့တာတွေ ဖြစ်နိုင်တဲ့အတွက် သတိထားရပါမယ်။ တချို့ cloud တွေမှာဆို sshd only ပဲ remote management ရတဲ့အတွက် ကျွန်တော်တို့ မှားရေးမိရင် နောက်တခေါက်ပြန်ဝင်လို့မရနိုင်ဘူးဆိုတဲ့ ပြဿနာရှိပါတယ်။ rule တွေရေးပြီးတဲ့အခါ လက်ရှိ session ကိုမပိတ်ဘဲနဲ့ တခြား hosts / စက်ကနေ ssh နဲ့ remote login ဝင်ပြီး ရမရ စစ်ပေးဖို့လိုပါတယ်။ အခု ဥပမာထဲကဆို 192.168.0.0/24 network ထဲက စက်တလုံးလုံး ဒါမှမဟုတ် public IP 99.99.99.99 ကနေပေ့ါ။ အဲ့ကနေပါ ဝင်လို့မရရင် လက်ရှိရေးထားတဲ့ config တွေကို ပြန်စစ်ဖို့လိုပါတယ်။
Hosts ACL ကိုသုံးပြီး တခြားဆားဗစ်တွေကိုလည်း သည်တိုင်းပဲ ဆက်လုပ်လို့ရပါတယ်။
ဒါဖြင့် ကျွန်တော်တို့ sshd config ကိုပြင်ပြီး ဆားဗစ်ကို hardening ထပ်လုပ်ရအောင်ပါ။
အရင်ဆုံး အခြေခံအနေနဲ့ ဘာပဲလုပ်လုပ် မလုပ်ခင် backup ယူပါ။ အခုက sshd config ဖိုင်ကို ထိမှာဖြစ်တဲ့အတွက် အဲ့သည့်ဖိုင်ကို backup ယူပါမယ်။
(ဆက်ရန် - ကျန်တဲ့အပိုင်းတွေ ထပ်တင်ပေးပါမယ်)
