Datenhaufen zu IT und Elektronik.

Kategorie: ZFS Filesystem (Seite 2 von 3)

FreeBSD / PC-BSD Backup ZFS auf USB HDD

Ich erstelle gerade ein Backup eines Notebooks. Plan ist das dieses Backup auf eine USB Platte geht. Dateisystem ist dabei ZFS…

Ein Backup per zfs send und zfs recv ist kein weiteres Problem und sofort zu erledigen. Ein Detail gibt es aber noch, ich will alles verschlüsselt! Das Notebook selbst besitzt eine full disk encryption. Da Notebook, sowie Datensicherung am Ende an einem nicht 100%tig sicherem Ort liegen werden, muss die Datensicherung ebenfalls vollverschlüsselt sein. Da die freie Version von ZFS leider keine Verschlüsselung bietet, setzte ich hier ebenfalls auf eine geli full disk encryption. So muss ich nur den Schlüssel an einem sicheren Ort aufbewahren und darf das Kennwort nicht vergessen 😉 Beides ist machbar, so kann ich mein Backup also liegen lassen. Greift sich jemand die Platte, wird er die Daten kaum entschlüsseln können \o/

Ich habe folgendes gemacht…

dmesg verrät mir, dass die USB-Platte erkannt wurde:

ugen0.2: <Intenso> at usbus0
umass0: <Intenso External USB 3.0, class 0/0, rev 3.00/5.07, addr 2> on usbus0
umass0:  SCSI over Bulk-Only; quirks = 0x0100
umass0:5:0:-1: Attached to scbus5
da0 at umass-sim0 bus 0 scbus5 target 0 lun 0
da0: <Intenso External USB 3.0 5438> Fixed Direct Access SCSI-6 device
da0: Serial Number 20141231055346
da0: 400.000MB/s transfers
da0: 953869MB (1953525164 512 byte sectors: 255H 63S/T 121601C)
da0: quirks=0x2<NO_6_BYTE>

Als ersten Schritt entferne ich nun per gdisk die voreingerichtete Partitionierung der Platte und erstelle eine neue GPT Partitionstabelle inkl. einer neuen Partition.

geli benötigt einen Schlüssel und dieser besteht am besten aus Zufallsdaten, diese liefert mir /dev/random:

$ dd if=/dev/random of=./backup-key bs=256 count=1

Mit diesem Schlüssel kann ich nun die verschlüsselte geli Partition auf der USB Platte einrichten:

$ geli init -s 4096 -K ./backup-key -l 256 /dev/da0s1
Enter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/da0s1.eli and
can be restored with the following command:

    # geli restore /var/backups/da0s1.eli /dev/da0s1

So, los geht es… Die neue verschlüsselte Partition kann eingehangen werden:

$ geli attach -k ./backup-key /dev/da0s1
Enter passphrase:

Fast geschafft, denn nun lässt sich bereits der ZFS-Pool anlegen:

$ zpool create usb-backup /dev/da0s1.eli

Tja, schon kann ich mit dem Pool arbeiten:

$ zpool list
NAME         SIZE  ALLOC   FREE   FRAG  EXPANDSZ    CAP  DEDUP  HEALTH  ALTROOT
smeerbsd     460G   184G   276G    24%         -    40%  1.00x  ONLINE  -
usb-backup   928G   296K   928G     0%         -     0%  1.00x  ONLINE  -

Ich starte also mal ein initiales Backup:

zfs send -R smeerbsd@auto-2015-05-23-21-00-00 | zfs recv -u usb-backup/notebook

Beim zfs send sorgt die Option -R dafür, dass alles rekursiv gesendet wird. Ich schiebe also mein komplettes Notebook auf den USB-Pool unter das neue Volume usb-backup/notebook. Beim zfs revc sorgt die Option -u dafür, dass die Laufwerke dort nicht gemountet werden. Dieses lässt sich optimieren. So kann man dafür sorgen, dass die Volumes auf der USB-Platte unmountbar sind. Dann hängt zfs diese bei einem neuen Import nicht ein, dieses ist aber eher ein neues Thema 😀

Bei weiteren Backups, muss dann natürlich nur noch die Differenz zwischen den Snapshots übertragen werden. Ebenfalls ein anderes Thema.

Beim Aushängen muss man nun natürlich ein paar Dinge beachten:

– sync erzwingen um alle Daten sicher geschrieben zu wissen.
– zpool exportieren
– geli Partition detachen

$ sync
$ zpool export usb-backup
$ geli detach /dev/da0s1

So, nun natürlich noch den Key an einen sicheren Ort legen. Es sollte ein dritter Ort sein, da er ja zur Entschlüsselung benötigt wird. Auf dem Notebook und auf der Sicherungsplatte liegt er also schlecht 😛

Bei Fragen, einfach melden 😀

FreeBSD ZFS Datensicherung / Backup

Ich muss sicher keinem mehr erzählen, dass ich ein absoluter ZFS Fan bin…. Wie sich Snapshots erstellen und per ssh einfach über das Netzwerk übertragen lassen, habe ich ja bereits vor einigen Jahren beschrieben. In einem Gespräch sind wir vor kurzem auf FlexClone von NetApp gekommen (von wegen Enterprise Storage 😉 ). In diesem Zusammenhang auch irgendwann auf die Art wie ich die Datensicherung auf meinem FreeBSD Notebook machen 🙂

Ich habe einen kleinen Solaris basierten Storageserver. Auf diesen pumpe ich inkrementell das ZFS Home Volume von diesem Notebook. Um euch nicht im Dunkeln zu lassen, beschreibe ich es hier kurz.

Der Ablauf ist im Grunde so:
– Snapshot auf dem Client anlegen.
– Volume auf dem Ziel anlegen.
– Snapshot vom Client per SSH in das Ziel schieben.
– Weitere Snapshots auf dem Client anlegen.
– Die Differenz der Snapshots auf das Volume ins Ziel schieben.

Los gehts!

Erstellen eines Snapshots auf dem Notebook. Dieses definiert damit auch den zu sichernden Stand:

$ zfs snapshot -r tank/usr/home/kernel@-12-10-2014

Nun sollte dieser Snapshot bei einem zfs list aufgelistet werden:

