วิธีป้องกัน Ubuntu Server จาก Hacker

วันดีคืนดีได้อี-เมลจาก DigitalOcean ว่า droplet ที่ใช้อยู่กลายเป็น botnet ไปยิงเครื่องคนอื่นซะงั้น เนื่องจากคิดว่าเป็น droplet ที่ไม่มีข้อมูลอะไรสำคัญ และมีแต่เว็บที่ไม่ดัง (เว็บเนี่ยและ) ก็เลยไม่ได้ตั้ง security อะไรมาก เพราะขี้เกียจ แต่สุดท้ายก็โดน hack และก็ต้องมาตั้งค่า server ใหม่หมด เพราะฉะนั้นเรามา กัน ดีกว่า แก้ กันดีกว่า

เราจะมาทำ Ubuntu Server ให้ปลอดภัยยิ่งขึ้น (ไม่ได้แปลว่าโดน hack ไม่ได้นะครับ) ด้วยวิธีการต่อไปนี้

  1. สร้าง user ใหม่แทน root ที่สามาถใช้ sudo ได้
  2. ปิดการเข้าใช้งานผ่าน password มาใช้ private key และไม่ให้ใช้ root
  3. ตั้งค่า ssmtp ให้ใช้ smtp server อื่น
  4. ติดตั้ง fail2ban ป้องกันการ brute force
  5. ตั้งค่าให้ auto อัพเดท security patches
  6. ลง logwatch เพื่อส่ง log ต่างๆเข้าอี-เมล
  7. ลง tripwire เพื่อตรวจสอบว่ามีไฟล์สำคัญไฟล์ไหนเปลี่ยนแปลงบ้าง
  8. เปิด 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