SSH Port
Tech Knowledge

[How-To] หลีกเลี่ยงการโดนโจมตีจาก Hacker แบบง่าย ๆ ด้วยการเปลี่ยน SSH Port

Published : March 22, 2024Time : 17 min read

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 สามารถตรวจสอบข้อมูลได้ที่หน้านี้

  1. Security Group Name - ชื่อของ security group เราสามารถตั้งค่าได้ แนะนำให้ตั้งให้สอดคล้องกับ Protocol

  2. Ingress - port ขาเข้าของ server (instance)

  3. Port/Ports Length - หมายเลขของ port ของ server

  4. IP Protocol - ในที่นี้เราจะใช้งาน SSH -> ปกติแล้ว SSH เป็น TCP

  5. Type - หมายเลข IP ของ server เราเป็น IPv4 ดังนั้น ตั้งเป็น IPv4

  6. Remote - ถ้าต้องการ Allow ทุก IP ให้ใช้เป็น 0.0.0.0/0, ถ้าต้องการ Block ให้เลือก Remote Security Group เลือก Security Group "default"

  7. 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 เพิ่มเติม

เราสามารถตั้งค่าความปลอดภัยเพิ่มเติมได้ ค่าที่แนะนำมีดังนี้

  1. LoginGraceTime : กรณีที่เรา ssh ค้างไว้แล้วยังไม่ใส่ password หากเวลามากกว่าที่ตั้งค่าไว้ session ที่กำลังเชื่อมต่ออยู่จะถูกตัด ควรตั้งเวลาไว้เพื่อไม่ให้ session เต็ม

  2. PermitRootLogin : ควรตั้งไว้เป็น no เพราะการ brute force ของ Hacker โดยปกติแล้วจะมี root เป็น user หลักๆ สำหรับการโจมตี และก็เป็นช่องโหว่ที่เครื่อง server มักจะถูกแฮ็ก

  3. MaxAuthTries : ใส่รหัสผ่านผิดกี่ครั้งถึงจะตัด session ให้ตั้งไว้น้อยๆ เพื่อให้ Hacker ลำบากขึ้น

  4. 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

ตรวจสอบข้อมูลตามรายการดังต่อไปนี้

  1. ตรวจสอบ sshd_config file ใน OS ว่า port ตรงกันหรือไม่ ด้วย command
# vi /etc/ssh/sshd_config 
  1. ตรวจสอบ listening port ด้วย
# netstat -tulnp 
  1. ตรวจสอบ OS firewall (ยังปิดไว้อยู่)

  2. ตรวจสอบ 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 ด้วย

หากสนใจมาตรการรักษาความปลอดภัยอื่นๆ เราจะเล่าให้ฟังในบทความต่อ ๆ ไป

AUTHOR
Author
Threepob Chunhasun
NIPA Support Team

I am Gundam!!!