มาตั้งค่าความปลอดภัยเบื้องต้นให้ Linux กันดีกว่า

นี่เป็นเกร็ดเล็กๆน้อยๆเบื้องต้นสำหรับมือใหม่ที่จะช่วยปรับแต่งให้เครื่อง Linux มีความปลอดภัยมากยิ่งขึ้นครับ โดยตัวอย่างที่ให้เป็นคำสั่งบนเครื่อง debian ถ้าใครใช้ distro อื่นๆก็อาจจะมีรายละเอียดปลีกย่อยแตกต่างกันไป (ส่วนใหญ่จะคล้ายๆกันแต่ต่างกันที่สถานที่เก็บ config ไฟล์ต่างๆ) ผิดพลาดประการใดก็ขออภัยด้วยครับ

แบ่งขั้นตอนคร่าวๆได้ดังนี้

  1. สร้าง user ขึ้นมาใหม่ - เพื่อที่จะได้ไม่ต้องเข้าเป็น root ตลอดเวลา ช่วยทั้งเรื่องความปลอดภัยและป้องกันความซุ่มซ่ามของตัวเองทำเครื่องพังจากการใช้คำสั่งอย่างไม่ระมัดระวัง

  2. เปลี่ยน root password - โดยเฉพาะคนที่ได้ root password มาจากคนอื่น (แต่ถ้าเราเปลี่ยนแล้ว คนๆนั้นก็จะเข้า root ไม่ได้นะครับ เว้นแต่ว่าจะให้สิทธิ์ใน sudoers ไว้ตามข้างล่าง)

  3. ปิด service ต่างๆที่ไม่ได้ใช้ - เพื่อลดจำนวนช่องโหว่ลง

  4. ลง sudo - จะได้ไม่ต้อง login เข้า root ตามข้อ (1) ข้างบน

  5. ตั้งค่า SSH - ไม่ให้ login โดยใช้ root และทำ public key authentication (ถ้าต้องการ)

  6. ตั้งค่า 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/

เป็นประโยชน์มากเลยครับ สำหรับมือใหม่ ขอบคุณครับ

ระวัง ข้อ 6 กะ centos นะครับ

มันมี script อยู่แล้ว เรียกจาก /etc/sysconfig/iptables