Linkdump
13. März 2019Dateihierarchie-Überprüfung mit mtree
18. Dezember 2017Mit dem BSD-Tool mtree kann eine Datei-Hierarchie mit einer Spezifikation verglichen werden, wobei diese Spezifikation ebenfalls mit mtree erstellt werden kann. So kann man mit mtree geänderte Dateien finden, es ist jedoch auch möglich, Dateien, die nicht der Spezifikation entsprechen, zu löschen oder geänderte Dateirechte wiederherzustellen.
Nehmen wir mal an, man hat ein paar Dateien:
$ find .
.
./file2
./dir
./dir/abc
./dir/ccc
./file1
Bevor man mit mtree etwas vergleichen kann, benötigt man eine Spezifikation der Dateien. Diese erstellen wir mit mtree -c
.
$ mtree -c > ../spec
$ cat ../spec
# user: olaf
# machine: m2.fritz.box
# tree: /Users/olaf/Desktop/test
# date: Mon Dec 18 18:50:28 2017
# .
/set type=file uid=501 gid=20 mode=0644 nlink=1 flags=none
. type=dir mode=0755 nlink=5 size=160 \
time=1513618591.304192231
file1 size=6 time=1513619185.055667000
file2 size=13 time=1513619203.579709605
# ./dir
dir type=dir mode=0755 nlink=4 size=128 \
time=1513618608.749249207
abc size=6 time=1513618604.803276546
ccc size=5 time=1513618611.066866426
# ./dir
..
..
Nun hat man eine Spezifikation, mit der man später die Dateien vergleichen kann.
$ touch dir/abc
$ echo "Hello World" > file1
$ mtree < ../spec
dir/abc changed
modification time expected Mon Dec 18 18:36:44 2017.803276546 found Mon Dec 18 18:56:22 2017.582045000
file1 changed
size expected 6 found 12
modification time expected Mon Dec 18 18:46:25 2017.055667000 found Mon Dec 18 18:57:03 2017.596168115
Wie man sieht, werden standardmäßig nur wenige Eigenschaften im der Spezifikation gespeichert, man hat jedoch eine große Auswahl an sogenannten keywords, die pro Datei gespeichert werden sollen. Diese können mit der -K
-Option angegeben werden.
$ mtree -c -K sha256digest
Das Tool ist zwar ein BSD-Tool und unter Linux standardmäßig nicht anzutreffen, ich habe aber zumindestens einen Port gefunden. Und unter Ubuntu gibt es das Paket freebsd-buildutils, welches das Tool fmtree enthält.
dav copy und move mit verschlüsselten Dateien
11. Dezember 2017Die integrierte Verschlüsselung von dav ist für den Benutzer weitestgehend transparent, bis auf in den Befehlen copy
und move
in der aktuellen Version 1.1. Bisher sind diese Befehle nur low level WebDAV, das heißt, es wird wirlich nur ein WebDAV COPY
oder MOVE
ausgeführt. Schauen wir uns dav copy
und dav move
erstmal an:
dav copy [-pcO] [-L <lock>] <url> <url>
dav move [-pcO] [-L <lock>] <url> <url>
Beide Befehle sind von der Benutzung her gleich, nur dass copy
eine Kopie erstellt und move
eine Ressource verschiebt. Wie man sieht, haben beide Befehle die Flags -p
und -c
, mit denen Verschlüsselung aktiviert und deaktiviert werden kann. Dies bezieht sich jedoch nur auf die Pfad-Auflösung.
Das Positive ist schon mal, dass mit aktivierter Verschlüsselung die Ziel-URL (das letzte Argument) auch randomisiert wird. Bei verschlüsselten Ressourcen ist der Dateiname, den der Server sieht, nur ein zufälliger String, während der Name, den dav verwendet, verschlüsselt in den Properties gespeichert wird. Das Problem ist, dass copy/move nicht diese Property anpassen, sondern nur die Properties der Source-URL kopieren, wie es von WebDAV COPY/MOVE gefordert ist. Das hat zur Folge, dass der Dateiname, den dav verwendet, bei verschlüsselten Ressourcen sich nicht durch dav copy/move ändert.
$ dav list -l cryptrepo
-c 32 bytes Dec 11 19:54 test.txt
$ dav move secrepo/test.txt cryptrepo/newname.txt
$ dav list -l cryptrepo
-c 32 bytes Dec 11 19:54 test.txt
Schlimmer wird es noch mit copy, wenn die Ziel-URL die selbe Collection ist:
$ dav copy cryptrepo/test.txt cryptrepo/copy.txt
$ dav list -l cryptrepo
-c 32 bytes Dec 11 20:10 test.txt
-c 32 bytes Dec 11 19:54 test.txt
Wer sich jetzt fragt, wie man die richtige Datei löschen kann: mit deaktivierter Verschlüsselung sieht man die echten Dateinamen und anhand des lastmodified-Datums kann man die richtige Datei identifizieren.
Möchte man eine verschlüsselte Datei umbenennen, also den verschlüsselten Namen ändern, gibt es einen einfachen Workaround.
Als erstes erstellt man mit dav put
eine neue Datei mit dem gewünschten Namen.
$ dav put cryptrepo/newfile.txt -
^D
Dann holt man sich den Inhalt der crypto-name
Property.
$ dav get-property cryptrepo/newfile.txt idav:crypto-name
z7qDCHM65EuUSooCt22yaI2d2zwKDdPDlgte23ATkUo=
Die Datei kann dann wieder gelöscht werden.
$ dav rm cryptrepo/newfile.txt
Die verschlüsselte Datei, die man umbenennen möchte, bekommt jetzt den Inhalt der crypto-name
Property.
$ dav set-property cryptrepo/test.txt idav:crypto-name z7qDCHM65EuUSooCt22yaI2d2zwKDdPDlgte23ATkUo=
Und schon denkt dav, dass die Datei newfile.txt heißt.
Extended Attributes Teil 7: macOS Commandline Tools
09. Dezember 2017Unter macOS sind Extended Attributes wie unter den meisten Betriebsystemen einfache name/value-Paare. Im unterschied zu Linux oder FreeBSD haben die Attribute keinen Namespace wie user oder system sondern einfach nur einen frei wählbaren Namen.
Extended Attributes können mit dem Tool xattr angezeigt und modifiziert werden. Außerdem kann auch ls
Extended Attributes anzeigen. Eine kleine Übersicht über xattr:
Namen aller Attribute oder oder mehrerer Dateien auflisten:
xattr file ...
Value eines Attributs ausgeben:
xattr -p attr_name file ...
Attribut setzen:
xattr -w attr_name attr_value file ...
Attribut entfernen:
xattr -d attr_name file ...
Alle Attribute entfernen:
xattr -c file ...
Außerdem zeigt ls -l@
an, ob und welche Attribute eine Datei hat.
Ein kleines Beispiel:
$ echo "hello" > test.txt
$ rm test.txt
$ echo "Hello World" > hello.txt
$ echo test > test.txt
$ xattr -w mime_type "text/plain" hello.txt
$ xattr -w author Olaf hello.txt
$ xattr -w testxattr testvalue test.txt
$ ls -l@
total 16
-rw-r--r--@ 1 olaf staff 12 9 Dez 19:18 hello.txt
author 4
mime_type 10
-rw-r--r--@ 1 olaf staff 5 9 Dez 19:18 test.txt
testxattr 9
$ xattr -p mime_type hello.txt
text/plain
Positiv ist, dass das macOS tar Extended Attributes im Archiv speichert. Auch cp kopiert sie standardmäßig. Insgesammt scheinen Extended Attributes unter macOS generell ein lebendigeres Feature als unter anderen Betriebsystemen zu sein, denn sie werden vom Finder oder anderen Programmen auch benutzt.
Datei ver- und entschlüsseln mit openssl - kompatibel mit dav
05. Dezember 2017Dateien auf der Kommandozeile kann man recht einfach mit openssl
verschlüsseln.
openssl aes-256-cbc -in file.txt -out file.enc
Entschlüsseln geht mit:
openssl aes-256-cbc -d -in file.enc -out file.txt
Der Key wird dabei aus einem Passwort generiert, welches von openssl abgefragt wird.
Möchte man von dav verschlüsselte Dateien von Hand mit openssl entschlüsseln, wird es ein wenig komplizierter. Die Keys die von dav verwendet werden, werden binär in Dateien gespeichert. Ein AES256-Key ist dann einfach eine 32 bytes große Datei.
Datei entschlüsseln
Zuerst muss der Key in eine für das openssl-Tool kompatible Form gebracht werden, nämlich ein Hex-String ohne Space.
hexdump -ve '/1 "%02X"' < ~/.dav/keys/mykey > mykey.hex
Dann muss aus der verschlüsselte Datei (hier im Beispiel encfile) noch der Initialisierungsvektor extrahiert werden. Dieser wird von dav nämlich immer an den Anfang der Datei gepackt. Die restlichen Bytes sind dann die eigentlichen verschlüsselten Daten.
dd if=encfile of=iv.bin bs=16 count=1
dd if=encfile of=encdata bs=16 skip=1
hexdump -ve '/1 "%02X"' < iv.bin > iv.hex
Jetzt haben wir den Key und den IV in passender Form und können die Datei mit openssl entschlüsseln:
openssl aes-256-cbc -d -K `cat mykey.hex` -iv `cat iv.hex` -in encdata -out file
Datei verschlüsseln
Um eine Datei zu verschlüsseln brauchen wir zunächst einen zufälligen Initialisierungsvektor.
dd if=/dev/random of=iv.bin bs=16 count=1
hexdump -ve '/1 "%02X"' < iv.bin > iv.hex
Dann können wir die Datei mit openssl verschlüsseln und anschließend mit cat den IV und die verschlüsselte Datei zusammenfügen:
openssl aes-256-cbc -K `cat mykey.hex` -iv `cat iv.hex` -in file.txt -out encdata
cat iv.bin encdata > file.enc