Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[Mini-Howto] dm-crypt verschlüsseltes /home: initscript
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Deutsche Dokumentation
View previous topic :: View next topic  
Author Message
Moorenkopf
Apprentice
Apprentice


Joined: 18 Apr 2004
Posts: 189
Location: NRW

PostPosted: Mon Apr 03, 2006 11:59 pm    Post subject: [Mini-Howto] dm-crypt verschlüsseltes /home: initscript Reply with quote

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 :D) 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
View user's profile Send private message
Perfect_P
Tux's lil' helper
Tux's lil' helper


Joined: 21 Apr 2005
Posts: 103

PostPosted: Tue Apr 11, 2006 8:55 am    Post subject: Reply with quote

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
View user's profile Send private message
Moorenkopf
Apprentice
Apprentice


Joined: 18 Apr 2004
Posts: 189
Location: NRW

PostPosted: Tue Apr 11, 2006 7:42 pm    Post subject: Reply with quote

Ist in der Tat eine schöne Sache so als initscript, danke.
Hab' da aber trotzdem noch was dran verändert :D :
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
View user's profile Send private message
Perfect_P
Tux's lil' helper
Tux's lil' helper


Joined: 21 Apr 2005
Posts: 103

PostPosted: Wed Apr 12, 2006 9:12 am    Post subject: Reply with quote

Moorenkopf wrote:
Ist in der Tat eine schöne Sache so als initscript, danke.
Hab' da aber trotzdem noch was dran verändert :D :
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
View user's profile Send private message
Roc
n00b
n00b


Joined: 19 Jul 2002
Posts: 35

PostPosted: Tue May 30, 2006 2:39 pm    Post subject: Reply with quote

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
View user's profile Send private message
Moorenkopf
Apprentice
Apprentice


Joined: 18 Apr 2004
Posts: 189
Location: NRW

PostPosted: Tue May 30, 2006 4:07 pm    Post subject: Reply with quote

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
View user's profile Send private message
Roc
n00b
n00b


Joined: 19 Jul 2002
Posts: 35

PostPosted: Tue May 30, 2006 9:27 pm    Post subject: Reply with quote

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
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Deutsche Dokumentation All times are GMT
Page 1 of 1

 
Jump to:  
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