Expulsar um cliente OpenVPN: kill, deny ou revogar um certificado?
Três ações do OpenVPN removem um cliente, mas cada uma termina algo diferente: uma sessão ativa, uma tentativa de login ou o direito de reconectar. Escolha pela identidade.
Tem um common name e um endereço nas notas, e três comandos que todos parecem remover um cliente. Só um faz o que você quer, e a escolha depende de precisar terminar a sessão que está a correr agora, recusar o próximo login ou retirar o direito de conectar de vez. Leia a identidade que você realmente tem antes de tocar em qualquer coisa, porque um pool do OpenVPN entrega o mesmo endereço de túnel a outra sessão mais tarde.
Que identidade você realmente tem
Um arquivo de estado de versão 3 é o ponto de partida habitual. A seção CLIENT_LIST traz o common name, o endereço real, os contadores de bytes e o tempo de conexão; a seção ROUTING TABLE mapeia um endereço virtual para um common name com um carimbo de tempo da última referência. O common name é a identidade estável. O endereço virtual é uma atribuição, e o endereço real atrás de um NAT pode mudar entre sessões sem que nada mude no servidor.
A interface de gerenciamento expõe uma visão semelhante pelo seu comando status e acrescenta um ID de cliente por sessão. É esse ID que client-kill espera, e não é o endereço do túnel. Se precisar saber qual common name recebeu qual endereço no momento da conexão, o ambiente de um script client-connect tem ambos, junto com o endereço externo confiável, mas esse script corre como o usuário do OpenVPN e precisa de um caminho de log gravável.
| What you hold | Where it came from | What it can act on |
|---|---|---|
| Common name | CLIENT_LIST, or the auth hook | kill, and credential revocation |
| Client ID | status on the management socket | client-kill, that one session |
| Tunnel address | ROUTING TABLE, client-connect environment | Nothing durable, the address is recycled |
Matar agora, recusar no login, revogar para sempre
Os dois comandos de remoção na interface de gerenciamento são ações de sessão. kill aceita um common name ou um endereço real e porta; client-kill aceita o ID do cliente e termina essa instância imediatamente. Nenhum é um bloqueio: um cliente expulso com certificado e senha válidos reconecta em segundos, o que está bem quando recicla um peer de teste e é inútil quando um laptop foi roubado.
client-deny é outro tipo de decisão. Normalmente é emitido a partir de um hook de autenticação ou de client-connect e recusa a sessão com um motivo, por isso se encaixa numa política que recusa um login em vez de numa que interrompe uma conexão. A documentação também avisa que uma recusa emitida durante uma renegociação TLS invalida a chave renegociada enquanto a sessão existente pode continuar até a janela de transição fechar. Se o requisito é que o cliente já não esteja, a resposta documentada é client-kill.
A remoção duradoura fica abaixo de tudo isso. Revogue o certificado e garanta que crl-verify aponta para uma lista que o servidor realmente recarrega, desative o arquivo de configuração específico do cliente no diretório ccd, ou desative a conta no backend que o hook de autenticação consulta. Uma revogação também não é instantânea: com os ajustes padrão de reneg-sec, uma sessão estabelecida pode continuar até renegociar, então a ação de sessão e a ação de credenciais são complementares, não alternativas.
O socket de gerenciamento está livre?
A interface de gerenciamento atende um cliente de cada vez. Se uma GUI ou um daemon de monitoramento já tem a conexão, o seu script não consegue anexar-se ao lado, e dependendo do cliente pode expulsar o existente em vez de falhar de forma limpa. A senha dele viaja em texto claro nesse socket, por isso pertence a um endereço local ou a um socket unix, nunca a uma interface pública.
Quando não consegue tomar o socket, ainda tem opções, e todas são mais lentas. Solte primeiro a sessão da GUI se a controla, ou aceite o caminho pela camada de credenciais e espere pela próxima renegociação. O que não deve fazer é reiniciar o serviço para se livrar de um cliente, porque isso termina também todas as outras sessões e destrói as provas do arquivo de estado desta.
A sequência que executo num servidor ativo
Ligue-se, leia o estado atual, atue sobre o ID que acabou de ler e leia-o novamente. Valores copiados de um documento são a forma mais comum de matar a pessoa errada.
status # note the client ID and common name
client-kill 3 # end that session now
kill Test-Client # alternative: by common name
status # confirm the session is goneO nome e o número acima são marcadores de posição, e os IDs são reutilizados depois de outros clientes se desconectarem. Confirme que a linha está ausente antes de anotar algo como feito, e verifique que a contagem de clientes conectados mudou em um e não em vários.
Confirme que ficou fora
Registe o common name, o endereço do túnel, o endereço externo e o minuto da remoção. Se o mesmo common name aparecer outra vez um minuto depois, a ação de sessão funcionou e a camada de credenciais não, o que é um reparo completamente diferente do de um comando que nunca teve efeito.
Depois teste do lado do cliente. Um certificado revogado deve falhar no próximo handshake; se ainda se conectar, a CRL não está a ser lida de todo, e essa é a descoberta que vale a pena relatar. Escolha a ação pelo que precisa terminar, confirme com um segundo status e corrija a camada de credenciais quando a resposta tiver de durar mais do que a sessão.