
Книга по технологии 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
