View previous topic :: View next topic |
Author |
Message |
Moorenkopf Apprentice
Joined: 18 Apr 2004 Posts: 189 Location: NRW
|
Posted: Mon Apr 03, 2006 11:59 pm Post subject: [Mini-Howto] dm-crypt verschlüsseltes /home: initscript |
|
|
Hi,
ich habe meine /home-Partition mit dm-crypt und luks verschlüsselt und will anderen nicht vorenthalten, wie ich das mounten und umounten automatisiert habe. (Hier der Thread zu dem Problem, was ich hatte: https://forums.gentoo.org/viewtopic-p-3228740.html)
Die Howtos, mit denen ich dm-crypt, luks und das (mein erstes ) Bask-Script an's Laufen bekommen hab':
http://de.gentoo-wiki.com/DM-Crypt
http://gentoo-wiki.com/SECURITY_System_Encryption_DM-Crypt_with_LUKS
http://gentoo-wiki.com/TIP_Script_to_unmount_Busy_Devices
Die Kurzfassung der Installation von dm-crypt:
Quote: | # /sbin/badblocks -c 10240 -s -w -t random -v /dev/sda4
Kernel vorbereiten
Module laden
# modprobe dm-crypt
# modprobe sha256
# modprobe blowfish (oder: aes)
# echo dm-crypt >> /etc/modules.autolaod.d/kernel-2.6
# emerge -p cryptsetup-luks
# /bin/cryptsetup -c blowfish-cbc-essiv:sha256 -y -s 256 luksFormat /dev/sda4
# /bin/cryptsetup luksOpen /dev/sda4 localcrypt
# mkreiserfs /dev/mapper/localcrypt
# mount -t reiserfs /dev/mapper/localcrypt /mnt/localcrypt
nach dem umounten: # /bin/cryptsetup luksClose localcrypt
erneutes öffnen:
# /bin/cryptsetup luksOpen /dev/sda4 localcrypt
# mount -t reiserfs /dev/mapper/localcrypt /mnt/localcrypt
/etc/fstab:
/dev/mapper/localcrypt /home reiserfs noatime,noauto 0 0 |
Automatisches mounten:
Dazu verwende ich local.start und local.stop aus /etc/conf.d.
local.start
Code: | /bin/cryptsetup luksOpen /dev/sda4 localcrypt && mount /home |
local.stop
Code: | #moo_umount
#Quelle der Schleifenbedingung (wie gesagt, mein erstes Bashscript): http://gentoo-wiki.com/TIP_Script_to_unmount_Busy_Devices
#Mountpoint
mntp=/home
#sleep
sec=5
#Versuche bis zum fuser -ki $mntp
max_count=8
count=0
umountret=`umount $mntp 2>&1`
while [ `echo $umountret | grep busy | wc -l` -gt 0 ]; do
let count=count+1
echo "moo_umount $mntp: Try No. $count"
if [ $count == $max_count ];
then
fuser -ki $mntp 2>&1
count=0;
fi
echo "moo_umount $mntp: Device busy -> sleep $sec"
sleep $sec 2>&1
umountret=`umount $mntp 2>&1`
done
echo "moo_umount $mntp: Successfully umounted $mntp"
/bin/cryptsetup luksClose localcrypt |
Das Script in local.stop versucht immer $max_counts mal ein normales "umount $mntp", schlägt dies fehl, so wird "fuser -ki $mntp" ausgeführt, was alle Prozesse die noch auf den Mountpoint zugreifen beenden sollte.
Nach jedem Versuch wird $sec Sekunden pausiert, weil sich (zumindest bei mir) alle Prozesse nach kurzer Zeit von selbst beenden.
Ein "cd /" vor dem herunterfahren macht sich übrigens auch gut (Stichwort: alias).
Ich hoffe ich konnte helfen, Moorenkopf
Last edited by Moorenkopf on Tue Apr 11, 2006 7:43 pm; edited 1 time in total |
|
Back to top |
|
|
Perfect_P Tux's lil' helper
Joined: 21 Apr 2005 Posts: 103
|
Posted: Tue Apr 11, 2006 8:55 am Post subject: |
|
|
hi,
cooles HowTo. Ich persönlich fänds aber geschickter dass ganze mit nem init.d-File zu realisieren. Hab hier mal dien script in ein init-file ebastelt. Außerdem hab ich am anfang noch ne schleife reingeschrieben. Dies soll verhindern, dass der PC auch bei falschem passwort weiterbootet. Wer dass nicht will, einfach die while schleife löschen. Hier ist das script:
/etc/init.d/luks_mount: | #!/sbin/runscript
# Vars
mapdevice=system2;
mntpnt=/mnt/system2;
mntdev=/dev/sda6;
#sleep
sec=5;
#Versuche bis zum fuser -ki $mntp
max_count=8;
start() {
ebegin "Mounting LUKS loopback device ...";
sleep 1;
cryptsetup -y luksOpen $mntdev $mapdevice;
while test $? -ne 0; do
cryptsetup -y luksOpen $mntdev $mapdevice
done
mount -t ext3 /dev/mapper/$mapdevice $mntpnt;
eend $?;
}
stop() {
ebegin "Unmounting LUKS loopback device ...";
count=0
umountret=`umount $mntpnt 2>&1`
while [ `echo $umountret | grep busy | wc -l` -gt 0 ]; do
let count=count+1
einfo "$mntpnt: Try No. $count"
if [ $count == $max_count ];
then
fuser -ki $mntpnt 2>&1
count=0;
fi
einfo "$mntpnt: Device busy -> sleep $sec"
sleep $sec 2>&1
umountret=`umount $mntpnt 2>&1`
done
einfo "$mntpnt: Successfully umounted $mntpnt"
/bin/cryptsetup luksClose $mapdevice;
eend $?;
} |
Wenn jemand ein eleganter oder besseres script hat, nur her damit. Natürlich übernehmen ich keinerlei Garantie für das Script .
das ganze könnt ihr dann mit Code: | rc-update add luks_mount default | automatisch starten lassen.
Noch einkleiner Zusatz zum HowTo: Wenn man nicht ne ganze Partition verschlüsseln will, kann man auch nur eine Containerdatei mit LUKS verschlüsseln (luks ist installiert & funktioniert):
1) Einer Containerdatei erzeugen und deren Größe festlegen:
Code: | touch protected
shred -n1 -s50M protected |
2) Eine loopbackdevice erstellen (wenn loop0 schon vergeben ist, nehmt eine andere Nummer):
Code: | losetup /dev/loop0 /path/to/protected |
3) Der Rest ist wie beim HowTo:
Formatieren: Code: | /bin/cryptsetup -c aes-cbc-essiv:sha256 -y -s 256 luksFormat /dev/loop0 |
Öffnen & Mounten: Code: | /bin/cryptsetup luksOpen /dev/loop0 localcrypt && mount /dev/mapper/localcrypt /mnt/localcrypt |
....
(Quelle: http://gentoo-wiki.com/SECURITY_dmcrypt#Using_dmcrypt_with_a_loopback_device)
mfg |
|
Back to top |
|
|
Moorenkopf Apprentice
Joined: 18 Apr 2004 Posts: 189 Location: NRW
|
Posted: Tue Apr 11, 2006 7:42 pm Post subject: |
|
|
Ist in der Tat eine schöne Sache so als initscript, danke.
Hab' da aber trotzdem noch was dran verändert :
Aus Quote: | cryptsetup -y luksOpen $mntdev $mapdevice; | hab' ich Quote: | /bin/cryptsetup luksOpen $mntdev $mapdevice; | gemacht. Das y-Flag ist überflüssig (wenn nicht bitte melden ).
Quote: | mount -t ext3 /dev/mapper/$mapdevice $mntpnt; | wird zu Quote: | mntfs=reiserfs;
mount -t $mntfs /dev/mapper/$mapdevice $mntpnt; | , ich hab' schließlich kein ext3
Und was man vielleicht auch noch erwähnen sollte, vor dem rc-update muss das Script ausführbar sein: Code: | # chmod +x /etc/init.d/luks_mount
# rc-update add luks_mount default |
So, das waren erstmal meine Änderungen, wenn ich aus Italien zurück bin fällt mir vielleicht noch mehr ein, als bis dann, Moorenkopf
/etc/init.d/luks_mount
Code: | #!/sbin/runscript
# Vars
mapdevice=localcrypt;
mntpnt=/home;
mntdev=/dev/sda4;
mntfs=reiserfs;
#sleep
sec=5;
#Versuche bis zum fuser -ki $mntp
max_count=8;
start() {
ebegin "Mounting LUKS loopback device";
sleep 1;
/bin/cryptsetup luksOpen $mntdev $mapdevice;
while test $? -ne 0; do
/bin/cryptsetup luksOpen $mntdev $mapdevice
done
mount -t $mntfs /dev/mapper/$mapdevice $mntpnt;
eend $?;
}
stop() {
ebegin "Unmounting LUKS loopback device";
count=0
umountret=`umount $mntpnt 2>&1`
while [ `echo $umountret | grep busy | wc -l` -gt 0 ]; do
let count=count+1
einfo "$mntpnt: Try No. $count"
if [ $count == $max_count ];
then
fuser -ki $mntpnt 2>&1
count=0;
fi
einfo "$mntpnt: Device busy -> sleep $sec"
sleep $sec 2>&1
umountret=`umount $mntpnt 2>&1`
done
einfo "$mntpnt: Successfully umounted $mntpnt"
/bin/cryptsetup luksClose $mapdevice;
eend $?;
} |
Last edited by Moorenkopf on Mon Apr 24, 2006 10:41 am; edited 1 time in total |
|
Back to top |
|
|
Perfect_P Tux's lil' helper
Joined: 21 Apr 2005 Posts: 103
|
Posted: Wed Apr 12, 2006 9:12 am Post subject: |
|
|
Moorenkopf wrote: | Ist in der Tat eine schöne Sache so als initscript, danke.
Hab' da aber trotzdem noch was dran verändert :
Aus Quote: | cryptsetup -y luksOpen $mntdev $mapdevice; | hab' ich Quote: | /bin/cryptsetup luksOpen $mntdev $mapdevice; | gemacht. Das y-Flag ist überflüssig (wenn nicht bitte melden ). | Nein, du hast recht -y ist bei DM-crypt nötig, nciht bei LUKS. DAs kommt davon wenn man 10Tabs im Beowser offen hat
Moorenkopf wrote: | Quote: | mount -t ext3 /dev/mapper/$mapdevice $mntpnt; | wird zu Quote: | mntfs=reiserfs;
mount -t $mntfs /dev/mapper/$mapdevice $mntpnt; | , ich hab' schließlich kein ext3 | gute Idee
mfg |
|
Back to top |
|
|
Roc n00b
Joined: 19 Jul 2002 Posts: 35
|
Posted: Tue May 30, 2006 2:39 pm Post subject: |
|
|
Ich habe das ganze hier bei mir auch soweit recht gut ans laufen bekommen, allerdings gibt es noch ein kleines Problem.
Ich möchte z.B. auch die Apache-DocRoot oder die MySQL-DB auf die verschlüsselte /home- Partition bringen. Dazu ist es erforderlich, dass /etc/init.d/luks_mount auf jeden Fall ausgeführt wird, bevor Apache, MySQL und dergleichen gestartet werden.
Dazu habe ich das Initscript anstatt in den Runlevel default in den den runlevel boot eingetragen. Beim Starten klappt das auch schon wie gewünscht. Beim Shutdown wird jedoch /home geunmountet bevor die abhängigen Dienste gestoppt werden.
Eigentlich müsste sich da doch über einen Eintrag depend() am Anfang des Skripts das gewünschte Verhalten erreichen lassen, oder? Habe das auch schon mit verschiedenen Optionen versucht, aber irgendwie klappt es nicht wie erwartet.
Jemand eine Idee? |
|
Back to top |
|
|
Moorenkopf Apprentice
Joined: 18 Apr 2004 Posts: 189 Location: NRW
|
Posted: Tue May 30, 2006 4:07 pm Post subject: |
|
|
Habe das noch nie gemacht, aber eigentlich reicht doch ein Blick auf /etc/init.d/apache:
Quote: | depend() {
need net
use mysql dns logger netmount postgresql
after sshd
} |
Wenn man das umändert in sowas, wie Quote: | depend() {
need apache
} | und in luks_mount einbaut sollte das doch kein Problem darstellen.
Gruß, Stefan |
|
Back to top |
|
|
Roc n00b
Joined: 19 Jul 2002 Posts: 35
|
Posted: Tue May 30, 2006 9:27 pm Post subject: |
|
|
Quote: |
depend() {
need apache
}
|
Also wenn ich das richtig verstehe, bewirkt dieser Eintrag genau das Umgekehrte, d.h. luks_mount "benötigt" apache und startet diesen zuerst. Ich habe es auch schon mit "before apache" versucht, aber das klappt leider auch nicht, da das unmounten vor dem Beenden des Apache stattfindet.
Optimal wäre es, wenn man die Abhängigkeit so definieren könnte, das Mount und Unmount unmittelbar vor/nach dem "normalen" Filesystem-Mount der fstab erfolgen. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|