#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 будет обработан для авторизации.