falha de segmentação

mesmo em 2018, quando os aplicativos de mensagens instantâneas modernos e ricos em recursos, como o Gitter ou o Slack extremamente popular, são tão difundidos como sempre, o IRC continua sendo o método preferido de comunicação para muitos desenvolvedores. É simples, estável, onipresente e, o mais importante, totalmente descentralizado. É um protocolo antigo, porém, como IRC tem chutado desde o início dos anos noventa (o protocolo IRC RFC foi publicado em 1993). Como tal, o IRC vem com suas limitações.

um dos mais notáveis para mim é a falta de arquivo de mensagens. Todas as mensagens enviadas e recebidas por um cliente IRC não são armazenadas em sua máquina, nem você obtém uma repetição das conversas anteriores em um canal que acabou de ingressar. Toda vez que você faz login em uma sala de bate-papo do IRC, você recebe uma lista limpa. Isso é inconveniente, dado que o IRC é muito usado como um canal de comunicação fora da banda. Você entra em um canal, deixa uma pergunta e depois espera algumas horas para alguém responder, já que as pessoas não tendem a monitorar o IRC com a mesma frequência que com outros aplicativos de mensagens instantâneas.

felizmente e talvez não surpreendentemente, este tem sido um problema resolvido há algum tempo. O método mais rápido e simples é estabelecer uma conexão permanente com o servidor IRC a partir de um servidor sob nosso controle, que está em 24/7 e estabelecer uma sessão SSH/tmux com ele toda vez que quisermos verificar o IRC. Quando terminarmos, basta desconectar a sessão com C-a d na tela GNU ou C-b d no tmux. Isso resolve o problema de perder todas as mensagens enviadas em um canal enquanto estávamos fora, mas é tudo o que você obtém. Se você está procurando uma solução que ofereça muito mais do que isso, é hora de dar uma olhada nos seguranças.

o que é um servidor bouncer?

um servidor bouncer é um servidor que usamos como proxy para acessar o IRC. Um Segurança pegará nossos detalhes de IRC e estabelecerá uma conexão com um servidor de IRC em nosso nome e até mesmo se juntará a uma lista de canais predefinidos.

em seguida, nos conectamos a este servidor bouncer de nosso cliente IRC em vez de ao servidor IRC diretamente e, a partir deste ponto, nossas mensagens serão “saltadas” pelo bouncer para o servidor de destino.

leões-de-chácara oferecer vários benefícios, incluindo o:

  • Persistente servidor e um canal de sessões
  • Log de conversas de canal para um arquivo de texto para arquivamento
  • leão-de-Chácara de autenticação de usuário
  • Automático de IRC do servidor de autenticação através de NickServ ou SASL
  • Automatizar o usuário IRC status (sair & mensagens de away, etc.)
  • e muito mais!

configurando o servidor bouncer na AWS

vamos configurar nosso próprio servidor Bouncer usando o ZNC, o aplicativo de servidor bouncer mais popular, em uma instância barata do AWS EC2.

o Lançamento de um novo Ubuntu Server 16.04 t2.nano instância do EC2 com todas as configurações padrão, exceto para o seguinte:

  • dados do Usuário: instale o leão-de-chácara de software (ZNC), crie um usuário para o processo e um diretório para armazenar seus arquivos e uma systemd arquivo da unidade, para iniciar na inicialização.
#!/bin/bashapt-get update && apt-get dist-upgrade -y && \apt-get install -y znc znc-dev znc-perl znc-python znc-tcl && \useradd -M -s /bin/false znc && usermod -L znc && \mkdir /opt/znc && \cat > /etc/systemd/system/znc.service <<- EOFDescription=ZNC IRC BouncerExecStart=/usr/bin/znc -d /opt/zncExecReload=/bin/kill -HUP $MAINPIDKillMode=processRestart=alwaysType=forkingUser=zncWantedBy=multi-user.targetAlias=znc.serviceEOF

