"keep" share - alpine linux minimal token based apache webdav service

reinhard@finalmedia.de Sun Dec 7 03:04:22 PM CET 2025

minimalistische API und Konzept auf Basis eines Standard Apache Webservers mit webdav. Standard Bordmittel. Kein CGI, kein PHP o.ä nötig. KISS Prinzip, aber eigene Token-Erzeugung und Verwaltung durch den Nutzer.

ACHTUNG! Nicht auf einem öffentliche Server installieren, sondern noch zwingend einen TLS proxy vorschalten, der auch den auth übernimmt, beim Zugriff auf "/new/" und "/chain/"

Funktionsweise

Bei einer Anfrage unter /new/ wird die Anfrage (wenn sie einem regex Muster eines Tokens entspricht) von apache statt in ein logfile in ein gawk script geleitet, das dann ein Verzeichnis mit diesem Namen erstellt. Unter Kenntnis dieses tokens (also verzeichnissen) können dann Daten in jenem Verzeichnis hochgeladen werden.

Zu einem bestehenden derartigen token, kann man mittels /chain/ dann weitere read-only tokens erzeugen, unter deren Kenntnis wiederum dann Zugriffe via /ro/ möglich sind. Diese sind symlinks zum rw token, jedoch über die methode GET auf nurlesenden Zugriff limitiert.

Setup

Debian 13 Instant-Setup via
 curl -Ls https://finalmedia.de/code/kb/6fbfe4089e26/setup.txt | sh
Empfohlen: Alpine-Linux ab 3.23 (!) Instant-Setup via
 curl -Ls https://finalmedia.de/code/kb/6fbfe4089e26/setup_alpine.txt | sh
Letztlich geschieht dabei das:

#!/bin/sh

# mindestens: alpine linux 3.23

# keep hot dav storage (simple variant)
# reinhard@finalmedia.de
# Sun Dec  7 02:56:53 PM CET 2025

# example setup

apk add apache2 gawk apache2-webdav apr-util-dbm_gdbm curl findutils
rc-update add apache2

rm /etc/apache2/conf.d/dav.conf

mkdir -p /var/www/localhost/keep/ro
mkdir -p /var/www/localhost/keep/rw

chown root:root /var/www/localhost/keep/rw
chown root:root /var/www/localhost/keep/ro
chmod 111 /var/www/localhost/keep/rw
chmod 111 /var/www/localhost/keep/ro

mkdir /var/lib/dav
touch /var/lib/dav/lockdb
chown apache:apache /var/lib/dav
chown apache:apache /var/lib/dav/lockdb

echo forbidden > /var/www/localhost/keep/ro/index.html
echo forbidden > /var/www/localhost/keep/rw/index.html
echo keep > /var/www/localhost/keep/index.html

chown -R apache:apache /var/www/localhost/keep

chattr +i /var/www/localhost/keep/rw/index.html
chattr +i /var/www/localhost/keep/ro/index.html

chattr +i /var/www/localhost/keep


