ข้ามไปยังเนื้อหา
กลับไปหน้าบทความ
ความปลอดภัยเครือข่าย

802.1X และ NAC คืออะไร เสียบสาย LAN แล้วเกิดอะไรขึ้นบ้าง

802.1X ให้ switch ปิด port จนกว่า RADIUS server จะยืนยันตัวตนเครื่องได้ ไล่ EAPOL และ RADIUS ทีละ packet เทียบ EAP-TLS กับ PEAP พร้อม MAB และ posture

ปานกลาง11 นาทีในการอ่าน

ในบทความนี้

ตอบสั้น ๆ ก่อนครับ 802.1X คือมาตรฐานของ IEEE ที่ทำให้ switch หรือ access point ไม่ส่ง traffic ปกติของเครื่องที่เพิ่งต่อเข้ามา จนกว่าเครื่องนั้นจะยืนยันตัวตนกับ authentication server (ส่วนใหญ่คือ RADIUS server) ได้ ส่วน NAC (Network Access Control) คือระบบที่ใช้ผลการยืนยันตัวตนนั้น ร่วมกับข้อมูลอื่นของเครื่อง เช่น สถานะ patch หรือ antivirus มาตัดสินว่าเครื่องควรได้สิทธิ์แค่ไหน

802.1X จึงเป็นกลไกที่ port ใช้เปิดหรือปิด ส่วน NAC เป็นนโยบายที่บอกว่าเปิดให้ใคร เปิดแค่ไหน และเมื่อไรควรเปลี่ยนสิทธิ์ บทความนี้จะไล่ทีละ packet ตั้งแต่เสียบสาย LAN จนถึงตอนที่ port เปิดครับ

เครื่องลูกข่ายกับ switch คุยกันด้วย EAPOL ส่วน switch ส่ง EAP ชุดเดียวกันต่อให้ RADIUS server ใน Access-Request และ port เปิดหลังได้ Access-Accept เท่านั้น

802.1X คืออะไร

802.1X คือมาตรฐาน IEEE ชื่อเต็ม Port-Based Network Access Control ฉบับที่ใช้อยู่คือ IEEE 802.1X-2020 ซึ่งอนุมัติเมื่อ 30 มกราคม 2563 และเผยแพร่ 28 กุมภาพันธ์ 2563 IEEE สรุปขอบเขตไว้ว่าเป็นการให้ผู้ดูแลเครือข่ายจำกัดการใช้ port ของ LAN ให้เฉพาะอุปกรณ์ที่ผ่านการยืนยันตัวตนและได้รับอนุญาตแล้ว

ตัว 802.1X ไม่ได้กำหนดวิธีพิสูจน์ตัวตนเอง มันใช้ EAP (Extensible Authentication Protocol) ตาม RFC 3748 ซึ่งเป็น framework ที่รองรับวิธียืนยันตัวตนได้หลายแบบ และวิ่งบน data link layer ได้โดยไม่ต้องมี IP ข้อนี้สำคัญ เพราะตอนที่เครื่องเพิ่งเสียบสาย มันยังไม่มี IP address เลย EAP ที่ห่อมาใน Ethernet frame ระหว่างเครื่องกับ switch เรียกว่า EAPOL (EAP over LAN)

802.1X มีอุปกรณ์กี่ฝ่าย และแต่ละฝ่ายทำอะไร

มีสามฝ่ายครับ RFC 3748 นิยามไว้ดังนี้ (หัวข้อ 1.2)

ฝ่าย ใน 802.1X เรียกว่า ตัวอย่าง หน้าที่
Peer Supplicant laptop, IP phone ตอบคำขอ EAP และพิสูจน์ตัวตน
Authenticator Authenticator access switch, wireless AP เริ่มขอให้ยืนยันตัวตน ส่ง EAP ต่อ และเปิดหรือปิด port
Backend authentication server Authentication server RADIUS server หรือ NAC server ที่พูด RADIUS ตรวจ credential และตอบว่าให้เข้าหรือไม่

