นี่เป็นเกร็ดเล็กๆน้อยๆเบื้องต้นสำหรับมือใหม่ที่จะช่วยปรับแต่งให้เครื่อง Linux มีความปลอดภัยมากยิ่งขึ้นครับ โดยตัวอย่างที่ให้เป็นคำสั่งบนเครื่อง debian ถ้าใครใช้ distro อื่นๆก็อาจจะมีรายละเอียดปลีกย่อยแตกต่างกันไป (ส่วนใหญ่จะคล้ายๆกันแต่ต่างกันที่สถานที่เก็บ config ไฟล์ต่างๆ) ผิดพลาดประการใดก็ขออภัยด้วยครับ
แบ่งขั้นตอนคร่าวๆได้ดังนี้
-
สร้าง user ขึ้นมาใหม่ - เพื่อที่จะได้ไม่ต้องเข้าเป็น root ตลอดเวลา ช่วยทั้งเรื่องความปลอดภัยและป้องกันความซุ่มซ่ามของตัวเองทำเครื่องพังจากการใช้คำสั่งอย่างไม่ระมัดระวัง
-
เปลี่ยน root password - โดยเฉพาะคนที่ได้ root password มาจากคนอื่น (แต่ถ้าเราเปลี่ยนแล้ว คนๆนั้นก็จะเข้า root ไม่ได้นะครับ เว้นแต่ว่าจะให้สิทธิ์ใน sudoers ไว้ตามข้างล่าง)
-
ปิด service ต่างๆที่ไม่ได้ใช้ - เพื่อลดจำนวนช่องโหว่ลง
-
ลง sudo - จะได้ไม่ต้อง login เข้า root ตามข้อ (1) ข้างบน
-
ตั้งค่า SSH - ไม่ให้ login โดยใช้ root และทำ public key authentication (ถ้าต้องการ)
-
ตั้งค่า iptables - เพื่อเปิดใช้เฉพาะ port ที่จำเป็นจริงๆ
มาเริ่มกันเลยดีกว่า…
1. สร้าง user โดยใช้คำสั่ง adduser
$ adduser username
$ passwd username
2. เปลี่ยน root password
$ passwd
3.ปิด service ต่างๆที่ไม่ได้ใช้
ปกติผมจะไปเพิ่มหรือลบ symbolic link ตาม /etc/rcX.d/ เอาด้วยความเคยชิน แต่เดี๋ยวนี้ใช้สคริปต์ update-rc.d ได้ครับ (สำหรับ debian) หรือ ‘service’ สำหรับ Centos
$ update-rc.d -f service_name remove
4. ลง sudo
$ apt-get install sudo
หรือใครใช้ Centos ก็ให้ใช้ yum เอา
จากนั้นก็ให้ใช้ visudo เพื่อแก้ไฟล์ sudoers อยากให้ใครใช้คำสั่งที่ต้องใช้ root privilege ได้ก็ใส่บรรทัดนี้เข้าไป
username ALL=(ALL)
5. ตั้งค่า SSH
อันดับแรกที่ผมทำเลยคือปิด root login ครับ ให้เข้ามาเป็น user ธรรมดาแล้วมา sudo เอา
เปิดไฟล์ /etc/ssh/sshd_config โดยใช้ editor ที่ถนัด แล้วมองหาบรรทัด PermitRootLogin yes แล้วเปลี่ยนเป็น PermitRootLogin no แทน
จากนั้นก็เช็คว่าให้ใช้ SSH version 2 เท่านั้น โดยดูในไฟล์เดิมแล้วหาบรรทัด Protocol 2,1 แล้วเปลี่ยนเป็น Protocol 2 แทน ถ้าเป็น Protocol 2 อยู่แล้วก็ไม่ต้องไปยุ่งอะไรมันครับ
ถ้าอยากจะเปลี่ยน port SSH ด้วยก็ทำได้ครับ หาบรรทัด Port 22 แล้วเปลี่ยนเลข 22 เป็น port อื่นที่เราต้องการ
สำหรับคนที่โรคจิตวิตกจริตอย่างผมก็อาจจะอยากใช้ public key authentication แทน ก็ทำได้ครับ ก่อนอื่นก็สร้าง public/private key บนเครื่องตัวเองก่อน
$ ssh-keygen -t rsa
และควรจะใส่ password ให้กับ key นี้ด้วยเพื่อเพิ่มความปลอดภัย (ไม่งั้นถ้า private key โดนขโมย คนที่ขโมยก็จะสามารถเข้าเครื่องเราได้ทันที)
จากนั้นก็ upload public key ขึ้นไปบน server
$ scp id_rsa.pub username@server:id_rsa.pub
แล้ว log เข้าไปที่ server เพื่อตั้งให้ใช้ key นี้สำหรับ login
$ cd (ไปที่ home ของ user ที่ต้องการ)
$ mkdir .ssh
$ chmod 700 .ssh
$ cat id_rsa.pub >> .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
แล้วเปิดไฟล์ /etc/ssh/sshd_config ขึ้นมาอีกครั้งเพื่อตั้งให้ใช้ public key เท่านั้น
หาบรรทัด PasswordAuthentication yes แล้วเปลี่ยนเป็น PasswordAuthentication no
หาบรรทัด UsePAM yes แล้วเปลี่ยนเป็น UsePAM no
ถ้ามั่นใจว่าไม่ได้ทำอะไรผิดก็ทำการ restart sshd
$ /etc/init.d/ssh restart
*** ควรจะทำที่หน้าจอหรือผ่าน iKVM เพราะถ้า config พลาดอาจจะทำให้เข้าเครื่องไม่ได้ (เตือนแล้วนะครับ) หรือถ้าจำเป็นจริงๆที่ต้องทำจากข้างนอกก็ต้องไม่ปิด session ssh ปัจจุบันจนกว่าจะมั่นใจว่าสามารถเข้า session ใหม่ผ่าน public key ได้ ***
6. ตั้งค่า iptables
โดยปกติผมจะปิดทุก port ยกเว้นแต่ port ที่ต้องใช้จริงๆ ขั้นตอนต่อไปจะทำในไฟล์หรือใส่ command เข้าไปเลยก็ได้ ถ้าสร้างไฟล์ก็ให้เริ่มไฟล์ด้วย *filter เพื่อบอกว่าเรากำลังแก้ filter table อยู่ ดังนี้
$ vi /etc/iptables.test.rules
*filter
-A INPUT -i lo -j ACCEPT
-A INPUT -i ! lo -d 127.0.0.0/8 -j REJECT
-A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
-A OUTPUT -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
-A FORWARD -j DROP
COMMIT
อธิบาย rules ต่างๆ
1 - อนุญาต traffic จาก loopback interface
2 - ถ้ามี traffic มาที่ 127.0.0.0/8 ต้องมาจาก loopback interface เท่านั้น
3 - อนุญาต incoming traffic ที่เริ่มจากเครื่องนี้
4 - อนุญาต outgoing traffic ทั้งหมด
5 - อนุญาต tcp traffic ที่มาที่ port 80
6 - อนุญาต tcp traffic ที่มาที่ port 22 (SSH)
7 - อนุญาต ping
8 - เก็บ log traffic ที่ไม่ได้รับอนุญาต
9 - drop incoming traffic อื่นๆ
10 - drop traffic อื่นๆ ที่จะต้องถูก forward
เสร็จแล้วก็ load เข้า iptables โดยคำสั่ง
$ iptables-restore < /etc/iptables.test.rules
หรือถ้าไม่ทำใส่ไฟล์ก็ให้ใช้คำสั่ง iptables นำหน้าแทนครับ เช่น
$ iptables -A INPUT -i lo -j ACCEPT
แล้วใส่เข้าไปทีละบรรทัด
จากนั้นก็ดูความเรียบร้อย
$ iptables -L
และลองดูว่า port ที่ต้องการจะใช้ใช้ได้จริงหรือเปล่า และ port อื่นๆได้ถูกปิดไปจริงหรือไม่ (สำหรับคนที่เปลี่ยน port ssh ก็อย่าลืมเปลี่ยนตามนะครับ) ถ้าเรียบร้อยดีก็ save ไป
$ iptables-save > /etc/iptables.up.rules
แล้วสร้าง script ขึ้นมาเพื่อโหลด rules ตอน boot
$vi /etc/network/if-pre-up.d/iptables
#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules
save ไฟล์แล้วเปลี่ยน permission ให้เป็น executable
$ chmod +x /etc/network/if-pre-up.d/iptables
เป็นอันเสร็จเรียบร้อย
(ลอกมาจาก blog ตัวเอง + update นิดหน่อย) original ที่นี่ http://just-another-blog.com/lang/en-us/2011/01/securing-a-debian-box-เพิ่มความปลอดภัยให้-debi/