$ zfs list
NAME                                         USED  AVAIL  REFER  MOUNTPOINT
tank                                         107G   109G   144K  none
tank/ROOT                                   8,76G   109G   144K  none
tank/ROOT/beforeUpdate-2014-10-10_20-18-44     8K   109G  5,04G  /mnt
tank/ROOT/beforeUpdate-2014-10-10_21-02-41     8K   109G  5,06G  /mnt
tank/ROOT/beforeUpdate-2014-10-12_17-38-35   136K   109G  8,05G  /mnt
tank/ROOT/default                           8,76G   109G  8,28G  /mnt
tank/ROOT/default@2014-10-10-20:18:44       56,6M      -  5,04G  -
tank/ROOT/default@2014-10-10-21:02:41       31,3M      -  5,06G  -
tank/ROOT/default@2014-10-12-17:38:35        323M      -  8,05G  -
tank/tmp                                     392K   109G   392K  /tmp
tank/usr                                    98,4G   109G   144K  /mnt/usr
tank/usr/home                               97,0G   109G   152K  /usr/home
tank/usr/home/kernel                        97,0G   109G  96,9G 
/usr/home/kernel
tank/usr/home/kernel@-12-10-2014            20,0M      -  96,9G  -
tank/usr/jails                               144K   109G   144K  /usr/jails
tank/usr/obj                                 144K   109G   144K  /usr/obj
tank/usr/pbi                                 144K   109G   144K  /usr/pbi
tank/usr/ports                              1,41G   109G   856M  /usr/ports
tank/usr/ports/distfiles                     582M   109G   582M 
/usr/ports/distfiles
tank/usr/src                                 144K   109G   144K  /usr/src
tank/var                                    9,32M   109G   144K  /mnt/var
tank/var/audit                               160K   109G   160K  /var/audit
tank/var/log                                 356K   109G   356K  /var/log
tank/var/tmp                                8,67M   109G  8,67M  /var/tmp

Sollte ein zfs list keine Snapshots anzeigen, ist dieses sicher beim Pool deaktiviert. In diesem Fall hilft ein:

$ zpool set listsnapshots=on tank

Auf dem Sicherungsziel erstelle ich nun ein neues ZFS Volume, in welches die Sicherung gehen soll:

$ zfs create DatenPool01/Datensicherung/errorlap
$ zfs list DatenPool01/Datensicherung/errorlap
NAME                                  USED  AVAIL  REFER  MOUNTPOINT
DatenPool01/Datensicherung/errorlap   209K  2.56T   209K  /mnt/DatenPool01/Datensicherung/errorlap

Nun kann ich bereits den erstellten Snapshot in dieses neue Volume schieben:

$ zfs send -R tank/usr/home/kernel@-12-10-2014 | ssh
root@solaris-storage.kernel-error.de zfs receive -Fduv DatenPool01/Datensicherung/errorlap
The authenticity of host 'solaris-storage.kernel-error.de (192.168.10.10' can't be
established.
ECDSA key fingerprint is ec:c0:e6:ed:81:b4:16:35:e9:c6:22:f0:a7:f7:ed:d6.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'solaris-storage.kernel-error.de' (ECDSA) to the list of known
hosts.
root@solaris-storage.kernel-error.de's password:
receiving full stream of tank/usr/home/kernel@-12-10-2014 into
DatenPool01/Datensicherung/errorlap/usr/home/kernel@-12-10-2014
received 98.4GB stream in 5298 seconds (19.0MB/sec)

Ist dieses durch, sollte man dieses natürlich am Ziel auch erkennen können:

$ zfs list DatenPool01/Datensicherung/errorlap
NAME                                  USED  AVAIL  REFER  MOUNTPOINT
DatenPool01/Datensicherung/errorlap  97.0G  2.47T   221K  /mnt/DatenPool01/Datensicherung/errorlap

Jetzt ist also bereits eine Vollsicherung im Ziel angekommen. Die weiteren Sicherungen sollen/können nun inkrementell erfolgen. Dazu erstelle ich einen weiteren Snapshot:

$ zfs snapshot -r tank/usr/home/kernel@-12-10-2014-02

Nun kann ich die Differenz dieser beiden Snapshots ins Ziel schieben:

$ zfs send -R -i tank/usr/home/kernel@-12-10-2014
tank/usr/home/kernel@-12-10-2014-02 | ssh root@solaris-storage.kernel-error.de zfs
receive -Fduv DatenPool01/Datensicherung/errorlap
root@solaris-storage.kernel-error.de's password:
Permission denied, please try again.
root@solaris-storage.kernel-error.de's password:
receiving incremental stream of tank/usr/home/kernel@-12-10-2014-02 into
DatenPool01/Datensicherung/errorlap/usr/home/kernel@-12-10-2014-02
received 991MB stream in 59 seconds (16.8MB/sec)

Somit liegt im Ziel nun eine aktuelle Datensicherung. Dieses lässt sich nun natürlich per Script automatisieren und vor allem alle 15 Minuten erstellen, sofern gewünscht! So lassen sich natürlich auch Vollsicherungen des kompletten Notebooks erstellen 🙂

B.t.w.1: NetApp stelle ich hiermit sicher nicht in Frage. Spitzen Produkte, gut durchdacht und toller Service.

B.t.w.2: PC-BSD bietet ein Stück Software mit dem Namen Life Preserver. Mit dessen Hilfe kann man die Snapshots auf seinem kompletten Pool managen und diesen recht einfach per SSH mit einem anderen ZFS System syncen. So zum Beispiel auch mit FreeNAS. Alles lässt sich damit komplett automatisieren. So kann man alle 15 Minuten per SSH seinen kompletten Pool auf sein ZFS Backup schieben. Mit passenden Internetanbindung von überall auf der Welt transparent. Stirbt das System, kann man mit einer Boot CD und einer neuen Platte ganz flott alles wiederherstellen, egal wo man gerade ist 😀 

Fragen? Dann fragen!

Warum keine Windows Server Sicherung?

Eine gute Frage, oder? Nun ja, man bekommt diese tolle Windows Server Image oder Image Server Sicherung ja kostenlos von Microsoft dazu. Mit ihr lassen sich auch tatsächlich komplette Server sichern. Dieses sogar zuverlässig 😀