จุดที่ควรเข้าใจคือ switch ส่วนใหญ่ทำงานแบบ pass-through คือไม่ได้ตรวจ credential เอง แค่ส่ง EAP ไปมาระหว่างเครื่องกับ server RFC 3748 เขียนว่าข้อดีของแบบนี้คือ switch หรือ access point ไม่ต้องเข้าใจ authentication method ทุกแบบ และเมื่อทำงานแบบ pass-through แล้ว authenticator ต้องตัดสินผลจาก Accept/Reject ที่ server ส่งมาเท่านั้น (หัวข้อ 2.3) อยากเปลี่ยนจาก PEAP เป็น EAP-TLS ก็เปลี่ยนที่ server กับเครื่องลูกข่าย ไม่ต้องแตะ switch

เสียบสาย LAN แล้วเกิดอะไรขึ้นบ้าง

สรุปคือ port เริ่มที่สถานะ unauthorized แลก EAP กันหลายรอบผ่าน switch ไปถึง RADIUS server แล้ว port จะเปิดเมื่อ server ตอบ Access-Accept ลองไล่ทีละขั้นบน access switch ที่เปิด 802.1X ไว้ครับ (ตัวอย่างใช้คำสั่งและพฤติกรรมของ Cisco Catalyst ตาม คู่มือ IOS XE 17.9 ยี่ห้ออื่นใช้ชื่อคำสั่งต่างกันแต่ลำดับ protocol เหมือนกัน)

ขั้นที่ 1: link up และ port ยังไม่เปิด

เมื่อตั้ง port เป็น authentication port-control auto port จะเริ่มที่สถานะ unauthorized และให้ผ่านได้แค่ EAPOL frame DHCP, ARP และ traffic อื่นของเครื่องจะถูกทิ้ง ค่าเริ่มต้นของ port บน Catalyst คือ force-authorized ซึ่งแปลว่าไม่ยืนยันตัวตนเลย ถ้าลืมตั้ง port ไหน port นั้นก็เปิดตามปกติ

ขั้นที่ 2: switch ถามว่าเป็นใคร

เมื่อ link ขึ้น switch ส่ง EAP-Request/Identity ไปที่เครื่อง เครื่องตอบด้วย EAP-Response/Identity ถ้าเครื่องบูตเสร็จแล้วยังไม่ได้รับคำถามนี้ เครื่องจะส่ง EAPOL-Start เพื่อให้ switch เริ่มถามตัวตน

EAP packet มี Code สี่ค่า คือ 1 Request, 2 Response, 3 Success และ 4 Failure (RFC 3748 หัวข้อ 2.2) และ EAP เป็น protocol แบบ lock-step ที่มี packet ค้างอยู่ได้ทีละหนึ่งตัว authenticator จะส่ง Request ถัดไปไม่ได้จนกว่าจะได้ Response ที่ถูกต้อง

ขั้นที่ 3: switch ห่อ EAP ใส่ RADIUS

switch นำ EAP-Response ที่ได้ไปใส่ใน attribute ชื่อ EAP-Message แล้วส่งให้ RADIUS server ใน Access-Request (RFC 3579) EAP-Message คือ attribute หมายเลข 79 และทุก RADIUS packet ที่มี EAP-Message ต้องมี Message-Authenticator (หมายเลข 80) ด้วย เพื่อป้องกันการปลอม packet RADIUS ใช้ UDP port 1812 และ switch กับ server ยืนยันกันด้วย shared secret ที่ไม่ถูกส่งข้ามเครือข่าย

RFC 3580 กำหนดเพิ่มว่าใน 802.1X ให้ใส่ MAC address ของเครื่องไว้ใน Calling-Station-Id เป็นตัวพิมพ์ใหญ่คั่นด้วยขีด เช่น 00-10-A4-23-19-C0 ใน log ของ RADIUS server ค่านี้คือสิ่งที่ใช้ค้นว่าเครื่องไหนต่อเข้ามาที่ port ไหน

ขั้นที่ 4: server ถามกลับ และแลกกันหลายรอบ

