Опубликовано

Новинка: “Изучаем eBPF: программирование ядра Linux для улучшения безопасности, сетевых функций и наблюдаемости”

Изучаем eBPF: программирование ядра Linux для улучшения безопасности, сетевых функций и наблюдаемости

Книга по технологии eBPF, построенной на основе знаменитого фильтра пакетов, изобретённого в университете Беркли (Berkeley Packet Filter), и позволяющей пропускать в ядро Linux пользовательские пакеты и таким образом модифицировать поведение и функции ядра.  В книге рассмотрено, как eBPF соотносится с устройством ядра Linux и его расширениями, какие системные вызовы применяются при обслуживании eBPF, какую роль eBPF играет при обеспечении безопасности. Рассказано о программировании модулей для eBPF, объяснены практические аспекты использования этого механизма:  портирование программ с дистрибутива в дистрибутив и с корпоративного сервера в облако.

Для разработчиков, системных администраторов Linux и специалистов по безопасности

Книга даёт полный обзор технологии eBPF, от основ до продвинутых концепций, и содержит массу практических советов по её внедрению.
Алексей Старовойтов, один из авторов eBPF

eBPF – это целый новый тренд в развитии облачно-ориентированных архитектур, и книга Лиз отлично его объясняет на множестве ценных примеров и упражнений.
Дэниэл Боркманн, один из авторов eBPF

Программирование ядра Linux для улучшения безопасности, сетевых функций и наблюдаемости

Что такое eBPF? Эта революционная технология на основе Berkeley Packet Filter (фильтра пакетов, изобретённого в университете города Беркли), позволяющая писать собственный код, динамически изменяющий поведение и функции ядра Linux. Это выдающаяся платформа,  гарантирующая новый уровень безопасности, наблюдаемости и работы с сетевыми инструментами. Книга незаменима для разработчиков, системных администраторов, инженеров и студентов, желающих подробнее изучить ядро Linux.

В книге приведена вся базовая  информация, необходимая для начала работы с eBPF. Приведённые примеры кода и вывода командной строки послужат стартовой площадкой для тех, кто хочет разобраться с этой новой технологией и научиться самостоятельно писать программы c применением eBPF.

В книге рассмотрено:

  • Почему в последние годы технология eBPF приобрела такую важность и как с её помощью создавать мощные инфраструктурные инструменты
  • Различные примеры кода eBPF, от уровня “Hello World” до сценариев, помогающих выявлять потенциальные нарушения безопасности и управлять пакетами в сети
  • Как управлять программами eBPF и прикреплять их к событиям
  • Как при помощи верификатора eBPF гарантировать безопасность выполнения конкретной программы и как обеспечить портирование программ eBPF между различными версиями ядра
  • Как компоненты eBPF взаимодействуют с Linux и как с их помощью динамически влиять на поведение операционной системы

Книгу “Изучаем eBPF: программирование ядра Linux для улучшения безопасности, сетевых функций и наблюдаемости можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие…………………………………………………………………………………………… 11

Для кого эта книга……………………………………………………………………………………………………………………… 11

Что охватывает эта книга…………………………………………………………………………………………………………. 12

Необходимые знания…………………………………………………………………………………………………………………. 13

Примеры кода и упражнения……………………………………………………………………………………………………. 13

eBPF только для Linux?……………………………………………………………………………………………………………… 14

Условные обозначения, используемые в этой книге………………………………………………………………. 14

Использование примеров кода…………………………………………………………………………………………………. 14

Онлайн-обучение O’Reilly…………………………………………………………………………………………………………. 15

Как контактировать с нами………………………………………………………………………………………………………. 15

Благодарности…………………………………………………………………………………………………………………………… 16

Глава 1. Что такое eBPF и почему это важно?………………………………………… 17

Корни eBPF: пакетный фильтр Беркли…………………………………………………………………………………….. 17

От BPF к eBPF…………………………………………………………………………………………………………………………….. 18

Эволюция eBPF в продакшен-системах…………………………………………………………………………………… 19

Сложности именования…………………………………………………………………………………………………………….. 20

Ядро Linux………………………………………………………………………………………………………………………………….. 21

Добавление новой функциональности в ядро…………………………………………………………………………. 22

Модули ядра………………………………………………………………………………………………………………………………. 24