Ich muss aber sicher nicht erwähnen, dass ich im Grunde keine Ahnung von Microsoft Systemen und vor allem der Windows Server Sicherung habe, oder? Egal, mal weiter! Ich wollte ja die Frage beantworten….

Die Windows Server Sicherung kann nicht mit Bandlaufwerken oder ähnlichem umgehen. Natürlich kann man auf einen Netzwerk Share -eine Freigabe- sichern. Da die Sicherung in diesem Fall leider keine Volume Shadow Copy vom Ziel erstellen kann, würde die laufende Sicherung also die bestehende Überschreiben. Bricht die Sicherung als „unvollständig“ ab, hat man nichts mehr.

Volume Shadow Copy…. Weist man der Windows Server Sicherung ein spezielles Backup Volume zu, gibt es der Windows Sicherung die Möglichkeit solche Schattenkopien vom Ziel anzulegen. Man verliert also bei einer unvollständigen Sicherung nicht unbedingt die alten Sicherungen :-). Damit sind wir also bei einer im Rechner verbauten Platte, einer externen USB Platte (bis hier eine schlechte Idee) oder auch bei einer ISCSI Platte. Ersteinmal ok, oder? Jain, warum erkläre ich später! Erst noch etwas zu den Schattenkopien. Windows selbst hat natürlich die Möglichkeit einzelne Schattenkopie von seinen Dateien anzulegen. Diese werden sogar noch von der Serversicherung gesichert. So könnte man also nach dem Zurückspielen einer Vollsicherung sogar noch zu einem etwas älteren Stand zurückspringen. Denn noch muss zuerst die Vollsicherung zurückgespielt werden und dann geht es auf einen älteren Stand. Das ist im Falle einer Rücksicherung sehr langwierig. Funktioniert denn noch sehr gut…

Vollsicherung… Die Windows Server Sicherung kann nur Vollsicherungen erstellen, also keine inkrementell oder differentielle Datensicherung. Das bedeutet man muss jeden Tag die kompletten Daten zum Sicherungsziel „pumpen“. Nutzt man nun als Ziel ein intelligentes Storage System wie ein NetApp oder ein ZFS basiertes System (Nexenta, OpenIndiana, Solaris, FreeNas)… Vielleicht noch zusammen mit ISCSI…. dann bringen einem sehr viele der feinen Zusatzfunktionen des Storage Servers kaum noch etwas. Mal angenommen man möchte sein Storage System mit einem anderen abgleichen, dann wird ebenfalls wieder alles kopiert, da sich ja leider immer alles ändert. Dumme Sache das 🙁

Möchte man also seine Sicherung nicht im Unternehmen liegen haben (Feuer / Flugzeug / Wasser / ..) würde so jeden Tag die vollständige Sicherung bewegt werden müssen. Denkt man nun an ein paar TB wird schnell klar, das man sich schon extreme Anbindungen an seinen Standort mieten muss, nur um die Sicherung überhaupt in einem gewissen Zeitfenster aus dem Haus zu bekommen.

Hier kommen dann wieder die etwas teureren Sicherungsprogramme anderer Hersteller ins Spiel .-)

Um es also auf den Punkt zu bringen… Die Windows Server Sicherung funktioniert und hält was sie verspricht, ohne die Möglichkeit einer differentielle Sicherung wird sie denn noch von mir in fast allen Fällen eine Abfuhr bekommen.

Oh ja, sobald es die Möglichkeit einer differentiellen Datensicherung gibt, bitte melden!

Linux und die UUID

Ich bin inzwischen ja von ZFS schon sehr verwöhnt… Vor allem was so Dinge angeht sich Kombinationen aus Laufwerk, Partition, Mountpunkt und SATA-Port zu merken. Man denkt einfach nicht mehr darüber nach 🙁 Heute bin ich damit mal wieder auf die Nase gefallen. Ok ok…. Natürlich kann man zur Konfiguration auch einfach die UUID nutzen, diese ist dann eindeutig und man kann ähnlich wie bei ZFS die ganzen Zusammenhänge „vergessen“….. Ich finde die UUID-Geschichte aber anstrengend. Diese viel zu lange Nummer zu tippen geht überhaupt nicht, sich diese erst in Konfigurationsfiles zu schieben und dann…. bäääähhhh. Dann kann ich mir die Nummer auch nur wieder schlecht merken.

Wie auch immer. Der Ansatz ist gut und wenn es Konfiguriert ist, geht es ja auch. Um mir nicht noch ein Komando mehr merken zu müssen friemel ich die Zuordnung UUID ==> Devicename immer wie folgt heraus:

ls -Al /dev/disk/by-uuid/
insgesamt 0
lrwxrwxrwx 1 root root 10 17. Sep 11:26 0e6894c5-1dfd-4fcb-8cc4-12290c28c3dc -> ../../sdb3
lrwxrwxrwx 1 root root 10 17. Sep 11:26 11cc385c-7fcc-4b87-88b9-ebe05af67df8 -> ../../sda1
lrwxrwxrwx 1 root root 10 17. Sep 11:26 2fc86b49-ad36-4755-bd72-aba0ec54f2e4 -> ../../sdb2
lrwxrwxrwx 1 root root 10 17. Sep 11:26 ca266482-0623-43a1-8741-70f8de485023 -> ../../sdb1

Jemand eine bessere Idee? In diesem Sinne….

SSH Host Keys in DNS Zone – sshfp und ggf. DNSSEC

