Azután letisztogattam az sda1-et, hogy nehezebb legyen törni:
shred -nvz 2 /dev/sda1
Ez eltartott egy ideig... :)
Elkészítetem a kulcsot:
nano -w mypasswd
sha256 < mypasswd > root.key
Eztan elkészítettem a titkosított rendszert:
cryptsetup -c aes-cbc-plain -d mypasswd create root /dev/sda1
mkfs.ext3 /dev/mapper/root
persze használhatsz más titkosítást (aes) és filerendszert (ext3) is, de akkor majd az initramfs-be más modulok kellenek
mount /dev/mapper/root /mnt
cp -axv / /mnt
Egy kicsit át kell állítgatni a dolgokat ott benn
az fstab-ban a root-ot át kel írni
/dev/sda3 ról /dev/mapper/root-ra és fájlrendszert is, amire formáztad
Na cool!, ezzel is megvagyunk, már csak az kell, hogy el is induljon a gép
Én rámásoltam a root.key-t egy usb-re (/./keys/root.key ) erre a szcenárióra történnek majdan a dolgok.:)
Szóval csinálni kéne egy egy initramfs-t, ami elérhetővé teszi a titkosított fs-t meg be is bootolja a rendszert.
Olvastam mindenféle leírásokat volt, aki nem nem csinált semmi ilyesmit (kipróbáltam nem működött), mások meg kézzel álltak neki (nekem az sem igazán ment). Fontos, hogy az initramfs - ha jól tudom - csak az újabb 2.6-os kernelelekben jelent meg.
Gondoltam, nem fogok szerencsétlenkedni azzal, hogy elkészítsek egy ilyesmit, hanem:
mkdir initrd
cd initrd
zcat /boot/initrd.img-2.6.15-27-server | cpio -i
Bemásoltam a szükséges modulokat (mivel az Ubuntu olyan... moduláris - hehe)
cp -R /lib/modules/..../fs/vfat lib/modules/..../fs
...
(amik kellenek: fat, vfat, az össes nls, ext3 - vagy amilyen filrendszert akarsz a root-nak, aes, dm-mod, dm-crypt, dm-bbr <-- ez nem biztos.)
Aztán a futtathatókat:
cp /bin/ ls bin
... stb (ls, cryptsetup, head )
ldd /bin/ ls
és akkor átmásoltam azokat a könyvtárakat is, amik ezeknek a parancsoknak kellenek
Na már csak meg kellett írnom, hogy beolvassa az USB-ról a kulcs fájlt, felállítsa a rootfs-t és utána folytathatja a normál boot-ot.
Ehhez - hosszas kutakodás után - a scripts/local fájlt kellett módosítanom
Itt pedig a..., vagyis inkább inkább beillesztem a fájlt
# Local filesystem mounting -*- shell-script -*-
# Parameter: Where to mount the filesystem
mountroot ()
{
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-top"
run_scripts /scripts/local-top
[ "$quiet" != "y" ] && log_end_msg
# If the root device hasn't shown up yet, give it a little while
# to deal with removable devices
if [ ! -e "${ROOT}" ]; then
log_begin_msg "Waiting for root file system..."
if [ -x /sbin/usplash_write ]; then
/sbin/usplash_write "TIMEOUT 180" || true
fi
slumber=1800
while [ ${slumber} -gt 0 -a ! -e "${ROOT}" ]; do
/bin/sleep 0.1
slumber=$(( ${slumber} - 1 ))
done
if [ ${slumber} -gt 0 ]; then
log_end_msg 0
else
log_end_msg 1 || true
fi
if [ -x /sbin/usplash_write ]; then
/sbin/usplash_write "TIMEOUT 15" || true
fi
fi
# We've given up, but we'll let the user fix matters if they can
while [ ! -e "${ROOT}" ]; do
panic "ALERT! ${ROOT} does not exist. Dropping to a shell!"
done
# Get the root filesystem type
eval $(fstype < ${ROOT})
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-premount"
run_scripts /scripts/local-premount
[ "$quiet" != "y" ] && log_end_msg
if [ ${readonly} = y ]; then
roflag=-r
else
roflag=-w
fi
# FIXME This has no error checking
FSTYPE=ext3
modprobe -Qb ${FSTYPE}
# try mount usb
modprobe -Qb ohci-hcd
modprobe -Qb ehci-hcd
modprobe -Qb fat
modprobe -Qb vfat
modprobe -Qb aes
rmmod usb_storage > /dev/null
USBDEV=`ls /dev/sd*1 | head -n1`
modprobe -Qb usb-storage
echo "********** Please insert the USB key! **********"
while [ `ls /dev/sd*1 | head -n1` = "$USBDEV" ]; do
/bin/sleep 0.1
done
USBDEV=`ls /dev/sd*1 | head -n1`
mkdir -p __a
mount ${USBDEV} __a -tvfat
modprobe dm-mod
modprobe dm-crypt
modprobe dm-bbr
sleep 1
[ "$quiet" != "y" ] && log_begin_msg "Try decrypt root file system..."
if [ ! -e ./__a/.keys/root.key ]; then # <-- itt at lehet irni, ha mashova tettuk a kulcsot
panic "The key file does not exists"
fi
log_end_msg
cryptsetup -c aes-cbc-plain -d __a/.keys/root.key create root ${ROOT}
export ROOT=/dev/mapper/root
umount ./__a
rm -rf ./__a
# FIXME This has no error checking
# Mount root
mount ${roflag} -t ${FSTYPE} ${ROOT} ${rootmnt}
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
run_scripts /scripts/local-bottom
[ "$quiet" != "y" ] && log_end_msg
}
Vastagítottal jelöltem, amit én változtattam. Nem egy hűde jó kód, de megteszi. Ha valakinek van jobb, akkor írjon :)
Ne ezután már csak el kellett készíteni a initramfs-t:
find . | cpio -o -H newc | gzip -n9 > /boot/initrd.img-2.6.15-27-server_e
cp /boot/vmlinuz.img-2.6.15-27-server /boot/vmlinuz.img-2.6.15-27-server_e
dpkg-reconfigure linux-image-2.6.15-27-server
Ekkor bekerül a hozzátartozó grub bejegyzés /boot/grub/menu.lst-be
amit gyorsan át is szerkesztettem:
kernel /vmlinuz-2.6.15-27-server_e root=/dev/sda1 ro quiet splash
-ra
És újra is indíthatjuk a gépet.
Elviekben bebootol a már titkosított root-ra. Már csak a swap-ot kellett hozzáadnom:
Szerkesztettem /etc/crypttab-ot
swap /dev/sda3 /dev/random swap
sort hozzáadtam
aztán az /etc/fstab-ot is
/dev/mapper/swap none swap sw 0 0
Eztán meg megsemmísitettem a nyomokat a swap-on:
shred -z /dev/sda3
/etc/init.d/cryptdisks start
Vegul swapon -a :)
Innen lehet folytatni a telepítést, _de_ minden új kernelnél meg kell csinálni a hozzá tartozó initramfs-t :(
Persze maradtak még támadási felületek:
1. Ha valaki módosítja vagy a kernelt vagy az initrd-t, mert ugye azok egy tikositatlan partíción vannak
Erre talán az lehet megoldás, hogy készítunk az aktuális kernelról és intrd-ról egy md5 sum-ot és minden boot-nál leellenőrizzük, hogy helyes-e. Vagy egyáltlaán nem tároljuk a HDD-n sem a kernelt, sem az initrd-t, hanem azokat is kirakjuk USB-re; Ehhez találtam is egy leírást, mármint az usb-ről botolásról. Áhh, most nem találom :)
Gondolkoztam azon, hogy arra az esetre, ha az ember elvesztené az pendrive-ot, akkor be lehetne építeni a scriptbe egy olyan részt, ami beolvassa stdin-ról a passwd-t és abból generálja le a hash-t. Viszont ekkor egy újabb támadási felületet nyitunk
2. Ha valaki egy hw keyloggert tesz a gépre, leolvashatja a jelszavunkat.
Na ehhez jutott eszembe egy olyan shell script, ami annyit csinál, hogy összegyűjti a használható karaktereket [a-Z0-9_], majd véletlenszerűen hozzájuk rendel egy másik karakter. Ezt kiírja a képernyőre a user meg lenyomja a megfelelő billentyűt. Majd újra generálja ezt a táblázatot. Így végül meglesz beolvassa a jelszót kicsit lassú, de a keyloggerben minden boothoz más és más lesz. ha előre bekéri a jelszó hosszát is, hasonló módon, akkor mindig véletlenszerű jelszavakat generálhatunk, hogy néhány plusz leütést is bekér a usertől.
Na kb. ennyi lenne.
Ahoy!
****** KIEG ******
Köszi, megnéztem és tényleg; a modulok hozzáadásához elég ha az /etc/mkinitramfs/modules -hoz hozzáadom a szükségeseket
a progik és könyvtáraik bepakolászásához pedig ír az ember egy scriptet a /usr/share/initramfs-tools/hooks/ alá. A decrypt részt pedig /etc/initramfs/init-premount/ -ba teszi (abban nem vagyok biztos, hogy milyen néven lenne jó, lehet hogy mindegy, de én valami z-vel kezdődőt csinálnék, hogy biztos legyen, hogy az udev már megy.)
- neuro blogja
- A hozzászóláshoz be kell jelentkezni
- 1680 megtekintés
Hozzászólások
Csak hozz létre egy repo-t a rendszeres make-kpkg eredményeidből, és örülünk... ;)
--
sha
loser.
user.
computer abuser.
http://digitaldynamite.demoscene.hu
- A hozzászóláshoz be kell jelentkezni
initram ujrageneralasahoz:
update-initramfs -u
erdemes atnezned az initramfs-tools csomag fajljait, hatha valahova be tudod haxolni a sajat scriptedet, es akkor eleve tartalmazni fogja. a mindenkepp szukseges kernel modulokat is meg lehet mondani, es akkor azt sem kell kezzel bemasolgatni.
--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
- A hozzászóláshoz be kell jelentkezni
Hát nem'tom. Szerintem nincs túl sok értelme a rendszer teljes titkosításának. Pláne egy "nyíltan hozzáférhető" rendszer esetében. végül is a / bin / ls -t titkosítani mondjuk nem'tom mennyi értelme van... Miért is nem elegendő csak a valóban védendő adatokat tartalmazó particiót (image fájlt) titkosítani ?
--------
Nem a zsömle kicsi, a pofátok nagy...
- A hozzászóláshoz be kell jelentkezni
Maximum abból a szempontból van értelme, hogy a támadó nem tudja eldönteni, hogy milyen verzióju programokat használsz; hogy esetleg később neten keresztül hatoljon be. Bár a kernel így is kinn marad, de erre írtam, hogy lehetne teljesen usb-ről bootoló rendszert is készíteni.
- A hozzászóláshoz be kell jelentkezni
Hát nem'tom... normál körülmények között úgy fér hozzá a cucchoz, hogy elcsórja, merthogy azért a serverlopás/notebooklopás mondjuk a leggyakoribb módja. feltételezve, hogy csak az adatparticiót titkosítod. (így a rendszer frissítés is problémamentes, és a szerintem "felesleges" önszopatás elkerülhető, namost miután elcsórta, már nem fogja tudni elindítani, mivel ugye a feltehetően kritikus adatpartició nem csatol be. tehát a kritikus alkalmazások 0 adattal indulnak el. namost egy ilyen sikertelen csatolás/leállítás/kísérlet nyomai azért nem törölhetőek el nyomtalanul, észrevétlenül.
azt meg hogy visszateszi a cuccost, oda ahonnan elcsórta megint az a probléma, hogy megintcsak nem fogja tudni elindítani, tehát esélye nincs visszaállítani az "eredeti állapotot".
A netes eléréssel rendelkező daemonok (pl. apache) -ról pedig az nmap is bőséges információt szolgáltat, méghozzá "főverziószám" szinten. úgyhogy szerintem innentől a rendszerpartició titkosításával járó hercehurca felesleges önszopatás. főleg mert a rendszerfrissítés nehézkes. és egy kritikus frissítés ilyetén elmaradása, esetleg nagyobb kockázattal is járhat...persze mindenki azt csinál amit akar... :))
én pusztán elmélkedtem.
--------------
Nem a zsömle kicsi, a pofátok nagy...
- A hozzászóláshoz be kell jelentkezni
Azért én az nmap-ben anyira nem bíznék meg. De végülis az a megoldás is jó, amit mondasz. Minden esetre, csak ki akartam próbálni a dolgot; aztán meg jól leírni :)
- A hozzászóláshoz be kell jelentkezni