"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:

apk add apache2 gawk apache2-webdav apr-util-dbm_gdbm daemontools-encore curl
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

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

base64 -d << ::EOF:: | tar -C / -x -z -v
H4sIAAAAAAAAA+1X33PaOBDmFf8Vi5NL7zIHMthAepNmLr2k18ykTSdt8nK5ZoS9gMe25JMEhOml
f3tX/EggQJOHpp102AdktJ+s3Y/9ViLs8lgYmaCo6G7hccwja9bro5Hs7uj5taBQrVerdd/zm9Vm
wavWaoFXAO+R4pmznjZcARSUlOZruPv8T9Q2SqwVC6a7Dl5hCBpNL446cQQ852EXocMHCZRfMXi2
6cNnYB//8crP//3UuLYjL7fpMbjeZLC1BZvBfQAfSi8sDD7poTaY/eqmAsq6DRcu63PFBoMBS2XI
067UhiWIOVMD5m767oX7NYwkTGAxW+5v18+cH83pU7JQITcocPB48r9X/zXvVv+NRmD17zXX+v8u
9q30f6PoLIliBeX8QZpe6/VHWyhFuxKxCNu8l5qK/frN97AabwTBKv379dvzP6j6DdK/X6tV1/r/
HrZ7HivT4+lrUids/7Hj7TnFjfeo+qje8gyB5FvBK57lKVJxZI5TPJY8eiOjXooQ8f5lNn4cD5rR
eEnTFS0XkG29Akyeu3iepnKQoenKaOmqWb9d6xQPeP9YhsnBSxi1nTRuMXq1bT1J1CL/BpyjGsJR
lktluDClUslOCgm8ZyRQ08LQSELEIsIrSGPiwwLaUgGdkZEU6RB0lyvUv0MLQ97TOMUiTzToYZbG
IgEqpw4aQeSVaNsxlftRFgsYYCvj1CXVnzcNkRCHSkl1LDuTuGWHjVtvjaH1VGjGKf5FZSqzpSge
hqi1hQH9QNTMMbJ0yLCXoTCnVLawohFPN59iIfB8m28rjiIUF2LRHYBMls3XV8w/B9tQ0jg0i966
5wFluMzhTxyWPnMo+kdtOMX/eqjN5dnpEXxkdF9hQB9dKZMRP8TMK6kybsD95cydc91S9z9DE97w
NnvzmVkAKPovZtavjCG0/5wYjIZVccw7V0Yy+x9sbs0omLmXODCxXap2bmIpwGXu3s301E5y69NQ
PrIlitopFm34VOVWW9BRJAEqlLvL9q2u3ox1BX8ffoDXh/sHy1EnVNcqjhDeSoELkIP9czhpt2/D
ZdN495bnYC8FP0Ma8udIY8C22fZDMnlANAsYkkiIH4Y5ZZ/n1B1GuzIZGjRlbUiX2f1UvDub0rE8
W7EwfRxnsZlo+KWMhlCrBs1gx28EO4uvmJwmsQ5l354b0rK3lL9dNnOEEp3O+j67trWt7UnYF1sI
WQoAFgAA
::EOF::

service apache2 start

Schnittstellenbeschreibung

 /new/		neues rw token erstellen
 /chain/	symlinken eines ro token zu einem rw
 /unchain/	tbd: 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 http://127.0.0.1/ro/20260618e7c00c8b616b6e36fdc9a524bf9101d85b74e67601ce150faa5a80db68c7a3/blonk.txt

Demo Content via RW Token herunterladen

curl http://127.0.0.1/rw/20260618e7c00c8b616b6e36fdc9a524bf9101d85b74e67601ce150faa5a80db68c7a3/blonk.txt