У меня есть много хостов с динамическими IP-адресами, которые должны иметь доступ к контенту на определенном локальном веб-сайте в разное время, которое я определяю. Время разрешенного доступа всегда различно. Я управляю всеми хостами, которые будут подключаться.

Когда я хочу, чтобы хост имел доступ к частному веб-сайту, я инициирую SSH-туннель от каждого хоста до учетной записи на веб-хосте. Теперь пользователь сможет получить доступ к содержимому веб-сайта через http://localhost. Когда эта машина больше не сможет получить доступ к веб-сайту, туннель будет закрыт.

На частном веб-сайте я могу запустить сценарии PHP /Python /CGI / и т.д. Мне нужно иметь возможность идентифицировать хост, который подключен, потому что информация, которую я предоставляю, будет отличаться в зависимости от хоста, который подключен. Если я выполню поиск имени хоста, скажем, PHP, я, конечно, получу имя хоста веб-сервера. Это будет происходить для каждого клиентского соединения. Я хочу иметь возможность получить доступ к имени хоста клиента. Еще хуже, у клиента будет динамическое имя хоста. Меня не волнует это имя. У меня есть фиксированное имя для каждого хоста, который находится в файле в системе - например. / И т.д. / fixedhostname.

Какую информацию я могу хранить при создании SSH-соединения, чтобы из PHP/CGI/Python/etc. Я мог бы запросить имя хоста подключенного хоста.

ОБНОВИТЬ:
Просто так меньше загадок на мой вопрос ... Клиентами являются студенческие машины (которыми я управляю) в разных компьютерных лабораториях. Веб-сервер дает тестовые вопросы для в лабораторных тестах. Разные лаборатории могут обрабатывать разные тесты одновременно. Я хочу придумать способ выяснить "настоящий" исходный хост (не спрашивая ученика). Я мог бы передать его по адресу : http://localhost? Host = myhost, но тогда учащийся в другом тесте мог увидеть вопрос из другого теста, просто изменив URL. Я мог бы закодировать имя хоста, а затем расшифровать его, но студент все еще мог поделиться URL. Только хосты в тестовом режиме смогут получить доступ к веб-серверу. Первоначально я хотел сделать это с OpenVPN, но я подумал, что создание CA и управление всеми различными ключами только для единственной цели управления доступом к веб-сайту кажется излишним, но, возможно, это не так ... Я подумал, что SSH может быть проще. Сначала я подумал, что смогу просто передать некоторую информацию, которую PHP сможет получить, чтобы определить реальную личность хост-машины.

3 ответа3

1

Если ваши студенты подключаются с компьютеров на базе Linux, вы можете использовать этот сценарий подключения:

#!/bin/bash ssh student@webserver -R 5000:localhost:22 ssh user@localhost sh -c 'hostname >> hostnames.txt; date >> hostnames.txt' ssh student@webserver -L 80:localhost:80

Вот две команды ssh.

Первый используется для записи информации об имени хоста компьютера учащегося и метке времени его соединения в файл hostname.txt на компьютере веб-сервера. student@webserver - это адрес ssh, по которому ваши учащиеся входят в ваш веб-сервер через ssh, а user@localhost - это адрес для входа в систему учащегося с веб-сервера через обратный туннель. Это обратное соединение должно выполняться с использованием ключей ssh, чтобы избавиться от вызова пароля (просто используйте команды ssh-keygen -r RSA и ssh-copy-id user@student.machine из веб-сервера для создания аутентификации на основе ключей).

Вторая команда ssh используется для построения основного туннеля, чтобы учащийся мог подключиться к порту 80 веб-сервера, используя localhost:80 т.е. http://localhost/, на своем локальном компьютере.

Вы можете объединить удаленные команды (имя хоста и дату) в некоторый удаленный скрипт, чтобы предотвратить его возможное изменение студентами. Кроме того, вы можете добавить информацию, относящуюся к IP, в файл hostname.txt с помощью команды greped ifconfig или аналогичной.

Если ваши студенты подключаются с компьютеров под управлением Windows, вы можете установить облегченный сервер freeSSHd в Windows в режиме обслуживания и аутентификации на основе ключей для обратных туннельных подключений.

0

Предполагая, что можно использовать https, вы можете создать ЦС и использовать сертификаты на стороне клиента, где у каждого клиента есть уникальный сертификат со свойствами, которые можно регистрировать (например, common_name.)

Тем не менее, мне интересно, может ли быть лучшей стратегией отказаться от SSH-туннелей и использовать вместо этого OpenVPN. Таким образом, вы можете назначить каждому устройству свой собственный (частный) статический IP-адрес и контролировать время доступа, используя правила iptables. Это также означает, что вы можете использовать стандартные директивы PHP, такие как $ _SERVER ["remote_addr"], чтобы упростить программирование. Затем вы также можете придерживаться http (все еще пользуясь преимуществами шифрования), и с программным обеспечением на клиентской стороне работать намного проще.

0

пользователь сможет получить доступ к содержимому веб-сайта через http://localhost.

Вы можете использовать доменное имя, например lvh.me (я думаю, сокращение от "local virtual host") вместо localhost. Кто-то зарегистрировал это как глобальное сопоставление DNS с 127.0.0.1 (так что нет необходимости во взломе файла hosts ), и он поддерживает субдомены, такие как http://user1.lvh.me Или, если вы не доверяете пользователю чтобы попробовать другие поддомены, а затем использовать случайный, трудно угадываемый поддомен. Наконец, в коде на стороне сервера используйте заголовок Host чтобы увидеть, кто подключается.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .