Pesquisa de site

ASSH: uma maneira avançada de interagir com SSH


Aprimore sua experiência SSH com assh quando você tiver vários hosts aos quais se conectar.

ASSH ou Advanced SSH Config é um wrapper para SSH que permite o gerenciamento dinâmico e avançado de configurações SSH.

As configurações SSH padrão podem rapidamente se tornar complexas e difíceis de gerenciar, especialmente em ambientes com muitos servidores. ASSH oferece uma solução para este problema introduzindo uma camada de abstração. Isso sobrecarrega a utilização do recurso de arquivo de configuração SSH.

Por exemplo, se você tiver um conjunto de servidores divididos em ambientes de desenvolvimento, teste e produção. Com o ASSH, você pode definir esses ambientes de forma clara e organizada, facilitando a alternância entre eles conforme necessário.

# assh.yml
defaults:
  user: talha
groups:
  development:
    hosts:
      - dev1.example.com
      - dev2.example.com
  testing:
    hosts:
      - test1.example.com
      - test2.example.com
  production:
    hosts:
      - prod1.example.com
      - prod2.example.com

ASSH permite definir grupos de servidores com base em seus ambientes, o que facilita a conexão com um ambiente específico sem listar hosts individuais. Por exemplo, para conectar-se ao servidor de desenvolvimento:

assh development

Parece emocionante? Vamos ver mais sobre assh.

Como funciona o ASSH

Vamos mergulhar nos principais conceitos do ASSH para entender melhor como essa ferramenta enriquece a experiência SSH. ASSH não é apenas um invólucro; é uma reinvenção inteligente de como interagimos com o SSH.

ASSH funciona interpondo-se entre seu cliente SSH e suas conexões SSH. Ele intercepta comandos SSH e os manipula de acordo com as configurações especificadas em seu ~/.ssh/config. Isso permite grande flexibilidade e personalização profunda de suas conexões.

O núcleo do ASSH é baseado em dois componentes principais:

O Analisador de Configuração: ASSH lê e interpreta o arquivo de configuração SSH. Ele adiciona uma camada extra de funcionalidade, respeitando a sintaxe básica e a funcionalidade do arquivo SSH original.

O proxy SSH: quando uma conexão SSH é iniciada, o ASSH atua como um proxy. Ele pode alterar dinamicamente os parâmetros de conexão, distribuir a carga entre vários hosts ou até mesmo passar por vários servidores para chegar ao destino final.

Um dos aspectos mais poderosos do ASSH é a sua capacidade de lidar com configurações complexas com simplicidade. Por exemplo, você pode configurar conexões por meio de servidores proxy, definir regras de reconexão automática ou até mesmo gerenciar grupos de hosts com configurações semelhantes.

Com o ASSH, você pode definir regras avançadas para cada host ou grupo de hosts em seu arquivo de configuração. Essas regras podem incluir:

  • Balanceamento e failover: Distribua conexões entre vários hosts para equilibrar a carga ou fornecer redundância.

  • Hosts de encadeamento e salto: Conecte-se a um host por meio de um ou mais intermediários, o que é particularmente útil em ambientes complexos ou seguros.

  • Ganchos personalizados: execute scripts ou comandos específicos em momentos diferentes durante sua conexão SSH, como antes do login, após o logout, etc.

Instalando ASSH

Esteja você no Linux, macOS ou Windows, o processo de instalação foi projetado para ser o mais simples possível. ASSH é facilmente instalável através de gerenciadores de pacotes comuns.

No Linux, o processo pode variar um pouco dependendo da sua distribuição, mas o ASSH geralmente está disponível por meio de gerenciadores de pacotes padrão. ASSH também pode ser instalado com asdf-vm:

asdf plugin add assh
asdf install assh latest
asdf global assh latest

Arquivos de configuração ASSH

Após instalar o ASSH, é essencial entender como os arquivos de configuração são definidos.