ถ้า server จะยืนยันตัวตนด้วย EAP มันต้องตอบด้วย Access-Challenge ที่มี EAP-Message switch แกะ EAP ข้างในออกมาส่งเป็น EAPOL ให้เครื่อง เครื่องตอบ switch ห่อกลับเป็น Access-Request แบบนี้ไปเรื่อย ๆ method ที่ส่ง certificate ต้องแตก packet เป็นหลายชิ้น RFC 3748 ยกตัวอย่างว่า certificate chain ขนาด 14,960 octet ต้องใช้สิบรอบเมื่อ EAP MTU คือ 1,496 octet

ขั้นที่ 5: Access-Accept และ port เปิด

เมื่อ server ตอบ Access-Accept switch ส่ง EAP-Success ให้เครื่อง และ port เปลี่ยนเป็น authorized ให้ traffic ของเครื่องนั้นผ่านได้ตามปกติ ถ้าได้ Access-Reject switch ต้องไม่ให้เครื่องเข้าเครือข่าย

Access-Accept ไม่ได้บอกแค่ว่าผ่าน มันส่งสิทธิ์มาด้วย ตัวอย่างที่ใช้บ่อยคือกำหนด VLAN ด้วย attribute สามตัวตาม RFC 3580

Tunnel-Type             = VLAN (13)
Tunnel-Medium-Type      = 802
Tunnel-Private-Group-ID = "20"

VLAN ID เป็นค่า 1 ถึง 4094 แต่ส่งเป็น string ใน Tunnel-Private-Group-ID

ขั้นที่ 6: ยืนยันตัวตนซ้ำ หรือปิด session

port กลับเป็น unauthorized เมื่อ link down หรือได้รับ EAPOL-Logoff และถ้าเปิด reauthentication ไว้ server กำหนดรอบได้ด้วย Session-Timeout (attribute 27) กับ Termination-Action (attribute 29) ถ้า Termination-Action เป็น RADIUS-Request session จะไม่หลุดระหว่างยืนยันซ้ำ

EAP-TLS กับ PEAP ต่างกันอย่างไร

ต่างกันที่ฝั่งเครื่องลูกข่ายพิสูจน์ตัวตนด้วยอะไรครับ EAP-TLS ใช้ certificate ทั้งสองฝั่ง ส่วน PEAP ใช้ certificate แค่ฝั่ง server เพื่อสร้าง TLS tunnel แล้วให้เครื่องลูกข่ายยืนยันตัวตนด้วย password หรือ method อื่นข้างใน tunnel

EAP-TLS (RFC 5216 มีนาคม 2551) ใช้ TLS ทำ mutual authentication ด้วย certificate และสร้าง key ใน flow ของ RFC server ส่ง certificate ของตัวเองพร้อม certificate_request และเครื่องลูกข่ายตอบด้วย certificate ของตัวเองกับ certificate_verify EAP Type ของ EAP-TLS คือ 13 ต่อมา RFC 9190 (กุมภาพันธ์ 2565) กำหนดการใช้กับ TLS 1.3 ซึ่งมี forward secrecy เสมอ ไม่เปิดเผยตัวตนของเครื่องลูกข่าย และบังคับตรวจ revocation

PEAP (Type 25 หรือ 0x19) เป็น method ที่ Microsoft กำหนด spec ไว้ใน MS-PEAP มีสองช่วง ช่วงแรกยืนยันตัวตนของ PEAP server และสร้าง TLS session ช่วงที่สองเริ่ม EAP รอบใหม่ข้างใน TLS เพื่อยืนยันตัวตนเครื่องลูกข่าย inner method ที่ใช้บ่อยคือ EAP-MSCHAPv2 Microsoft เขียนเหตุผลไว้ตรง ๆ ว่า PEAP มีไว้สำหรับองค์กรที่ไม่อยากแบกต้นทุนของ PKI ฝั่ง client

EAP-TLS PEAP (inner EAP-MSCHAPv2)
เครื่องลูกข่ายพิสูจน์ตัวตนด้วย certificate + private key username + password ใน TLS tunnel
certificate ที่ต้องมี server และทุกเครื่องลูกข่าย server เท่านั้น
สิ่งที่ต้องดูแล ออก ต่ออายุ และ revoke certificate ของเครื่อง password policy และการตั้งค่า client ให้ตรวจ certificate ของ server

ความเห็นของผมคือ จุดที่ PEAP พลาดบ่อยไม่ได้อยู่ที่ protocol แต่อยู่ที่การตั้งค่าฝั่ง client ช่วงแรกของ PEAP มีไว้ยืนยันว่า server เป็นตัวจริง ถ้า supplicant ไม่ได้ตั้งให้ตรวจ certificate ของ server กับ CA ที่ถูกต้องและชื่อ server ที่คาดไว้ ช่วงแรกก็ไม่ได้ยืนยันอะไร และช่วงที่สองซึ่งใช้ credential ของผู้ใช้ก็จะไปคุยกับ server ตัวไหนก็ได้ที่ตอบกลับมา ถ้าเลือก PEAP ควรบังคับการตั้งค่านี้ผ่าน policy ของเครื่อง ไม่ปล่อยให้ผู้ใช้กดยอมรับ certificate เองครับ

อุปกรณ์ที่ไม่มี supplicant เช่นเครื่องพิมพ์ เข้าเครือข่ายได้อย่างไร

ใช้ MAB (MAC Authentication Bypass) ครับ คือให้ switch ใช้ MAC address ของเครื่องเป็นตัวตนแทน

ลำดับบน Catalyst คือ ถ้า 802.1X หมดเวลารอ EAPOL แล้วเปิด MAB ไว้ switch จะรอ Ethernet packet แรกจากเครื่อง เอา MAC address ใน packet นั้นเป็นตัวตน แล้วส่งใน Access-Request ไปที่ RADIUS server ถ้าระหว่างนั้นเห็น EAPOL switch จะหยุด MAB แล้วกลับไปทำ 802.1X

MAB Deployment Guide ของ Cisco ให้รายละเอียดที่ควรรู้สามเรื่อง

เพราะ MAB ปลอมได้ง่าย สิทธิ์ที่ให้กับเครื่องที่ผ่าน MAB ควรแคบที่สุด

NAC คืออะไร และต่างจาก 802.1X อย่างไร

NAC คือการตัดสินสิทธิ์เข้าเครือข่ายจากหลายข้อมูลรวมกัน ไม่ใช่แค่ตัวตน ส่วน 802.1X เป็นแค่ช่องทางหนึ่งที่ NAC ใช้รับข้อมูลตัวตนและสั่งเปิดหรือปิด port

ข้อมูลที่ NAC ใช้เพิ่มจากตัวตนเรียกว่า posture IETF อธิบายไว้ใน RFC 5209 (มิถุนายน 2551) ซึ่งเป็นเอกสารของงาน NEA (Network Endpoint Assessment) ว่าเป็นการประเมินสถานะของเครื่องตอนขอเข้าเครือข่ายหรือระหว่างที่ต่ออยู่ เพื่อหาเครื่องที่ขาดหรือใช้ระบบป้องกันที่ล้าสมัย เช่น antivirus และ host-based firewall หรือขาด security patch สำคัญ ตัวอย่าง posture attribute ที่ RFC ยกคือเวอร์ชันของ operating system ที่ติดตั้งอยู่

ลำดับที่ใช้กันทั่วไปคือ

  1. เครื่องผ่าน 802.1X และได้สิทธิ์แบบจำกัดก่อน เช่น ไปได้แค่ server ที่ใช้ตรวจ posture และ server ที่ใช้แก้ไข
  2. agent บนเครื่องรายงาน posture ให้ NAC server
  3. NAC server ตัดสินว่าเครื่องผ่านเงื่อนไขหรือไม่
  4. NAC server สั่ง switch ให้เปลี่ยนสิทธิ์ของ session ที่มีอยู่ด้วย RADIUS CoA (Change of Authorization)

