Linux
น้องๆ เคยได้ยินคำว่า "Hardening" กันไหม? ถ้าแปลตรงตัวก็คือ "ทำให้แข็ง" ในโลกของ Linux Server มันหมายถึงการทำให้ Server ของเรามีความปลอดภัยมากขึ้น ป้องกันจากพวก Hacker หรือผู้ไม่ประสงค์ดีนั่นเอง
สมัยผมทำร้านเน็ต SiamCafe สมัยก่อน โดน Hack บ่อยมาก! พวก Hacker ก็จะเข้ามาขโมยข้อมูล, เปลี่ยนหน้าเว็บ หรือหนักกว่านั้นคือเอา Server เราไปใช้เป็นฐานปล่อย DDOS (Distributed Denial of Service) ซึ่งมันสร้างความเสียหายให้เราเยอะมาก ทั้งเสียเงิน เสียเวลา เสียชื่อเสียง
Hardening เลยเป็นสิ่งที่สำคัญมากๆ สำหรับ Server ทุกตัว ไม่ว่าจะเป็น Web Server, Database Server หรือ File Server เพราะถ้า Server เราโดน Hack ข้อมูลทุกอย่างก็ตกอยู่ในอันตรายหมด
ก่อนที่เราจะไป Hardening Server กัน เราต้องมีพื้นฐานความรู้บางอย่างก่อนนะ ไม่งั้นทำไปก็อาจจะงงๆ ว่าทำอะไรอยู่
อันนี้สำคัญสุด! คือต้องคิดเสมอว่า "ทุกอย่างมีความเสี่ยง" ไม่ว่าจะเป็น Password, Software, Configuration ทุกอย่างต้องตรวจสอบและระมัดระวังเสมอ SiamCafe Blog มีบทความดีๆ เกี่ยวกับ Security Mindset ลองไปอ่านดูนะ
สมัยก่อนตอนทำร้านเน็ต ผมเคยพลาดตั้ง Password ง่ายๆ ให้ Root Account ปรากฏว่าโดน Hack ภายในไม่กี่วัน! หลังจากนั้นมาก็เข็ดเลย ต้องคิดเสมอว่า Hacker เก่งกว่าเราเสมอ
ต้องเข้าใจ Command Line พื้นฐาน, File Permissions, User Management พวกนี้เป็นพื้นฐานที่สำคัญมากในการจัดการ Server Linux
น้องๆ ลองนึกภาพว่าถ้าเราไม่รู้ File Permissions เราอาจจะตั้ง Permission ให้ไฟล์สำคัญเป็น 777 (Read, Write, Execute for everyone) ซึ่งมันอันตรายมาก ใครๆ ก็สามารถเข้ามาแก้ไขไฟล์เราได้
ต้องเข้าใจเรื่อง IP Address, Port, Firewall, Routing พวกนี้ก็สำคัญ เพราะ Hacker ส่วนใหญ่จะโจมตีผ่าน Network
ถ้าเราไม่เข้าใจเรื่อง Firewall เราก็อาจจะเปิด Port ที่ไม่จำเป็นทิ้งไว้ ทำให้ Hacker สามารถเข้ามาเจาะระบบผ่าน Port นั้นได้ง่ายขึ้น
การเริ่มต้น Hardening Server ไม่ได้ยากอย่างที่คิด แต่ต้องทำตามขั้นตอนอย่างเป็นระบบ และต้องทำอย่างสม่ำเสมอ
สิ่งแรกที่ต้องทำคือ Update และ Upgrade Package ทั้งหมดใน Server ของเรา เพราะ Package รุ่นใหม่ๆ มักจะมี Patch แก้ไขช่องโหว่ด้าน Security
sudo apt update
sudo apt upgrade
สมัยก่อนผมเคยปล่อย Server ทิ้งไว้นานๆ ไม่ได้ Update ปรากฏว่าโดน Hack เพราะ Software รุ่นเก่ามีช่องโหว่ที่ Hacker รู้จักแล้ว
ปิด Services ที่เราไม่ได้ใช้งาน เพราะ Services ที่รันอยู่ก็เหมือนประตูที่เปิดรอ Hacker เข้ามาโจมตี
sudo systemctl stop service_name
sudo systemctl disable service_name
ยกตัวอย่างเช่น ถ้าเราไม่ได้ใช้ FTP Server เราก็ควรปิดมันไปเลย เพราะถ้าเปิดทิ้งไว้ Hacker อาจจะเข้ามา Brute Force Password ได้
Firewall เป็นเหมือนกำแพงที่คอยป้องกันการโจมตีจากภายนอก เราต้อง Configure Firewall ให้ดี เพื่ออนุญาตเฉพาะ Traffic ที่จำเป็นเท่านั้น
sudo ufw enable
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
สมัยก่อนผมเคยพลาด Configure Firewall ผิด ทำให้ Server ไม่สามารถเข้าถึงได้จากภายนอก ต้องเข้าไปแก้ผ่าน Console อย่างเดียว
นอกจาก Hardening Server เองแล้ว ยังมีทางเลือกอื่นๆ อีกที่เราสามารถใช้เพื่อเพิ่มความปลอดภัยให้กับ Server ของเราได้
| ทางเลือก | ข้อดี | ข้อเสีย | เหมาะสำหรับ |
|---|---|---|---|
| Hardening Server เอง | ควบคุมได้เต็มที่, ประหยัดค่าใช้จ่าย | ต้องมีความรู้, ใช้เวลา | ผู้ที่มีความรู้ด้าน Linux และต้องการควบคุมทุกอย่างเอง |
| ใช้ Managed Server | ไม่ต้องดูแลเอง, สะดวก | เสียค่าใช้จ่าย, ควบคุมได้น้อย | ผู้ที่ไม่มีความรู้ด้าน Linux หรือต้องการความสะดวก |
| ใช้ Cloud Security Services | มีความปลอดภัยสูง, ปรับขนาดได้ง่าย | เสียค่าใช้จ่าย, อาจจะซับซ้อน | ผู้ที่ต้องการความปลอดภัยระดับสูง และพร้อมจ่าย |
ทางเลือกแต่ละอย่างก็มีข้อดีข้อเสียแตกต่างกันไป น้องๆ ต้องเลือกให้เหมาะสมกับความต้องการและความสามารถของตัวเอง
สมัยผมทำร้านเน็ต SiamCafe แรกๆ ก็ Hardening Server เองหมด เพราะตอนนั้นยังไม่มี Cloud Security Services ให้ใช้ แต่พอมี Cloud Security Services ผมก็เริ่มใช้บ้าง เพราะมันช่วยลดภาระในการดูแลรักษา Server ได้เยอะเลย SiamCafe Blog มีบทความเปรียบเทียบ Cloud Security Services หลายเจ้า ลองไปอ่านดูนะ
ดูวิดีโอเพิ่มเติมเกี่ยวกับLinux Server Hardening:
เอาล่ะ มาถึงส่วนที่สำคัญที่สุดแล้ว นั่นคือ เคล็ดลับที่ผมใช้จริง สมัยทำร้านเน็ต SiamCafe ยุคบุกเบิก เรื่องพวกนี้ไม่ได้มีสอนในตำรานะ ต้องเจ็บจริงถึงจะรู้!
Hardening Server มันเหมือนกับการสร้างบ้านน่ะ ต้องเริ่มจากรากฐานที่แข็งแรง แล้วค่อยๆ สร้างกำแพง ป้องกันคนไม่หวังดีเข้ามา
SSH ปกติจะใช้ Port 22 ใช่ไหม? นั่นแหละตัวดี ใครๆ ก็รู้! เปลี่ยนไปใช้ Port อื่นซะ เช่น 2222 หรืออะไรที่มันสุ่มๆ หน่อย แต่แค่นั้นยังไม่พอ ต้องทำ Port Knocking ด้วย
Port Knocking คืออะไร? คือการที่เราต้องเคาะประตู (ส่ง packet) ตามลำดับที่ถูกต้องก่อน ถึงจะเปิด Port SSH ให้เราเชื่อมต่อได้
# ติดตั้ง knockd (ตัวอย่างบน Debian/Ubuntu)
apt-get update
apt-get install knockd
# แก้ไข /etc/knockd.conf
[options]
UseSyslog
[openSSH]
sequence = 1234,5678,9012
seq_timeout = 5
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9012,5678,1234
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
tcpflags = syn
# แก้ไข /etc/default/knockd
START_KNOCKD=1
# สั่งให้ knockd ทำงาน
systemctl start knockd
systemctl enable knockd
โค้ดข้างบน คือตัวอย่างการตั้งค่า knockd สมมติว่าเราตั้ง Sequence เป็น 1234, 5678, 9012 เราต้องส่ง Packet ไปที่ Port เหล่านี้ตามลำดับก่อน ถึงจะเปิด Port 2222 ให้เรา SSH ได้ เจ๋งไหมล่ะ!
Fail2ban คือโปรแกรมที่คอยเฝ้าดู Log file แล้วแบน IP address ที่พยายาม Login ผิดพลาดซ้ำๆ มันเหมือนตำรวจที่คอยจับผู้ร้ายที่พยายามงัดบ้านเรานั่นแหละ
# ติดตั้ง Fail2ban
apt-get install fail2ban
# แก้ไข /etc/fail2ban/jail.local (สร้างจาก jail.conf)
[sshd]
enabled = true
port = 2222 ; เปลี่ยนเป็น Port SSH ที่เราใช้
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 ; พยายามผิดพลาด 3 ครั้ง แบนเลย
bantime = 3600 ; แบน 1 ชั่วโมง
# สั่งให้ Fail2ban ทำงาน
systemctl start fail2ban
systemctl enable fail2ban
ในตัวอย่างนี้ Fail2ban จะคอยเฝ้าดู Log ของ SSH ถ้ามีใครพยายาม Login ผิดพลาด 3 ครั้ง มันจะแบน IP address นั้นเป็นเวลา 1 ชั่วโมง
การใช้ Password ในการ Login มันเสี่ยงเกินไป Hacker อาจจะเดารหัสผ่านเราได้ วิธีที่ปลอดภัยกว่าคือ การใช้ Key-Based Authentication
Key-Based Authentication คือการใช้ Public key และ Private key ในการยืนยันตัวตน Private key จะเก็บไว้ในเครื่องเรา ส่วน Public key เราจะเอาไปใส่ไว้ใน Server
# สร้าง SSH Key pair บนเครื่อง Client
ssh-keygen -t rsa
# Copy Public Key ไป Server
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server_ip
# ปิด Password Authentication บน Server
# แก้ไข /etc/ssh/sshd_config
PasswordAuthentication no
ChallengeResponseAuthentication no
# Restart SSH Service
systemctl restart sshd
พอทำเสร็จ เราจะ Login เข้า Server โดยไม่ต้องใส่ Password อีกต่อไป แต่ต้องมี Private Key ที่ถูกต้องเท่านั้น
Firewall คือกำแพงที่กั้นระหว่าง Server เรากับโลกภายนอก เราต้องกำหนดกฎว่าใครสามารถเข้ามาได้บ้าง และใครที่ห้ามเข้า
iptables เป็น Firewall ที่ Built-in มากับ Linux ส่วน ufw (Uncomplicated Firewall) เป็น Frontend ที่ใช้งานง่ายกว่า
# ติดตั้ง UFW (ถ้ายังไม่ได้ติดตั้ง)
apt-get install ufw
# อนุญาต SSH (เปลี่ยน Port ถ้าจำเป็น)
ufw allow 2222/tcp
# อนุญาต HTTP (Port 80) และ HTTPS (Port 443)
ufw allow 80/tcp
ufw allow 443/tcp
# เปิดใช้งาน UFW
ufw enable
# ดูสถานะ UFW
ufw status
UFW จะช่วยให้เราตั้งค่า Firewall ได้ง่ายขึ้นเยอะ แต่ถ้าอยากได้ความละเอียดมากขึ้น iptables ก็ยังเป็นตัวเลือกที่ดี
iCafeForexสมัยผมทำร้านเน็ต เคยเจอ Hackers พยายามเข้ามาเจาะระบบบ่อยมาก ถ้าเราไม่ป้องกัน Hacker ก็จะเข้ามาขโมยข้อมูล เปลี่ยนแปลงข้อมูล หรือทำให้ Server ล่มได้
ถ้าไม่เคยทำเลย อาจจะยากหน่อย แต่ถ้าค่อยๆ เรียนรู้ทีละขั้นตอน ก็ไม่ยากเกินไปหรอก ลองเริ่มจาก Best Practices ที่ผมแนะนำไปก่อนก็ได้
ไม่มีอะไรปลอดภัย 100% หรอก แต่การ Hardening Server จะช่วยลดความเสี่ยงได้อย่างมาก และทำให้ Hacker ทำงานยากขึ้นเยอะ
ควรจะ Hardening Server เป็นประจำ และคอยอัพเดท Security Patch อยู่เสมอ เพราะ Hacker ก็พัฒนาเทคนิคใหม่ๆ อยู่ตลอดเวลา
SiamCafe BlogLinux Server Hardening เป็นเรื่องที่สำคัญมาก โดยเฉพาะถ้าเราต้องดูแล Server ที่เก็บข้อมูลสำคัญ หรือให้บริการต่างๆ บนอินเทอร์เน็ต
อย่าลืมว่าการ Hardening Server ไม่ใช่แค่การทำตาม Checklist แต่เป็นการทำความเข้าใจถึงความเสี่ยง และหาทางป้องกันอย่างเหมาะสม
หวังว่าบทความนี้จะเป็นประโยชน์กับทุกคนนะครับ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลย!