
eBPF 기반의 Linux 시스템 잠금 및 감사 보안 도구입니다. 커널 기능을 제한하고, 파일리스 실행을 차단하며, 메모리를 보호하고, 선언적 프로필을 통해 컨테이너와 IoT 디바이스를 강화합니다.

bpflock - Linux 머신을 잠그고 감사하기 위한 eBPF 기반 보안.
참고: bpflock은 현재 실험 단계에 있으며, 동작이 중단되거나 옵션과 보안 의미가 변경될 수 있으며, 일부 BPF 프로그램은 Cilium ebpf 라이브러리를 사용하도록 업데이트될 예정입니다.
bpflock은 eBPF를 사용하여 Linux 보안을 강화합니다. 다양한 Linux 기능에 대한 접근을 제한함으로써, bpflock은 공격 표면을 줄이고 잘 알려진 공격 기술을 차단할 수 있습니다.
호스트 pid 및 네트워크 네임스페이스에서 실행되는 컨테이너 관리자, systemd 및 기타 컨테이너/프로그램과 같은 프로그램만 전체 Linux 기능에 접근할 수 있으며, 자체 네임스페이스에서 실행되는 컨테이너 및 애플리케이션은 제한됩니다.
bpflock bpf 프로그램이 restricted 프로필에서 실행되는 경우, 권한 있는 프로그램/컨테이너를 포함한 모든 프로그램/컨테이너의 접근이 거부됩니다.
bpflock은 Linux Security Modules + BPF를 포함한 여러 보안 기능을 활용하여 Linux 머신을 보호합니다.
아키텍처 및 보안 설계 참고 사항:
bpflock은 다음과 같이 분류할 수 있는 여러 보안 보호 기능을 제공합니다:
파일시스템 보호
네트워크 보호
bpflock은 보안 의미론을 간단하게 유지합니다. 보안 스펙트럼을 광범위하게 포괄하고 특정 Linux 기능에 대한 접근을 제한하기 위해 세 가지 전역 프로필을 지원합니다.
profile: bpf 프로그램별로 적용할 수 있는 전역 프로필이며, 다음 중 하나를 취합니다:
allow|none|privileged : 동일하며, 가장 덜 안전한 프로필을 정의합니다. 이 프로필에서는 모든 프로세스에 대해 접근이 기록되고 허용됩니다. 보안 이벤트를 기록하는 데 유용합니다.baseline : 제한적인 프로필로, 호스트 네임스페이스에서 실행되는 권한 있는 애플리케이션 및 컨테이너, 또는 bpflock_cgroupmap bpf 맵의 cgroup별 허용 프로필을 제외한 모든 프로세스에 대해 접근이 거부됩니다.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\"'"
Ubuntu에서 BPF LSM을 활성화하려면 예를 들어:
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
파일리스 바이너리 실행을 로깅하고 제한하려면 다음을 실행하세요:
docker run --name bpflock -it --rm --cgroupns=host --pid=host --privileged \
-e "BPFLOCK_FILELESSLOCK_PROFILE=restricted" \
-v /sys/kernel/:/sys/kernel/ \
-v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock
restricted 프로필로 실행할 때 컨테이너 로그에는 다음이 표시됩니다:
time="2022-02-04T14:54:33Z" level=info msg="event=syscall_execve tgid=1833 pid=1833 ppid=1671 uid=1000 cgroupid=8821 comm=loader pcomm=bash filename=./loader retval=0" bpfprog=execsnoop subsys=bpf
time="2022-02-04T14:54:33Z" level=info msg="event=lsm_bprm_creds_from_file tgid=1833 pid=1833 ppid=1671 uid=1000 cgroupid=8821 comm=loader pcomm=bash filename=memfd:memfd-test retval=-1 reason=denied (restricted)" bpfprog=filelesslock subsys=bpf
time="2022-02-04T14:54:33Z" level=info msg="event=syscall_execve tgid=1833 pid=1833 ppid=0 uid=1000 cgroupid=8821 comm= pcomm= filename=/proc/self/fd/3 retval=-1" bpfprog=execsnoop subsys=bpf
restricted 프로필로 실행하면 문제가 발생할 수 있으므로 기본 프로필은 allow입니다.
커널 모듈 보호를 적용하려면
환경 변수 BPFLOCK_KMODLOCK_PROFILE=baseline 또는 BPFLOCK_KMODLOCK_PROFILE=restricted로 실행하세요:
docker run --name bpflock -it --rm --cgroupns=host --pid=host --privileged \
-e "BPFLOCK_KMODLOCK_PROFILE=restricted" \
-v /sys/kernel/:/sys/kernel/ \
-v /sys/fs/bpf:/sys/fs/bpf linuxlock/bpflock
예제:
$ sudo unshare -p -n -f
# modprobe xfs
modprobe: ERROR: could not insert 'xfs': Operation not permitted
time="2022-02-07T06:50:25+01:00" level=info msg="event=syscall_execve tgid=52323 pid=52323 ppid=52288 uid=0 cgroupid=7014 comm=modprobe pcomm=bash filename=/usr/sbin/modprobe retval=0" bpfprog=execsnoop subsys=bpf
time="2022-02-07T06:50:25+01:00" level=info msg="event=lsm_kernel_read_file operation=loading module tgid=52323 pid=52323 ppid=52288 uid=0 cgroupid=7014 comm=modprobe pcomm=bash filename=xfs.ko retval=-1 reason=denied (restricted)" bpfprog=kmodlock subsys=bpf