Автор Тема: Настройка доступа учителя к ученическим компьютерам по SSH  (Прочитано 121 раз)

Оффлайн gadfly7

  • Участник
  • *
  • Сообщений: 23
Готовимся к удалённому управлению классом

Рано или поздно администратору школьного компьютерного класса приходит мысль об удалённом управлении.
Бегать с флешкой по классу можно, но долго. Гораздо удобнее сделать так, чтобы учитель мог подключаться к любому компьютеру класса по SSH прямо со своего места.

Что мы получим в итоге:

- Учитель сможет подключаться к ученическим компьютерам по SSH без пароля (по ключам)
- Настройка безопасная: парольный вход для root запрещён, только ключи
- Всё делается за один обход класса с флешкой. Один раз таки придётся
- После настройки у вас останется список обработанных компьютеров - никого не пропустите


Скрипт будет работать в двух режимах:

Режим 1 - "Подготовка флешки" (запускается на компьютере учителя от обычного пользователя)

- Проверяет, есть ли у учителя SSH-ключ (алгоритм ed25519)
- Если нет - создаёт новый (без парольной фразы)
- Копирует публичную часть ключа на флешку

Режим 2 - "Настройка ученического ПК" (запускается на каждом ученическом компьютере от root)

- Берёт ключ с флешки
- Добавляет его в authorized_keys для root
- Разрешает в SSH доступ root'у по ключам (PermitRootLogin prohibit-password)
- Перезапускает SSH
- Записывает имя компьютера в чек-лист (чтобы учитель видел, какие ПК уже обработаны)


Нам понадобится

1. Флешка
2. Компьютер учителя (с которого будете подключаться)
3. Все ученические компьютеры (обходим по очереди с флешкой)


Шаг 1. Создаём скрипт на флешке

На вашей флешке создайте новый текстовый файл и назовите его setup_access.sh.

Отступление про окончания строк! Если вы создаёте файл скрипта в Windows (в Блокноте), перед запуском нужно будет исправить окончания строк "под линукс", иначе он не сработает. Я рекомендую один из двух способов:
- Установить утилиту dos2unix (есть в репозитории Альт) и выполнить dos2unix setup_access.sh
- Или открыть файл в редакторе Mousepad, выбрать в меню "Документ" - "Завершение строк" - "Unix (LF)" и сохранить.
Ещё лучше: создавайте скрипты сразу в Linux (в любом текстовом редакторе) - тогда проблем с окончаниями не будет вообще.

Продолжаем. Откройте файл в текстовом редакторе и вставьте туда вот этот код:

#!/bin/bash

SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
KEY_NAME="id_ed25519.pub"
KEY_ON_FLASH="$SCRIPT_DIR/$KEY_NAME"

echo "=== МАСТЕР НАСТРОЙКИ ДОСТУПА SSH ==="
echo "Выберите режим работы:"
echo "1) ПОДГОТОВИТЬ ЭТУ ФЛЕШКУ (запускать на компьютере УЧИТЕЛЯ от ОБЫЧНОГО пользователя)"
echo "2) НАСТРОИТЬ ЭТОТ УЧЕНИЧЕСКИЙ КОМПЬЮТЕР (запускать на каждом ПК от root)"
echo "------------------------------------"
read -p "Введите цифру (1 или 2): " MODE

