อีบีพีเอฟ
| อีบีพีเอฟ | |
|---|---|
| ผู้เขียนต้นฉบับ | อเล็กซี่ สตาโรโวอิตอฟ, แดเนียล บอร์กมันน์[ 1 ] [ 2 ] |
| นักพัฒนา | ชุมชนโอเพนซอร์ส Meta Google Isovalent Microsoft Netflix [ 1 ] |
| ปล่อย | 2014 [ 3 ] |
| เขียนเป็น | ซี |
| ระบบปฏิบัติการ | ลินุกซ์ , วินโดวส์[ 4 ] |
| พิมพ์ | ระบบรันไทม์ |
| ใบอนุญาต | ลินุกซ์: ใบอนุญาต GPLไวโอเล็ต: ใบอนุญาต MIT |
| เว็บไซต์ | ebpf.io |
| ที่เก็บข้อมูล | ลินุกซ์ : git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/ วินโดวส์: github.com/Microsoft/ebpf-for-windows/ |
eBPF เป็นเทคโนโลยีที่สามารถเรียกใช้โปรแกรมในบริบทที่มีสิทธิ์พิเศษเช่นเคอร์เนล ของ ระบบปฏิบัติการ[ 5 ]เป็นเทคโนโลยีที่พัฒนาต่อจากBerkeley Packet Filter (BPF โดยที่ "e" เดิมหมายถึง "ขยาย") ซึ่งเป็นกลไกการกรองใน Linux และยังใช้ในส่วนที่ไม่เกี่ยวข้องกับเครือข่ายของเคอร์เนล Linux ด้วย
ใช้เพื่อขยายขีดความสามารถของเคอร์เนลได้อย่างปลอดภัยและมีประสิทธิภาพในระหว่างการทำงาน โดย ไม่จำเป็นต้องเปลี่ยนแปลงซอร์สโค้ดของเคอร์เนลหรือโหลดโมดูลของเคอร์เนล[ 6 ]ความปลอดภัยมีให้ผ่านตัวตรวจสอบภายในเคอร์เนลซึ่งทำการวิเคราะห์โค้ดแบบคงที่และปฏิเสธโปรแกรมที่ขัดข้อง ค้าง หรือรบกวนเคอร์เนลในทางลบ[ 7 ] [ 8 ]
รูปแบบการตรวจสอบความถูกต้องนี้แตกต่างจาก สภาพแวดล้อม แซนด์บ็อกซ์ซึ่งสภาพแวดล้อมการดำเนินการถูกจำกัด และรันไทม์ไม่มีข้อมูลเชิงลึกเกี่ยวกับโปรแกรม[ 9 ]ตัวอย่างของโปรแกรมที่ถูกปฏิเสธโดยอัตโนมัติ ได้แก่ โปรแกรมที่ไม่มีการรับประกันการออกจากโปรแกรมที่แข็งแกร่ง (เช่น ลูป for/while ที่ไม่มีเงื่อนไขการออกจากโปรแกรม) และโปรแกรมที่อ้างอิงตัวชี้โดยไม่มีการตรวจสอบความปลอดภัย[ 10 ]
ออกแบบ
โปรแกรมที่โหลดซึ่งผ่านการตรวจสอบจะถูกตีความหรือคอมไพล์แบบทันทีในเคอร์เนล (JIT compiled) เพื่อประสิทธิภาพการทำงานแบบเนทีฟรูปแบบการทำงานเป็นแบบขับเคลื่อนด้วยเหตุการณ์และทำงานจนเสร็จสมบูรณ์โดย มีข้อยกเว้นเพียงเล็กน้อย [ 2 ]หมายความว่า โปรแกรมสามารถแนบกับ จุด เชื่อมต่อ ต่างๆ ใน เคอร์เนล ของระบบปฏิบัติการและจะทำงานเมื่อมีการเรียกใช้เหตุการณ์ กรณีการใช้งาน eBPF รวมถึง (แต่ไม่จำกัดเพียง) เครือข่ายเช่นXDPการติดตามและระบบย่อยด้านความปลอดภัย[ 5 ]ด้วยประสิทธิภาพและความยืดหยุ่นของ eBPF ที่เปิดโอกาสใหม่ๆ ในการแก้ปัญหาการผลิตBrendan Greggจึงขนานนาม eBPF ว่า "พลังวิเศษสำหรับ Linux" [ 11 ] Linus Torvaldsกล่าวว่า "BPF มีประโยชน์จริงๆ และพลังที่แท้จริงของมันคือวิธีที่มันอนุญาตให้ผู้คนเขียนโค้ดเฉพาะทางซึ่งจะไม่เปิดใช้งานจนกว่าจะมีการร้องขอ" [ 12 ] เนื่องจากความสำเร็จใน Linux รันไทม์ eBPF จึงถูกพอร์ตไปยังระบบปฏิบัติการอื่นๆ เช่นWindows [ 4 ]
ประวัติศาสตร์
eBPF พัฒนามาจาก Berkeley Packet Filter แบบคลาสสิก (cBPF ซึ่งเป็นชื่อที่ใช้ในภายหลัง) ในระดับพื้นฐานที่สุด eBPF ได้นำการใช้รีจิสเตอร์ 64 บิตจำนวน 10 ตัวมาใช้ (แทนที่จะเป็นรีจิสเตอร์ 32 บิต 2 ตัวสำหรับ cBPF) ความหมายของการกระโดดที่แตกต่างกัน คำสั่งเรียกและข้อกำหนดการส่งผ่านรีจิสเตอร์ที่สอดคล้องกัน คำสั่งใหม่ และการเข้ารหัสที่แตกต่างกันสำหรับคำสั่งเหล่านี้[ 13 ]
| วันที่ | เหตุการณ์ |
|---|---|
| เมษายน 2554 | คอมไพเลอร์แบบ just-in-time (JIT compiler) ตัวแรกในเคอร์เนล Linux สำหรับ Berkeley Packet Filter แบบคลาสสิกได้รับการรวมเข้าด้วยกันแล้ว[ 14 ] |
| มกราคม 2555 | กรณีการใช้ งานที่ไม่ใช่เครือข่ายครั้งแรกของ Berkeley Packet Filter แบบคลาสสิกseccomp-bpf [ 15 ]ปรากฏขึ้น ซึ่งอนุญาตให้กรองการเรียกใช้ระบบโดยใช้นโยบายที่กำหนดค่าได้ซึ่งดำเนินการผ่านคำสั่ง BPF |
| มีนาคม 2557 | David S. Miller ผู้ดูแลหลักของสแต็กเครือข่าย Linux ยอมรับการปรับปรุง ตัวแปล BPF ในเคอร์เนลแบบเก่าโดยถูกแทนที่ด้วยตัวแปล eBPF และเคอร์เนล Linux จะแปล BPF แบบคลาสสิก (cBPF) เป็นคำสั่ง eBPF ภายใน[ 16 ]มีการเผยแพร่ในเวอร์ชัน 3.18 ของเคอร์เนล Linux [ 17 ] |
| มีนาคม 2558 | ความสามารถในการแนบ eBPF เข้ากับkprobesเป็น กรณีการใช้งาน การติดตาม ครั้งแรก ได้รับการผสานรวม[ 19 ] ในเดือนเดียวกันนั้น งานโครงสร้างพื้นฐานเบื้องต้นได้รับการยอมรับให้แนบ eBPF เข้ากับเลเยอร์ควบคุมการจราจรเครือข่าย (tc) ซึ่งอนุญาตให้แนบ eBPF เข้ากับเส้นทางขาเข้าหลักและต่อมาเส้นทางขาออกของสแต็กเครือข่าย ซึ่งต่อมาถูกนำไปใช้อย่างแพร่หลายโดยโครงการ ต่างๆเช่นCilium [ 20 ] [ 21 ] [ 22 ] |
| สิงหาคม 2558 | แบ็กเอนด์ คอมไพเลอร์ eBPF ได้รับการรวมเข้ากับLLVMเวอร์ชัน 3.7.0 [ 23 ] |
| กันยายน 2558 | Brendan Greggประกาศชุดเครื่องมือติดตามใหม่ที่ใช้ eBPF เป็นพื้นฐานในชื่อโครงการ bcc โดยจัดเตรียมส่วนหน้าสำหรับ eBPF เพื่อให้การเขียนโปรแกรมง่ายขึ้น[ 24 ] |
| กรกฎาคม 2559 | eBPF ได้รับความสามารถในการแนบเข้ากับเส้นทางรับหลักของไดรเวอร์เครือข่าย เลเยอร์นี้เป็นที่รู้จักในปัจจุบันในชื่อeXpress DataPath (XDP) และถูกเพิ่มเข้ามาเพื่อตอบสนองต่อDPDKเพื่อสร้างเส้นทางข้อมูลที่รวดเร็วซึ่งทำงานร่วมกับเคอร์เนล Linux แทนที่จะข้ามไป[ 25 ] [ 26 ] [ 27 ] |
| สิงหาคม 2559 | Ciliumได้รับการประกาศครั้งแรกในงานLinuxConในฐานะโครงการที่ให้ บริการเครือข่ายคอนเทนเนอร์ IPv6 ที่รวดเร็ว ด้วย eBPF และ XDP ปัจจุบัน Cilium ได้รับการนำไปใช้ ในบริการ Kubernetes ของผู้ให้บริการคลาวด์รายใหญ่ และเป็นหนึ่งใน CNI ที่ใช้กันอย่างแพร่หลายที่สุด[ 28 ] [ 22 ] [ 29 ] |
| พฤศจิกายน 2559 | Netronome เพิ่มการถ่ายโอนโปรแกรม eBPF สำหรับเลเยอร์ XDP และ tc BPF ไปยัง NIC ของพวกเขา[ 30 ] |
| พฤษภาคม 2560 | Katran ซึ่งเป็นโหลดบาลานเซอร์เลเยอร์ 4 ของMeta ได้เริ่มใช้งานแล้ว แพ็กเก็ตทุกแพ็กเก็ตที่ส่งไปยัง facebook.comตั้งแต่นั้นเป็นต้นมาได้รับการประมวลผลโดย eBPF และ XDP [ 31 ] |
| พฤศจิกายน 2560 | eBPF กลายเป็นระบบย่อยเคอร์เนลของตัวเองเพื่ออำนวยความสะดวกในการจัดการแพตช์เคอร์เนลที่เติบโตอย่างต่อเนื่อง คำขอพูลแรกโดยผู้ดูแล eBPF ได้รับการส่งแล้ว[ 32 ] |
| กันยายน 2560 | Bpftool ถูกเพิ่มเข้าไปในเคอร์เนล Linux เป็นยูทิลิตี้พื้นที่ผู้ใช้เพื่อตรวจสอบระบบย่อย eBPF [ 33 ] |
| มกราคม 2561 | มีการเผยแพร่ตระกูลซ็อกเก็ตใหม่ชื่อ AF_XDP ซึ่งช่วยให้สามารถประมวลผลแพ็กเก็ตที่มีประสิทธิภาพสูงด้วยความหมายแบบ zero-copy ที่เลเยอร์ XDP [ 34 ]ปัจจุบันDPDKมีการสนับสนุนไดรเวอร์โหมดโพล AF_XDP อย่างเป็นทางการ[ 35 ] |
| กุมภาพันธ์ 2561 | ต้นแบบ bpfilter ได้รับการเผยแพร่แล้ว ซึ่งอนุญาตให้แปลชุดย่อยของกฎ iptables เป็น eBPF ผ่านไดรเวอร์โหมดผู้ใช้ที่พัฒนาขึ้นใหม่ งานนี้ก่อให้เกิดข้อโต้แย้งเนื่องจากความพยายามในการพัฒนา nftables ที่กำลังดำเนินอยู่ และยังไม่ได้รวมเข้ากับ mainline [ 36 ] [ 37 ] |
| ตุลาคม 2561 | Brendan Greggได้ประกาศเครื่องมือ bpftrace ใหม่นี้ในชื่อDTrace 2.0 สำหรับ Linux [ 38 ] |
| พฤศจิกายน 2561 | การตรวจสอบภายใน eBPF ได้ถูกเพิ่มสำหรับkTLSเพื่อรองรับความสามารถในการบังคับใช้นโยบาย TLS ในเคอร์เนล[ 39 ] |
| พฤศจิกายน 2561 | BTF (BPF Type Format) ได้ถูกเพิ่มเข้าไปในเคอร์เนล Linux เป็นรูปแบบข้อมูลเมตาที่มีประสิทธิภาพ ซึ่งมีขนาดเล็กกว่าDWARF ประมาณ 100 เท่า [ 40 ] |
| ธันวาคม 2019 | หนังสือเล่มแรกเกี่ยวกับ BPF ที่มีความยาว 880 หน้า ซึ่งเขียนโดย Brendan Gregg ได้รับการเผยแพร่[ 41 ] |
| มีนาคม 2563 | Googleได้เพิ่มการสนับสนุน BPF LSM เข้าไปในเคอร์เนล Linux ทำให้สามารถตั้งโปรแกรมโมดูลความปลอดภัย Linux (LSM) ผ่าน eBPF ได้[ 42 ] |
| กันยายน 2020 | แบ็กเอนด์คอมไพเลอร์ eBPF สำหรับGNU Compiler Collection (GCC) ได้รับการผสานรวมแล้ว[ 43 ] |
| กรกฎาคม 2565 | ไมโครซอฟต์ได้ปล่อย eBPF สำหรับ Windows ซึ่งรันโค้ดในเคอร์เนล NT [ 4 ] |
| ตุลาคม 2567 | สถาปัตยกรรมชุดคำสั่ง (ISA) ของ eBPF ได้รับการ เผยแพร่ ใน RFC 9669 |
สถาปัตยกรรมและแนวคิด
แผนที่ eBPF
แผนที่ eBPF เป็นที่เก็บข้อมูลแบบคีย์/ค่า ที่มีประสิทธิภาพ ซึ่งอยู่ในพื้นที่เคอร์เนลและสามารถใช้เพื่อแบ่งปันข้อมูลระหว่างโปรแกรม eBPF หลายโปรแกรมหรือเพื่อสื่อสารระหว่างแอปพลิเคชันในพื้นที่ผู้ใช้และโค้ด eBPF ที่ทำงานในเคอร์เนล โปรแกรม eBPF สามารถใช้ประโยชน์จากแผนที่ eBPF เพื่อจัดเก็บและเรียกค้นข้อมูลในโครงสร้างข้อมูลที่หลากหลาย การใช้งานแผนที่นั้นมีให้โดยเคอร์เนลหลัก มีหลายประเภท[ 44 ]รวมถึงแผนที่แฮช อาร์เรย์ และบัฟเฟอร์วงแหวน
ในทางปฏิบัติ แผนที่ eBPF มักใช้สำหรับสถานการณ์ต่างๆ เช่น โปรแกรมพื้นที่ผู้ใช้เขียนข้อมูลการกำหนดค่าเพื่อให้โปรแกรม eBPF เรียกใช้ โปรแกรม eBPF จัดเก็บสถานะเพื่อเรียกใช้ในภายหลังโดยโปรแกรม eBPF อื่น (หรือการเรียกใช้โปรแกรมเดียวกันในอนาคต) หรือโปรแกรม eBPF เขียนผลลัพธ์หรือเมตริกลงในแผนที่เพื่อให้โปรแกรมพื้นที่ผู้ใช้เรียกใช้เพื่อแสดงผลลัพธ์[ 45 ]
เครื่องเสมือน eBPF
เครื่องเสมือน eBPF ทำงานภายในเคอร์เนลและรับโปรแกรมในรูปแบบ คำสั่ง ไบต์โค้ด eBPF ซึ่งจะถูกแปลงเป็นคำสั่งเครื่องดั้งเดิมที่ทำงานบน CPU การใช้งาน eBPF ในช่วงแรกๆ จะใช้การตีความไบต์โค้ด eBPF แต่ปัจจุบันได้เปลี่ยนมาใช้ กระบวนการ คอมไพล์แบบ Just-in-Time (JIT) แทนแล้ว เพื่อเหตุผลด้านประสิทธิภาพและความปลอดภัย[ 45 ]
เครื่องเสมือน eBPF ประกอบด้วยรีจิสเตอร์ 64 บิตจำนวน 11 ตัวพร้อมรีจิสเตอร์ย่อย 32 บิต ตัวนับโปรแกรมและพื้นที่สแต็ก BPF ขนาด 512 ไบต์ รีจิสเตอร์ อเนกประสงค์เหล่านี้ จะติดตามสถานะเมื่อโปรแกรม eBPF ถูกดำเนินการ[ 46 ]
เสียงร้องหาง
การเรียกแบบ Tail callสามารถเรียกและดำเนินการโปรแกรม eBPF อื่น และแทนที่บริบทการดำเนินการได้คล้ายกับวิธีการทำงานของระบบexecve() สำหรับกระบวนการปกติ โดยพื้นฐานแล้วสิ่งนี้อนุญาตให้โปรแกรม eBPF เรียกโปรแกรม eBPF อื่นได้ การเรียกแบบ Tail call ถูกนำไปใช้เป็นการกระโดดแบบยาว โดยใช้ เฟรมสแต็ก เดียวกัน การเรียกแบบ Tail call มีประโยชน์อย่างยิ่งใน eBPF ซึ่งสแต็กมีขนาดจำกัดเพียง 512 ไบต์ ในระหว่างรันไทม์ สามารถเพิ่มหรือแทนที่ฟังก์ชันการทำงานได้แบบอะตอมิก จึงเปลี่ยนแปลงพฤติกรรมการดำเนินการของโปรแกรม BPF [ 46 ]กรณีการใช้งานที่นิยมสำหรับการเรียกแบบ Tail call คือการกระจายความซับซ้อนของโปรแกรม eBPF ไปยังหลายโปรแกรม อีกกรณีการใช้งานหนึ่งคือการแทนที่หรือขยายตรรกะโดยการแทนที่เนื้อหาของอาร์เรย์โปรแกรมในขณะที่กำลังใช้งานอยู่ ตัวอย่างเช่น เพื่ออัปเดตเวอร์ชันโปรแกรมโดยไม่ต้องหยุดทำงานหรือเพื่อเปิด/ปิดใช้งานตรรกะ[ 47 ]
การโทร BPF ถึง BPF
โดยทั่วไปถือเป็นแนวปฏิบัติที่ดีในการพัฒนาซอฟต์แวร์ที่จะจัดกลุ่มโค้ดทั่วไปไว้ในฟังก์ชันโดยห่อหุ้มตรรกะเพื่อการนำกลับมาใช้ใหม่ ก่อนเคอร์เนล Linux 4.16 และ LLVM 6.0 โปรแกรม eBPF C ทั่วไปจะต้องสั่งให้คอมไพเลอร์ทำการอินไลน์ฟังก์ชัน อย่างชัดเจน ส่งผลให้ไฟล์ออบเจ็กต์ BPF มีฟังก์ชันที่ซ้ำกัน ข้อจำกัดนี้ถูกยกเลิกแล้ว และคอมไพเลอร์ eBPF กระแสหลักในปัจจุบันรองรับการเขียนฟังก์ชันในโปรแกรม eBPF ได้อย่างเป็นธรรมชาติ ซึ่งจะช่วยลดขนาดโค้ด eBPF ที่สร้างขึ้น ทำให้เป็นมิตรกับแคชคำสั่ง CPU มากขึ้น[ 45 ] [ 46 ]
ตัวตรวจสอบ eBPF
ตัวตรวจสอบเป็นส่วนประกอบหลักของ eBPF และหน้าที่หลักคือการรับรองว่าโปรแกรม eBPF ปลอดภัยต่อการทำงาน โดยจะทำการวิเคราะห์แบบคงที่ของไบต์โค้ด eBPF เพื่อรับประกันความปลอดภัย ตัวตรวจสอบจะวิเคราะห์โปรแกรมเพื่อประเมินเส้นทางการทำงานที่เป็นไปได้ทั้งหมด โดยจะตรวจสอบคำสั่งตามลำดับและประเมินผล กระบวนการตรวจสอบเริ่มต้นด้วยการค้นหาแบบเจาะลึกผ่านเส้นทางที่เป็นไปได้ทั้งหมดของโปรแกรม ตัวตรวจสอบจะจำลองการทำงานของแต่ละคำสั่งโดยใช้การตีความแบบนามธรรม[ 48 ]โดยติดตามสถานะของรีจิสเตอร์และสแต็ก หากคำสั่งใดอาจนำไปสู่สถานะที่ไม่ปลอดภัย การตรวจสอบจะล้มเหลว กระบวนการนี้จะดำเนินต่อไปจนกว่าจะวิเคราะห์เส้นทางทั้งหมดเสร็จสิ้นหรือพบการละเมิด ขึ้นอยู่กับประเภทของโปรแกรม ตัวตรวจสอบจะตรวจสอบการละเมิดกฎเฉพาะ กฎเหล่านี้อาจรวมถึงการตรวจสอบว่าโปรแกรม eBPF จะสิ้นสุดภายในระยะเวลาที่เหมาะสมเสมอ (ไม่มีลูปอนันต์หรือการเรียก ซ้ำอนันต์ ) การตรวจสอบว่าโปรแกรม eBPF ไม่ได้รับอนุญาตให้อ่านหน่วยความจำตามอำเภอใจ เนื่องจากความสามารถในการอ่านหน่วยความจำตามอำเภอใจอาจทำให้โปรแกรมรั่วไหลข้อมูลที่ละเอียดอ่อน การตรวจสอบว่าโปรแกรมเครือข่ายไม่ได้รับอนุญาตให้เข้าถึงหน่วยความจำนอกขอบเขตของแพ็กเก็ตเนื่องจากหน่วยความจำที่อยู่ติดกันอาจมีข้อมูลที่ละเอียดอ่อน การตรวจสอบว่าโปรแกรมไม่ได้รับอนุญาตให้เกิดภาวะเดดล็อกดังนั้นสปินล็อก ที่ถืออยู่ จะต้องถูกปล่อย และสามารถถือล็อกได้เพียงครั้งละหนึ่งล็อกเท่านั้นเพื่อหลีกเลี่ยงภาวะเดดล็อกข้ามหลายโปรแกรม การตรวจสอบว่าโปรแกรมไม่ได้รับอนุญาตให้อ่านหน่วยความจำที่ไม่ได้เริ่มต้น นี่ไม่ใช่รายการตรวจสอบทั้งหมดที่ตัวตรวจสอบดำเนินการ และมีข้อยกเว้นสำหรับกฎเหล่านี้ ตัวอย่างเช่น โปรแกรมติดตามสามารถเข้าถึงตัวช่วยที่อนุญาตให้พวกเขาอ่านหน่วยความจำในลักษณะที่ควบคุมได้ แต่โปรแกรมประเภทเหล่านี้ต้องการสิทธิ์ระดับรูทดังนั้นจึงไม่ก่อให้เกิดความเสี่ยงด้านความปลอดภัย[ 47 ] [ 45 ]
เมื่อเวลาผ่านไป ตัวตรวจสอบ eBPF ได้พัฒนาขึ้นเพื่อรวมคุณสมบัติและการปรับปรุงใหม่ๆ เช่น การรองรับลูปที่มีขอบเขตการกำจัดโค้ดที่ไม่ได้ใช้งาน การตรวจสอบทีละฟังก์ชัน และการเรียกกลับ (callback )
eBPF CO-RE (คอมไพล์ครั้งเดียว รันได้ทุกที่)
โปรแกรม eBPF ใช้หน่วยความจำและโครงสร้างข้อมูลจากเคอร์เนล โครงสร้างบางอย่างอาจถูกแก้ไขระหว่างเวอร์ชันเคอร์เนลที่แตกต่างกัน ทำให้เค้าโครงหน่วยความจำเปลี่ยนแปลงไป เนื่องจากเคอร์เนล Linux มีการพัฒนาอย่างต่อเนื่อง จึงไม่มีการรับประกันว่าโครงสร้างข้อมูลภายในจะยังคงเหมือนเดิมในเวอร์ชันต่างๆ CO-RE เป็นแนวคิดพื้นฐานในการพัฒนา eBPF สมัยใหม่ที่ช่วยให้โปรแกรม eBPF สามารถใช้งานได้กับเวอร์ชันและโครงสร้างเคอร์เนลที่แตกต่างกัน มันแก้ปัญหาความท้าทายของการเปลี่ยนแปลงโครงสร้างเคอร์เนลระหว่าง การแจกจ่าย และเวอร์ชันLinux ที่แตกต่างกัน CO-RE ประกอบด้วย BTF (BPF Type Format) ซึ่งเป็น รูปแบบ เมตาเดตาที่อธิบายประเภทที่ใช้ในเคอร์เนลและโปรแกรม eBPF และให้ข้อมูลโดยละเอียดเกี่ยวกับเค้าโครงโครงสร้าง ออฟเซ็ตฟิลด์ และประเภทข้อมูล มันช่วยให้สามารถเข้าถึงประเภทเคอร์เนลได้ในขณะทำงาน ซึ่งมีความสำคัญอย่างยิ่งต่อการพัฒนาและการตรวจสอบโปรแกรม BPF BTF ถูกรวมอยู่ในอิมเมจเคอร์เนลของเคอร์เนลที่เปิดใช้งาน BTF การย้ายตำแหน่งพิเศษจะถูกสร้างขึ้นโดยคอมไพเลอร์ (เช่น LLVM) การย้ายตำแหน่งเหล่านี้จะบันทึกคำอธิบายระดับสูงของข้อมูลที่โปรแกรม eBPF ตั้งใจจะเข้าถึง ไลบรารีlibbpfปรับโปรแกรม eBPF ให้ทำงานกับโครงสร้างข้อมูลในเคอร์เนลเป้าหมายที่โปรแกรมทำงาน แม้ว่าโครงสร้างนี้จะแตกต่างจากเคอร์เนลที่โค้ดถูกคอมไพล์ก็ตาม ในการทำเช่นนี้ libbpf ต้องการข้อมูลการย้ายตำแหน่ง CO-RE ของ BPF ที่สร้างโดย Clang ซึ่งเป็นส่วนหนึ่งของกระบวนการคอมไพล์[ 45 ]โปรแกรม eBPF ที่คอมไพล์แล้วจะถูกจัดเก็บไว้ในไฟล์ออบเจ็กต์Executable and Linkable Format (ELF) ไฟล์นี้มีข้อมูลประเภท BTF และ การย้ายตำแหน่งที่สร้างโดย Clangรูปแบบ ELF ช่วยให้ตัวโหลด eBPF (เช่น libbpf) สามารถประมวลผลและปรับโปรแกรม BPF แบบไดนามิกสำหรับเคอร์เนลเป้าหมายได้[ 49 ]
การสร้างแบรนด์
ชื่อเรียก eBPF มักใช้แทนกันได้กับ BPF [ 2 ] [ 50 ]ตัวอย่างเช่น โดยชุมชนเคอร์เนล Linux eBPF และ BPF ถูกอ้างถึงว่าเป็นชื่อเทคโนโลยีเช่นเดียวกับLLVM [ 2 ] eBPFพัฒนามาจากภาษาเครื่องสำหรับเครื่องเสมือนการกรองในBerkeley Packet Filterเป็นเวอร์ชันขยาย แต่เนื่องจากกรณีการใช้งานขยายออกไปนอกเครือข่าย ปัจจุบัน "eBPF" จึงถูกตีความว่าเป็น คำ ย่อเทียม[ 2 ]
ผึ้งเป็นโลโก้อย่างเป็นทางการของ eBPF ในการประชุมสุดยอด eBPF ครั้งแรก มีการลงคะแนนเสียงและตั้งชื่อมาสคอต ผึ้งว่า "eBee" [ 51 ] [ 52 ]โลโก้นี้สร้างขึ้นโดย Vadim Shchekoldin [ 52 ]ก่อนหน้านี้เคยมีมาสคอตที่ไม่เป็นทางการของ eBPF มาก่อน[ 53 ]แต่ไม่ได้รับการยอมรับอย่างแพร่หลาย
การปกครอง
มูลนิธิ eBPF ก่อตั้งขึ้นในเดือนสิงหาคม พ.ศ. 2564 โดยมีเป้าหมายเพื่อขยายการสนับสนุนเพื่อขยายขีดความสามารถอันทรงพลังของ eBPF และเติบโตไปไกลกว่า Linux [ 1 ]สมาชิกผู้ก่อตั้ง ได้แก่Meta , Google , Isovalent, MicrosoftและNetflixวัตถุประสงค์คือการระดมทุน จัดทำงบประมาณ และใช้เงินทุนเพื่อสนับสนุนโครงการโอเพนซอร์ส โอเพนดาต้า และ/หรือโอเพนมาตรฐานต่างๆ ที่เกี่ยวข้องกับเทคโนโลยี eBPF [ 54 ]เพื่อผลักดันการเติบโตและการนำระบบนิเวศ eBPF ไปใช้ให้มากขึ้น นับตั้งแต่เริ่มก่อตั้งRed Hat , Huawei , Crowdstrike , Tigera, DaoCloud, Datoms และ FutureWei ก็ได้เข้าร่วมด้วย[ 55 ]
การรับเลี้ยงบุตรบุญธรรม
eBPF ได้รับการนำไปใช้งานโดยผู้ใช้งานขนาดใหญ่จำนวนมาก ตัวอย่างเช่น:
- Metaใช้ eBPF ผ่าน Katran layer 4 load balancer สำหรับทราฟฟิกทั้งหมดที่ส่งไปยัง facebook.com [ 56 ] [ 57 ] [ 58 ] [ 31 ]
- Googleใช้ eBPF ในGKEพัฒนาและใช้ BPF LSM เพื่อทดแทนการตรวจสอบ และใช้ eBPF สำหรับเครือข่าย[ 29 ] [ 59 ] [ 60 ] [ 61 ]
- Cloudflareใช้ eBPF สำหรับการปรับสมดุลโหลด การป้องกัน DDoS และการบังคับใช้ความปลอดภัย[ 62 ] [ 63 ] [ 64 ] [ 65 ] [ 66 ]
- Netflix ใช้ eBPF สำหรับ การสังเกตการณ์เครือข่ายทั่วทั้งระบบและการวินิจฉัยประสิทธิภาพ[ 67 ] [ 68 ]
- Dropboxใช้ eBPF ผ่าน Katran สำหรับการปรับสมดุลโหลดเลเยอร์ 4 [ 69 ]
- Androidใช้ eBPF สำหรับ NAT46 และการตรวจสอบการรับส่งข้อมูล[ 70 ] [ 71 ] [ 72 ]
- Samsung Galaxyใช้ eBPF สำหรับโซลูชันเครือข่าย[ 73 ]
- Yahoo! Inc ใช้ eBPF ผ่าน Cilium สำหรับการปรับสมดุลโหลดเลเยอร์ 4 [ 74 ]
- LinkedInใช้ eBPF สำหรับการสังเกตการณ์โครงสร้างพื้นฐาน[ 75 ]
- Alibabaใช้ eBPF สำหรับ การปรับสมดุลโหลด ของ Kubernetes Pod [ 76 ]
- Datadogใช้ eBPF สำหรับการสร้างเครือข่ายและการบังคับใช้ความปลอดภัยของ Kubernetes Pod [ 77 ] [ 78 ] [ 79 ]
- Trip.comใช้ eBPF สำหรับเครือข่าย Pod ของ Kubernetes [ 80 ] [ 81 ]
- Shopifyใช้ eBPF สำหรับการตรวจจับการบุกรุกผ่าน Falco [ 82 ]
- DoorDash ใช้ eBPF ผ่าน BPFAgent สำหรับการตรวจสอบระดับเคอร์เนล[ 83 ]
- Microsoftได้พอร์ต eBPF และ XDP ไปยัง Windows [ 84 ] [ 85 ] [ 86 ]
- Seznamใช้ eBPF ผ่าน Cilium สำหรับการปรับสมดุลโหลดเลเยอร์ 4 [ 87 ]
- DigitalOceanใช้ eBPF และ XDP เพื่อจำกัดอัตราการเข้าถึงบริการภายในในเครือข่ายเสมือน[ 88 ]
- CapitalOneใช้ eBPF สำหรับการสร้างเครือข่าย Pod ของ Kubernetes [ 89 ]
- Bell Canadaใช้ eBPF เพื่อปรับปรุงเครือข่ายโทรคมนาคมให้ทันสมัยด้วย SRv6 [ 90 ]
- Elastic_NVใช้ eBPF สำหรับการวิเคราะห์โปรไฟล์โค้ดเป็นส่วนหนึ่งของการนำเสนอการตรวจสอบ[ 91 ]
- Appleใช้ eBPF สำหรับความปลอดภัยของ Kubernetes Pod [ 92 ]
- Skyใช้ eBPF สำหรับการสร้างเครือข่าย Pod ของ Kubernetes [ 93 ]
- Walmartใช้ eBPF สำหรับการปรับสมดุลโหลดเลเยอร์ 4 [ 94 ] [ 95 ]
- Huaweiใช้ eBPF ผ่านระบบบูตที่ปลอดภัย DIGLIM ของพวกเขา[ 96 ]
- Ikeaใช้ eBPF สำหรับเครือข่าย Kubernetes Pod [ 97 ]
- The New York Timesใช้ eBPF สำหรับการสร้างเครือข่าย[ 98 ]
- Red Hatใช้ eBPF ในระดับใหญ่เพื่อการกระจายโหลดและการติดตามในระบบคลาวด์ส่วนตัวของตน
- Palantir Technologiesใช้ eBPF เพื่อแก้ไขปัญหาเครือข่ายในคลัสเตอร์ Kubernetes ขนาดใหญ่[ 99 ]
- Bloombaseใช้ eBPF สำหรับการตรวจจับและลดภัยคุกคามในระดับชั้นจัดเก็บข้อมูลเครือข่าย
ความปลอดภัย
เนื่องจากความง่ายในการเขียนโปรแกรม eBPF จึงถูกใช้เป็นเครื่องมือในการโจมตีช่องทางด้านข้างของ เวลาในระดับไมโครสถาปัตยกรรม เช่นSpectreต่อไมโครโปรเซสเซอร์ ที่ เปราะ บาง [ 100 ]ในขณะที่ eBPF ที่ไม่มีสิทธิ์พิเศษใช้มาตรการบรรเทาผลกระทบต่อ Spectre v1, v2 และ v4 สำหรับx86-64 [ 101 ] [ 102 ]การใช้งานที่ไม่มีสิทธิ์พิเศษนั้นถูกปิดใช้งานโดยค่าเริ่มต้นโดยชุมชนเคอร์เนลเพื่อปกป้องผู้ใช้สถาปัตยกรรมที่ไม่ได้รับการสนับสนุนและจำกัดผลกระทบของช่องโหว่ฮาร์ดแวร์ในอนาคต[ 103 ] บน x86-64 นั้น Spectre v1 จะถูกบรรเทาผลกระทบผ่านการรวมกันของการบังคับใช้ขอบเขตแบบไม่มีสาขา (เช่น คำสั่งปิดบัง) และการตรวจสอบเส้นทางการดำเนินการแบบคาดการณ์ Spectre v4 จะถูกบรรเทาผลกระทบโดยใช้สิ่งกีดขวางการคาดการณ์ (เช่น lfence) เท่านั้น และ Spectre v2 จะถูกบรรเทาผลกระทบผ่าน retpoline เมื่อมีให้ใช้งาน[ 104 ]หรือสิ่งกีดขวางการคาดการณ์ มาตรการบรรเทาเหล่านี้ป้องกันไม่ให้ข้อมูลที่ละเอียดอ่อนซึ่งเป็นของเคอร์เนล (เช่น ที่อยู่ของเคอร์เนล) รั่วไหลโดยโปรแกรม eBPF ที่เป็นอันตราย แต่ไม่ได้ออกแบบมาเพื่อป้องกันโปรแกรม eBPF ที่ไม่เป็นอันตรายจากการรั่วไหลของข้อมูลที่ละเอียดอ่อนที่ตนเองเป็นเจ้าของ/ประมวลผลโดยไม่ได้ตั้งใจ (เช่น คีย์การเข้ารหัสที่จัดเก็บเป็นตัวเลข) [ 102 ]
ดูเพิ่มเติม
อ่านเพิ่มเติม
- เกร็กก์, เบรนแดน (ธันวาคม 2019). เครื่องมือเพิ่มประสิทธิภาพ BPF . แอดดิสัน-เวสลีย์. ISBN 978-0136554820.
- David Calavera, Lorenzo Fontana (ธันวาคม 2019). การตรวจสอบระบบ Linux ด้วย BPF . สำนักพิมพ์ O'Reilly Media, Incorporated. ISBN 978-1492050209.
- เกร็กก์, เบรนแดน (ธันวาคม 2020). ประสิทธิภาพของระบบ, ฉบับพิมพ์ครั้งที่สอง . แอดดิสัน-เวสลีย์. ISBN 978-0136820154.
- ไรซ์, ลิซ (เมษายน 2022). eBPF คืออะไร? . ISBN 978-1492097259.
- ไรซ์, ลิซ (เมษายน 2023). การเรียนรู้ eBPF: การเขียนโปรแกรมเคอร์เนลลินุกซ์เพื่อเพิ่มประสิทธิภาพการสังเกตการณ์ การเชื่อมต่อเครือข่าย และความปลอดภัย . สำนักพิมพ์ O'Reilly Media. ISBN 978-1098135126.
- Thaler, Dave, บรรณาธิการ (ตุลาคม 2024). สถาปัตยกรรมชุดคำสั่ง BPF (ISA) . IETF . doi : 10.17487/RFC9669 . RFC 9669. สืบค้นเมื่อ5 มกราคม 2024 .
ลิงก์ภายนอก
- eBPF.io - บทนำ บทแนะนำ และแหล่งข้อมูลชุมชน eBPF
- eBPF.foundation - เว็บไซต์ของมูลนิธิ eBPF แห่ง Linux Foundation
- คู่มือสำหรับนักพัฒนา eBPF: เรียนรู้ eBPF ทีละขั้นตอนพร้อมตัวอย่าง
- สารคดี eBPF - สารคดีเกี่ยวกับจุดเริ่มต้นของ eBPF