Данный курсач реализует модуль безопасности ядра. Он следит за процессами (для которых он включен) и смотрит чтобы они никуда не лазяли по типу вне директории, к сторонним айпишникам и портам, к неразрешенным сокетам, пайпам, или обычным файлам.
Управление с помощью sequence file.
echo "restrict 9999" > /proc/mylsm/mylsm
echo "allow_ip 9999 127.0.0.1:80" > /proc/mylsm/mylsm
echo "allow_file 9999 /path/to/file regular" > /proc/mylsm/mylsm # regular unix file
echo "allow_file 9999 /path/to/file.sock unix_socket" > /proc/mylsm/mylsm
echo "allow_file 9999 /path/to/file.pipe pipe" > /proc/mylsm/mylsm
echo "allow_directory 9999 /path/to/directory" > /proc/mylsm/mylsm
cat /proc/mylsm/mylsm
echo "info_pids 0" > /proc/mylsm/mylsm
cat /proc/mylsm/mylsm
echo "info_restriction 9999" > /proc/mylsm/mylsm
cat /proc/mylsm/mylsm
Terminal apps:
# ssh window 1
python ./python_tests/restrict_me.py
# ssh window 2
python ./python_tests/restricter.py
Способ описанный tut не предполагает загружаемый модуль. Он предполагает встроенный модуль. В ядро. С перекомпиляцией ядра.
Идеологически они одинаковые только у этого модуля нет метода exit, и выгрузить его не получится.
- Скачал Linux с Kernel Security Subsystem из git.kernel.org, следуя инструкции из KernSec
- Сделал git checkout на next-testing (!!!!!), версия ядра 5.18. next-general у меня не компилировался.
- Make kernel:
make x86_64_config
make kvm_guest.config
make -j12
- Build virtual machine:
Последовал этому видосу Пришлось поставить пару пакетов и создать несколько файлов.
git clone https://github.com/bgmerrell/vkerndev
cd vkerndev
./make_vm.py
./run_vm.py --kernel ./path/to/linux/arch/x86/boot/bzImage --kernel-header ./path/to/linux/usr/include
Следую этому видосу youtube.
- Сделал свою папку внутри
/linux/security
: mylsm
Создал Kconfig, makefile, my_secutiry_lsm.c
/linux/security/mylsm/Kconfig:
config SECURITY_MYLSM
bool "MYLSM support"
depends on SECURITY
default n
help
This is isolation software developed by Mikhail Scherbina
/linux/security/mylsm/Makefile:
obj-$(CONFIG_SECURITY_MYLSM) := mylsm.o
mylsm-y: mylsm.o
/linux/security/mylsm/mylsm.c:
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/printk.h>
#include <linux/lsm_hooks.h>
#include <linux/kern_levels.h>
#include <linux/binfmts.h>
static int my_test_bprm_check_security(struct linux_binprm *bprm)
{
printk(KERN_ERR "Hello from mylsm: %s\n", bprm->interp);
return 0;
}
static struct security_hook_list my_test_hooks[] __lsm_ro_after_init = {
LSM_HOOK_INIT(bprm_check_security, my_test_bprm_check_security),
};
static int __init my_test_init(void)
{
printk(KERN_ERR "mytest: We are going to do things\n");
security_add_hooks(my_test_hooks, ARRAY_SIZE(my_test_hooks), "my_test");
return 0;
}
DEFINE_LSM(mylsm) = {
.name = "mylsm",
.init = my_test_init,
};
Добавил в /linux/.config:
CONFIG_SECURITY_MYLSM=y
...
Добавил в /linux/security/Kconfig:
CONFIG_SECURITY_MYLSM=y
...
source "security/lockdown/Kconfig"
source "security/landlock/Kconfig"
source "security/mylsm/Kconfig"
Добавил в /linux/security/makefile:
obj-$(CONFIG_BPF_LSM) += bpf/
obj-$(CONFIG_SECURITY_LANDLOCK) += landlock/
obj-$(CONFIG_SECURITY_MYLSM) += mylsm/
make menuconfig
secutity options ->
MY LSM support <- tick yes
(большой лист с landlock,lockdown,yama,loadpin) <- добавил туда свой модуль mylsm
После этого надо бы перебилдить всё:
make -j12 bzImage
Теперь при запуски qemu с кернелом видны собщения из ядра.