como o arquivo da unidade systemd foi colocado diretamente em /etc/systemd/system, ele será executado automaticamente na inicialização. Não há necessidade de ativá-lo.

  • sub-rede: certifique-se de que a instância seja lançada em uma sub-rede pública com um Gateway de Internet conectado, para que seja facilmente acessível a partir da Internet.
  • volume EBS: sua senha ZNC (Bouncer), senha do servidor IRC e registros de conversa IRC serão armazenados em arquivos de texto simples, então eu recomendo fortemente que você criptografe o volume.
  • crie um novo grupo de segurança para anexá-lo para que as seguintes portas estejam abertas:
    • SSH: para que possamos configurar a instância
    • porta TCP 7078 (qualquer porta não reservada serve, na verdade): Porta de escuta ZNC
  • Defina sua tag “nome” para algo significativo, se desejar

agora gere um novo endereço IP elástico e associe-o à instância.

Instalando o ZNC

SSH em sua instância EC2 recém-criada e execute o processo de configuração da primeira vez do ZNC, que nos pedirá para definir uma porta de escuta para o segurança e criar uma conta de administrador. Selecione as opções como abaixo.

$ znc --makeconf Checking for list of available modules... -- Global settings -- Listen on port (1025 to 65534): 7078 Listen using SSL (yes/no) : yes Verifying the listener... Unable to locate pem file: , creating it Writing Pem file ... Enabled global modules -- Admin user settings -- Username (alphanumeric): admin Enter password: Confirm password: Nick : Alternate nick : Ident : Real name (optional): Bind host (optional): Enabled user modules Set up a network? (yes/no) : no Writing config ... To connect to this ZNC you need to connect to it as your IRC server using the port that you supplied. You have to supply your login info as the IRC server password like this: user/network:pass. Try something like this in your IRC client... /server <znc_server_ip> +7078 admin:<pass> To manage settings, users and networks, point your web browser to https://<znc_server_ip>:7078/ Launch ZNC now? (yes/no) : no

Isso irá gerar um arquivo de configuração que será armazenado no diretório home para o usuário que o ssh teria como (ubuntu se você estiver usando o padrão da Amazon desde o Ubuntu Server AMI). Vamos mover os arquivos de configuração recém-criados deste diretório para /opt/znc e dar os direitos de proprietário do usuário znc a ele.