case $MODE in
    1)
        # РЕЖИМ УЧИТЕЛЯ: Генерируем и копируем ключ на флешку
        if [ "$EUID" -eq 0 ]; then
            echo "❌ ОШИБКА: Режим 1 должен запускаться от ОБЫЧНОГО пользователя, а не от root!"
            echo "Выйдите из root (команда exit) и запустите скрипт снова."
            exit 1
        fi
       
        echo "Режим: ПОДГОТОВКА ФЛЕШКИ..."
       
        # Если в системе учителя ключа нет - создаем
        if [ ! -f "$HOME/.ssh/id_ed25519" ]; then
            echo "Ключ не найден. Создаю новый для этого ПК..."
            mkdir -p "$HOME/.ssh"
            chmod 700 "$HOME/.ssh"
            ssh-keygen -t ed25519 -N "" -f "$HOME/.ssh/id_ed25519"
            echo "✅ Ключ создан"
        else
            echo "✅ Ключ уже существует"
        fi
       
        # Копируем публичный ключ на флешку рядом со скриптом
        cp "$HOME/.ssh/$KEY_NAME" "$KEY_ON_FLASH"
        echo "✅ Файл $KEY_NAME скопирован на флешку."
        echo ""
        echo "Теперь эту флешку можно нести на ученические компьютеры."
        echo "На каждом ученическом ПК запустите этот же скрипт и выберите режим 2."
        ;;

    2)
        # РЕЖИМ КОМПЬЮТЕРА УЧЕНИКА: Настраиваем доступ
        echo "Режим: НАСТРОЙКА УЧЕНИЧЕСКОГО ПК..."
       
        # Проверка root (нужен для правки /etc/ и /root/)
        if [ "$EUID" -ne 0 ]; then
            echo "❌ ОШИБКА: Запустите скрипт от root (через su -)"
            exit 1
        fi
       
        # Проверка: есть ли вообще ключ на флешке?
        if [ ! -f "$KEY_ON_FLASH" ]; then
            echo "❌ ОШИБКА: На флешке нет файла $KEY_NAME!"
            echo "Сначала запустите этот скрипт на компьютере учителя (режим 1)."
            exit 1
        fi

        # 1. Создаём папку .ssh для root, если нет
        mkdir -p /root/.ssh
        chmod 700 /root/.ssh

        # 2. Добавляем ключ, если его ещё нет
        if ! grep -qf "$KEY_ON_FLASH" /root/.ssh/authorized_keys 2>/dev/null; then
            cat "$KEY_ON_FLASH" >> /root/.ssh/authorized_keys
            echo "✅ Ключ добавлен в /root/.ssh/authorized_keys"
        else
            echo "⏩ Ключ уже есть в authorized_keys, пропускаем"
        fi
        chmod 600 /root/.ssh/authorized_keys

        # 3. Делаем бэкап конфига SSH
        cp /etc/openssh/sshd_config /etc/openssh/sshd_config.bak.$(date +%Y%m%d)

        # 4. Разрешаем root-доступ по ключам (без пароля)
        sed -i 's/^#*PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/openssh/sshd_config
        echo "✅ Настройки SSH обновлены"

        # 5. Включаем автозагрузку SSH и запускаем
        systemctl enable sshd
        systemctl restart sshd
        echo "✅ Служба SSH добавлена в автозагрузку и запущена"

        # 6. Запись в чек-лист (просто имя компьютера для контроля)
        echo "$(hostname)" >> "$SCRIPT_DIR/checked_pcs.txt"
        echo "✅ Компьютер $(hostname) добавлен в список"

        echo ""
        echo "==================== ГОТОВО ===================="
        echo "Теперь учитель может подключиться к этому ПК:"
        echo "  ssh root@$(hostname)"
        echo "  или (если не работает DNS) по IP:"
        echo "  ssh root@$(ip route get 1 | awk '{print $7}' | head -1)"
        echo "================================================"
        ;;
    *)
        echo "❌ Отмена. Введено неверное значение."
        exit 1
        ;;
esac

Сохраните файл.


Шаг 2. Запускаем режим 1 на компьютере учителя

Важно: Режим 1 должен запускаться от обычного пользователя, а не от root!

1. Если предполагаете исправлять окончания строк с помощью dos2unix, а она ещё не установлена (и файл создавался в Windows), можно сейчас установить её её от root. Если она не нужна или уже есть - пропускаем.
su -# apt-get update && apt-get install dos2unix
# exit