CoA กำหนดไว้ใน RFC 5176 ซึ่งเปลี่ยนทิศทางปกติของ RADIUS คือให้ server เป็นฝ่ายส่ง request ไปที่ switch ผ่าน UDP port 3799 CoA-Request ใช้เปลี่ยนสิทธิ์ของ session เช่น ส่ง Filter-ID ใหม่ ส่วน Disconnect-Request ใช้ตัด session สำหรับ Catalyst นั้น CoA สั่งได้สี่แบบ คือ reauthenticate, terminate, port shutdown และ port bounce

posture มีข้อจำกัดที่ควรรู้สองข้อ ข้อแรก RFC 5209 บอกเองว่าเครื่องที่ถูกมองว่าผ่านเงื่อนไขก็ยังอาจมีช่องโหว่ต่อภัยในเครือข่ายได้ ข้อสอง ระบบต้องเชื่อว่าเครื่องรายงานตามจริง RFC เดียวกันระบุว่า NEA ไม่ได้กำหนดวิธีตรวจจับเครื่องที่โกหกเรื่อง posture ของตัวเอง และอุปกรณ์บางชนิด เช่น เครื่องพิมพ์ อาจรัน NEA client ไม่ได้เลย

ถ้า RADIUS server ล่ม เครื่องจะเข้าเครือข่ายได้หรือไม่

ขึ้นกับการตั้งค่าครับ ถ้าไม่ได้ตั้งอะไรไว้ เครื่องที่ต้องยืนยันตัวตนใหม่จะเข้าไม่ได้ เพราะ port อยู่ที่ unauthorized

Catalyst มีตัวเลือกที่ชื่อ inaccessible authentication bypass (หรือ critical authentication) ถ้า RADIUS server ติดต่อไม่ได้ switch จะให้เครื่องเข้าเครือข่ายโดยใส่ port ไว้ในสถานะ critical-authentication ใน VLAN ที่กำหนดไว้ คู่มือเดียวกันยังแยกอีกสองกรณีที่มักตั้งคู่กัน คือ guest VLAN สำหรับเครื่องที่ไม่ตอบ 802.1X และ restricted VLAN สำหรับเครื่องที่ตอบแต่ยืนยันตัวตนไม่ผ่าน

ข้อนี้เป็นการเลือกระหว่างให้ใช้งานต่อได้กับความเข้มงวด ไม่มีคำตอบเดียว ที่ควรทำคือเลือกให้ชัดก่อนเปิดใช้จริง และมี RADIUS server มากกว่าหนึ่งตัวครับ

เริ่มเปิด 802.1X ควรเช็กอะไรบ้าง

รายการนี้เป็นสิ่งที่ผมจะเช็กก่อนเปิด 802.1X บน access switch โดยอิงจากพฤติกรรมที่อธิบายไว้ข้างบน

  • รู้ว่าทุก port เป็น force-authorized อยู่ก่อน และ port ไหนบ้างที่จะเปลี่ยนเป็น auto
  • มีรายการอุปกรณ์ที่ไม่มี supplicant (เครื่องพิมพ์ กล้อง เครื่องสแกน) และแผนว่าจะใช้ MAB กับอะไร
  • RADIUS server แยก MAB ออกจาก login ปกติด้วย Service-Type และให้สิทธิ์ MAB แคบ
  • เลือก EAP method แล้ว ถ้าเป็น PEAP มี policy บังคับให้ client ตรวจ certificate ของ server
  • ตั้ง timer (tx-period, max-reauth-req) ให้เหมาะกับอุปกรณ์ที่บูตเร็ว
  • ตัดสินใจเรื่อง guest VLAN, restricted VLAN และ critical authentication ไว้ล่วงหน้า
  • มี RADIUS server สำรอง และ shared secret ที่ไม่ซ้ำกันระหว่างอุปกรณ์
  • ค้น log ด้วย Calling-Station-Id ได้ เวลาผู้ใช้แจ้งว่าเข้าเครือข่ายไม่ได้

แหล่งอ้างอิง

อ่านต่อ