Динамическая загрузка программ eBPF………………………………………………………………………………….. 25

Высокая производительность программ eBPF………………………………………………………………………… 26

eBPF в облачных средах…………………………………………………………………………………………………………… 26

Итоги…………………………………………………………………………………………………………………………………………… 29

Глава 2. «Hello World» от eBPF………………………………………………………………. 30

BCC’s «Hello World»…………………………………………………………………………………………………………………… 30

Выполнение «Hello World»………………………………………………………………………………………………………… 33

Карты BPF………………………………………………………………………………………………………………………………….. 35

Карты типа хеш-таблиц………………………………………………………………………………………………………. 36

Карты в буфере Perf и кольцевом буфере BPF…………………………………………………………………… 39

Вызовы функций…………………………………………………………………………………………………………………… 44

Хвостовые вызовы………………………………………………………………………………………………………………… 45

Итоги…………………………………………………………………………………………………………………………………………… 50

Упражнения………………………………………………………………………………………………………………………………… 50

Глава 3. Анатомия eBPF-программы……………………………………………………… 52

Виртуальная машина eBPF………………………………………………………………………………………………………. 52

Регистры eBPF………………………………………………………………………………………………………………………. 53

Инструкции eBPF………………………………………………………………………………………………………………….. 53

eBPF «Hello World» для сетевого интерфейса………………………………………………………………………….. 55

Компиляция объектного файла eBPF……………………………………………………………………………………….. 57

Анализ объектного файла eBPF……………………………………………………………………………………………….. 57

Загрузка программы в ядро………………………………………………………………………………………………………. 59

Проверка загруженной программы………………………………………………………………………………………….. 60

Тег программы BPF………………………………………………………………………………………………………………. 61

Транслированный байт-код………………………………………………………………………………………………… 62

JIT-компилируемый машинный код……………………………………………………………………………………. 62

Присоединение к событию………………………………………………………………………………………………………… 64

Глобальные переменные…………………………………………………………………………………………………………… 66

Отключение программы……………………………………………………………………………………………………………. 68

Выгрузка программ……………………………………………………………………………………………………………………. 68

Вызовы к BPF из BPF…………………………………………………………………………………………………………………. 68

Итоги…………………………………………………………………………………………………………………………………………… 70

Упражнения………………………………………………………………………………………………………………………………… 71

Глава 4. Системный вызов bpf()…………………………………………………………….. 73

Загрузка BTF-данных………………………………………………………………………………………………………………… 77

Создание карт…………………………………………………………………………………………………………………………….. 77

Загрузка программы………………………………………………………………………………………………………………….. 78

Изменение карты из пространства пользователя……………………………………………………………………. 79

Ссылки BPF-программ и карт…………………………………………………………………………………………………… 81

Закрепление………………………………………………………………………………………………………………………….. 81

BPF-связи………………………………………………………………………………………………………………………………. 83

Дополнительные системные вызовы, задействованные в eBPF…………………………………………….. 83

Инициализация буфера Perf………………………………………………………………………………………………… 83

Присоединение к событиям kprobe…………………………………………………………………………………….. 84

Настройка и чтение событий Perf………………………………………………………………………………………. 85

Кольцевые буферы…………………………………………………………………………………………………………………….. 86

Чтение информации из карты……………………………………………………………………………………………………. 88

Поиск карты………………………………………………………………………………………………………………………….. 89

Чтение элементов карты………………………………………………………………………………………………………. 89

Итоги…………………………………………………………………………………………………………………………………………… 90

Упражнения………………………………………………………………………………………………………………………………… 91

Глава 5. CO-RE, BTF и libbpf………………………………………………………………….. 94

Подход BCC к портированию…………………………………………………………………………………………………… 94

CO-RE: обзор……………………………………………………………………………………………………………………………… 96

Формат типов BTF……………………………………………………………………………………………………………………… 97

Варианты использования BTF……………………………………………………………………………………………. 97

Листинг информации BTF через bpftool…………………………………………………………………………….. 98

Типы в BTF……………………………………………………………………………………………………………………………. 99

Карты с BTF-информацией……………………………………………………………………………………………….. 102

Данные BTF для функций и прототипов функций…………………………………………………………… 102