2. Вставьте флешку и перейдите в её папку уже под своей обычной учёткой:
cd /run/media/ пока не нажимаем Enter- нажмите Tab - автодополнение подставит имя
- нажмите Tab ещё - подставит имя флешки
- нажмите Enter - есть, мы перешли в корень флешки

3. Если нужно, на этом этапе можно исправить окончания строк в файле скрипта (если не требуется - пропускаем):
dos2unix setup_access.sh
4. Запустите скрипт. Мы выполняем его от вашей обычной учётной записи.
sh setup_access.sh
5. Выберите режим 1 (Подготовить эту флешку).

Скрипт проверит наличие SSH-ключа в папке ~/.ssh/id_ed25519. Если ключа нет - создаст его. Затем скопирует публичный ключ на флешку.

Вы увидите примерно такое сообщение:

=== МАСТЕР НАСТРОЙКИ ДОСТУПА SSH ===
Выберите режим работы:
1) ПОДГОТОВИТЬ ЭТУ ФЛЕШКУ (запускать на компьютере УЧИТЕЛЯ от ОБЫЧНОГО пользователя)
2) НАСТРОИТЬ ЭТОТ УЧЕНИЧЕСКИЙ КОМПЬЮТЕР (запускать на каждом ПК от root)
------------------------------------
Введите цифру (1 или 2): 1
Режим: ПОДГОТОВКА ФЛЕШКИ...
✅ Ключ уже существует
✅ Файл id_ed25519.pub скопирован на флешку.

Теперь эту флешку можно нести на ученические компьютеры.
На каждом ученическом ПК запустите этот же скрипт и выберите режим 2.

Флешка готова! Теперь на ней лежит:
- сам скрипт setup_access.sh
- публичный ключ id_ed25519.pub
- (позже появится файл checked_pcs.txt со списком обработанных компьютеров)


Шаг 3. Обходим ученические компьютеры (режим 2)

На каждом ученическом ПК:

1. Вставляем флешку.
2. Открываем терминал.
3. Переходим в root:
su -   (вводим пароль администратора)
Команду на разрешение подключаться к компьютеру должен дать сам root, поэтому от него и выполняется скрипт на целевом компьютере.

4. Переходим в папку с флешкой (снова используйте Tab):
# cd /run/media/ не жмём Enter- Tab
- Tab
- Enter - есть.

5. Запускаем скрипт:
# sh setup_access.sh
6. Выбираем режим 2 (Настроить этот ученический компьютер).

Скрипт:
- проверит, есть ли ключ на флешке
- добавит ключ в authorized_keys для root
- сделает бэкап конфига SSH
- пропишет PermitRootLogin prohibit-password
- перезапустит SSH
- запишет имя компьютера в файл checked_pcs.txt на флешке

Вы увидите примерно такой вывод:

=== МАСТЕР НАСТРОЙКИ ДОСТУПА SSH ===
Выберите режим работы:
1) ПОДГОТОВИТЬ ЭТУ ФЛЕШКУ (запускать на компьютере УЧИТЕЛЯ от ОБЫЧНОГО пользователя)
2) НАСТРОИТЬ ЭТОТ УЧЕНИЧЕСКИЙ КОМПЬЮТЕР (запускать на каждом ПК от root)
------------------------------------
Введите цифру (1 или 2): 2
Режим: НАСТРОЙКА УЧЕНИЧЕСКОГО ПК...
✅ Ключ добавлен в /root/.ssh/authorized_keys
✅ Настройки SSH обновлены
✅ Служба SSH перезапущена
✅ Компьютер pc-21 добавлен в список

==================== ГОТОВО ====================
Теперь учитель может подключиться к этому ПК:
  ssh root@pc-21
  или (если не работает DNS) по IP:
  ssh root@192.168.1.22
================================================

Повторяем эту процедуру на всех ученических компьютерах.


Шаг 4. Проверяем, никого не пропустили