O arquivo ~/.ssh/config é um arquivo de texto padrão que define configurações para conexões SSH. Este arquivo pode incluir informações como nomes de host, endereços IP, nomes de usuário, portas e outras opções de configuração.

Aqui está um exemplo da aparência de uma entrada básica neste arquivo:

Host myserver
HostName myserver.example.com
User myuser
Port 22
IdentityFile ~/.ssh/id_ed25519

Neste exemplo, myserver é um alias para a conexão SSH com o servidor myserver.example.com. Este arquivo também especifica o nome de usuário, a porta e o arquivo de identidade SSH a ser usado para esta conexão.

Host *.example.com
 User myuser
 IdentityFile ~/.ssh/id_ed25519
 ControlMaster auto
 ControlPath ~/.ssh/cm-%r@%h:%p
 ControlPersist 5m

Neste exemplo, *.example.com é um modelo para conexão SSH a servidores cujo nome de domínio termina com .example.com. Este modelo também especifica o nome de usuário, o arquivo de identidade SSH e as configurações de conexões a serem usadas para esta conexão. Neste exemplo, o ControlMaster permite a multiplexação de conexão SSH. Aqui ele é definido como auto, o que informa ao SSH para tentar usar uma conexão existente com o mesmo host em vez de criar uma nova e ControlPath, como o nome sugere, especifica o local do soquete de controle. Da mesma forma, ControlPresist especifica por quanto tempo a conexão mestre permanecerá aberta após o encerramento das conexões do cliente.

Construindo arquivo SSH

ASSH usa seu próprio arquivo de configuração, denominado .assh.yml, para construir o arquivo SSH. Neste arquivo de configuração o assh adiciona suas próprias opções e funcionalidades. Por exemplo, com ASSH, você pode definir modelos para configurações comuns, usar ganchos para acionar ações específicas e muito mais.

Vejamos isso em detalhes com um primeiro exemplo bastante simplista:

hosts:
 on1.talha.local:
 User:talha

Neste exemplo, on1.talha.local fará login com o usuário talha.

Gerando o arquivo SSH

A primeira coisa a fazer antes de começar qualquer coisa é salvar o arquivo atual:

cp ~/.ssh/config ~/.ssh.config.orig

Para construir ou atualizar seu arquivo de configuração SSH, use o seguinte comando:

assh config build

Este comando permite que o ASSH gere um arquivo de configuração SSH enriquecido, levando em consideração recursos avançados do ASSH. Aqui está o conteúdo gerado com o arquivo acima:

#This file was automatically generated by assh vn/a (n/a) #on 2024-02-28 01:21:27 +0100 CET, based on ~/.ssh/assh.yml
#
# more info: https://github.com/moul/assh

# host-based configuration
Host on1.talha.local
User talha

# global configuration
Host *
ProxyCommand /home/bob/.asdf/installs/assh/2.16.0/bin/assh connect --port=%p %h

Se você leu corretamente, o wrapper assh é usado sempre que o ssh.

Validando a configuração

Para verificar se tudo está em ordem, você pode testar sua configuração estabelecendo uma conexão SSH com um de seus servidores:

ssh on1.talha.local

Se a conexão for bem-sucedida, o ASSH está instalado e configurado corretamente.

Configurações avançadas

As configurações padrão no ASSH servem como configuração base para todos os hosts que não especificam explicitamente determinadas configurações. Isto é particularmente útil em ambientes com muitos servidores, pois ajuda a manter uma configuração uniforme e centralizada.

Para definir as configurações padrão no ASSH, você deve definir uma seção de padrões em seu arquivo. Aqui está um exemplo de configuração das configurações padrão:

defaults
 User defaultuser
 Port 22
 IdentityFile ~/.ssh/id_ed25519
 ForwardAgent yes
 ControlMaster auto
 ControlPath ~/.ssh/multiplex/%r@%h:%p
 ControlPersist 10m

Neste exemplo, todos os hosts herdarão essas configurações padrão, a menos que sejam substituídas na configuração específica do host.

Embora as configurações padrão sejam aplicadas a todos os hosts, você ainda pode substituí-las por hosts específicos. Por exemplo:

Host specialserver
 HostName special.example.com
 User specialuser
 Port 2222

Neste caso, specialserver usará um usuário e uma porta diferentes daqueles definidos nas configurações padrão.

Criação de modelos

Um modelo no ASSH é um tipo de modelo de configuração que pode ser aplicado a múltiplas entradas em seu ~/.ssh/config. Isso permite definir uma configuração base e reutilizá-la para diferentes hosts, evitando redundância. e tornando as configurações mais fáceis de manter.

Para criar um modelo no ASSH, você começa definindo uma seção Modelos em seu arquivo de configuração. Por exemplo :

templates: 
 my-template:    
 User: bart

Neste exemplo, my-template é um modelo que define um parâmetro comum: o usuário.

Para aplicar este modelo a um host, basta referenciar o nome do modelo na configuração do host:

Host server1  
 Inherits my-template  
 HostName server1.example.com

Host server2  
 Inherits my-template  
 HostName server2.example.com

Aqui, server1 e server2 herdam as configurações definidas em my-template, o que garante consistência na configuração enquanto reduz a duplicação.

Outros comandos ASSH CLI

A interface de linha de comando (CLI) ASSH oferece vários comandos em assh config que você pode gerenciar com eficiência suas configurações SSH. Esses comandos permitem construir, visualizar e manipular a configuração de forma avançada.

Visualização gráfica de hosts

O comando assh config graphvizgera uma representação gráfica de seus hosts e seus relacionamentos, no formato Graphviz.

assh config graphviz
digraph G {
        "10.0.0.*"->"vr1.talha.local"[ color=red, label=1 ];
        "machine*"->"vr1.talha.local"[ color=red, label=1 ];
        "10.0.0.*" [ color=blue ];
        "machine*" [ color=blue ];
        "vr1.talha.local" [ color=blue ];
}

Isto pode ser extremamente útil para visualizar configurações complexas, especialmente quando você tem dependências ou relacionamentos entre diferentes hosts, como gateways ou configurações em cascata.

Saída em JSON

O comando assh config json fornece uma representação JSON da sua configuração. Este é um recurso útil para integração com outras ferramentas ou para processamento automatizado.

assh config json

{
  "hosts": {
    "10.0.0.*": {
      "User": "root",
      "Gateways": [
        "vr1.talha.local"
      ]
    },
    "192.168.3.*": {
      "User": "ubuntu"
    },
    "machine*": {
      "User": "talha",
      "Gateways": [
        "vr1.talha.local"
      ]
    },
    "on1.talha.local": {
      "User": "talha"
    },
    "proxmox": {
      "User": "root",
      "Aliases": [
        "proxmox.talha.local"
      ]
    },
    "proxmox2": {
      "User": "root",
      "Aliases": [
        "proxmox2.talha.local"
      ]
    },
    "vr1.talha.local": {
      "User": "root"
    }
  },
  "templates": {},
  "defaults": {
    "StrictHostKeyChecking": "no",
    "UserKnownHostsFile": [
      "/dev/null"
    ],
    "Hooks": {}
  },
  "asshknownhostfile": "~/.ssh/assh_known_hosts"
}

Este comando pode ser usado para analisar e processar sua configuração SSH em scripts ou aplicativos que consomem dados JSON.

Configuração de pesquisa

Finalmente, o comando assh config searchpermite pesquisar entradas específicas em sua configuração usando texto de pesquisa.

assh config search proxmox

Listing results for proxmox:
    proxmox -> root@proxmox:22
    proxmox2 -> root@proxmox2:22

Este comando é extremamente útil quando você está trabalhando com um grande número de hosts e precisa encontrar informações específicas rapidamente.

Palavras Finais

ASSH é uma ferramenta revolucionária que muda a maneira como você gerencia sua configuração SSH. Desde a configuração inicial e configurações padrão até o uso avançado de templates e CLI, o ASSH prova ser um aliado indispensável para qualquer administrador de sistema.