Как-то раз я столкнулся с тем, что мой телефон просто не включился, а у меня там были все TOTP коды аутентификации в гугловском приложении Authenticator. Облако в нем я не включаю по соображениям безопасности, коды храню только локально.
Хорошо, что у меня есть старый телефон, на который я периодически выгружал — дублировал все свои коды с основного телефона. На всякий случай. Но пары сервисов я недосчитался, не успел продублировать.
После этого случая я стал искать альтернативу «запасному» телефону в качестве места хранения кодов аутентификации и нашел 2FAuth, неплохой вариант для моих целей. Хранить пароли в Vaultwarden, и в нем же TOTP коды считаю не совсем хорошей идеей. Весь смысл TOTP теряется при таком подходе. В случае компрометации 2FAuth у злоумышленников не будет Vaultwarden с паролями, и наоборот.
А так как я переношу все свои домашние сервисы в Proxmox, 2fauth будет жить там же. В моем случае, для запуска можно пойти двумя путями — собрать lxc контейнер с помощью скрипта Proxmox VE Helper-Scripts или настроить самому.
Я выбрал первый вариант с ОС Alpine, которая не требует много ресурсов, ввиду своей легковесности. Параметры моего lxc: 1 ядро, 256мб ОЗУ и 1гб места на ссд.
Заходим в консоль контейнера и ставим docker-compose:
apk add docker-compose
Далее я создал папку 2fauth:
mkdir 2fauth
Даем права, согласно официальной инструкции с сайта 2FAuth:
chown 1000:1000 2fauth
chmod 700 2fauth
Далее создаем файл docker-compose.yml:
nano docker-compose.yml
Содержимое тоже берем с официального мануала.
Что я изменил:
Поменял порт на 8090:8000/tcp
Указал требование на перезапуск: restart: always
Сгенерировал свое значение APP_KEY, с этим отлично помог Vaultwarden.
Указал домен с https в строке APP_URL. Если заходить через http не будет работать сканирование qr.
Безопаснее, конечно же, использовать 2fauth только в локальной сети, не открывая доступ в интернет. Но тогда нужно настроить туннель в свою локальную сеть, чтобы иметь доступ к 2fauth вне дома. У Keenetic, например, для этого уже все предусмотрено даже без белого ip.
Итоговый файл docker-compose.yml выглядит следующим образом:
version: "3"
services:
2fauth:
image: 2fauth/2fauth
container_name: 2fauth
volumes:
- ./2fauth:/2fauth
ports:
- 8090:8000/tcp
restart: always
environment:
- APP_NAME=2FAuth
- APP_ENV=local
- APP_TIMEZONE=UTC
- APP_DEBUG=false
- SITE_OWNER=mail@example.com
- APP_KEY=oCijrWWnj7r87KArG8jH9p6cBkg5xWKg
- APP_URL=https://2fa.my.domain.com
- IS_DEMO_APP=false
- LOG_CHANNEL=daily
- LOG_LEVEL=notice
- DB_DATABASE="/srv/database/database.sqlite"
- CACHE_DRIVER=file
- SESSION_DRIVER=file
- MAIL_MAILER=log
- MAIL_HOST=smtp.mailtrap.io
- MAIL_PORT=2525
- MAIL_USERNAME=null
- MAIL_PASSWORD=null
- MAIL_ENCRYPTION=null
- MAIL_FROM_NAME=null
- MAIL_FROM_ADDRESS=null
- MAIL_VERIFY_SSL_PEER=true
- THROTTLE_API=60
- LOGIN_THROTTLE=5
- AUTHENTICATION_GUARD=web-guard
- AUTHENTICATION_LOG_RETENTION=365
- AUTH_PROXY_HEADER_FOR_USER=null
- AUTH_PROXY_HEADER_FOR_EMAIL=null
- PROXY_LOGOUT_URL=null
- WEBAUTHN_NAME=2FAuth
- WEBAUTHN_ID=null
- WEBAUTHN_USER_VERIFICATION=preferred
- TRUSTED_PROXIES=null
- PROXY_FOR_OUTGOING_REQUESTS=null
- BROADCAST_DRIVER=log
- QUEUE_DRIVER=sync
- SESSION_LIFETIME=120
- REDIS_HOST=127.0.0.1
- REDIS_PASSWORD=null
- REDIS_PORT=6379
- PUSHER_APP_ID=
- PUSHER_APP_KEY=
- PUSHER_APP_SECRET=
- PUSHER_APP_CLUSTER=mt1
- VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
- VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
- MIX_ENV=local
Далее запускаем контейнер:
docker-compose up -d
После сообщения об успешном запуске переходим по адресу, который мы настроили для 2fauth. У себя я это сделал через доменное имя Keenetic.