Проверка данных BTF для карт и программ……………………………………………………………………. 103

Генерация заголовочного файла ядра…………………………………………………………………………………… 103

CO-RE: eBPF-программы………………………………………………………………………………………………………… 105

Заголовочные файлы…………………………………………………………………………………………………………. 105

Информация заголовков ядра………………………………………………………………………………… 106

Заголовки от библиотеки libbpf…………………………………………………………………………….. 106

Заголовки, специфичные для приложения……………………………………………………………. 107

Определения карт………………………………………………………………………………………………………………. 107

Секции eBPF-программы…………………………………………………………………………………………………… 108

Доступ к памяти с CO-RE………………………………………………………………………………………………….. 110

Декларация лицензии………………………………………………………………………………………………………… 112

Компиляция программ eBPF для CO-RE………………………………………………………………………………… 112

Отладочная информация…………………………………………………………………………………………………… 112

Оптимизация……………………………………………………………………………………………………………………….. 112

Целевая архитектура…………………………………………………………………………………………………………. 112

Makefile……………………………………………………………………………………………………………………………….. 113

Информация BTF в объектном файле……………………………………………………………………………….. 113

BPF-перемещения…………………………………………………………………………………………………………………….. 114

Код CO-RE пользовательского пространства………………………………………………………………………. 115

Библиотека Libbpf для пользовательского пространства…………………………………………………… 115

BPF-шаблоны……………………………………………………………………………………………………………………… 116

Загрузка программ и карт в ядро…………………………………………………………………………… 117

Доступ к уже существующим картам……………………………………………………………………. 118

Присоединение событий………………………………………………………………………………………… 119

Управление буфером событий………………………………………………………………………………. 119

Примеры кодов libbpf…………………………………………………………………………………………………………. 120

Итоги…………………………………………………………………………………………………………………………………………. 120

Упражнения……………………………………………………………………………………………………………………………… 121

Глава 6. Верификатор eBPF………………………………………………………………….. 122

Процесс верификации……………………………………………………………………………………………………………… 122

Журнал верификатора…………………………………………………………………………………………………………….. 124

Визуализация потока управления………………………………………………………………………………………….. 126

Проверка функций-помощников…………………………………………………………………………………………….. 126

Аргументы функции-помощника……………………………………………………………………………………………. 128

Контроль типа лицензии…………………………………………………………………………………………………………. 129

Контроль доступа к памяти……………………………………………………………………………………………………. 129

Проверка указателей перед их разыменованием………………………………………………………………….. 131

Доступ к контексту………………………………………………………………………………………………………………….. 133

Выполнение до завершения……………………………………………………………………………………………………. 133

Циклы………………………………………………………………………………………………………………………………………… 133

Контроль кода возврата………………………………………………………………………………………………………….. 134

Недопустимые инструкции…………………………………………………………………………………………………….. 135

Недоступные инструкции……………………………………………………………………………………………………….. 135

Итоги…………………………………………………………………………………………………………………………………………. 135

Упражнения……………………………………………………………………………………………………………………………… 136

Глава 7. Типы программы eBPF и присоединения……………………………….. 138

Аргументы контекста программы………………………………………………………………………………………….. 138

Функции-помощники и коды возврата…………………………………………………………………………………… 139

Kfuncs……………………………………………………………………………………………………………………………………….. 140

Трассировка……………………………………………………………………………………………………………………………… 140

kprobes и kretprobes……………………………………………………………………………………………………………. 141

Прикрепление kprobes к точкам входа системных вызовов………………………………… 142

Прикрепление kprobes к другим функциям ядра………………………………………………….. 142

fentry/fexit…………………………………………………………………………………………………………………………… 143

Точки трассировки…………………………………………………………………………………………………………….. 144

Точки трассировки, разрешаемые BTF……………………………………………………………………………. 146

Прикрепления в пользовательском пространстве…………………………………………………………… 147

LSM……………………………………………………………………………………………………………………………………… 148

Сеть…………………………………………………………………………………………………………………………………………… 149

Сокеты…………………………………………………………………………………………………………………………………. 150

Контроль трафика……………………………………………………………………………………………………………… 150

XDP………………………………………………………………………………………………………………………………………. 151

Рассекатель потока……………………………………………………………………………………………………………. 152

