[How-To] หลีกเลี่ยงการโดนโจมตีจาก Hacker แบบง่าย ๆ ด้วยการเปลี่ยน SSH Port
SSH คืออะไร?
Secure Shell หรือเรียกกันว่า SSH คือ โปรโตคอลเครือข่ายที่ใช้เพื่อเข้าถึง server จากระยะไกล โดยทำให้ client และ server สามารถสื่อการกันได้ผ่านช่องสัญญาณที่ได้รับการเข้ารหัส เราสามารถเข้าถึงเซิร์ฟเวอร์จากระยะไกลได้โดยการระบุชื่อผู้ใช้ ที่อยู่ IP และหมายเลขพอร์ตที่จะใช้ในการสื่อสาร การเชื่อมต่อเช่นนี้มีความปลอดภัยกว่าการใช้ Telnet ที่เป็นโปรโตคอลที่ทำหน้าที่แบบเดียวกัน
Port เริ่มต้นของ SSH
เนื่องจากการสื่อสารแบบไร้สายหรือแบบใช้สายระหว่างเครื่องสองเครื่องต้องเกิดขึ้นผ่าน port โดยทั่วไปแล้ว จะมี port ทั้งหมด 65,536 พอร์ท (2^16 -> 16 bits) และค่าเริ่มต้นของ SSH จะสื่อสารผ่าน port 22
ทำไมต้องเปลี่ยน Default SSH Port?
เนื่องจาก ผู้ใช้งานจะทราบกันโดยทั่วไปว่า port 22 เป็น port เริ่มต้นของ SSH จึงอาจทำให้บุคคลที่ไม่ได้รับอนุญาตสามารถเข้าถึงข้อมูลจาก port นี้ได้ง่ายกว่าจาก port อื่น ๆ
หากเราเปลี่ยน port จะทำให้ผู้บุกรุกต้องสุ่ม port อื่น ๆ ที่แตกต่างกันจึงโจมตีได้ยากขึ้น การเปลี่ยน default SSH port จึงช่วยเพิ่มความปลอดภัยให้แก่ server ได้ โดยเฉพาะจาก Brute Force Attack (การลองผิดลองถูกในการถอดรหัสข้อมูลที่เข้ารหัส)
ช่วงของ Port ตามมาตรฐานสากล
ในความเป็นจริง เราสามารถเปลี่ยน SSH port เป็นอะไรก็ได้ ที่ไม่ซ้ำกับ port ที่เปิดอยู่แล้วของ server นั้น ๆ อย่างไรก็ตาม ก็ควรเปลี่ยน port ให้สอดคล้องกับมาตรฐานสากลดังต่อไปนี้
Port สื่อสารทั้งหมด 65,536 port (2^16 -> 16 bits) จะแบ่งตามประเภทการใช้งาน โดยแบ่งเป็นช่วง (port range) ดังนี้
Start | End | Designation |
---|---|---|
0 | 1023 | System หรือ well-known port |
1024 | 49151 | User หรือ registered port |
49152 | 65535 | Dynamic, private หรือ ephemeral port |
อ้างอิง https://en.wikipedia.org/wiki/Registered_port
จากตาราง อธิบายได้ว่า
Well-known port : มีช่วงตั้งแต่ 0 ถึง 1023 (0 to 2^10 - 1) port นี้ใช้กับ OS system process
Registered port : มีช่วงตั้งแต่ 1024 ถึง 49151 (2^10 to 2^14 + 2^15 - 1) หน่วยงาน Internet Assigned Numbers Authority (IANA) เช่น Apple, Cisco จะเป็นผู้กำหนดให้กับผู้ร้องขอ
Dynamic, private หรือ ephemeral port : มีช่วงตั้งแต่ 49,152 ถึง 65,535 (2^15 + 2^14 to 2^16 - 1) port เหล่านี้สามารถใช้ได้ส่วนตัวโดยไม่ต้องขอ IANA
ดังนั้นแล้ว หากต้องการเปลี่ยน SSH port ให้เป็นไปตามมาตรฐานสากล จึงควรเปลี่ยนให้อยู่ในช่วงของ dynamic, private หรือ ephemeral port
ข้อมูลเพิ่มเติมเกี่ยวกับ port
อ่านต่อ https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
วิธีการเปลี่ยน SSH Port
1. ตรวจสอบ firewall service ภายใน OS
เปิด program ที่จะใช้ในการ SSH เข้าสู่ instance เช่น Ternimal สำหรับ MacOS หรือ PuTTY สำหรับ Windows เพื่อใช้งานในการ SSH และใส่ command
# service firewalld status
จากภาพ จะพบว่า firewall ถูกปิดไว้เรียบร้อย (แนะนำ) โดนในที่นี้จะใช้แค่ security group ของ NIPA Cloud Space
หมายเหตุ: เพิ่ม ufw, iptable สำหรับบาง OS
2. ตรวจสอบ Security Group
ทุกครั้งที่สร้าง instance จำเป็นต้อง allow port สำหรับเข้าถึง server อย่างน้อย 1 port ระบบจะสร้าง default SSH port มาให้อยู่แล้ว port 22 ดังภาพ
การตรวจสอบการตั้งค่าของ Security Group
เมื่อคลิกที่ security group นั้น ๆ จะปรากฏหน้าต่าง Security Group Detail สามารถตรวจสอบข้อมูลได้ที่หน้านี้
Security Group Name - ชื่อของ security group เราสามารถตั้งค่าได้ แนะนำให้ตั้งให้สอดคล้องกับ Protocol
Ingress - port ขาเข้าของ server (instance)
Port/Ports Length - หมายเลขของ port ของ server
IP Protocol - ในที่นี้เราจะใช้งาน SSH -> ปกติแล้ว SSH เป็น TCP
Type - หมายเลข IP ของ server เราเป็น IPv4 ดังนั้น ตั้งเป็น IPv4
Remote - ถ้าต้องการ Allow ทุก IP ให้ใช้เป็น 0.0.0.0/0, ถ้าต้องการ Block ให้เลือก Remote Security Group เลือก Security Group "default"
Egress - การตั้งค่าทางฝั่ง Client -> เมื่อเครื่อง Client ต้องการเชื่อมต่อทางฝั่งของ Client ก็จะต้องมี port สำหรับรับส่ง package ซึ่งทางฝั่งของ Client จะเปิดเป็น port อะไรก็ได้ และจะเชื่อมต่อกับปลายทาง (server ในที่นี้ก็คือฝั่ง ingress: SSH port 22) ดังนั้นการตั้งค่าจะเป็น ports length All-65535
3. ตรวจสอบ port ที่เปิดอยู่ทั้งหมด (listening port)
ตรวจสอบ port ที่เปิดใช้งานทั้งหมดในปัจจุบัน ด้วย command
# netstat -tulnp
จากภาพจะเห็นว่า port 22 protocol SSH เปิดอยู่
4. เปลี่ยน SSH port
การเปลี่ยน SSH port จำเป็นต้องเปลี่ยนทั้งภายใน OS (SSH config file) และ Firewall รวมถึง NIPA Cloud firewall (ยังไม่ใช้งาน firewall ใน OS)
4.1 เปลี่ยน SSH port ภายใน OS (SSH config file)
backup config เดิม ด้วย command
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config_backup
แล้วตรวจสอบ file ที่ backup
# ls -l /etc/ssh/
จากนั้น แก้ไข SSH config file ด้วย command
# vi /etc/ssh/sshd_config
จะเห็นว่า มีบรรทัดที่เขียนว่า #port 22 ให้เราเปลี่ยนหมายเลข port เป็น port ที่เราต้องการดังภาพ
4.2 การตั้งค่าความปลอดภัยของ SSH config file เพิ่มเติม
เราสามารถตั้งค่าความปลอดภัยเพิ่มเติมได้ ค่าที่แนะนำมีดังนี้
LoginGraceTime : กรณีที่เรา ssh ค้างไว้แล้วยังไม่ใส่ password หากเวลามากกว่าที่ตั้งค่าไว้ session ที่กำลังเชื่อมต่ออยู่จะถูกตัด ควรตั้งเวลาไว้เพื่อไม่ให้ session เต็ม
PermitRootLogin : ควรตั้งไว้เป็น no เพราะการ brute force ของ Hacker โดยปกติแล้วจะมี root เป็น user หลักๆ สำหรับการโจมตี และก็เป็นช่องโหว่ที่เครื่อง server มักจะถูกแฮ็ก
MaxAuthTries : ใส่รหัสผ่านผิดกี่ครั้งถึงจะตัด session ให้ตั้งไว้น้อยๆ เพื่อให้ Hacker ลำบากขึ้น
MaxSessions : จำนวน max session ที่เชื่อมต่อด้วย SSH protocol
เมื่อตั้งค่าทุกอย่างใน ssh_config file แล้ว ให้ restart sshd service หลังจาก restart แล้ว session อาจจะถูกตัด การเข้าถึงจะต้องใช้ port ตามที่เราเปลี่ยน รวมทั้งต้องตั้งค่า firewall ใหม่ด้วย (แนะนำให้ตั้งค่า firewall ก่อน)
5. เปลี่ยน SSH port ใน Security Group
5.1 เพิ่ม security group ขึ้นใหม่
การเปลี่ยน port SSH เป็น port อื่นที่ไม่ใช่ well-known port จะต้องเพิ่ม security group ขึ้นมาใหม่ โดยเลือกเข้าสู่หน้า security group เลือก Security Group > Customize
จะปรากฏหน้าต่าง Creat Security Group ขึ้นมา ให้กรอกข้อมูลที่ต้องการและคลิก ‘CONFIRM’
5.2 เพิ่ม rule ใน security group
คลิกที่ปุ่ม ‘MORE’ ของ security group ที่ต้องการ เลือก ‘Add Rules’ ที่ฝั่งของ Ingress
เมื่อคลิกแล้ว จะปรากฏหน้าต่าง Add Ingress Rule ขึ้นมา คลิก Customs Rule แล้วตั้งค่าดังภาพ แล้วคลิก ‘CONFIRM’
Types : Custom TCP
Port : port ที่ตั้งค่าใน sshd_config file ใน OS
เมื่อตั้งค่าเสร็จแล้ว จะเห็นที่ฝั่ง ingress มี rule ที่สร้างไว้เพิ่มขึ้นมา โดยไม่ต้องแก้ไขฝั่ง egress
5.3 Attach security group ที่สร้างใหม่กับ instance
เข้าหน้า instance คลิกที่ instance ที่ต้องการเพื่อเข้าสู่หน้า instance detail เลือก tab ‘Network’ คลิก V เพื่อแสดง port ของ instance นั้น ๆ
คลิก ‘Attach Security Group’ เลือก security group ที่เราสร้างไว้ แล้วตรวจสอบว่า ingress ตรงกับที่เราเพิ่ม rule เข้าไปแล้วหรือไม่ หากไม่ตรงกันต้องกลับไปตั้งค่าในขั้นตอนก่อนหน้าให้ตรง
แต่หากตรงกันแล้ว คลิก ‘CONFIRM’
ขณะนี้ instance จะมี security group ทั้งหมด 2 group คือ default SSH (22) และ Custom SSH ที่เราเพิ่มเข้าไป
5.4 ตรวจสอบข้อมูลอีกครั้งก่อน restart service
ตรวจสอบข้อมูลตามรายการดังต่อไปนี้
- ตรวจสอบ sshd_config file ใน OS ว่า port ตรงกันหรือไม่ ด้วย command
# vi /etc/ssh/sshd_config
- ตรวจสอบ listening port ด้วย
# netstat -tulnp
ตรวจสอบ OS firewall (ยังปิดไว้อยู่)
ตรวจสอบ security group
6. Restart service และตรวจสอบผลการเปลี่ยน SSH port
Restart service ด้วย command
# service sshd restart
ตรวจสอบ listening port อีกครั้งเพื่อตรวจสอบว่า port ดังกล่าวถูกเปลี่ยนแล้วจริงหรือไม่
# netstat -tulnp
จากภาพจะเห็นว่า SSH port จะเปลี่ยนจาก 22 เป็น 50222 ตามที่ตั้งค่าไว้
7. ลบ SSH default security group
หลังจากตั้งค่าและตรวจสอบเสร็จเรียบร้อยแล้ว ให้ลบ security group ที่ไม่จำเป็นออก ในที่นี้คือ SSH default เดิม
เลือก security group ที่เป็นตัว port 22 แล้วคลิก ‘DETACH’ เพื่อให้ server มีทางเข้าน้อยที่สุด hacker จะได้หาช่องโหว่ได้ยากขึ้น
8. ทดสอบ SSL acress
ทดสอบเข้า server ใหม่อีกรอบ
เปรียบเทียบการโดนโจมตีระหว่าง default SSH port กับ custom SSH port
ผู้เขียนได้เก็บข้อมูลการถูกโจมตีไว้ตั้งแต่สร้างเครื่อง server โดย filter ข้อมูลที่ถูกโจมตีเปรียบเทียบกันระหว่างการเปิด SSH port ด้วย default port 22 กับ custom port 50222 โดยจะเปรียบเทียบการถูกโจมตีเป็นเวลา 24 ชั่วโมง มีผลดังนี้
Default SSH port 22
Custom SSH port 50222
จากผลจะพบว่า
Custom SSH port มีจำนวนการโจมตีและ IP ที่โจมตีเข้ามาน้อยกว่า Default SSH port
User ที่ถูกโจมตีมากที่สุดคือ root
User ที่ถูกโจมตีมักจะเป็น user ที่คนใช้บ่อย เช่น user, test, admin, oracle เป็นต้น รวมถึง user ที่เป็นชื่อของโปรแกรมที่ใช้งานบ่อยๆ เช่น postgres โปรแกรมจัดการฐานข้อมูล, nagios โปรแกรมมอนิเตอร์
ดังนั้น การเปลี่ยน port ช่วยให้หลีกเลี่ยงการโจมตีได้ในระดับหนึ่ง โดยควรใช้ควบคู่กับมาตรการรักษาความปลอดภัยอื่นๆ ด้วย เช่น ไม่ให้สิทธิ์ root SSH access และไม่ตั้งชื่อที่เป็นชื่อที่คนทั่วไปใช้กันบ่อย ๆ
วิธีบล็อกการโจมตีที่แนะนำ
ใช้โปรแกรมชื่อ fail2ban ซึ่งจะช่วย auto block โดยเพิ่มเข้าไปใน firewall ว่า IP นี้ไม่ให้ ssh ทีละ IP โดยที่ใช้การ filter จาก log file
ตัวอย่างการบล็อกด้วย fail2ban
การจะใช้ fail2ban ต้องรู้จักพื้นฐานของคำสั่ง iptables และ firewall-cmd รวมถึงการทำงานของ Linux firewall ด้วย
หากสนใจมาตรการรักษาความปลอดภัยอื่นๆ เราจะเล่าให้ฟังในบทความต่อ ๆ ไป