7 วิธีในการปกป้อง Asterisk จาก Hacker (Asterisk Security)

Asterisk Opensource IP Pbx

7 วิธีในการปกป้อง Asterisk จาก Hacker (Asterisk Security)

โพสต์โดย voip4share » 22 มี.ค. 2010 00:20

ดาวน์โหลดบทความ How to Secure Asterisk นี้ในรูปแบบไฟล์ pdf

สวัสดีครับ ผมได้บทความการป้องกัน Asterisk (จากพวกมือบอน) จากเว็บนี้ http://blogs.digium.com/2009/03/28/sip-security/ เลยเอามาฝากครับ บทความนี้พูดถึง 7 วิธีในการป้องกัน Asterisk ให้แคล้วคลาดจากพวกชอบสุ่มเดา Username/Password ใน Asterisk ของเรา

ขั้นตอนปกติที่พวกมือบอนใช้
1. แสกน host หา SIP Server -> Asterisk
โดยการส่ง SIP Message เช่น Register, Invite แบบสุ่มๆมาที่ IP Address เป้าหมาย เปลี่ยน IP เปลี่ยน Port ไปเรื่อยๆ ถ้ามี Response ก็แสดงว่า IP นี้เป็น SIP Server
2. แสกนหาเบอร์ Extension
โดยการใช้โปรแกรมหรือ Script ส่ง SIP Register หรือ INVITE หรืออื่นๆ ส่งไปที่ IP SIP Server เป้าหมาย เพื่อหาว่าใน Server มี Extension เบอร์อะไรบ้าง
3. แสกนหา Password
โดยยการใช้โปรแกรมหรือ Script ส่ง SIP Register ไปยัง SIP Server โดยระบุเบอร์ Extension ที่แสกนมาได้ แล้วเปลี่ยนพาสเวอร์ดไปเรื่อยๆจนกว่าจะเจอ

ถ้าเขาเข้ามาได้ก็อาจจะใช้ระบบของเราโทรไปที่นู่นที่นี่ได้ ฟรี (ขึ้นอยู่กับว่า SIP Server โทรไปที่ไหนได้บ้าง และโทรยังไง) ค่าใช้จ่ายก็จะตกอยู่กับเรา หรือลูกค้าที่โดน Hack

การที่ SIP Server ของเราโดนแบบนี้ แม้ว่าเขาจะเดา Username/Password ไม่ได้ก็ตาม แต่โปรแกรมหรือ Script เหล่านั้นจะส่ง SIP Message ปริมาณมหาศาลและเร็วมากมาที่ SIP Server ผลก็คือ SIP Server อาจจะให้บริการลูกค้าไม่ได้หรือไม่ก็แฮ้งค์ไปเลยเพราะถูกกิน CPU/RAM ไปหมด

อย่างไรก็ตาม ถ้า SIP Server ไม่ได้ต่อกับ Internet หรือโทรได้แต่เบอร์ Extension ด้วยกัน ก็ไม่น่าเป็นห่วงเท่าไหร่ แต่ก็ควรจะป้องกันไว้ดีกว่าครับ

7 วิธีในการทำ SIP Security ให้แก่ Asterisk

1. ให้ยอมรับ SIP Authentication Request จาก IP Address ที่กำหนดไว้เท่านั้น
วิธีนี้จะง่ายถ้าเบอร์ Extension ทุกเบอร์อยู่ใน LAN หรือ Internet แบบ Fixed IP ไม่มีเบอร์ไหนที่ใช้งานมาจาก Internet แบบ Dynamic IP เลย
ในไฟล์ sip.conf ให้เพิ่มบรรทัด

deny = 0.0.0.0/0.0.0.0
permit= 192.168.0.0/255.255.255.0

ใส่เป็น Subnet หรือ IP address ของโฮสต์ที่จะรีจิสเตอร์ด้วย Extension ดังกล่าว ใช้ DNS หรือ FQDN ไม่ได้นะครับต้องเป็น IP Address เท่านั้น ซึ่ง Asterisk จะยอมรับ SIP Authentication Request มาจาก IP ที่ขึ้นต้นด้วย 192.168.0 เท่านั้น

หรือเราจะเอาไปใส่ไว้ในเบอร์ SIP Extension แต่ละเบอร์ก็ได้นะครับ เช่น

[100]
deny=0.0.0.0/0.0.0.0
permit=192.168.0.0/255.255.255.0

