วิธีป้องกัน Ubuntu Server จาก Hacker
วันดีคืนดีได้อี-เมลจาก DigitalOcean ว่า droplet ที่ใช้อยู่กลายเป็น botnet ไปยิงเครื่องคนอื่นซะงั้น เนื่องจากคิดว่าเป็น droplet ที่ไม่มีข้อมูลอะไรสำคัญ และมีแต่เว็บที่ไม่ดัง (เว็บเนี่ยและ) ก็เลยไม่ได้ตั้ง security อะไรมาก เพราะขี้เกียจ แต่สุดท้ายก็โดน hack และก็ต้องมาตั้งค่า server ใหม่หมด เพราะฉะนั้นเรามา กัน ดีกว่า แก้ กันดีกว่า
เราจะมาทำ Ubuntu Server ให้ปลอดภัยยิ่งขึ้น (ไม่ได้แปลว่าโดน hack ไม่ได้นะครับ) ด้วยวิธีการต่อไปนี้
- สร้าง user ใหม่แทน root ที่สามาถใช้ sudo ได้
- ปิดการเข้าใช้งานผ่าน password มาใช้ private key และไม่ให้ใช้ root
- ตั้งค่า ssmtp ให้ใช้ smtp server อื่น
- ติดตั้ง fail2ban ป้องกันการ brute force
- ตั้งค่าให้ auto อัพเดท security patches
- ลง logwatch เพื่อส่ง log ต่างๆเข้าอี-เมล
- ลง tripwire เพื่อตรวจสอบว่ามีไฟล์สำคัญไฟล์ไหนเปลี่ยนแปลงบ้าง
- เปิด Firewall
มาเริ่มกันเลย
สร้าง user ใหม่แทน root ที่สามาถใช้ sudo ได้
เราจะมาสร้าง user ชื่อ demo กันนะครับ และจะให้ demo ใช้ sudo ได้ ถ้าอยากเปลี่ยนชื่อก็เปลี่ยน demo เป็นอย่างอื่นได้เลย
adduser demo
ตอบคำถามที่ขึ้นมาเสร็จก็มาเพิ่ม user คนนี้เข้า group sudo
gpasswd -a demo sudo
เสร็จแล้วเรามาเพิ่ม Public Key เพื่อใช้ Private Key ในการ Authenticate เข้า Server แทนการใช้ password (หากไม่มี ssh key อยู่แล้วให้ run ssh-keygen
บนเครื่องทำงานของท่าน)
ก่อนอื่นเราต้องเข้าไปที่ user ที่เราพึ่งสร้างใหม่และทำการสร้าง folder .ssh
su - demo
mkdir .ssh
chmod 700 .ssh
เสร็จแล้วเปิด nano เพื่อเพิ่ม Public key ของเรา (นำมาจาก ~/.ssh/id_rsa.pub
)
nano .ssh/authorized_keys
กด Ctrl+X และก็ Y เพื่อ save authorized_keys
สุดท้ายก็ตั้ง permission ของ file authorized_keys ให้ถูกต้อง
chmod 600 .ssh/authorized_keys
คุณควรจะสามารถเข้า ssh demo@<ไอพีของ server=""> ได้โดยไม่ต้องใส่รหัสผ่านไอพีของ>
ปิดการเข้าใช้งานผ่าน password มาใช้ private key และไม่ให้ใช้ root
หลังจากเราได้ user ที่สามารถ sudo ได้แล้ว และไม่ต้องใช้รห้สผ่านในการล็อกอิน เราก็มาปิด root กับการ login ด้วยรหัสผ่านกัน
เริ่มโดยการแก้ sshd_config
nano /etc/ssh/sshd_config
หา PermitRootLogin yes
ให้เปลี่ยนเป็น no และ PasswordAuthentication yes
ให้เปลี่ยนเป็น no
หากต้องการเปลี่ยน Port ssh จาก default ทีเป็น 22 ให้เปลี่ยนได้ตรง Port 22
เป็นเลขที่เราต้องการ เสร็จแล้วก็ restart ssh server
service ssh restart
ตั้งค่า ssmtp ให้ใช้ smtp server อื่น
เราจะลง sendmail และลบออกและใช้ ssmtp (เอาไว้หลอก fail2ban MTA) ระบบนี้เอาไว้ใช้ส่งอี-เมลแจ้ง report ต่างๆของเครื่องไปยังอี-เมลของเรา
sudo apt-get update
sudo apt-get install sendmail
sudo apt-get install mailutils ssmtp
เนื่องจาก IP ส่วนใหญ่ที่ผมเคยใช้ (DigitalOcean) โดน blacklist เป็น spam ใน Google เราเปลี่ยนมาใช้ SMTP ของคนอื่นอย่าง mailgun หรือ sendgrid ดีกว่าครับ โดยการเข้าไปที่
sudo nano /etc/ssmtp/ssmtp.conf
และให้แก้ตามนี้
- เปลี่ยน root เป็นอี-เมลที่ต้องการให้ส่งจาก (From)
- เปลี่ยน mailhub เป็น
mailhub=smtp.mailgun.org
(หากใช้เจ้าอื่นก็เปลี่ยนเป็นที่เขาให้มานะครับ) - เพิ่มบรรทัดต่อไปนี้พร้อมแก้ smtp user กับ smtp password
AuthUser=<smtp user> AuthPass=<smtp password> UseTLS=YES UseSTARTTLS=YES
- เปลี่ยน rewriteDomain เป็น domain ของท่านเช่น
rewriteDomain=sarnsuwan.com
- เปลี่ยน hostname เป็นอี-เมลของท่าน
เสร็จแล้วกด Ctrl+X
และ Y
เพื่อ save หลังจากท่านสามารถลองส่งอี-เมลโดยการใช้ ssmtp <อี-เมลที่ต้องการจะส่ง>
กด enter และพิมพ์ต้องการที่จะส่งแล้วกด Ctrl+D
สุดท้ายลบ sendmail ออกเปลี่ยนมาเป็น ssmtp
sudo service sendmail stop
sudo killall sendmail
sudo rm -rf /usr/sbin/sendmail
sudo ln -s /usr/sbin/ssmtp /usr/sbin/sendmail
ติดตั้ง fail2ban ป้องกันการ brute force
เริ่มโดยการลง fail2ban
sudo apt-get update
sudo apt-get install fail2ban
เสร็จแล้วก็ copy การตั้งค่า jail.conf
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
ให้แก้ตามนี้
- เปลี่ยน
destemail
เป็นอี-เมลที่ต้องการให้ fail2ban report ไปให้ - เปลี่ยน
action = %(action_)s
เป็นaction = %(action_mw)s
- เปลี่ยน sender เป็นอี-เมลที่คุณให้ส่งจาก
- เพิ่มบรรทัดต่อไปนี้ ใต้
# SSH servers
[ssh] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 3
การตั้งค่าอื่นๆให้ลองอ่านกันดูนะครับ ส่วน jail ต่างๆ โดย default แล้วจะถูกปิดไว้ หากอยากเปิดให้ไปเพิ่ม enabled = true
ใน jail ที่อยากเปิดนะครับ
สุดท้ายก็ปืดเปิด fail2ban ใหม่
sudo /etc/init.d/fail2ban restart
คุณควรจะได้อี-เมลส่งมาบอกว่า fail2ban ได้เริ่มแล้ว
ตั้งค่าให้ auto อัพเดท security patches
security patch เป็นสิ่งสำคัญมากๆเพราะฉะนั้นเรามาทำให้มัน auto update ดีกว่า จะได้ไม่ต้องมานั่ง monitor
sudo apt-get install unattended-upgrades
เสร็จแล้วเพิ่ม file นี้ที่ /etc/apt/apt.conf.d/10periodic โดยการ nano /etc/apt/apt.conf.d/10periodic
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";
ลง logwatch เพื่อส่ง log ต่างๆเข้าอี-เมล
ต่อไปเราจะมาลง logwatch กัน logwatch ทำหน้าที่ส่ง log report มาให้เราทางอี-เมลทุกๆวันเพื่อให้เราได้ตรวจสอบแบบง่าย วิธีการลงก็เพียง
sudo apt-get install logwatch
เสร็จแล้วก็เพิ่ม logwatch เข้า crontab เพื่อให้มัน run ทุกวัน
sudo crontab -e
0 1 * * * logwatch --logfile secure --detail high --mailto <อี-เมลที่คุณต้องการให้ logwatch ส่งไปหา> --range yesterday
กด Ctrl+X
และ Y
เพื่อออกและ save
ลง tripwire เพื่อตรวจสอบว่ามีไฟล์สำคัญไฟล์ไหนเปลี่ยนแปลงบ้าง
หากสมมุติว่าระบบที่ผมแนะนำมาทั้งหมดกันไว้ไม่อยู่ และ hacker ได้เข้ามาแล้วจริงๆ ส่วนใหญ่แล้วจะเกิดการปรับแต่งไฟล์ขึ้นเพื่อให้สามารถเข้ามาใช้ได้อีก หรือทำเป็น botnet ในเช่น case ของผม ซึ่งสามารถตรวจสอบได้โดยใช้ tripwire
sudo apt-get update
sudo apt-get install tripwire
หลังจากลงเสร็จแล้ว สามารถไปแก้ config ของ tripwire ว่าให้ monitor ไฟล์ไหนบ้างได้ที่ /etc/tripwire/twpol.txt
ผมแนะนำให้ไปอ่านบทความของ Justin Ellingwood เพื่อดูวิธีการตั้งค่า Tripwire นะครับ
หลังจากแก้ config เสร็จแล้วก็ทำการสร้าง policy ใหม่โดย
sudo twadmin -m P /etc/tripwire/twpol.txt
sudo tripwire --init
เหลือเพิ่มเข้า crontab อีกนิดหน่อยก็เสร็จแล้ว
sudo crontab -e
เสร็จแล้วเพิ่ม
30 3 * * * /usr/sbin/tripwire --check | mail -s "Tripwire report for `uname -n`" <อี-เมลที่ต้องการให้แจ้งเตือน>
เปิด Firewall
สุดท้าย เราควรเปิด Firewall เพื่อป้องการเข้าถึง Port ที่เราไม่ได้อยากให้เป็น public โดยเราจะใช้ UFW (Uncomplicated Firewall) ซึ่งเป็น front-end ครอบ iptables เพื่อทำให้ใช้งานง่าย
วิธีการใช้งานก็มีดังนี้
- เพิ่มกฎ
sudo ufw allow 22/tcp sudo ufw deny 1111/udp
- ลบกฎ
sudo delete allow 22/tcp
หรือจะลบโดยเลขกฎก็ได้ (ดูเลข
sudo ufw status numbered
)sudo ufw delete <เลขกฏ>
- เปิด
sudo ufw enable
- ปิด
sudo ufw disable
- ดู status
sudo ufw status
ส่วนตัวแล้วผมใช้ firewall เพื่อบล็อกการเข้าถึง port ภายในทั้งหมด และเปิดเพื่อให้ IP บ้านผมใช้ได้เท่านั้น วิธีการก็คือ
sudo ufw allow from <IP Address> proto udp to any port <port>
นี่เป็นวิธีการทำให้ Ubuntu Server ของคุณปลอดภัยยิ่งขึ้นจากคนที่พยายามเข้าใช้ server ของคุณแบบไม่ได้รับอนุญาติ แต่ถ้าหาก Script ที่คุณใช้หรือ Software ต่างๆที่รันอยู่บน Server มีช่องโหว่ คุณก็ยังสามารถโดน Hack ได้อยู่ดีนะครับ เพราะฉะนั้นหมั่น backup data กันไว้ด้วยนะครับ
Credit
- My First 5 Minutes On A Server; Or, Essential Security for Linux Servers
- SSMTP and Logwatch - Email logs from the command line
- How To Protect SSH with Fail2Ban on Ubuntu 14.04
- How To Use Tripwire to Detect Server Intrusions on an Ubuntu VPS
- How To Setup a Firewall with UFW on an Ubuntu and Debian Cloud Server