OpenSSH bietet die Möglichkeit die Fingerprints der Host Keys in einer DNS Zone als SSHFP-RECORD zu speichern. Dieses ermöglicht bei einem Verbindungsaufbau, die Fingerprints gegenn welche in der DNS Zone zu validieren. Es kann daher helfen, sich z.B. gegen man in the middle Angriffe zu schützen. Ist die Zone zusätzlich noch per DNSSEC (http://www.kernel-error.de/dnssec) geschützt, hat man schon eine recht hohe Sicherheit gegen solche Angriffe. Dieses zielt hauptsächlich darauf ab, Zugriffe per Kennwort zu sichern. Basiert das Login auf SSH Schlüssel, kann ein Angreifer im seltensten Fall etwas mit den Daten anfangen, dennoch hilft jedes Stückchen mehr Sicherheit! OK, es steht und fällt alles wieder beim Thema DNS, daher bitte auf DNSSEC achten.

Damit SSH auch prüft ob es im DNS einen passenden RECORD gibt muss folgendes in die Konfigurationsdatei /etc/ssh/ssh_config eingetragen werden, sofern man es global für alle Benutzer auf seinem Client aktivieren möchte:

$ echo "VerifyHostKeyDNS yes" >> /etc/ssh/ssh_config

Soll es für die eigene Benutzerumgebung geschehen liegt diese Konfigurationsdatei natürlich unter: ~/.ssh/ssh_config Soll es nur für die aktuelle Sitzung aktiviert werden, lässt es sich als Option einfach mitgeben:

$ ssh -o "VerifyHostKeyDNS=yes" www.kernel-error.de

Baut man nun eine Verbindung auf, fragt OpenSSH den DNS Server ob dieser Informationen zum erwarteten Fingerprint liefern kann. Sind keine Einträge in der DNS Zone vorhanden schaut der Verbindungsaufbau wie folgt aus:

$ ssh -v www.kernel-error.de
OpenSSH_5.5p1 Debian-6+squeeze2, OpenSSL 0.9.8o 01 Jun 2010
.....
DNS lookup error: data does not exist
The authenticity of host 'www.kernel-error.de (2001:7d8:8001:100::dead:beef)' can't be established.
RSA key fingerprint is fc:aa:73:17:bc:6a:0a:4f:af:3a:98:9e:73:b8:c4:68.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)?

Um dieses zu „verbessern“, gibt mehrere Möglichkeiten die SSHFP RR für seine Zone zu erstellen. Es gibt das Programm sshfp…

$ sshfp www.kernel-error.de
www.kernel-error.de IN SSHFP 1 1 f9dfcb6311e31da8c267ae53a5830887bd2bb3b3
www.kernel-error.de IN SSHFP 2 1 97179afabaaf9b68b05dbf1357cffe3de6ce76fe

Dann gibt es unter anderem noch die, von mir präferierte Lösung, direkt per ssh-keygen auf dem Zielhost (Server):

$ ssh-keygen -f /etc/ssh/ssh_host_rsa_key.pub -r www.kernel-error.de.
www.kernel-error.de. IN SSHFP 1 1 47890eecc9a2893061734b07b8f60caa1a856148
www.kernel-error.de. IN SSHFP 1 2 b2518ad49cc2adf517d3f6a9faaf4017abc2c3e33dae0a29c46226e9ff691cd2
$ ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key.pub -r www.kernel-error.de.
www.kernel-error.de. IN SSHFP 3 1 3dd9de0dcf1523341b45a53f1d57043609e26c62
www.kernel-error.de. IN SSHFP 3 2 e1c76bd66b5a0641789b0b37be5b80ae3f6395c1cd2b73cca532a8111c9515b4

Dabei ist der SSHFP-RECORD wie folgt aufgebaut:

Zielhost  ==>  Protrokollart  ==>  RR-Typ  ==> Host-Key Algorithmus ==> Hash-Art des FP ==> Fingerprint

Folgende Host-Key-Algorithmen sind bisher definiert:

  1.  1 ssh-rsa
  2.  2 ssh-dss
  3.  3 ecdsa
  4.  4 ed25519

Hash-Arten des FP sind dabei SHA1 und SHA2(56).  1 wäre dabei SHA1 und 2 logischerweise SHA2

Diese fertigen RECORDS kann man nun in seiner DNS-Zone veröffentlichen, dass die Zone zum Host zu passen hat, muss ich ja sicher nicht mehr erwähnen, oder?

Baut man nun die Verbindung erneut auf, findet OpenSSH auch etwas.

$ ssh -v www.kernel-error.de
OpenSSH_5.5p1 Debian-6+squeeze2, OpenSSL 0.9.8o 01 Jun 2010
.....
debug1: found 2 insecure fingerprints in DNS
debug1: matching host key fingerprint found in DNS
The authenticity of host 'www.kernel-error.de (2001:7d8:8001:100::dead:beef)' can't be established.
RSA key fingerprint is fc:aa:73:17:bc:6a:0a:4f:af:3a:98:9e:73:b8:c4:68.
Matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)?

Natürlich lassen sich die Einträge auch mit dig abrufen:

$ dig +short www.kernel-error.de IN SSHFP
3 1 3DD9DE0DCF1523341B45A53F1D57043609E26C62
3 2 E1C76BD66B5A0641789B0B37BE5B80AE3F6395C1CD2B73CCA532A811 1C9515B4
1 1 47890EECC9A2893061734B07B8F60CAA1A856148
1 2 B2518AD49CC2ADF517D3F6A9FAAF4017ABC2C3E33DAE0A29C46226E9 FF691CD2
SSHFP 7 3 86400 20160307114536 20150313114536 13952 kernel-error.de. hib4uoiPCBlAXytsVHsqvGdGDRPdec42nA2J7IW8mQVV/o7fb5kPfV6J ZIp4D6O0RsSWW++9QzvCd0gHiTQcQLXdpypCoSBbLYGpWnBl3zCk9zFS iLhawl79VFun7xccZU9UjWoHRyrEo5pDfN3heBgT4ycjlB2m0i40D5WQ 25pCh95yAnSB/wchW4MwffDgc+10GrRcpxWL662k6pFRpLFHsDZ2YS6c zYEK2u1nAc0hI0XqtJrXxDxZZ9reHWvmk5wAK3LHcoWOv5DFP6LyIzY8 omhm+zF9KzIt8V0PuzMD9rUfeZAZjjCsllxv39bx+UHcS0ZsKxpCV4Ny c2OSCOCyHjtc1+qgYuZlkL5rej7wOVvCTB5Jym4B0vTO7ct22/VoqEdh zLjiWXSDW87qkNnImGU1EXHMqOXU5qzxgKgRjMu6AfJYB+zRP2B2P5eJ I9sGWOWJIV24ot1dWisWeSvItXNHW84mzFVgqUUuMKZ5uQGocpWjMc7c b0h0o4P4D0HtarBuRV7Z6QsJjEy0zMst2PChi3y+WFP4ar7Tl59K3ePN 7Qw/695jjA2YitpUYWBZL052r5d2u9hBTZGPvxvJRjFfvNcdy7Sv3ii1 sl6dTp/XIlJ82xsVEwNEYqgSQVJwNEzIcH+doUF4pGKnFmOWG/NlXfYJ 9Kx2Xon6c7Y=
SSHFP 10 3 86400 20160307114536 20150313114536 12698 kernel-error.de. dbv2KMbxb4Vd+kLz86hGjdc12b3/8THtIfThd8kjm5ik9Yxo3njcw60/ sJ9wvJ4/2AiBNoEebh3wUxnoJprqsjyEdIq+7mPggVhs6VV5Sl9GZoNM 1bzkq85xjHt9/KVzLwou9/s0t9PgZ3vl2wU6MMl5MvleGumw+w6DnZpz NXzX57IpMs3TCMHPVhpYglGjtRcDPnfFSqbLLwnM5rbidp80iEob/d3J Xm6lSPBuwrry4aAYErWMxxsDJBosXKGC2EQNKK5PrkVF9JbWwXUFXowU H9m1iNsDaRBP6xqKoa+I4efR9GNojb55s2Nh1b6T+9zVyjcclp2rYbt/ QL6l6GSTHvoP6L7o3H3heg1Q4uUu+mj7a8lEHfuF2jbp6afjrL17hR/b v7ArzP7PpV6KOmx15pBLH3V0GoEle7WKon65+6mNaDDvs5yh7LSd1Im3 zAi1C0TUkf4VN4MU+FhDh+r6KKsqh0WvP0hc7UaTcpEIH3ox7QbHGvf7 zxiBypRVfrrW3OQhQvRk6U4wIIx1XicaYRfkPmEL/OtYTc9B81dGe3ci JLZLedMCWifPtsO+B3ml5apH8+MTu7fyWEpf4NPz2egWzFkHYsl8Out8 2z7jzhPwgAfyZ2qr0z1SZWSpxvZ/P7LqNaauoFQxpyZT6/qFXA8M1quf Tornope2Y4E=

