
Инструмент безопасности на основе eBPF для блокировки и аудита Linux-машин. Ограничивает возможности ядра, блокирует бесфайловое выполнение, защищает память и укрепляет защиту контейнеров и IoT-устройств с помощью декларативных профилей.

bpflock — безопасность на основе eBPF для блокировки и аудита Linux-машин.
Примечание: bpflock currently находится на экспериментальной стадии, возможны сбои, параметры и семантика безопасности могут измениться, некоторые BPF-программы будут обновлены для использования библиотеки Cilium ebpf.
bpflock использует eBPF для усиления безопасности Linux. Ограничивая доступ к широкому спектру функций Linux, bpflock может уменьшить поверхность атаки и заблокировать некоторые известные методы атак.
Только программы, такие как менеджеры контейнеров, systemd и другие контейнеры/программы, работающие в пространствах имен pid и network хоста, имеют доступ ко всем функциям Linux; контейнеры и приложения, работающие в своих собственных пространствах имен, будут ограничены.
Если BPF-программы bpflock работают в профиле restricted, то всем программам/контейнерам, включая привилегированные, будет отказано в доступе.
bpflock защищает Linux-машины, используя множество функций безопасности, включая Linux Security Modules + BPF.
Заметки по архитектуре и дизайну безопасности:
bpflock предоставляет множество защитных мер, которые можно классифицировать следующим образом:
Трассировка системы и приложений
Защита файловой системы
Сетевая защита
bpflock сохраняет семантику безопасности простой. Он поддерживает три глобальных профиля для широкого охвата спектра безопасности и ограничения доступа к определенным функциям Linux.
profile: это глобальный профиль, который может быть применен к каждой BPF-программе; он принимает одно из следующих значений:
allow|none|privileged: они одинаковы и определяют наименее безопасный профиль. В этом профиле доступ регистрируется и разрешается для всех процессов. Полезно для регистрации событий безопасности.baseline: ограничительный профиль, в котором доступ запрещен для всех процессов, кроме привилегированных приложений и контейнеров, работающих в пространствах имен хоста, или профилей, разрешенных для каждой cgroup в BPF-карте bpflock_cgroupmap.restricted: строго ограничительный профиль, в котором доступ запрещен для всех процессов.Разрешенные или заблокированные операции/команды:
В профилях allow|privileged или baseline можно указать список разрешенных или заблокированных команд, и они будут применены.
--protection-allow: список разрешенных операций, разделенных запятыми. Действителен в профиле baseline, полезен для приложений, которые слишком специфичны и выполняют привилегированные операции. Это уменьшит использование профиля allow | privileged, поэтому вместо использования профиля privileged мы можем указать baseline и добавить набор разрешенных команд для определения таких приложений в каждом конкретном случае.--protection-block: список заблокированных операций, разделенных запятыми. Действителен в профилях allow|privileged и baseline, позволяет ограничить доступ к некоторым функциям без использования полного профиля restricted, который может нарушить работу некоторых специфических приложений. Использование профилей baseline или privileged открывает доступ к большинству функций Linux, но с опцией --protection-block можно заблокировать часть этого доступа.Примеры безопасности BPF см. в примерах конфигурации bpflock
bpflock требует следующего:
Версия ядра Linux >= 5.13 со следующей конфигурацией:
CONFIG_BPF_SYSCALL=y
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO_BTF=y
CONFIG_KPROBES=y
CONFIG_LSM="...,bpf"
CONFIG_BPF_LSM=y
Очевидно, ядро с поддержкой BTF.
Если ваше ядро было скомпилировано с CONFIG_BPF_LSM=y, проверьте /boot/config-*, чтобы подтвердить, но при запуске bpflock выдается ошибка:
must have a kernel with 'CONFIG_BPF_LSM=y' 'CONFIG_LSM=\"...,bpf\"'"
Затем, чтобы включить BPF LSM, например в Ubuntu:
GRUB_CMDLINE_LINUX и сохраните.
"lsm=lockdown,capability,yama,apparmor,bpf"
или
GRUB_CMDLINE_LINUX="lsm=lockdown,capability,yama,apparmor,bpf"
sudo update-grub2
Для запуска с профилем по умолчанию allow или privileged (наименее безопасный профиль):
docker run --name bpflock -it --rm --cgroupns=host \
--pid=host --privileged \
-v /sys/kernel/:/sys/kernel/ \
-v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock