UNIXwork

Dateihierarchie-Überprüfung mit mtree

2017-12-18 19:19:03.0

Mit 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.

Autor: Olaf | 0 Kommentare | Tags: bsd, shell

dav copy und move mit verschlüsselten Dateien

2017-12-11 20:34:24.0

Die 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.

Autor: Olaf | 0 Kommentare | Tags: dav, shell

Extended Attributes Teil 7: macOS Commandline Tools

2017-12-09 19:31:52.0

Unter 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.

Autor: Olaf | 0 Kommentare | Tags: macos, xattr, shell

Datei ver- und entschlüsseln mit openssl - kompatibel mit dav

2017-12-05 19:22:44.0

Dateien 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
Autor: Olaf | 0 Kommentare | Tags: openssl, crypto, dav, shell

Einfacher Proxy mit netcat

2017-12-04 20:25:18.0

Vor langer Zeit wurde es gefordert und hier ist es: eine Anleitung inklusive Erklärung wie man mit netcat einen Proxy für eine TCP-Verbindung baut, der bei Bedarf auch den Traffic anzeigt oder speichert.

Zunächst einmal benötigt man einen Server zu dem der Client sich normalerweise direkt verbinden würde. Wer live mittesten will, kann sich mit netcat einen basteln:

nc -l -p 1220

Nun wollen wir aber einen Proxy. Hierfür lauschen wir mit einem weiteren netcat-Prozess auf einem anderen Port. Der Client soll sich dann mit dem Proxy verbinden, und der Proxy soll den Traffic an den Server (Port 1220) senden. Bevor wir zur kompletten Lösung für bidirektionale Traffic-Weiterleitung kommen, hier erstmal der einfache Fall nur für eine Richtung.

nc -l -o 1221 | nc localhost 1220

Mit einer einfachen Pipe wird die Ausgabe des Proxies, also die Daten, die der Client sendet, zu dem Server gesendet. Alles was der Server sendet, wird jedoch vom netcat-Prozess, der den Proxy mit dem Server verbindet (nc localhost 1220), auf stdout ausgegeben. Was also fehlt ist, dass die Ausgabe dieses Prozesses als Eingabe für den Proxy dient. Und dafür benutzen wir eine Named Pipe (FIFO).

Eine normale Pipe besteht nur aus zwei Filedeskriptoren und kann daher nur an Kindprozesse weitergegeben werden. Eine FIFO hingegen wird im Dateisystem abgebildet und jeder Prozess kann auf diese zugreifen. Erstellen können wir eine FIFO mit dem Befehl mkfifo.

mkfifo fifo

Dann erweitern wir den Befehl für den Proxy noch so, dass der Proxy-Prozess seine Eingabe aus der FIFO bezieht und der zweite netcat-Prozess seine Ausgabe in die FIFO schreibt.

nc -l -o 1221 < fifo | nc localhost 1220 > fifo

Jetzt wird der ganze Traffic in beide Richtungen weitergereicht, wir wollen ihn jedoch noch im Terminal anzeigen lassen oder loggen. Hierfür verwenden wir das Tool tee, welches seine Eingabe auf stdout ausgibt und sie zusätzlich noch in eine Datei schreibt. Damit können wir jetzt z.B. den Traffic in zwei separaten Dateien loggen:

nc -l -p 1221 < fifo | tee client.log | nc localhost 1220 | tee server.log > fifo

Den Traffic im Terminal anzeigen kann man, in dem man /dev/tty zur Hilfe nimmt. Dieses ist ein spezielles Device, was für das Terminal des aktuellen Prozesses steht. Daten, die wir in /dev/tty reinschreiben, werden im Terminal ausgegeben.

nc -l -p 1221 < fifo | tee /dev/tty | nc localhost 1220 | tee fifo

Eine weitere Möglichkeit ist, den Traffic in eine weitere FIFO zu schreiben. Aus dieser kann man in einem anderen Terminal dann mit cat oder einem anderen Programm den Traffic live mitlesen.

mkfifo traffic
nc -l -p 1221 < fifo | tee traffic | nc localhost 1220 | tee traffic > fifo

Beachten muss man dabei jedoch, dass man erst aus der traffic-FIFO liest, bevor Daten übertragen werden, da das Öffnen einer FIFO blockiert, bis das andere Ende geöffnet wird. Solange also die traffic-FIFO nicht geöffnet wird, blockieren die tee-Prozesse, was das ganze Konstrukt aufhält.

Autor: Olaf | 2 Kommentare | Tags: network, shell
Weiter