Determina o host de origem em um túnel da Web SSH através de PHP / CGI / etc

0

Eu tenho muitos hosts com endereços IP dinâmicos que precisam ser capazes de acessar o conteúdo em um determinado site local em momentos diferentes que eu determinei. Os tempos de acesso permitido são sempre diferentes. Eu gerencio todos os hosts que se conectarão.

Quando eu quiser que um host possa acessar o site privado, inicio um túnel SSH de cada host para uma conta no host da web. Agora, o usuário seria capaz de acessar o conteúdo do site através do link . Quando essa máquina não puder mais acessar o site, o túnel será fechado.

No site privado, posso executar scripts PHP / Python / CGI / etc. Eu preciso ser capaz de identificar o host que está conectado porque as informações que eu forneço serão diferentes com base no host que está conectado. Se eu fizer uma pesquisa de nome de host, digamos, PHP, é claro, obter o nome do host do servidor web. Isso acontecerá para todas as conexões do cliente. Eu quero ser capaz de acessar o nome do host do cliente. Pior ainda, o cliente terá um nome de host dinâmico. Eu realmente não me importo com esse nome. Eu tenho um nome fixo para cada host que está em um arquivo no sistema - por exemplo. / etc / fixedhostname.

Quais informações eu poderia armazenar quando eu criava a conexão SSH para que a partir de PHP / CGI / Python / etc. Eu poderia consultar o nome do host do host conectado.

UPDATE:
Só assim há menos mistério para a minha pergunta ... Os clientes são máquinas estudantis (executadas por mim) em diferentes laboratórios de informática. O servidor da web faz perguntas de teste em testes de laboratório. Laboratórios diferentes podem estar lidando com testes diferentes ao mesmo tempo. Eu quero encontrar uma maneira de descobrir o host de origem "real" (sem perguntar ao aluno). Eu poderia inseri-lo em: link , mas um aluno em um teste diferente poderia ver a pergunta de outro teste apenas alterando o URL. Eu poderia codificar o nome do host e decodificá-lo, mas o aluno ainda poderia compartilhar o URL. Apenas hosts no modo de teste poderão acessar o servidor da web. Inicialmente, eu queria fazer isso com o OpenVPN, mas achei que criar um CA e gerenciar todas as diferentes chaves apenas com o único objetivo de gerenciar o acesso a um site parecia um exagero, mas talvez não seja. Mais fácil. Eu inicialmente imaginei que poderia passar apenas algumas informações em que o PHP poderia acessar para determinar a identidade real da máquina host.

    
por Jason 22.06.2017 / 22:25

3 respostas

1

Se seus alunos se conectarem a partir de máquinas baseadas em Linux, você poderá usar este script de conexão:

#!/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

Aqui estão dois comandos ssh.

O primeiro é usado para gravar informações sobre o nome do host da máquina do aluno e o registro de data e hora de sua conexão no arquivo hostname.txt na máquina do servidor web. student@webserver é o endereço ssh para seus alunos fazerem login em seu servidor da web via ssh e user@localhost é o endereço para fazer login na máquina do aluno a partir do servidor da web por meio do túnel reverso. Essa conexão reversa deve ser feita usando chaves ssh para se livrar da chamada de senha (basta usar os comandos ssh-keygen -r RSA e ssh-copy-id [email protected] do servidor da web para criar autenticação baseada em chave).

O segundo comando ssh é usado para construir o túnel principal para que o aluno possa se conectar à porta 80 do servidor web usando localhost:80 , ou seja, link em sua máquina local .

Você pode combinar comandos remotos (hostname e date) em algum script remoto para evitar sua possível alteração pelos alunos. Além disso, você pode adicionar algumas informações relacionadas ao IP ao arquivo hostname.txt usando o comando greped ifconfig ou algo semelhante.

Caso seus alunos se conectem a partir de máquinas com Windows, você pode instalar o servidor freeSSHd leve no Windows em modo de serviço e a autenticação baseada em chave para conexões de encapsulamento reversas.

    
por 26.06.2017 / 22:51
0

Supondo que é aceitável usar https, você pode criar uma CA e usar certificados do lado do cliente, em que cada cliente tem um certificado exclusivo com propriedades que podem ser registradas (por exemplo, o nome do usuário.)

Dito isso, gostaria de saber se uma estratégia melhor seria abandonar os túneis SSH e usar o OpenVPN. Dessa forma, você pode dar a cada dispositivo seu IP estático (privado) e controlar os horários de acesso usando as regras do iptables. Isso também significa que você pode usar diretivas padrão do PHP, como $ _SERVER ["remote_addr"], facilitando a programação. Você também pode ficar com http (enquanto ainda se beneficia da criptografia) e é muito mais fácil trabalhar com programação no lado do cliente.

    
por 23.06.2017 / 10:59
0

the user would be able to access the contents of the web site through http://localhost.

Você poderia usar um nome de domínio como lvh.me (abreviação de "host virtual local", eu acho) em vez de localhost. Alguém registrou isso como um mapeamento DNS global para 127.0.0.1 (portanto, não há necessidade de qualquer invasão no arquivo hosts ) e ele suporta subdomínios, como o link Ou, se você não confia que o usuário experimente outros subdomínios, use um subdomínio aleatório e difícil de adivinhar. Por fim, no código do lado do servidor, use o cabeçalho Host para ver quem está se conectando.

    
por 23.06.2017 / 11:12