#6752: Скрипт прозрачной / автоматической авторизации под локальным пользователем на Linux

Отредактирована: 19 дней назад

Симптомы

Необходимо настроить прозрачную авторизацию под локальным пользователем на Linux (Ubuntu, Debian, Centos, Astra, Red OS, Alt, Rosa).

Авторизация пользователей в консоли без веб-интерфейса.

Решение

Для настройки прозрачной аутентификации под локальным пользователем на Linux вам необходимо выполнить следующее:

1) Настроить captive-портал по документации, использовать профиль аутентификации с методом - Локальный пользователь
2) На Linux машине Создать файл login_cpa.sh и сделать его исполняемым chmod +x login_cpa.sh
Содержимое файла:

#!/bin/bash

# Настройки
TARGET_URL="http://cbr.ru"
LOGIN="test"
PASSWORD="test"
COOKIE_JAR="cookies.txt"
urlencode() {
    local string="$1"
    local encoded=""
    local i
    for (( i=0; i<${#string}; i++ )); do
        char="${string:i:1}"
        case "$char" in
            [a-zA-Z0-9.~_-]) encoded+="$char" ;;
            *) encoded+=$(printf '%%%02X' "'$char") ;;
        esac
    done
    echo "$encoded"
}

FINAL_URL=$(curl -s -L -o /dev/null -w '%{url_effective}' "$TARGET_URL")

if [ -z "$FINAL_URL" ]; then
    echo "Ошибка: не удалось получить конечный URL"
    exit 1
fi



ST=$(echo "$FINAL_URL" | sed -n 's/.*[?&]st=\([^&]*\).*/\1/p')
LINK=$(echo "$FINAL_URL" | sed -n 's/.*[?&]link=\([^&]*\).*/\1/p')
if [ -z "$ST" ] || [ -z "$LINK" ]; then
    echo "Ошибка: не удалось извлечь параметры st и link"
    exit 1
fi

curl -k -s -c "$COOKIE_JAR" "$FINAL_URL" > /dev/null

CSRF_TOKEN=$(grep csrf_token "$COOKIE_JAR" | awk '{print $7}')
if [ -z "$CSRF_TOKEN" ]; then
    echo "Ошибка: не удалось получить CSRF-токен"
    exit 1
fi

HOST=$(echo "$FINAL_URL" | awk -F/ '{print $3}')

ENCODED_LOGIN=$(urlencode "$LOGIN")
ENCODED_PASS=$(urlencode "$PASSWORD")
BODY="login=$ENCODED_LOGIN&password=$ENCODED_PASS&st=$ST&link=$LINK&auth_code=&remember_me=false&csrfmiddlewaretoken=$CSRF_TOKEN"

RESPONSE=$(curl -k -s -b "$COOKIE_JAR" -c "$COOKIE_JAR" \
    -X POST \
    --data "$BODY" \
    "https://$HOST/cpa/login")

echo "   Ответ сервера: $RESPONSE"

if echo "$RESPONSE" | grep -q '"success":true'; then
    echo "Авторизация успешна! Сессия сохранена в $COOKIE_JAR"
else
    echo "Ошибка авторизации. Код ошибки: $(echo "$RESPONSE" | sed -n 's/.*"error_code":\([0-9]*\).*/\1/p')"
    exit 1
fi

Переменные LOGIN и PASSWORD заменить на свои соответственно.

3) На Linux машине создать файл setup_auth_service.sh и сделать его исполняемым chmod +x setup_auth_service.sh
Содержимое файла:

#!/usr/bin/env bash

set -e  # прерывать выполнение при ошибке

SOURCE_SCRIPT="login_cpa.sh"

if [ ! -f "$SOURCE_SCRIPT" ]; then
    echo "Ошибка: файл $SOURCE_SCRIPT не найден в текущей директории."
    exit 1
fi

# ---- Определяем реальный путь к исходному файлу ----
REAL_PATH=$(realpath "$SOURCE_SCRIPT")

# ---- Целевой путь ----
DEST_SCRIPT="$HOME/login_cpa.sh"

if [ "$REAL_PATH" = "$DEST_SCRIPT" ]; then
    echo "Файл уже находится в домашней директории, пропускаем копирование."
    # Убедимся, что он исполняемый
    chmod +x "$DEST_SCRIPT"
else
    echo "Копируем $SOURCE_SCRIPT в $DEST_SCRIPT..."
    cp "$SOURCE_SCRIPT" "$DEST_SCRIPT"
    chmod +x "$DEST_SCRIPT"
    echo "Скрипт скопирован и сделан исполняемым."
fi

# ---- Создание каталога для systemd unit-файлов ----
USER_SYSTEMD_DIR="$HOME/.config/systemd/user"
mkdir -p "$USER_SYSTEMD_DIR"

# ---- Создание файла сервиса auth.service ----
SERVICE_FILE="$USER_SYSTEMD_DIR/auth.service"
cat > "$SERVICE_FILE" << EOF
[Unit]
Description=Auth service on UserGate UTM (captive portal)
After=network.target network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=$DEST_SCRIPT
StandardOutput=append:/tmp/auth.log
StandardError=append:/tmp/auth-error.log

[Install]
WantedBy=default.target
EOF
echo "Создан файл сервиса: $SERVICE_FILE"

# ---- Создание файла таймера auth.timer ----
TIMER_FILE="$USER_SYSTEMD_DIR/auth.timer"
cat > "$TIMER_FILE" << EOF
[Unit]
Description=Run auth service every 1 minutes

[Timer]
OnBootSec=1m
OnUnitInactiveSec=1m

[Install]
WantedBy=timers.target
EOF
echo "Создан файл таймера: $TIMER_FILE"

# ---- Вывод инструкции ----
echo ""
echo "Установка завершена!"
echo ""
echo "Для запуска авторизации по таймеру выполните следующие команды:"
echo ""
echo "  systemctl --user daemon-reload"
echo "  systemctl --user enable auth.timer"
echo "  systemctl --user start auth.timer"
echo ""
echo "Проверьте статус:"
echo "  systemctl --user status auth.service"
echo "  systemctl --user status auth.timer"
echo ""
echo "Если вы хотите изменить интервал, отредактируйте $TIMER_FILE"
echo "и выполните systemctl --user daemon-reload"
echo ""
echo "Удачи!"

Где в параметре OnUnitInactiveSec указана 1 минута, вы можете указать свое время, через которое скрипт должен повторно отработать для авторизации.
В параметре OnBootSec также указана 1 минута, параметр отвечает за время, через которое скрипт будет запущен после инициализации системы.

4) Выполнить команды по порядку:

systemctl --user daemon-reload
systemctl --user enable auth.timer
systemctl --user start auth.timer

После этого будет посылаться запрос на http://cbr.ru каждую минуту после запуска системы, и если пользователь unknown, редирект на страницу captive будет обработан для авторизации.