

- ที่ต้องทำอย่างแรกที่สุดแน่นอน ก็คือ ลงลินุกซ์ก่อนสิครับ
- หลังจากนั้นให้ลง SSH Server ด้วยคำสั่ง
apt-get install openssh-server
- เข้าไปแก้ไขไฟล์ /etc/ssh/sshd_config ซึ่งเป็นไฟล์ที่มีไว้ตั้งค่า SSH Server ของเรา โดยจะแสดงเฉพาะค่าที่เกี่ยวข้องกับความปลอดภัยดังนี้
1 2 3 4 5 6 7 8 9 |
Port 9999 ListenAddress 192.168.100.10 LoginGraceTime 120 PermitRootLogin no StrictModes yes PermitEmptyPasswords no AllowUsers username1 username2 AllowGroups groupname PasswordAuthentication no |
บรรทัดที่ 1 เป็นการตั้งค่าพอร์ตที่จะใช้ในการล็อคอิน SSH เข้ามา ซึ่งแนะนำให้ตั้งค่าเป็นพอร์ตที่มากกว่า 1024 ขึ้นไป เพื่อให้คนที่จะเจาะระบบของเราไม่สามารถหาพอร์ตที่จะใช้ในการล็อคอินได้ง่ายนัก (แต่ใช่ว่าจะหาไม่ได้นะเออ)
บรรทัดที่ 2 ในกรณีบางครั้งเรามีการ์ดแลนหลายใบที่ติดตั้งอยู่กับเซิร์ฟเวอร์ ให้ตั้งค่าเป็นไอพีที่เราต้องการจะให้ล็อคอิน SSH เข้ามา เช่น ตั้งเป็นไอพี 192.168.100.10 ในกรณีที่ต้องการให้ล็อคอินผ่านไอพีภายในระบบของเราเท่านั้น
บรรทัดที่ 3 เป็นการตั้งเวลาที่จะให้ SSH Server ตัดการเชื่อมต่อ ถ้าผู้ใช้ไม่ได้เข้ามาล็อคอินภายในเวลาที่กำหนด (หน่วยเป็นวินาที)
บรรทัดที่ 4 ให้ตั้งค่าเป็น no เพื่อไม่ให้ root สามารถล็อคอินเข้ามายัง SSH ได้โดยตรง ต้องล็อคอินผ่านผู้ใช้อื่นก่อน แล้วใช้คำสั่ง su เป็น root อีกทีหนึ่ง
บรรทัดที่ 5 เป็นการตั้งค่าให้ SSH ตรวจสอบ permission ของ home directory ก่อนล็อคอินทุกครั้ง
บรรทัดที่ 6 ตั้งค่าเป็น no เพื่อบังคับให้ใส่รหัสผ่านในการล็อคอินทุกครั้ง ไม่สามารถเว้นว่างไว้ได้ (ป้องกันช่องโหว่ในบางกรณีที่ผู้ใช้ไม่มีรหัสผ่าน แต่ยังสามารถล็อคอินเข้ามาได้)
บรรทัดที่ 7 กำหนดผู้ใช้ที่สามารถ SSH ได้
บรรทัดที่ 8 กำหนดกลุ่มผู้ใช้ที่สามารถ SSH ได้
บรรทัดที่ 9 กำหนดให้ล็อคอินด้วยระบบอื่นที่ไม่ใช่เป็นการใส่ชื่อผู้ใช้กับรหัสผ่าน ให้ตั้งค่าเป็น no และใช้ควบคู่กับวิธีการ SSH โดยไม่ต้องใส่รหัสผ่าน
บรรทัดที่ 2 ในกรณีบางครั้งเรามีการ์ดแลนหลายใบที่ติดตั้งอยู่กับเซิร์ฟเวอร์ ให้ตั้งค่าเป็นไอพีที่เราต้องการจะให้ล็อคอิน SSH เข้ามา เช่น ตั้งเป็นไอพี 192.168.100.10 ในกรณีที่ต้องการให้ล็อคอินผ่านไอพีภายในระบบของเราเท่านั้น
บรรทัดที่ 3 เป็นการตั้งเวลาที่จะให้ SSH Server ตัดการเชื่อมต่อ ถ้าผู้ใช้ไม่ได้เข้ามาล็อคอินภายในเวลาที่กำหนด (หน่วยเป็นวินาที)
บรรทัดที่ 4 ให้ตั้งค่าเป็น no เพื่อไม่ให้ root สามารถล็อคอินเข้ามายัง SSH ได้โดยตรง ต้องล็อคอินผ่านผู้ใช้อื่นก่อน แล้วใช้คำสั่ง su เป็น root อีกทีหนึ่ง
บรรทัดที่ 5 เป็นการตั้งค่าให้ SSH ตรวจสอบ permission ของ home directory ก่อนล็อคอินทุกครั้ง
บรรทัดที่ 6 ตั้งค่าเป็น no เพื่อบังคับให้ใส่รหัสผ่านในการล็อคอินทุกครั้ง ไม่สามารถเว้นว่างไว้ได้ (ป้องกันช่องโหว่ในบางกรณีที่ผู้ใช้ไม่มีรหัสผ่าน แต่ยังสามารถล็อคอินเข้ามาได้)
บรรทัดที่ 7 กำหนดผู้ใช้ที่สามารถ SSH ได้
บรรทัดที่ 8 กำหนดกลุ่มผู้ใช้ที่สามารถ SSH ได้
บรรทัดที่ 9 กำหนดให้ล็อคอินด้วยระบบอื่นที่ไม่ใช่เป็นการใส่ชื่อผู้ใช้กับรหัสผ่าน ให้ตั้งค่าเป็น no และใช้ควบคู่กับวิธีการ SSH โดยไม่ต้องใส่รหัสผ่าน
- จากนั้น restart service ssh เพื่อให้รับค่าใหม่ที่ตั้งค่าไปด้วยคำสั่ง (ถ้าใช้วิธี SSH เข้ามาตั้งค่า ไม่ต้องกลัวว่าจะหลุด)
/etc/init.d/ssh restart
- หลังจาก restart service ssh แนะนำให้ลอง SSH ทดสอบก่อนให้แน่ใจว่าล็อคอินได้แน่นอน เพราะมีบางกรณีที่ตั้งค่าผ่าน SSH พอ restart ssh แล้วก็ตัดเซสชันที่ตัวเองล็อคอินอยู่ ปรากฎว่าไม่สามารถล็อคอินได้หลังจากนั้นเพราะว่าตั้งค่าผิด และจบลงด้วยต้องลงลินุกซ์ใหม่หมดอีกครั้งหนึ่ง (ในกรณีที่เครื่องเซิร์ฟเวอร์ไม่ได้อยู่ใกล้ตัว)
จริงๆ วิธีที่ปลอดภัยที่สุดคือ ปิดและลบ SSH Server ไปเลย...
- ที่มา at: http://www.wingfoss.in.th/content/how-to-secure-ssh-server
นี่เป็นเกร็ดเล็กๆน้อยๆเบื้องต้นสำหรับมือใหม่ที่จะช่วยปรับแต่งให้เครื่อง 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 ต่างๆ
- อนุญาต traffic จาก loopback interface
- ถ้ามี traffic มาที่ 127.0.0.0/8 ต้องมาจาก loopback interface เท่านั้น
- อนุญาต incoming traffic ที่เริ่มจากเครื่องนี้
- อนุญาต outgoing traffic ทั้งหมด
- อนุญาต tcp traffic ที่มาที่ port 80
- อนุญาต tcp traffic ที่มาที่ port 22 (SSH)
- อนุญาต ping
- เก็บ log traffic ที่ไม่ได้รับอนุญาต
- drop incoming traffic อื่นๆ
- 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
ที่มา www.thaihosttalk.com