Современные дистрибутивы, позиционирующие себя как безопасные, меня не устраивают. У всех есть неприемлемые проблемы: ограниченный функционал без возможности добавляния нового, принуждение к использованию определённого софта, закрытый код и гнилая документация. В этой статье я покажу, как собрать LiveCD с функцией amnesia (полной выгрузкой системы в ram, ramroot).
Также я расскажу, как избежать некоторых ошибок, допущенных в других дистрибутивах.
Cтатью пишу на этой ОС. Отныне и выход на форум буду осуществлять исключительно через неё.
Спойлер: Критика
Если вы используете операционную систему, ориентированную на защиту от цифровой криминалистики, то это почти наверняка будет Tails, Whonix или QubesOS. У каждой ОС основной спонсор - OTF (Open Technology Fund), который получает значительную часть финансирования от государства через USAGM (40 млн в 2023 году). Документация расплывчата, разобраться сложно. Частенько возникает 404 даже на очень важных ссылках. Больше всего меня смущают технические проблемы, из-за которых и была написана эта статья. ОС принуждают использовать Tor. К Tor есть претензии - в ряде случаев его применение неуместно и может критически навредить безопасности, а отключение Tor затруднительно или вовсе невозможно (ломает дистрибутив). Более того, Tor блокируют в ряде стран, что делает дистрибутивы полносью бесполезными. При работе в виртуальной машине возможен взлом путём обхода самой виртуализации, ну или если сам хост был взломан. В случае LiveCD, на примере Tails, при извлечении флешки ОС перестаёт работать, шифруя свою оперативную память и вызывая kernel panic. Да, затирание RAM в случае угрозы - это круто, но вместо индикатора опасности могло бы быть не извлечение флешки, а, например, комбинация клавиш. Если ПК будет взломан во время сессии и в него будет подключена флешка - данные на ней могут быть перезаписаны. Этого бы не произошло при её извлечении, чего не позволяет дистрибутив. Хлам. ОС не должна оставлять следов, поэтому должна полностью работать в RAM. Однако огромное количество ненужного ПО расходует память, а также увеличивает возможности для атаки! Мои цели: ОС должна быть простой и минималистичной; всё, что может быть постоянным хранилищем, должно быть изъято после запуска; установка нового ПО должна быть простой; всё ПО - open source. В качестве базового дистрибутива для форка я взял Gentoo Stage3.
Спойлер: Установка ОС
Спойлер: Разметка диска
Смотрим разделы, выбираем имя целевого раздела (в примере /dev/sdX) lsblk Создаём новую разметку. 1:EF02 - BIOS 10 мб 2:EF00 - EFI 500мб 3:8300 - всё остальное место под корень sgdisk -o -n 1:0:+10M -t 1:EF02 -n 2:0:+500M -t 2:EF00 -n 3:0:0 -t 3:8300 /dev/sdX Форматируем ESP в FAT32 (для UEFI) mkfs.fat -F32 /dev/sdX2 Создаём EXT4 и ставим метку OS_ROOT mkfs.ext4 -L OS_ROOT /dev/sdX3 Монтируем корень в /mnt и ESP в /mnt/boot mkdir /mnt mount /dev/sdX3 /mnt mkdir /mnt/boot mount /dev/sdX2 /mnt/boot
Спойлер: Заливка stage3
Качаем stage3 (минимальный набор) из https://distfiles.gentoo.org/releases/amd64/autobuilds/current-stage3-amd64-openrc/ cd /mnt wget https://distfiles.gentoo.org/releases/amd64/autobuilds/current-stage3-amd64-openrc/stage3-amd64-openrc-20250817T170357Z.tar.xz tar xpvf stage3-amd64-openrc-20250817T170357Z.tar.xz --xattrs-include='*.*' --numeric-owner Пробрасываем proc/sys/dev в корень и копируем DNS. mount -t proc /proc /mnt/proc mount --rbind /sys /mnt/sys mount --rbind /dev /mnt/dev cp -L /etc/resolv.conf /mnt/etc/ Заходим в окружение и подгружаем переменные профиля. chroot /mnt /bin/bash source /etc/profile
Спойлер: Настройка Portage
-systemd - без systemd
-elogind - без логин-демона
USE="-systemd -elogind X dbus udev"
Получаем снапшот ebuild и синхронизируем зеркала
emerge-webrsync
emerge --sync
Ставим OpenRC
emerge -av openrc
rc-update add local default
Спойлер: Ядро
Ставим исходники и настраиваем ядро. Включаем: TMPFS - корень в RAM. OverlayFS - для оверлея. BLK_DEV_INITRD - поддержка initramfs SQUASHFS (на live) emerge -av gentoo-sources cd /usr/src/linux* make menuconfig Сборка и установка ядра, модулей make -j$(nproc) make modules_install make install
Спойлер: Собираем initramfs
mkdir -p /root/initramfs/{bin,sbin,etc,proc,sys,newroot,mnt}
emerge -av busybox
cp -a /bin/busybox /root/initramfs/bin/
for i in sh mount switch_root rsync blkid; do ln -s busybox /root/initramfs/bin/$i; done
Скрипт для инициализации initramfs:
nano /root/initramfs/init
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sys /sys
mount -t devtmpfs dev /dev
ROOTDEV="$(blkid -L OS_ROOT)"
[ -z "$ROOTDEV" ] && exec sh
mount -o ro "$ROOTDEV" /newroot || exec sh
echo "Копирование в RAM"
mount -t tmpfs -o size=6G tmpfs /mnt #Свой размер
rsync -aHx --exclude=/proc --exclude=/sys --exclude=/dev /newroot/ /mnt/ || exec sh
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
echo "Переключение в RAM root"
exec switch_root /mnt /sbin/init
chmod +x /root/initramfs/init
cd /root/initramfs
find . -print0 | cpio --null -ov --format=newc | gzip -9 > /boot/initramfs.img
Спойлер: Загрузчик
UEFI в ESP как removable (будет грузиться без записи в NVRAM)
Генерируем конфиг
grub-mkconfig -o /boot/grub/grub.cfg
Спойлер: Cервисы и графика
emerge -av sys-apps/dbus
rc-update add dbus default
Драйверы и сервер X, мета xfce.
emerge -av x11-base/xorg-drivers x11-base/xorg-server
emerge -av xfce-base/xfce4-meta
Slim будем использовать как дисплей менеджер.
emerge -av x11-misc/slim
rc-update add slim default
Создаём пользователя, даём права wheel, прописываем запуск XFCE при startx/slim.
useradd -m -G users,wheel neko
passwd neko
echo "exec startxfce4" > /home/neko/.xinitrc
chown neko:neko /home/neko/.xinitrc
chmod 644 /home/neko/.xinitrc
Автовход юзеру и старт XFCE.
nano /etc/slim.conf
default_user neko
login_cmd exec startxfce4
Спойлер: fstab
Все данные в этих точках теряются!
Для примера:
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
tmpfs /var tmpfs defaults,noatime,mode=1777 0 0
tmpfs /home tmpfs defaults,noatime,mode=1777 0 0
Спойлер: Дополнительное ПО
emerge -av net-vpn/tor www-client/firefox app-crypt/kleopatra
В список не стоит добавлять ненужные пакеты, старайтесь избегать этого.
Спойлер: Возможно полезный бонус
Я написал небольшой bash скрипт который очень надёжно шифрует данные, хоть и очень медленно (не помеха, если файл, это всего лишь txt пароли :)).
Небольшая фича!
Если в файл добавить новые данные, они будут дозаписаны в зашифрованном виде, при этом уже зашифрованные данные не изменяются.
nano scr.sh
#!/bin/bash
read -p "Действие (e/d): " act
read -p "Файл: " file
read -s -p "Пароль: " pass
echo
gen_hash() {
sec="$pass"; hash=""
for ((i=0;i<$1;i++)); do
h=$(echo -n "$sec" | sha512sum | awk '{print $1}')
hash+=${h:0:1}
sec=${h:1:128}
done
echo "$hash"
}
if [[ "$act" == "e" ]]; then
hex=$(base32 "$file" | od -An -tx1 | tr -d ' \n')
hash=$(gen_hash ${#hex})
enc=""
for ((i=0;i<${#hex};i++)); do
c=$((0x${hex:i:1}+0x${hash:i:1}))
((c>15)) && c=$((c-16))
enc+=$(printf "%x" $c)
done
echo "$enc" > enc.txt
echo "Готово! Принимай enc.txt"
elif [[ "$act" == "d" ]]; then
hex=$(tr -d '\n' < "$file")
hash=$(gen_hash ${#hex})
dec=""
for ((i=0;i<${#hex};i++)); do
c=$((0x${hex:i:1}-0x${hash:i:1}))
((c<0)) && c=$((c+16))
dec+=$(printf "%x" $c)
done
echo "$dec" | xxd -r -p | base32 -d > dec.txt
echo "Готово! Принимай dec.txt"
else
echo "Буквочка 'e' для шифрования, а 'd' для дешифровки."
fi
Пример вывода (пароль selfcare):
8e6458f072747e130c847cd0842a5a54cd1e953e34335b4ac1e5d646ca05d91e3a544fe1f6f6a967ee565e767d246fa2affe732d044794e3ac32b28b5eef6ef366f3fb5b0a093604681d5add049f478df2df58e4f2a38dacb961d76d71986c9bb6bd906e49fbe1006561c99f6fb66ffe4d2ea433768943125f50f18707e13ee1569b8315675cecb65bd651675d55b099d749
Пример вывода (пароль - 0; данные - нули):
780f4755cb2dcdce79419ef245cbb40608b31b6ba660b80b11bc5e3a04c7c49dbab9b317c06d3949b62830775e22de2a809d4dd69aee345c0f4d19
Я планирую постепенно совершенствовать эту ОС, добавляя всё новые и новые функции!
LIMB