[101]
deny=0.0.0.0/0.0.0.0
permit=192.168.0.5/255.255.255.0

2. เซ็ต alwaysauthreject=yes ในไฟล์ sip.conf
ดีฟอลท์คือ no ซึ่งจะทำให้เมื่อพวกมือบอนสุ่ม Resigter/Invite เข้ามาแล้วโดนระบบเรา Reject นั้นเป็นเพราะว่าไม่มี Username หรือว่ามี Username แต่ Password ผิด แต่ถ้าเราเซ็ตเป็น yes จะทำให้พวกเขาแยกไม่ออกว่า SIP Response ที่ได้รับนั้นเป็นเพราะ Username ถูกต้องหรือไม่ถูกต้องกันแน่ เพราะ Response ที่ส่งออกไปนั้นจะเหมือนกับ Username ถูกแต่ Password ผิด ทำให้ Hacker ไม่รู้ว่าตัวเองรู้อะไรอยู่ เขาจะนึกว่าเขารู้ Username แล้ว (แต่จริงๆยังไม่รู้ :D )ลองดูตัวอย่างกันครับ

ถ้าไม่เซ็ตหรือเซ็ต alwaysauthreject=no (ค่าดีฟอลท์) แล้ว Register หรือ Invite ด้วย Username ที่ไม่มีอยู่จริง Asterisk จะส่ง "404 Not Found" กลับมา แบบนี้ครับ

192.168.0.1 -> 192.168.0.2 SIP Request: REGISTER sip:58.97.35.22
192.168.0.2 -> 192.168.0.1 SIP Status: 404 Not found
เขาก็จะรู้ว่า Username ผิดแน่นอน ก็จะลอง Username ใหม่อีกจนกว่าจะได้ "403 Forbidden" กลับมา ซึ่งบอกว่า Username ถูกแต่ Password ผิด

และถ้า Register ด้วย Username ที่มีอยู่จริง แต่ Password ผิด Asterisk จะส่ง "403 Forbidden" กลับมา แบบนี้ครับ
192.168.0.1 -> 192.168.0.2 SIP Request: REGISTER sip:58.97.35.22
192.168.0.2 -> 192.168.0.1 SIP Status: 403 Forbidden (Bad auth)
เขาก็จะรู้ว่า Password ผิด ก็จะลองเปลี่ยน Password ไปเรื่อยๆ

ถ้าเซ็ต alwaysauthreject=yes ไม่ว่า Username จะมีหรือไม่มีอยู่จริง ก็จะให้ผลเหมือนกันครับ คือ "403 Forbidden" เขาก็จะนึกว่า Password ผิด แต่จริงๆ Username อาจจะผิดด้วยก็ได้

3. ตั้ง Password ให้เดายากๆ
เซ็ตบรรทัด secret= ของแต่ละ SIP Extension ให้เดายากๆครับ อาจใช้โปรแกรมประเภทสร้าง Password มาช่วยตั้งก็ได้ ตั้งให้แข็งแรงที่สุดครับ

4. ยอมรับ AMI (Asterisk Manager Interface) Request เฉพาะจาก Host ที่เชื่อถือได้เท่านั้น
โดยใส่บรรทัด deny และ permit ในแต่ละ Username/Password เช่น

[user]
secret=password
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0

ซึ่ง Asterisk จะยอมรับ AMI Request ด้วย Username=user จาก Local Host เท่านั้น และตั้ง Secret ให้เดายากๆด้วยนะครับ

5. แต่ละ Sip Account ให้โทรได้พร้อมกัน 1 หรือ 2 คอล
ถ้าไม่จำเป็นก็ไม่ควรปล่อยให้แต่ละ SIP Account มีสิทธิ์โทรพร้อมๆกันได้มากกว่า 1 หรือ 2 สาย โดยใส่บรรทัด call-limit=1 หรือ call-limit=2 ทั้งนี้เพื่อป้องกันในกรณีที่ Hacker รู้ Username/Password และ Register เข้าระบบของเราได้แล้ว ยังไงซะเขาก็จะโทรได้แค่ 1 หรือ 2 คอลพร้อมๆกัน แต่ถ้าจำเป็นต้องเปิดให้โทรพร้อมกันหลายๆคอล ก็ต้องใช้ Security ในข้ออื่นๆร่วมด้วยครับ

