สำนักวิทยบริการและเทคโนโลยีสารสนเทศ (สวส.)

Office of Academic Resources and Information Technology

การตั้งค่าความปลอดภัยให้กับ SSH Server

   Linux  สำหรับผู้ดูแลระบบลินุกซ์ทุกคน สิ่งที่จะต้องลงและตั้งค่าทันทีหลังจากติดตั้งลินุกซ์เซิร์ฟเวอร์นั่นก็คือ Secure Shell Server หรือที่เรียกกันย่อๆ ว่า SSH Server ซึ่งในบทความนี้จะแนะนำถึงวิธีการลงและตั้งค่า SSH อย่างไรให้มีความปลอดภัยสูงสุด 
  • ที่ต้องทำอย่างแรกที่สุดแน่นอน ก็คือ ลงลินุกซ์ก่อนสิครับ
  • หลังจากนั้นให้ลง 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 โดยไม่ต้องใส่รหัสผ่าน
  • จากนั้น 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 ไฟล์ต่างๆ) ผิดพลาดประการใดก็ขออภัยด้วยครับ
แบ่งขั้นตอนคร่าวๆได้ดังนี้
  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
 
ที่มา www.thaihosttalk.com