$ sudo mv ~/.znc/* /opt/znc$ rmdir ~/.znc$ sudo chown -R znc:znc /opt/znc

Agora você pode começar a ZNC

$ sudo systemctl start znc

Garantir ZNC foi iniciado com êxito

$ systemctl status znc● znc.service - ZNC IRC Bouncer Loaded: loaded (/etc/systemd/system/znc.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2018-07-29 13:02:07 UTC; 21min ago Process: 1181 ExecStart=/usr/bin/znc -d /opt/znc (code=exited, status=0/SUCCESS) Main PID: 1245 (znc) Tasks: 1 Memory: 10.8M CPU: 54ms CGroup: /system.slice/znc.service └─1245 /usr/bin/znc -d /opt/znc

Configurando ZNC

O primeiro estágio de configuração está concluída. Agora precisamos adicionar o usuário que entraremos como e uma rede IRC para associar a esse usuário.

para aplicar as configurações restantes ao bouncer, nos conectaremos ao frontend de configuração da web, disponível na porta em que o configuramos para ouvir (no meu caso, porta 7078). Portanto, em seu navegador, insira o seguinte URL: https://<bouncer_ip_address>:7078. Se você receber um erro de “certificado HTTPS ausente” ou similar, poderá ignorar isso com segurança e instruir seu navegador a continuar. Agora faça login como o usuário administrador que você criou antes, usando a senha que você digitou.

ZNC web frontend

depois de fazer login, você pode clicar na entrada do Menu “Configurações Globais” no lado direito para dar uma olhada na configuração geral do segurança.

o ZNC instala uma coleção de módulos (objetos compartilhados) em /usr/lib/znc que você pode carregar ou descarregar enquanto o daemon está em execução. Se você rolar para baixo até a parte inferior, verá uma lista dos módulos globais que afetam a operação do segurança, que você pode ativar/desativar alternando as caixas de seleção na coluna “Nome”. No meu caso, tenho” log ” ativado, pois quero que meu segurança armazene em um arquivo de texto todas as mensagens enviadas nos canais dos quais sou membro.

 Módulos globais ZNC

clique em” Gerenciar usuários ” no menu à direita para abrir o painel de configuração do Usuário. Agora clique em “Adicionar” para adicionar um novo usuário e preencha os detalhes: nome de usuário, senha (observe que essa senha só será usada para se autenticar com ZNC, não será usada com o servidor IRC), detalhes IRC e uma lista de módulos que você pode querer carregar para este usuário especificamente.

detalhes do usuário do ZNC

em seguida, clique em “Salvar e continuar” na parte inferior para que possamos adicionar uma rede IRC para este usuário.

adicionar uma rede a um usuário

preencha os detalhes da rede IRC com a qual este usuário será associado e, opcionalmente, habilite todos os módulos que você deseja carregar automaticamente ao se conectar a esta rede. Um desses módulos pode ser sasl se você deseja autenticar usando este método com o servidor IRC. Eu estarei habilitando este módulo nesta rede.

Em “Servidores desta rede de IRC” caixa de texto que você irá inserir as informações do servidor de IRC que você deseja se conectar no formato

<server> <port> <irc_password>

Acrescentar um sinal para a porta para indicar uma conexão SSL. <irc_password> é a senha que você usou para se registrar no servidor IRC por meio do comando /NickServ, que é completamente separado da senha que você definiu para se autenticar no próprio segurança acima.

Por exemplo, para conectar-se à rede de IRC Freenode, através de SSL com uma conta previamente registrado, o conteúdo desta caixa de texto seria

irc.freenode.net +6697 myNickServPassword123

caso Contrário, ele poderia simplesmente ser

irc.freenode.net 6667

Configurando a rede de IRC

Você notará que o IRC palavra-passe é armazenada em texto não criptografado no servidor. É por isso que eu recomendei durante as etapas de configuração do VPS para criptografar seu volume EBS e, naturalmente, ter um controle muito apertado sobre quem pode acessar seu servidor bouncer. É recomendável bloquear o grupo de segurança VPS para permitir apenas conexões de entrada de um subconjunto muito pequeno de IPs.

clique em “Salvar e continuar” novamente. Agora você pode, opcionalmente, adicionar uma lista de canais que deseja que o segurança faça login, mas também se lembrará daqueles que você se junta quando se conectar a ele.

agora temos um AWS VPS (Virtual Private Server) hospedando uma instalação totalmente funcional do ZNC. A última coisa a fazer é apontar nosso cliente IRC para o segurança.

conectando-se ao Segurança

vou usar o irssi para me conectar ao Segurança. Aqui estão os passos que segui para fazê-lo funcionar. Sua milhagem pode variar em um cliente diferente como HexChat ou mIRC, mas os próprios detalhes devem permanecer os mesmos.

Inicie o irssi especificando o apelido a ser usado para se conectar ao Segurança

$ irssi -n <username>

crie uma nova rede chamada freenodebnc e adicione os detalhes do segurança a ela. Como estou me conectando ao servidor Freenode IRC por SSL, estou usando a porta que ele expõe para conexões seguras, 6697 e passando o sinalizador -ssl. username/freenode é a combinação de nome de usuário e rede que criamos no painel de configuração do Usuário ZNC. password é a senha que usamos para autenticar com ZNC, não para o servidor IRC.

/network add freenodebnc/server add -net freenodebnc -auto -ssl <bouncer_ip> 6697 username/freenode:password

execute os seguintes comandos para salvar essas alterações no arquivo de configuração irssi e conecte-se ao Segurança.

/save/connect freenodebnc

Se você carregou o SASL módulo (você pode verificar se ele está carregado executando /msg *status ListModules), você precisa configurá-lo neste ponto. Portanto, quando estiver conectado ao bouncer, execute os seguintes comandos em seu cliente IRC.

/query *saslmechanism external plainset <NickServName> <password>

onde NickServName é o seu nome de usuário registrado com o servidor IRC e password a senha que você usa para autenticar no servidor acima mencionado.

agora reconecte-se à rede IRC com o módulo SASL reconfigurado.

/msg *status jump

pode levar alguns instantes para o segurança estabelecer a conexão (especialmente se você estiver se conectando por SSL e usando mecanismos de autenticação como SASL), mas depois disso, você obterá uma sessão permanente e segura com o servidor IRC que você pode pausar e retomar sempre que quiser. Bate-papo feliz!