На флешке появился файл checked_pcs.txt. Откройте его в любом текстовом редакторе - там построчно перечислены имена всех обработанных ПК.
Сверившись со своим списком (или просто вспомнив, сколько у вас компьютеров), вы легко увидите, не пропустили ли кого-то.
Если какой-то компьютер пропущен - можно вернуться и доделать.


Шаг 5. Проверяем. Пробуем подключиться с учительского компьютера

Теперь вернёмся на учительский компьютер и проверим, как работает доступ.

1. Откройте терминал на учительском компьютере (под своей обычной учёткой).
2. Попробуйте подключиться к одному из ученических ПК:
ssh root@pc-21   (вместо pc-21 подставьте реальное имя или IP компьютера)

Если всё настроено правильно, вы сразу окажетесь в системе ученического компьютера без запроса пароля.


Важное дополнение для пользователей Windows

Весь описанный выше процесс рассчитан на то, что учитель работает в Linux (в частности, в Альт Образование). Но если у вас на рабочем компьютере стоит Windows - это не проблема!  :-D

Начиная с Windows 10, в системе есть встроенный клиент OpenSSH. Это значит, что вы можете:

1. Открыть командную строку (или PowerShell) и сгенерировать SSH-ключ точно такой же командой, как в Linux:
ssh-keygen -t ed25519 -N "" -f "%USERPROFILE%\.ssh\id_ed25519"(можно просто выполнить в командной строке ssh-keygen без аргументов - и протыкать Enter на все вопросы)

2. Найти созданный публичный ключ в папке C:\Users\ВашеИмя\.ssh\id_ed25519.pub и скопировать его на флешку.

3. Дальше действовать по вышеописанному: взять флешку, обойти ученические компьютеры, запустить на них режим 2 нашего скрипта setup_access.sh. Ключ с флешки будет добавлен, SSH настроен, и вы сможете подключаться к ученическим ПК прямо из Windows.

Никакой магии - OpenSSH в Windows работает с теми же ключами, что и в Linux. Так что можете смело пользоваться, и даже без PuTTY.


Как всё это устроено
- SSH-ключи - это безопасный способ аутентификации. Вместо пароля используется пара ключей: приватный (хранится у учителя) и публичный (кладётся на ученические ПК).
- Мы использовали алгоритм ed25519 - современный, быстрый и надёжный.
- Параметр PermitRootLogin prohibit-password в конфиге SSH означает: root может заходить по SSH только с ключом, парольный вход запрещён.
- Файл checked_pcs.txt - просто текстовый лог, куда скрипт записывает имена обработанных компьютеров. Никакой другой роли он не играет.


Я потерял/удалил ключ на учительском компьютере
- Просто запустите режим 1 снова - скрипт создаст новый ключ. Но учтите: на всех ученических ПК, которые вы уже настроили, нужно будет заменить ключ (старый перестанет работать).


Кстати
Если ранее использовали мои решения из предыдущих тем, то на флешке уже шесть скриптов:

- archive_profile.sh и deploy.sh - для "замороженного" профиля ученика
- guest_cleanup.sh - для очистки мусора от гостевых сеансов
- samba_teacher.sh - для настройки сетевых папок учителя
- student_autofs.sh - для настройки ученических компьютеров (подключение к папкам учителя)
- setup_access.sh - для настройки SSH-доступа к ученическим ПК

Дальше предполагаю дать готовый способ использовать SSH для целевого массового запуска скриптов на ученических компьютерах. Опять же "всё в одном файле, запустил и всё само сделалось".


Скрипт делался для Альт Образование 11.1 (XFCE). Если используете другие дистрибутивы и версии - возможно, потребуется адаптация (например, путь к конфигу SSH, я не проверял).

upd: Исправил скрипт. На большинстве ученических компьютеров sshd изначально не стоит в автозапуске. Теперь скрипт включает его автозагрузку.
« Последнее редактирование: 20.03.2026 08:00:13 от gadfly7 »