Как создать портал авторизации для своих доменов с помощью Caddy
Как создать портал авторизации для своих доменов с помощью Caddy
Caddy — это современный веб-сервер с автоматической поддержкой HTTPS через Let’s Encrypt. Однако стандартная сборка Caddy не включает модуль caddy-security
, который необходим для создания портала авторизации и управления доступом к вашим доменам. В этой статье я расскажу, как собрать Caddy с этим модулем с помощью xcaddy
, настроить портал авторизации и защитить свои веб-приложения.
Предварительные требования
Перед началом убедитесь, что у вас есть:
- Сервер с операционной системой (например, Ubuntu 22.04).
- Доступ к командной строке с правами суперпользователя (
sudo
). - Базовые знания о веб-серверах и конфигурационных файлах.
- Домен или поддомен (например,
example.com
), с настроенными DNS-записями, указывающими на ваш сервер. - Установленный Go (версия 1.16 или выше) для сборки Caddy.
Шаг 1: Сборка Caddy с модулем caddy-security
Поскольку модуль caddy-security
не входит в стандартную сборку Caddy, нам нужно собрать кастомную версию с помощью инструмента xcaddy
.
1.1. Установка xcaddy
xcaddy
позволяет собирать Caddy с дополнительными модулями. Установите его следующим образом:
sudo apt update
sudo apt install -y golang
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
После выполнения этих команд xcaddy
будет доступен в ~/go/bin/xcaddy
. Убедитесь, что директория ~/go/bin
добавлена в ваш $PATH
, чтобы использовать xcaddy
глобально:
export PATH=$PATH:~/go/bin
1.2. Сборка Caddy с модулем caddy-security
Теперь соберем Caddy с модулем caddy-security
:
~/go/bin/xcaddy build --with github.com/greenpau/caddy-security
Эта команда создаст исполняемый файл caddy
в текущей директории.
1.3. Установка собранного Caddy
Переместите скомпилированный файл в системную директорию, чтобы он был доступен глобально:
sudo mv caddy /usr/bin/
Проверьте версию Caddy, чтобы убедиться, что модуль включен:
caddy version
Вывод должен показать версию Caddy с указанием, что сборка кастомная.
Шаг 2: Настройка хранилища пользователей
Для работы портала авторизации Caddy использует JSON-файл с данными пользователей. Мы создадим файл users.json
с помощью скрипта.
2.1. Создание директории для данных
Создайте директорию для хранения данных и установите правильные права доступа:
sudo mkdir -p /data/.local/caddy
sudo chown caddy:caddy /data/.local/caddy
2.2. Создание пользователя с помощью скрипта
Чтобы упростить процесс, используйте следующий скрипт. Он запрашивает данные пользователя и генерирует файл users.json
.
Сохраните этот код в файл generate_users_json.sh
:
#!/bin/bash
# Проверка зависимостей
if ! command -v python3 &> /dev/null; then
echo "Ошибка: Python3 не установлен. Установите: 'sudo apt install python3'."
exit 1
fi
if ! python3 -c "import bcrypt" &> /dev/null; then
echo "Ошибка: Модуль bcrypt не установлен. Установите: 'pip3 install bcrypt'."
exit 1
fi
if ! command -v uuidgen &> /dev/null; then
echo "Ошибка: uuidgen не установлен. Установите: 'sudo apt install uuid-runtime'."
exit 1
fi
# Запрос данных
read -p "Введите имя пользователя (username): " USERNAME
read -p "Введите email: " EMAIL
read -s -p "Введите пароль: " PASSWORD
echo
# Проверка данных
if [[ -z "$USERNAME" || -z "$EMAIL" || -z "$PASSWORD" ]]; then
echo "Ошибка: Все поля должны быть заполнены."
exit 1
fi
if [[ ${#USERNAME} -lt 3 || ${#USERNAME} -gt 50 || "$USERNAME" =~ [^a-z] ]]; then
echo "Ошибка: Имя пользователя — 3-50 символов, только строчные буквы (a-z)."
exit 1
fi
if [[ ${#PASSWORD} -lt 8 ]]; then
echo "Ошибка: Пароль — минимум 8 символов."
exit 1
fi
# Извлечение домена
DOMAIN=$(echo "$EMAIL" | cut -d'@' -f2)
if [[ -z "$DOMAIN" ]]; then
echo "Ошибка: Неверный формат email."
exit 1
fi
# Генерация значений
UUID=$(uuidgen)
DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
HASH=$(python3 -c "import bcrypt; print(bcrypt.hashpw('$PASSWORD'.encode(), bcrypt.gensalt(10)).decode())")
# Создание users.json
cat <<EOF > /data/.local/caddy/users.json
{
"version": "1.1.7",
"policy": {
"password": {
"min_length": 8,
"max_length": 128
},
"user": {
"min_length": 3,
"max_length": 50,
"allow_non_alpha_numeric": false,
"allow_uppercase": false
}
},
"revision": 1,
"last_modified": "$DATE",
"users": [
{
"id": "$UUID",
"username": "$USERNAME",
"email_address": {
"address": "$EMAIL",
"domain": "$DOMAIN"
},
"email_addresses": [
{
"address": "$EMAIL",
"domain": "$DOMAIN"
}
],
"passwords": [
{
"purpose": "generic",
"algorithm": "bcrypt",
"hash": "$HASH",
"cost": 10,
"expired_at": "0001-01-01T00:00:00Z",
"created_at": "$DATE",
"disabled_at": "0001-01-01T00:00:00Z"
}
],
"created": "$DATE",
"last_modified": "$DATE",
"roles": [
{
"name": "admin",
"organization": "authp"
}
]
}
]
}
EOF
# Установка прав
sudo chown caddy:caddy /data/.local/caddy/users.json
sudo chmod 640 /data/.local/caddy/users.json
echo "Файл /data/.local/caddy/users.json создан!"
echo "Перезапустите Caddy: sudo systemctl restart caddy"
Как использовать скрипт:
- Сохраните скрипт в файл
generate_users_json.sh
. - Сделайте его исполняемым:
chmod +x generate_users_json.sh
- Запустите:
./generate_users_json.sh
- Введите данные:
- Имя пользователя (например,
john
). - Email (например,
[email protected]
). - Пароль (минимум 8 символов).
- Имя пользователя (например,
Скрипт создаст файл /data/.local/caddy/users.json
с пользователем, которому присвоена роль authp/admin
.
Шаг 3: Настройка Caddy для авторизации
Теперь настроим Caddyfile для работы с порталом авторизации.
3.1. Основная конфигурация Caddy
Откройте файл /etc/caddy/Caddyfile
:
sudo nano /etc/caddy/Caddyfile
Добавьте глобальные настройки в начало файла:
{
storage file_system {
root /var/lib/caddy
}
email [email protected]
order authenticate before respond
order authorize before respond
security {
local identity store localdb {
realm local
path /data/.local/caddy/users.json
}
authentication portal my_portal {
crypto default token lifetime 3600
enable identity store localdb
cookie domain .example.com
ui {
links {
"Dashboard" "/dashboard" icon "las la-tachometer-alt"
"My Identity" "/auth/whoami" icon "las la-user"
}
}
transform user {
match origin local
action add role authp/admin
}
}
authorization policy my_policy {
set auth url /auth
allow roles authp/admin
acl rule {
comment "Allow authenticated admins"
match role authp/admin
allow stop log info
}
acl rule {
comment "Deny all others"
match any
deny log warn
}
}
}
}
- Замените
[email protected]
на ваш email. - Замените
.example.com
на ваш домен (например,.mydomain.com
).
3.2. Настройка для домена
Добавьте блок для вашего домена:
sub.example.com {
route {
handle /auth {
rewrite * /auth
request_header +X-Forwarded-Prefix /auth
authenticate with my_portal
}
route /auth* {
authenticate with my_portal
reverse_proxy 127.0.0.1:8080 {
header_up X-Real-IP {remote}
header_up Host {host}
}
}
route /* {
authorize with my_policy
reverse_proxy 127.0.0.1:8080 {
header_up X-Real-IP {remote}
header_up Host {host}
}
}
}
log {
output file /var/log/caddy/sub.example.com-access.log {
roll_size 30mb
roll_keep 10
roll_keep_for 720h
}
level ERROR
}
}
- Замените
sub.example.com
на ваш домен. - Настройте
reverse_proxy
под ваш бэкенд (адрес и порт).
Шаг 4: Проверка и перезапуск Caddy
4.1. Проверка конфигурации
Убедитесь, что Caddyfile корректен:
caddy validate --config /etc/caddy/Caddyfile
Если вы видите Valid configuration
, всё в порядке.
4.2. Перезапуск Caddy
Примените изменения:
sudo systemctl restart caddy
Проверьте статус:
systemctl status caddy
Служба должна быть active (running)
.
Шаг 5: Тестирование портала авторизации
- Перейдите в браузере на
https://sub.example.com/auth
. - Введите имя пользователя и пароль из
users.json
. - После входа проверьте доступ к защищенным ресурсам.
Если доступ не работает, проверьте:
- Данные в
users.json
. - Соответствие ролей в настройках.
Дополнительные советы
Множественные домены
Для разных доменов создайте отдельные порталы:
authentication portal another_portal {
cookie domain .anotherdomain.com
...
}
Логирование
Добавьте отладочные логи:
{
log {
output file /var/log/caddy/caddy.log
level DEBUG
}
}
Безопасность
- Обновляйте Caddy регулярно.
- Используйте сложные пароли.
- Настройте фаервол (
ufw
), разрешив только 80 и 443 порты.
Заключение
Теперь у вас есть настроенный портал авторизации на Caddy. Эта конфигурация масштабируема — добавляйте пользователей, домены и политики по вашим задачам. Если возникнут вопросы, загляните в документацию Caddy или спросите в сообществе!
- Наше сообщество Openode.XYZ OpeNode.xyz
- Aeza VPS (+15% к пополнению) Aeza.net
- Лучший Евро-хостер VPS (+1 месяц бесплатно на 100$) Kamatera.com
- VPS hosting - 4vps.su (-10% скидка!) 4VPS.su
- TG Channel TG-Channel Neonode.cc