6. ตั้ง Username ให้ต่างจากเบอร์ Extension
ปกติเวลาเราสร้าง SIP Extension เช่นเบอร์ 100 เรามักจะแม๊บกับ SIP Enty 100 และแม๊บกับกับ SIP User 100 ด้วย (ผมเองก็มักทำแบบนี้ แต่ต่อไปจะไม่แล้วครับ :D ) ซึ่งเมื่อ Hacker รู้ว่าในระบบเรามี Extension อะไรบ้าง ก็จะช่วยให้เขาเดา SIP Username ได้ง่าย ลองตั้ง SIP Username ให้ต่างจาก SIP Extension ดูครับ แบบนี้
แบบเดิม

[100]
secret=kikka

แบบใหม่

[kikka]
secret=kenji

แบบนี้รับรองว่า Hacker ต้องงงแน่ครับเพราะไม่คิดว่าเราจะใช้ชื่อเป็น Extension ตอนนี้ Asterisk จะรู้จัก Extension นี้ในนามของ Extension Name ครับ ไม่ใช่ Extension Number เหมือนเมื่อก่อน ซึ่งถ้าเราจะ Register ก็ต้องใช้ Username=kikka และ Password=kenji ด้วยนะครับ และนอกจากนั้นเราต้องเขียน Dialplan เพิ่มด้วย แบบนี้ครับ

เดิม
exten => 100,1,Dial(SIP/100,30,tT)
ใหม่
exten => 100,1,Dial(SIP/kikka,30,tT)
และ/หรือ
exten => kikka,1,Dial(SIP/kikka,30,tT)

โทรได้ทั้ง Name และ Number ครับ

ดูเหมือนว่าแบบนี้มันจะเป็นการเพิ่มงานให้เราเล็กน้อยครับ เลือกเอาตามสะดวกครับ :D

7. แน่ใจว่า Context ชื่อ [default] มันปลอดภัย
ที่ไฟล์ sip.conf มีบรรทัด context=default ซึ่งมีไว้สำหรับรองรับ Call ประเภท Unauthorized Call หมายถึงโทรเข้ามาในระบบของเราได้ได้โดยไม่ต้อง Register แต่ถ้ามีความจำเป็นต้องยอมรับ Unauthorized Calls เช่นเราอาจสร้าง IVR ให้บริการข้อมูลอะไรสักอย่างหนึ่ง แล้วเปิดให้โทรเข้ามาได้จาก IP ไหนก็ได้ในโลกนี้ เข้ามาฟังข้อมูลดังกล่าว เราก็ต้องป้องกันไม่ให้ Call เหล่านั้นเข้ามาใน Context ที่สามารถโทรออกไปภายนอกได้ ไม่เช่นนั้น ค่าใช้จ่ายทั้งหมดจะตกเป็นภาระของเรา

ไฟล์ sip.conf
[general]
context=default
allowguest=yes

ไฟล์ extensions.conf
[default]
exten => 1000,1,Answer()
exten => 1000,n,Playback(welcome-to-our-company)
...

ห้ามใส่บรรทัด include ที่สามารถโทรออกไปภายนอกได้โดยเด็ดขาด
หรือถ้าไม่หวังว่าจะรับ Unauthorized Call ใส่บรรทัด allowguest=no เลยก็ได้ครับ

ทั้งหมด 7 ขั้นตอนที่ผมแนะนำมานี้นะครับ ถึงแม้ว่าจะป้องกันไม่ได้ 100% ก็ตาม ผมเชื่อว่าอย่างน้อยก็จะช่วยให้เราปกป้องระบบ VoIP ของเราจากการถูกบุกรุกจากผู้ไม่หวังดีได้ไม่มากก็น้อย แต่อย่างไรก็ตามการเดา Username/Password ยังคงเกิดอยู่เรื่อยๆแม้ว่าเราจะทำตาม 7 ขั้นตอนนี้แล้วก็ตาม ผมมีวิธีที่จะจับตายพวกนี้มาแนะนำครับ

บทความที่เกี่ยวข้อง
ใช้ Fail2Ban จับตายพวกที่ชอบโจมตี Asterisk
เทคนิคการทำ Security ให้ Asterisk ด้วยการตรวจสอบ IP Address (IP ACL)
voip4share
Administrator
 
โพสต์: 656
ลงทะเบียนเมื่อ: 18 พ.ย. 2009 11:26
ที่อยู่: รามคำแหง กรุงเทพฯ

ย้อนกลับไปยัง Asterisk SIP Server

ผู้ใช้งานขณะนี้

กำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และ บุคคลทั่วไป 4 ท่าน