Легковесные туннели…………………………………………………………………………………………………………. 152

Cgroup………………………………………………………………………………………………………………………………….. 152

Инфракрасные контроллеры…………………………………………………………………………………………….. 152

BPF-типы прикреплений………………………………………………………………………………………………………….. 153

Итоги…………………………………………………………………………………………………………………………………………. 153

Упражнения……………………………………………………………………………………………………………………………… 154

Глава 8. eBPF для сети………………………………………………………………………….. 155

Отсечение пакетов…………………………………………………………………………………………………………………… 155

Коды возврата XDP программы……………………………………………………………………………………….. 156

Анализ пакетов XDP…………………………………………………………………………………………………………… 157

Балансировка нагрузки и форвардинг…………………………………………………………………………………… 160

Разгрузка XDP………………………………………………………………………………………………………………………….. 163

Контроль трафика (TC)…………………………………………………………………………………………………………… 164

Кодирование и декодирование пакета………………………………………………………………………………….. 168

SSL-библиотеки пространства пользователя………………………………………………………………….. 169

eBPF и сети Kubernetes…………………………………………………………………………………………………………….. 171

Избежание iptables…………………………………………………………………………………………………………….. 174

Координированные сетевые программы…………………………………………………………………………. 174

Применение сетевой политики………………………………………………………………………………………….. 176

Шифрованные соединения………………………………………………………………………………………………… 177

Итоги…………………………………………………………………………………………………………………………………………. 179

Упражнения и дополнительная литература…………………………………………………………………………. 179

Глава 9. eBPF для безопасности……………………………………………………………. 181

Контролируемость безопасности требует политики и контекста………………………………………. 181

Использование системных вызовов для событий безопасности…………………………………………. 182

seccomp………………………………………………………………………………………………………………………………. 183

Генерация seccomp-профилей…………………………………………………………………………………………… 184

Инструменты безопасности для отслеживания системных вызовов…………………………….. 186

BPF LSM……………………………………………………………………………………………………………………………………. 188

Cilium Tetragon…………………………………………………………………………………………………………………………. 189

Присоединение к внутренним функциям ядра…………………………………………………………………. 190

Превентивная защита………………………………………………………………………………………………………… 191

Сетевая безопасность……………………………………………………………………………………………………………… 192

Итоги…………………………………………………………………………………………………………………………………………. 193

Глава 10. Программирование eBPF………………………………………………………. 194

bpftrace…………………………………………………………………………………………………………………………………….. 194

Выбор языка для кода eBPF в ядре………………………………………………………………………………………… 197

BCC Python/Lua/C++……………………………………………………………………………………………………………….. 198

Язык C и libbpf…………………………………………………………………………………………………………………………. 200

Go…………………………………………………………………………………………………………………………………………. 201

Gobpf…………………………………………………………………………………………………………………………………… 202

ebpf-go………………………………………………………………………………………………………………………………… 202

libbpfgo………………………………………………………………………………………………………………………………. 204

Rust……………………………………………………………………………………………………………………………………………. 205

libbpf-rs………………………………………………………………………………………………………………………………. 205

Redbpf…………………………………………………………………………………………………………………………………. 206

Aya………………………………………………………………………………………………………………………………………. 206

Rust-bcc……………………………………………………………………………………………………………………………….. 208

Тестирование BPF-программ………………………………………………………………………………………………….. 208

Несколько BPF-программ……………………………………………………………………………………………………….. 209

Итоги…………………………………………………………………………………………………………………………………………. 210

Упражнения……………………………………………………………………………………………………………………………… 211

Глава 11. Будущая эволюция eBPF………………………………………………………. 212

Фонд eBPF………………………………………………………………………………………………………………………………… 212

eBPF в Windows………………………………………………………………………………………………………………………… 213

Эволюция Linux eBPF……………………………………………………………………………………………………………… 215

eBPF — это платформа, а не функция……………………………………………………………………………………. 217

Заключение………………………………………………………………………………………………………………………………. 218

Об авторе……………………………………………………………………………………………… 219

Об изображении на обложке………………………………………………………………… 220

Лиз Райс

Лиз Райс (Liz Rice) – ведущий инженер по разработке с открытым кодом в компании Isovalent, автор книги «Container Security» издательства O’Reilly