Wie immer bei DNSSEC zur Sicherheit prüfen ob die Antwort „sauber“ ist:

$ dig +dnssec www.kernel-error.de IN SSHFP |grep flags
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1
; EDNS: version: 0, flags:; MBZ: 7e06 , udp: 512

In der Antwort muss das ad flag gesetzt sein!!!

Nach all dieser Arbeit könnte man nun noch OpenSSH anweisen, die Verbindung nur aufzubauen, wenn der Host-Key erfolgreich validiert werden konnte. Dieses wieder, wie oben beschrieben, in der /etc/ssh/ssh_config oder den anderen Stellen:

Host *
    StrictHostKeyChecking yes

Ich mag solche Dinge sehr 🙂 Sehr kleiner Aufwand und schon ist es um einiges sicherer…


Kleines Update 16.02.2015

ed25519 erst richtig ab OpenSSH Version 6.7, ecdsa fragwürdig sicher und dss bitte NICHT! Ich will sagen >= OpenSSH 6.6 4096bit RSA bitte 🙂

Der Verbindungsaufbau sieht in der aktuellen OpenSSH Version etwas anders aus. Erfolgreich sollte es so aussehen:

debug1: found 4 secure fingerprints in DNS
debug1: matching host key fingerprint found in DNS

Inzwischen arbeitet OpenSSH direkt mit DNSSEC, wenn möglich. Solltet ihr also der Meinung sein, Fingerprints und Zone korrekt konfiguriert zu haben, OpenSSH wird aber einfach nicht „glücklich“… Dann prüft doch mal bitte auf Extension mechanisms for DNS (http://en.wikipedia.org/wiki/Extension_mechanisms_for_DNS)! Aktiviert sich normalerweise mit folgender Zeile in der /etc/resolv.conf

options edns0

Interrupt a zpool scrub

Möchte man einen zfs scrub abbrechen, da man die Leistung gerade besser brauchen kann, geht dieses mit folgendem Befehl:

$ zpool scrub -s PoolName

Im zpool status würde man dann folgendes sehen:

scrub: scrub stopped after 0h7m with 0 errors on Sun May 27 11:18:52 2012

im Gegensatz zu:

scrub: scrub completed after 0h7m with 0 errors on Sun May 26 10:52:13 2012

ZFS iSCSI Share einrichten: Schritt-für-Schritt-Anleitung

Openindiana/Solaris 11 und COMSTAR iSCSI-Target in 5 Minuten

openindiana und iSCSI mit COMSTAR

Die Jungs von SUN haben sich irgedwann einmal gedacht, wäre es nicht toll wenn wir Dinge wie iSCSI, FCoE, FC usw… Einfach in einem großen Framework zusammenfasst.

Damit ersetzt nun COMSTAR den alten iSCSI Target Deamon. Damit ändert sich natürlich auch die Konfiguration… Wie an so vielen Stellen beim Wechsel von Solaris 10 auf Solaris 11 / Opensolaris…

Ich möchte hier im Kurzen die Einrichtung eines einfachen iSCSI Targets basierend auf ZFS für einen Microsoft Windows Host beschreiben. Ich nutze dafür ein Openindiana System. Dieses basiert auf dem letzten Opensolaris welches dann später ins aktuelle Oracle Solrais 11 übergegangen ist.

Na dann mal los!

In diesem Testsystem habe ich für dieses Beispiel eine gesonderte Festplatte vorgesehen. Auf dieser erstelle ich zuerst einen neuen ZFS Pool:

root@iscsi-host:/# zpool create iscsi-target-pool c4t2d0
root@iscsi-host:/# zpool list iscsi-target-pool
NAME SIZE ALLOC FREE EXPANDSZ CAP DEDUP HEALTH ALTROOT
iscsi-target-pool 19,9G 124K 19,9G - 0% 1.00x ONLINE -

In diesem Pool lege ich nun ein weiters ZFS Volume an, welches später das eigentliche Ziel wird:

root@iscsi-host:/# zfs create -V 10g iscsi-target-pool/iscsi_10gb-lun01
root@iscsi-host:/# zfs list iscsi-target-pool/iscsi_10gb-lun01
NAME USED AVAIL REFER MOUNTPOINT
iscsi-target-pool/iscsi_10gb-lun01 10,3G 19,6G 16K -

Wie man sieht habe ich das ZFS Volume auf eine Größe von 10GB begrenzt. Das macht natürlich Sinn wenn man kurz darüber nachdenkt. Sonst würde die Poolgröße das jeweilige Target begrenzen und wenn man mehrere davon in einem Pool hat… Um die nötigen Grundlagen abzuschließen starte ich nun noch die nötigen Dieste.

root@iscsi-host:/# svcs stmf
STATE STIME FMRI
disabled 12:32:40 svc:/system/stmf:default
root@iscsi-host:/# svcadm enable stmf
root@iscsi-host:/# svcs stmf
STATE STIME FMRI
online 13:02:50 svc:/system/stmf:default
root@iscsi-host:/# stmfadm list-state
Operational Status: online
Config Status : initialized
ALUA Status : disabled
ALUA Node : 0

Zuerst schaue ich mir den Status des stmf (SCSI Target Mode Framework) an; es ist deaktiviert. Nach dem aktivieren und prüfen frage ist das stmf mit dem eigenen stmfadm(in) nach dem Status. Es soll ein iSCSI Target werden, dafür fehlt mir noch das folgende Packet:

root@iscsi-host:/# pkg install -v /network/iscsi/target
Zu installierende Pakete: 1
Geschätzter verfügbarer Speicherplatz: 9.91 GB
Geschätzter Speicherplatzverbrauch: 234.32 MB
Boot-Umgebung erstellen: Nein
Sicherung der Boot-Umgebung erstellen: Ja
Zu ändernde Services: 1
Boot-Archiv neu erstellen: Ja

Geänderte Pakete:
openindiana.org
network/iscsi/target
None -> 0.5.11,5.11-0.151.1.8:20130721T131345Z
Services:
restart_fmri:
svc:/system/manifest-import:default
DOWNLOAD PAKETE DATEIEN ÜBERTRAGUNG (MB)
Completed 1/1 37/37 0.3/0.3

PHASE AKTIONEN
Installationsphase 74/74

PHASE ELEMENTE
Paketstatus-Updatephase 1/1
Abbildstatus-Updatephase 2/2

Den Service wieder aktivieren und prüfen:

root@iscsi-host:/# svcs iscsi/target
STATE STIME FMRI
online 13:23:56 svc:/network/iscsi/target:default

Alles läuft, es kann also mit der logical unit weiter gehen. Ich lege also das logische Gerät an mit dem Ziel des vorhin angelegten ZFS Volumes:

root@iscsi-host:/# sbdadm create-lu /dev/zvol/rdsk/iscsi-target-pool/iscsi_10gb-lun01
Created the following LU:

GUID DATA SIZE SOURCE
-------------------------------- ------------------- ----------------
600144f051c247000000523ed0050001 10737418240 /dev/zvol/rdsk/iscsi-target-pool/iscsi_10gb-lun01

Vertrauen ist gut, Kontrolle ist besser! Also mal nachsehen ob alles angelegt ist und ob es auch „online“ ist 🙂 hier hilft wieder der stmfadm(in):

root@iscsi-host:/# stmfadm list-lu -v
LU Name: 600144F051C247000000523ED0050001
Operational Status: Online
Provider Name : sbd
Alias : /dev/zvol/rdsk/iscsi-target-pool/iscsi_10gb-lun01
View Entry Count : 0
Data File : /dev/zvol/rdsk/iscsi-target-pool/iscsi_10gb-lun01
Meta File : not set
Size : 10737418240
Block Size : 512
Management URL : not set
Vendor ID : OI
Product ID : COMSTAR
Serial Num : not set
Write Protect : Disabled
Writeback Cache : Disabled
Access State : Active

Damit der eigentliche Initiator es sehen kann, müssen wir dazu noch einen „view“ erstellen. Ich erstelle diesen mit Hilfe der eindeutigen GUID und prüfe ihn direkt im Anschluss:

root@iscsi-host:/# stmfadm add-view 600144F051C247000000523ED0050001
root@iscsi-host:/# stmfadm list-view -l 600144F051C247000000523ED0050001
View Entry: 0
Host group : All
Target group : All
LUN : 0

Zwischenstand:

– Ich habe alle nötigen Dienste.
– Ich habe 10GB ZFS Volume in einem extra Pool das ich nutzen möchte.
– Ich habe eine logical unit angelegt, welche dieses ZFS Volume wiederspiegelt.
– Ich habe dafür gesorgt das der initiator diese logical unit sehen kann.

Fehlt noch? Genau das Target:

root@iscsi-host:/# itadm create-target
Target iqn.2010-09.org.openindiana:02:6c3939bf-f5e5-4f28-a8d0-d0f0bbb2e1c4 successfully created
root@iscsi-host:/# itadm list-target -v
TARGET NAME STATE SESSIONS
iqn.2010-09.org.openindiana:02:6c3939bf-f5e5-4f28-a8d0-d0f0bbb2e1c4 online 0
alias: -
auth: none (defaults)
targetchapuser: -
targetchapsecret: unset
tpg-tags: default

Wie gehabt… Anlegen und zur Sicherheit noch einmal prüfen. Natürlich könnte ich den Namen des Targets ändern, soll aber schnell und einfach gehen, richtig?

Jetzt kann ich schon fast zur Microsoft Windows Maschine wechseln. Vorher sorge ich mit einem kurzen:

root@iscsi-host:/# devfsadm -i iscsi

…noch dafür dass mein konfiguriertes iSCSI Target ganz sicher im Discovery auftaucht!

Windows….
Ich lasse mich immer wieder von diesem Betriebssystem verarschen! Da will ich nur eben den Microsoft iSCSI-Initiator auf der Windows 7 Pro VM aktivieren um den Windows Part zu zeigen…. Da kommen bei der Installation so hässliche Fehlermeldungen wie:

"You do not have permission to update Windows. Please contact your system administrator."
"Setup could not find the update.inf file needed to update your system."
"Initiator-2.08-build3825-x64fre.exe"

Eine kurze Recherche zeigte mir meinen Fehler. Das Teil ist bei mir bereits installiert. Im Grunde habe ich für diese Erkentniss länger gebraucht als für die komplette Vorbereitung auf der Solaris Kiste 🙁 Nicht falsch verstehen, ich suche die Schuld nicht bei Windows! Ich habe halt einfach keine Ahnung von den Kisten.

Aber weiter im Text. Auf der Windows Seite habe ich folgendes gemacht:
– Das Portal über die IPv6 Adresse ermitteln lassen.
– Das Ziel gesucht und verbunden.
– Die neue „Festplatte“ in der Datenträgerverwaltung inizialisiert und auf diesem ein einfaches NTFS Volume erstellt.

Für den Microsoft Windows Teil habe ich ein paar Bilder erstellt 🙂

Screenshot der Windows Fehlermeldung: You do not have permission to update Windows. Please contact your system administraot.Screenshot der Windows Fehlermeldung: Setup could not find the update.inf File needed to update your systemScreenshot der Windows iSCSI-Initiator - Suche mit einestellung des Zielportales.Screenshot der Windows iSCSI-Initiator - Ziele mit dem erkennten iscsi ziel.
Screenshot der Windows iSCSI-Initiator - Mit Ziel verbinden.Screenshot der Windows iSCSI-Initiator - Volumes und Geräte mit Blick auf die Volumeliste.Screenshot der Windows Datenträgerinitialisierung und dem erkannten Datenträger 1 vom iscsi ziel.Screenshot der Windows Datenträgerverwaltung mit dem ferig konfigurieren COMSTART SCSI device.

ZFS encryption

ZFS Dateisystem verschlüsseln

Ab der ZFS Version 30 gibt es endlich die Möglichkeit sein ZFS Dateisystem zu verschlüsseln. Diese mit AES-128, 192 oder auch 256. Bei Schlüsseln größer 128 Bit macht es natürlich Sinn eine Hardwarebeschleunigung zu haben. SPARC User haben mit z.B.: T2 oder T3 gewonnen, Intel User mit z.B.: der 5600 CPU also den meisten großen Xeon CPUs.

Davon mal abgesehen… Sollte ein AES-128 Schlüssen mehr als ausreichen 🙂 Ich habe da etwas gelesen:

„In the case of AES-128, there is no known attack which is faster than the 2^128 complexity of exhaustive search.“

Für den normalen „Notebook-, Workstation- oder Serverklau“ sollte es reichen!

Wie geht es nun? Tja, so wie bei zfs fast immer. Extrem einfach:

$ zfs create -o encryption=on rpool/export/home/kernel/DatenSafe
Enter passphrase for 'rpool/export/home/kernel/DatenSafe':
Enter again:

Schon habe ich in meinem Homeverzeichnis einen DatenSafe. Natürlich sollte man das Kennwort nicht vergessen (wie immer) sonst hat man ein echtes Problem an seine Daten zu kommen! Starte ich mein System nun neu, kann das ZFS Dateisystem mangels fehlendem Kennwort nicht eingebunden werden. Dieses müsste ich also nachholen wenn ich auf dieses zugreifen möchte:

$ zfs mount rpool/export/home/kernel/DatenSafe
Enter passphrase for 'rpool/export/home/kernel/DatenSafe':

Es geht natürlich auch bequemer. Man könnte beim anlegen des ZFS Dateisystems sagen, der Schlüssel solle bitte als Datei auf dem USB-Stick liegen:

$ zfs create -o encryption=on -o keysource=raw,file:///media/usb-stick/schluessel rpool/export/home/kernel/DatenSafe

Dann müsste man immer diesen USB-Stick von dem eigentlichen System fern halten, damit nicht beides gleichzeitig abhanden kommt. Wäre dann ja so wie die PIN-Nummer auf der EC-Karte zu notieren! Dann müsste man den USB-Stick oder besser den Schlüssel kopieren und diesen zusätzlich sicher ablegen. Der Stick könnte ja mal kaputt gehen oder „verschwinden“. Hier müsste also die Lagerstelle der Sicherungskopie zusätzlich sicher sein. Ein Kennwort im Kopf ist da vielleicht doch besser. Kommt halt wieder darauf an 🙂


Unter Solaris 11 gibt es dieses natürlich auch in „schön“. Es gibt ein PAM Module! Damit kann man extrem einfach verschlüsselte Benutzerverzeichnisse realisieren.

Grob kann man es sich wie folgt vorstellen. Das PAM Module ermöglicht einen Abgleich zwischen dem Unix-Kennwort und dem Encryption Key des ZFS Dateisystems des Benutzerverzeichnisses. Zusätzlich wird beim ersten Login des Benutzers gleich das verschlüsselte Benutzerverzeichnis angelegt. Der Benutzer meldet sich also einfach am System an und das Filesystem wird gleichzeitig entschlüsselt und eingehangen.

Das PAM Module arbeitet dabei Hand in Hand mit ssh, dgm und natürlich dem normalen Konsolenlogin.

Eine erste Konfiguration könnte so aussehen:

Damit PAM diese Fähigkeit nutzt müssen wir dieses noch mitteilen. Dazu muss folgendes in der Konfigurationsdatei /etc/pam.conf ergänzt werden:

login auth     required pam_zfs_key.so.1 create
other password required pam_zfs_key.so.1

sshd-kbdint     auth requisite          pam_authtok_get.so.1
sshd-kbdint     auth required           pam_unix_cred.so.1
sshd-kbdint     auth required           pam_unix_auth.so.1
sshd-kbdint     auth required           pam_zfs_key.so.1 create
sshd-kbdint     auth required           pam_unix_auth.so.1

gdm     auth requisite          pam_authtok_get.so.1
gdm     auth required           pam_unix_cred.so.1
gdm     auth required           pam_unix_auth.so.1
gdm     auth required           pam_zfs_key.so.1 create
gdm     auth required           pam_unix_auth.so.1

Schon lässt sich ein neuer Benutzer anlegen. Diesem verpassen wir gleich ein initiales Kennwort:

$ useradd sebastian
$ passwd sebastian

Damit der Benutzer beim ersten Login sein Kennwort ändert, mit welchem das Homedirectory angelegt bzw. verschlüsselt wird, geben wir noch folgendes mit:

$ passwd -f sebastian

Wenn sich nun der User: „sebastian“ anmeldet passiert folgendes:

errorlap console login: sebastian
Password:
Choose a new password.
New Password:
Re-enter new Password:
login: password successfully changed for sebastian
Creating home directory with encryption=on.
Your login password will be used as the wrapping key.
Last login: Tue Apr 10 21:56:42 on console
Oracle Corporation      SunOS 5.11      11.0    November 2011
$

Schon ist der Benutzer sebastian angemeldet, hat ein encrypted homedirectory und ein Kennwort welches nur er kennt. Damit sind die Daten auf dem ~Notebook~ nun so sicher wie das Kennwort vom User Sebastian.

Mal schauen?

$ zfs get encryption,keysource rpool/export/home/sebastian
NAME                   PROPERTY    VALUE              SOURCE
rpool/export/home/sebastian  encryption  on                 local
rpool/export/home/sebastian  keysource   passphrase,prompt  local

Ich habe bereits einen User inkl. Daten. Ein ZFS Dateisystem lässt sich bisher nicht im Nachhinein verschlüssel. Aus diesem Grund muss die Option der Verschlüsselung beim erstellen des ZFS Filesystems angegeben werden. Ich könnte jetzt meine Daten sichern, den Benutzer löschen, den Benutzer neu anlegen und meine Daten zurücksichern… Leider bin ich faul und habe keinen Bock alle Rollen und Gruppenzugehörigkeiten neu anzulegen. Also habe ich folgendes gemacht:

Ich habe mir einen anderen User gegriffen der das Recht hat in die ROOT-Rolle zu wechseln. Mit diesem User habe ich dann das Homedirectory meines User umbenannt. Dieses musste ich aber erzwingen.

$ zfs rename -f rpool/export/home/kernel rpool/export/home/wurst

Dann soll beim nächsten Login direkt ein neues Kennwort gesetzt werden:

$ passwd -f kernel

Nach dem Login habe ich ein neues und verschlüseltes Benutzerverzeichnis. In dieses kopiere ich nun einfach wieder meine Daten aus /home/wurst und schon ist alles wie zuvor. Nur halt verschlüsselt! Natürlich liegen die Daten nun noch unverschlüsselt auf der Platte und in alten Snapshots. Dieses muss ich alles löschen. Da die Daten damit noch immer nicht zu 100% von der Platte verschwunden sind könnte man sie noch mit etwas Mühe von der Platte herunterknibbeln. Dieses muss man im Hinterkopf behalten. Die Daten werden erst langsam und Stück für Stück überschrieben. Ein wirklich sicherer Weg ist dieses also nicht!


Natürlich habe ich auch noch etwas für die Bilderliebhaber. So schaut der ganze Vorgang am Gnome Display Manager aus. Vom ersten Login des Users, über Kennwortänderung bis hin zur Bestätigung des angelegten und verschlüsselten Benutzerverzeichnis. Wie man sehen kann ist es sogar für den einfallslosen, mausschubsenden Anwender zu bewältigen. Fragt sich nur welcher dieser Anwender an einem Solaris Desktop arbeiten O_o???

ZFS Solaris 11 Homedirectory encryption mit gdm Benutzeranmeldung
ZFS Solaris 11 Homedirectory encryption mit gdm Eingabe des initialen Kennwortes


ZFS Solaris 11 Homedirectory encryption mit gdm Aufforderung zur Kennwortänderung


 

ZFS Solaris 11 Homedirectory encryption mit gdm Eingabe neues Kennwort
ZFS Solaris 11 Homedirectory encryption mit gdm wiederholte Eingabe neues Kennwort


ZFS Solaris 11 Homedirectory encryption mit gdm Kennwort wurde geändert

 

ZFS Solaris 11 Homedirectory encryption mit gdm verschlüsseltes Benutzerverzeichnis wurde angelegt


ZFS SMB

SMB Freigaben erstellen

Bevor ich mit um die Einrichtung von SMB Freigaben kümmern kann muss ich dafür sorgen das die nötigen Grundlagen dafür gegeben sind.

Als erstes installiere ich also die SMB Server kernel root components nach:

$ pkg install SUNWsmbskr
             Zu installierende Pakete:    1  
              Boot-Umgebung erstellen: Nein
Sicherung der Boot-Umgebung erstellen:   Ja
                Zu ändernde Services:    1

DOWNLOAD                                PAKETE     DATEIEN ÜBERTRAGUNG (MB)
Completed                                  1/1       29/29      0.5/0.5

PHASE                                       AKTIONEN
Installationsphase                             84/84

PHASE                                       ELEMENTE
Paketstatus-Updatephase                          1/1
Abbildstatus-Updatephase                         2/2

Installiert ist er damit schon mal. Damit nun am Ende die lokalen Benutzer mittels Benutzername / Kennwort zugriff auf die Freigaben haben muss noch folgende Zeile in die Datei /etc/pam.conf aufgenommen werden:

other password required pam_smb_passwd.so.1 nowarn

So nun nur noch den SMB-Server anwerfen:

$ svcadm enable -r smb/server

Jetzt schaue ich mal schnell nach ob er auch läuft (wenn er sinnlos hängen bleibt sucht man sonst so lange):

$ svcs smb/server
STATE          STIME    FMRI
online         20:11:41 svc:/network/smb/server:default

So gefällt es mir fast schon. Als nächstes hänge ich Kiste noch in die Workgroup meiner wahl:

smbadm join -w kernel-error.de
After joining kernel-error.de the smb service will be restarted automatically.
Would you like to continue? [no]: yes
Successfully joined kernel-error.de

Nun sollte alles bereit sein um SMB-Shares zu erstellen. Für meinen Test erstelle ich einen neues ZFS Dateisystem, welche ich später freigeben möchte:

$ zfs create rpool/windoof-freigabe
$ zfs list rpool/windoof-freigabe
NAME                    USED  AVAIL  REFER  MOUNTPOINT
rpool/windoof-freigabe   31K   190G    31K  /rpool/windoof-freigabe

Die eigentlich Freigabe erstellt sich nun fast von alleine:

$ zfs set sharesmb=on rpool/windoof-freigabe
$ zfs get sharesmb rpool/windoof-freigabe
NAME                    PROPERTY  VALUE     SOURCE
rpool/windoof-freigabe  sharesmb  on        local

Wooohooo….

Auf mehrfache Nachfrage hier noch etwas zu ZFS und CIFS-Shares >>klick<<

« Ältere Beiträge Neuere Beiträge »

© 2025 -=Kernel-Error=-

Theme von Anders NorénHoch ↑