base64 -d << ::EOF:: | tar -C /etc/apache2/ -x -z -v
H4sIAAAAAAAAA+1XbVMbNxD2V9+vWB+EtExtHXdnm3QIE1JIwgwJHRr4UhpGvlvbN76T3JNs40np
b+/KbxhsB2ZapyXV88GStY9Oq9W+SFGbJ0LLDoqKahfWA49Qr1ZHLeF+6wU7tcJO1ffqQd2r+vWC
t+P7Ya0A3pr0uYOe0jwHKORS6i/xHpI/UWyUWCMRTLUdvMYIekK1eY5QFtDigw6U3zB4vhnAn8A+
/eqVX/z2uXZjWl5uUje82WSwtQWb4UOEAEovDQ0+q6HSmH3npgLKqgmXLuvznA0GA5bKiKdtqTTr
IHZZPmDuZuBeul/iSOKEhrPlfn/z3Pm3rfn0EEnRrMRsrWuM4r++Ov5Nfxz/tXqt7lP8e/UwLEB1
rVpN8D+P/8n5x9jkvVRXzN9/fA1zwDU60BXnH1T98Pb8ayb/B35Ytfn/a2DvIsl1j6fvKKfC9o+7
3r5T3PgF8z7mH3iGQEm3gtc866ZIzpE5TvFE8vi9jHspQsz7V9m4O24Uo/aKhitKLjCbagWZJPf5
PE3lIEPdlvHSWfNyM9cpHvL+iYw6h69hVCzSpMHo06ZgdOIGyTfgAvMhHGddmWsudKlUMoNCAu9p
CXGSY6QlMRIR4zWkCdnDEJoyhxx5LEU6hFFxVD9AAyPeUzjlIu8oUMMsTUQHyJ1aqAUZr0TLjk15
EGeJgAE2Mk7VL381K2PEOMpzmZ/I1kRv2WK8y6M2+gyNpEIjTvEnclOZLWXxKEKlDA3ogKiYY2zM
IaNehkKfkdvCivI5XXzKhdALzH4bSRyjuBSL4hBkZ9l4dcX4CzAJJU0ivSiteh7QDpcJgonAmE8f
if5xE87w9x4qfXV+dgyfmMABA/ppS9kZ2Ycs80bmGdfgPjt374huTfcHQx3N7BbRqWokJl185yYA
iv7LufkrdYjMzZnBqFmlx13hSk3m7+B35oyUufMRBybYI2/nOpECXObuz4anOO0amYLysXFRVE6x
aNQnLzexBa2cQoAc5f60AxNX78dxBW+PPsK7o4PD5axT8us8iRE+SIELlMODCzhtNm/VZVN995fv
wVz3voVtyG9jGwO2zbYfs5NHaLPAoRCJ8OOwS7vvdik7jFZlMtKoy0pTXGYPm+Ln86k5lu9WLAyf
JFmiJzH8WsZD8HfCergb1MLdxU9MqkmiItk3dUMa6y213x6bK6FkTudJvULms+C61njo/e8Hwe37
PzT3f9O397+vgb///p+96BNBpqRsVo6hTLeqUXGDcmvWy8B4waNe/OY1/6TCyMLCwsLCwsLCwsLC
wsLCwsLCwsLiP4e/ABQrKVkAKAAA
::EOF::

chattr +i /etc/apache2/chaintoken.sh
chattr +i /etc/apache2/unchaintoken.sh
chattr +i /etc/apache2/createnew.sh

service apache2 start

Schnittstellenbeschreibung

 /new/		neues rw token erstellen
 /chain/	symlinken eines ro token zu einem rw
 /unchain/	symlink entfernen

 /ro/		nurlese zugriff (GET HEAD)
 /rw/		schreibender und lesender zugriff (PUT GET HEAD)

Beispiel Nutzung

Selbstgenerierung eines Tokens

Aufbau eines Tokens Schema:
[0-9]{6}[0-9a-f]{64}
YYYYmmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Token mit zwei Jahren Gültigkeit (Ablauf datum, also +2 Jahre):
echo "$((2+$(date +%Y)))$(date +%m)$(tr -dc "0-9a-f" < /dev/urandom | head -c 64)"

Drei RW Tokens erzeugen

curl -s http://127.0.0.1/new/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb41
curl -s http://127.0.0.1/new/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb42
curl -s http://127.0.0.1/new/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb43

ein neuen RO Token erzeugen und an bestehendes ...cb41 RW Token binden

curl -s http://127.0.0.1/chain/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb41/20260618e7c00c8b616b6e36fdc9a524bf9101d85b74e67601ce150faa5a80db68c7a3

drei weitere RO Tokens erzeugen und an ein gleiches ...cb42 RW Token binden

## should chain some ro tokens to the rw token 20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb42
curl -s http://127.0.0.1/chain/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb42/20260618e7c00c8b616b6e36fdc9a524bf9101d85b74e67601ce150faa5a80db68c7a2
curl -s http://127.0.0.1/chain/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb42/20260618e7c00c8b616b6e36fdc9a524bf9101d85b74e67601ce150faa5a80db68c7a1
curl -s http://127.0.0.1/chain/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb42/20260618e7c00c8b616b6e36fdc9a524bf9101d85b74e67601ce150faa5a80db68c7a0

Demo Content hochladen (RW Token)

echo ich_bin_content | curl -s -X PUT -T- http://127.0.0.1/rw/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb41/blonk.txt

Demo Content via RO Token herunterladen

curl -s http://127.0.0.1/ro/20260618e7c00c8b616b6e36fdc9a524bf9101d85b74e67601ce150faa5a80db68c7a3/blonk.txt

Demo Content via RW Token herunterladen

curl -s http://127.0.0.1/rw/20271139d6dcf6c7a611f08000b42e99a765f0d2b3998a74b7460f96165dba35a0cb41/blonk.txt

Auth

Tipp: Ergänze einen http_basic_auth für den Pfad /new/ und /chain/, um diesen abzusichern, wenn du nicht freie Token-Erstellung und Nutzung gestatten willst. Du kannst dies auch in einem vorgeschaltenen TLS Path Proxy mit einem separaten apache oder haproxy realisieren.