Aprovisionar um cliente de OpenVPN com etapas que param no erro
Cinco etapas impedem que um script de aprovisionamento deixe meia instalação: verificar as entradas, preparar o conjunto, trocar de forma atómica, ativar um único proprietário e planear a retirada.
Os scripts de aprovisionamento que reportam um erro e continuam são piores do que scripts que nunca são executados. A configuração do cliente toca em chaves protegidas, numa identidade no gateway e num serviço que pode já estar a servir tráfego. Cada um destes elementos precisa de uma condição de paragem, e o script tem de saber a que etapa chegou quando parou.
Trate tudo como uma transação com cinco pontos de verificação, e faça com que cada ponto de verificação se recuse a continuar por si próprio.
Corrija as entradas antes de tocar no sistema de ficheiros
Comece com um contrato explícito: uma identidade, uma origem de perfil, um proprietário de serviço previsto. Verifique que o perfil existe, que o certificado e a chave a que se refere são legíveis e que o diretório de destino pertence ao pacote esperado. Um caminho que se resolve não é prova de que o material por trás dele está completo.
Rejeite cedo as variáveis vazias. Uma $DEVICE não definida que se expande para nada transforma install -m 400 $KEY /etc/openvpn/client/ numa cópia dirigida a um diretório, e a falha chega mais tarde como um serviço que não consegue ler a sua chave.
Monte o conjunto de perfis num diretório de preparação
Construa primeiro o conjunto completo num local privado: perfil, CA, certificado de cliente, chave e qualquer auxiliar que o perfil invoque. Copie com install -m 400 -o root -g root para que as permissões sejam fixadas na criação e não depois. Depois reveja as referências dentro do perfil, porque uma linha relativa ca ou key é resolvida em relação ao diretório de trabalho da unidade assim que o serviço arranca. Nada deve ser escrito no diretório ativo até que todo o conjunto valide.
Registe uma impressão digital não secreta do que esta execução produziu, por exemplo sha256sum office.conf guardado junto a um marcador de versão. É esse único valor que permite a uma reexecução distinguir uma atualização de uma não-operação.
Troque de forma atómica e guarde o conjunto anterior
Mova o conjunto preparado para o seu lugar numa só operação onde o sistema de ficheiros o permitir, e guarde o conjunto anterior revisto sob um nome com marca temporal. Uma cópia parcial que deixa um perfil novo ao lado de uma chave antiga produz um serviço que se autentica com a identidade errada e não registra nada de útil sobre o motivo. Se a troca não puder ser atómica, ordene as movimentações para que o perfil chegue por último.
Quando o destino já existe, decida explicitamente se esta execução é uma atualização, uma reexecução idêntica ou um conflito com o perfil de outro dispositivo. Sobrescrever em silêncio um perfil que pertence a outra identidade é como duas máquinas acabam a partilhar um único certificado. Recuse a execução e nomeie o proprietário em conflito.
Ative um único proprietário e prove-o
Escolha um único caminho de ativação, ou a instância systemd ou o NetworkManager, e use-o de forma consistente. Arrancar um processo openvpn não gerido ao lado de uma unidade ativada dá dois túneis, atualizações DNS concorrentes e nenhuma resposta clara sobre qual deles é visado por um comando de paragem. Após a ativação, verifique systemctl is-active openvpn-client@office, depois a rota para o prefixo remoto e depois resolvectl status para o resolvedor que o túnel instalou. Termine alcançando um recurso para o qual o túnel existe.
Um processo em execução e um ícone verde na bandeja são factos do processo, não prova de que a identidade e a política de tráfego sobreviveram à entrega.
Reexecução e retirada são fluxos de trabalho separados
Uma segunda execução deve convergir nos mesmos ficheiros revistos e no mesmo proprietário, não criar uma segunda conta nem um segundo daemon. A retirada é o seu próprio procedimento: pare o proprietário exato, arquive ou elimine o perfil local conforme a política e revogue a identidade no gateway. Eliminar um ficheiro de chave local não revoga uma cópia que já saiu da máquina.
Mantenha um caminho de recuperação que não dependa do túnel, como acesso à consola ou uma segunda rota de gestão. Uma alteração de aprovisionamento que o deixa fora da máquina é uma alteração falhada mesmo quando cada etapa reportou sucesso.
O script que vale a pena guardar é uma transação em torno da propriedade e da evidência. Uma curta lista de comandos de cópia privilegiados não é a mesma coisa.