¡ ¡ ¡ ALL GLORY TO GLORIA ! ! !
Задача: монтировать шифрованные разделы и запускать в них программы без сохранения LUKS-ключей на самом сервере.
Команду на монтирование подавать через браузер.
$ sudo git clone --depth=1 https://github.com/mche/httpd-luks-mount.git foo-folder
См. комментарии в cgi-bin/config.sh
$ sudo busybox httpd -p 8080 -h /path/to/foo-folder
Более продвинутый вариант с uWSGI см. ниже.
Пример файлового устройства:
$ dd if=/dev/zero of=luksTest.img bs=1M count=100
$ sudo cryptsetup -s 512 luksFormat luksTest.img
$ sudo cryptsetup luksOpen luksTest.img myTest
$ sudo mkfs.ext4 -m 0 /dev/mapper/myTest
$ sudo cryptsetup luksClose /dev/mapper/myTest
В cgi-bin/luks-key.sh представлен пример наложения двух случайных строк частей в единый ключ. Тут открываются широкие возможности для творчества масс во всевозможных алгоритмах.
Далее процедуры ключа для встроенного алгоритма.
$ head -c 2048 /dev/urandom | base64 -w 0 > enc1.key
Вписать в cgi-bin/config.sh место сохраненной первой части ключа, например:
export key1URL=https://gist.githubusercontent.com/foo/3894cedc3997e3acd97470c63bf9ba4a/raw/enc1.key
Также генерируется случайная строка и она передается с УРЛами запросов. Генерация не обязательно длинная
$ head -c 512 /dev/urandom | base64 -w 0
Копипастим строку в УРЛы запросов.
Стыкуем две части в единый составной ключ
$ curl 'http://127.0.0.1:8080/cgi-bin/key.sh?<вторая часть ключа>' > enc.key
Ключ готов для внедрения в LUKS.
$ sudo cryptsetup luksAddKey luksTest.img enc.key
$ shred enc.key
Полученный файл ключа успешно внедрен и не будет использоваться. Всякий раз будут стыковаться две части из строки запроса и сетевого файла.
С другого компьютера, если сервер был выключен/перезагружен
$ curl 'http://хост:8080/cgi-bin/mount.sh?<вторая часть ключа>'
Таким образом, доверенные пользователи знают этот URL и тычут в браузере когда надо.
Если комп с LUKS навсегда утрачен ликвидируем файл в сети первой части ключа и не делаем http-монтирований.
Если прописать дополнительные команды в cgi-bin/post-mount.sh, то после успешного монтирования они выполнятся.
$ sudo su
# cd foo-folder/cgi-bin
# mv mount.sh jh4355k0398-mount.sh
# ln -s jh4355k0398-mount.sh mount.php
# mv key.sh jh4355k0398-key.sh
# ln -s jh4355k0398-key.sh key.php
Соответственно изменятся УРЛы http-запросов:
http://хост:8080/cgi-bin/key.php?<вторая часть ключа>
и http://хост:8080/cgi-bin/mount.php?<вторая часть ключа>
ВНИМАНИЕ! Только два файла mount.sh и key.sh исполняемые для точек http-запросов. Неисполняемые файлы будут 404 не найдены.
Нужно врубить плугин CGI
# wget https://projects.unbit.it/downloads/uwsgi-2.0.18.tar.gz
# tar -xvzf uwsgi-2.0.18.tar.gz
# cd uwsgi-2.0.18
# python uwsgiconfig.py --build core
# python uwsgiconfig.py --plugin plugins/cgi core
Запуск
./uwsgi -b 32768 --http-socket 0.0.0.0:8080 --plugins cgi --cgi /path/to/foo-folder/cgi-bin/ --http-socket-modifier1 9
HTTPS
./uwsgi -b 32768 --https-socket 0.0.0.0:8443,foobar.crt,foobar.key --plugins cgi --cgi /path/to/foo-folder/cgi-bin/ --https-socket-modifier1 9
Запросы без cgi-bin:
curl -vv -L 'https://хвост:8443/key...'