E aqui estão algumas fotos.

PiAlert em ação

Dispositivo desligado, vista frontal

Dispositivo desativado, vista lateral
Devo dizer que o que obtive, na melhor das hipóteses, pode ser chamado de uma versão alfa do dispositivo. Eu compartilhei o código doprojeto e o modelo para impressão 3D do caso em domínio público na esperança de que se alguém estiver interessado no meu projeto, eles me ajudem a melhorá-lo para o bem comum.
Visão Geral do Projeto
Após um incidente recente com um dos meus servidores, percebi que realmente gosto de vasculhar os logs e descobrir o que aconteceu. Eu costumo usar os seguintes comandos:
tail -n 80 -f /var/log/apache2/error.log
tail -n 80 -f /var/log/apache2/access.log
tail -n 80 -f /var/log/auth.log
É interessante ver quais páginas os bots estão tentando acessar do nada, ou quais contas eles estão tentando entrar via SSH. Também se parecem com filmes de hackers. Então pensei que poderia criar algo que parecesse muito mais atraente do que uma janela de terminal. Nesse momento, nasceu o projeto de que estou falando aqui.
Os resultados das tentativas de logon de monitoramento foram alterados recentemente. Isso aconteceu depois que implementei um procedimento de login mais rígido. Ou seja, o número de tentativas de login no sistema caiu drasticamente. Isso ficou aparente depois que o sistema de monitoramento de servidor que criei funcionou por 24 horas. Abaixo vou falar sobre isso.
Este material está dividido em três seções. O primeiro é sobre hardware, o segundo é sobre configuração de servidores e o terceiro é sobre programas para o Raspberry Pi.
Hardware
Meu dispositivo é montado com os seguintes componentes:
- Pi framboesa Zero W placa .
- Painel Pimoroni Blinkt LED ! ...
- Display barato de 7 segmentos e 4 dígitos (branco) da AliExpress.
Aqui está o diagrama de conexão.

Diagrama de conexão dos componentes à placa
Para conectar o painel LED Blinkt ao Raspberry Pi! Foram usados fios de conexão DuPont . Por um lado, eu os cortei e os soldei aos pinos correspondentes da porta GPIO de 40 pinos do painel. Não consegui conectar diretamente à placa porque ainda precisava conectar um monitor a ele.
Levei muito tempo para fazer o painel funcionar. No início, pensei que minha instância estava sofrendo de conexões ruins no conector. E para descobrir isso, eu tive que passar por tentativa e erro, gastar muito mais tempo do que gostaria de gastar nisso. Depois de entrar em contato com a Pimoroni via Twitter, descobriu-se que as primeiras versões do Blinkt! use o pino 2 para 5 V, não o pino 4 como mostrado em pinout.xyz . Eu, no entanto, até descobrir, apressado encomendei outro painel de LED Blinkt !, para o caso de o meu não estar funcionando. E agora, depois que consegui lançar o primeiro, preciso pensar em um novo projeto em que pudesse usar o segundo. Coloquei
todos esses componentes em uma caixa que projetei no Tinkercad... O corpo foi impresso na minha impressora Ender 3 Pro 3D. Peguei a caixa, mas ainda não conseguia pensar em como fazer suas partes de modo que elas se encaixassem bem umas nas outras ou fossem presas umas às outras com travas. Como resultado, formei um par de postes em uma das partes do corpo, projetados para parafusos M5, que usei para montar o dispositivo acabado. Esses postes são colocados ao longo das bordas para que haja espaço suficiente na caixa para o Raspberry Pi.
Para imprimir a caixa, usei PLA de um fabricante desconhecido (temperatura de impressão - 217 ° C, taxa de preenchimento - 10%). Apliquei as configurações usuais são apanhadas depois de assistir a vários vídeos no YouTube .

Resultados de várias tentativas de imprimir um corpus

Montagem do corpo
Só consegui criar um painel frontal decente na minha nona tentativa. Cada vez que eu digitava, descobri que algo precisava ser movido um pouco, ou que em algum lugar, embora um pouco, algo precisava ser corrigido. Só usei o Tinkercad algumas vezes durante a edição do modelo e tive que começar a trabalhar nele quase desde o início. Eu queria consertar a barra de LED Blinkt! usando encaixes, mas depois de algumas tentativas sem sucesso desisti dessa ideia e resolvi o problema com uma pistola de cola (eu amo essa coisa!). Como resultado, consertei a tela e a placa Raspberry Pi com ela. Terminando o trabalho no caso, eu estava resolvendo a questão de colocar a placa nele. A princípio não consertei a placa no gabinete de forma alguma, mas por causa disso, conectar o cabo USB a ela se tornou uma verdadeira aventura.Na versão final do case (se é que podemos dizer que algumas de suas versões serão "finais") eu gostaria de me livrar dos parafusos, dos furos para eles e dos postes dentro do case, e encontrar uma maneira de conectar as partes do case, por exemplo, com usando travas. Se alguém quiser participar do trabalho do corpus e mudar tudo nele - seja bem-vindo! E também quero fechar o painel frontal do gabinete com algo como vidro translúcido ou um pedaço de acrílico. Isso daria ao dispositivo uma aparência acabada, ocultando detalhes muito "técnicos".Se alguém quiser participar do trabalho do corpus e mudar tudo nele - seja bem-vindo! E também quero fechar o painel frontal do gabinete com algo como vidro translúcido ou um pedaço de acrílico. Isso daria ao dispositivo uma aparência acabada, ocultando detalhes muito "técnicos".Se alguém quiser participar do trabalho do corpus e mudar tudo nele - seja bem-vindo! E também quero fechar o painel frontal do gabinete com algo como vidro translúcido ou um pedaço de acrílico. Isso daria ao dispositivo uma aparência acabada, ocultando detalhes muito "técnicos".
A placa Raspberry Pi na qual este projeto é baseado já foi usada em outro projeto que precisava de uma porta GPIO de 40 pinos para ser montada na parte traseira da placa. Acabou sendo uma vantagem. A placa está bem fixada no case, provavelmente não vou usá-la em outros projetos. Portanto, dobrei alguns dos pinos para colocar melhor tudo na caixa.

Tudo se encaixa!
No final, tive outra ideia, que deveria equipar o aparelho com pelo menos alguns botões. Talvez nem mesmo os tire, mas simplesmente esconda-os em algum lugar da caixa. É necessário alternar entre os diferentes tipos de ataques fixos e exibir seu número. E o segundo deve, com um toque curto, desligar a tela e, com um toque longo, desligar suavemente o Raspberry Pi. Se necessário, sempre posso me conectar ao meu dispositivo via SSH e, se realmente precisar, posso criar uma rota de URL que invoca o comando
sudo halt.
Configuração do servidor
Quando, após o incidente mencionado, estava reforçando a proteção dos servidores e configurando o monitoramento, verifiquei se o programa fail2ban estava instalado neles . Isso é maravilhoso FOSS-projeto. O Fail2ban monitora os logs no servidor e registra informações sobre algo que, em condições normais, não deveria acontecer, como várias tentativas de login SSH com falha. Em seguida, o programa proíbe o endereço IP de origem das solicitações suspeitas, fazendo isso no caso de ser um problema potencialmente sério ou se alguns eventos se repetirem em um período de tempo predeterminado. Por padrão, fail2ban monitora o tráfego SSH, mas o programa também pode ser configurado para ficar de olho em outra coisa, como o número de erros 404 ou o número de tentativas malsucedidas de logar no painel de administração de um projeto WordPress .
Fail2ban permite que você crie suas próprias ações que são chamadas quando vários eventos ocorrem. Acabou sendo mais complicado do que fazer algo como uma simples solicitação de curl, então acabei recorrendo ao GitHub para obter ajuda. Não importa o que eu fizesse, não conseguia fazer o sistema funcionar como deveria. Para facilitar a solução de um problema semelhante, contarei como eu, no final, consegui montar tudo. Ou seja, estamos falando sobre o uso de fail2ban em um servidor baseado em Debian.
Vamos criar um arquivo
jail.locale adicionar o seguinte a ele:
[sshd]
enabled = true
port = ssh
banaction = pinotifyred[myhost="SCRIPTHOSTSERVER"]
Aqui
SCRIPTHOSTSERVERvocê precisa substituí-lo por um URL adequado (por exemplo - on dev.testing:8080). Observe que não há informações de protocolo no início desta URL, não há caminho no final e o endereço não deve terminar com uma barra.
Como resultado, teremos as ações usuais associadas ao SSHD, o programa continuará a banir endereços IP suspeitos, mas também poderemos criar ações adicionais. Infelizmente, você não pode simplesmente descrever o comando que será executado aqui (esse era o meu problema). Em vez disso, você precisa dizer ao sistema exatamente que ação tomar. A ação é chamada a partir de um arquivo armazenado em uma pasta
action.d. Os nomes dos arquivos .conf nesta pasta correspondem aos nomes das ações (no nosso caso, este pinotifyred.conf). Esta é a aparência desses arquivos:
[Definition]
# get- "http://example.com/red"
actionban = curl --fail "http://<my-host>/red" >> /dev/null
[Init]
# jail- :
my-host = SCRIPTHOSTSERVER
Aqui, novamente, você precisa mudar
SCRIPTHOSTSERVERpara uma URL adequada (mais ou menos dev.testing:8080), seguindo as mesmas regras que foram discutidas acima na descrição do arquivo jail.local.
O código chama a ação e altera a variável
my-host. Eu não poderia fazer tudo funcionar sem essa variável.
Este código executa o comando necessário. Ele declara algumas variáveis que são necessárias para o fail2ban funcionar. Além disso, a forma como isso é configurado significa que temos a capacidade de enviar solicitações curl ou wget com parâmetros diferentes. Entre esses parâmetros, por exemplo, pode haver informações sobre qual IP foi banido e quando exatamente aconteceu. Portanto, se você deseja receber informações mais detalhadas sobre os ataques do que, como no meu caso, apenas dados sobre o número, você pode usar isso. Ou seja, para fazer isso, você pode colocar um
action.darquivo com o seguinte conteúdo na pasta :
[Definition]
# get- "http://example.com/ban.php?jail=sshd&ip=192.0.2.100":
actionban = curl -G --data-urlencode "jail=%(name)s" --data-urlencode "ip=" --fail "http://<my-host>/ban.php"
[Init]
# jail- :
my-host = SCRIPTHOSTSERVER
Gostaria de salientar que provavelmente há um bug aqui, pois a ação é chamada duas vezes - quando o IP é bloqueado e quando é desbloqueado. Eu pretendo resolver isso mais tarde, talvez isso leve a uma duplicação do número de ataques.
Software Raspberry Pi
Para ser honesto, meu código é uma bagunça completa. Ele foi escrito em Python 3 por uma pessoa (eu) que não conhece Python, mas é capaz de buscar respostas para perguntas na Internet. Isso, juntamente com o conhecimento geral de programação, me permitiu escrever um programa em Python.
Não vou falar aqui sobre como preparar o Raspberry Pi para o trabalho de SSH, pois muitas pessoas já falaram sobre isso . O código em questão está hospedado no GitHub . É representado por alguns arquivos. O primeiro arquivo é este
pialert.py, ele começa na inicialização do sistema. O segundo arquivo tm1637.pyé uma biblioteca que tirei deste material do site RaspberryTips .
Meu programa Python atua como um servidor HTTP (sei que não é para produção, mas ainda é um projeto doméstico simples) ouvindo todas as solicitações. Este é um programa de thread único, portanto, se houver muitas solicitações, ele provavelmente falhará. O programa aguarda a chegada da URL e, se estiver registrado com ela, executa a ação. A ação é acender o LED do Blinkt!, No estilo Larson Scanner , e aumentar o contador. A escolha da cor do LED depende do URL.
Estou usando 4 cores:
- Azul - indica que um ataque foi feito no meu site WordPress .
- Vermelho - ataque SSH no servidor A.
- Roxo - ataque SSH no servidor B.
- Verde - ataque de URL contra o servidor C.
Talvez, com o tempo, eu amplie o conjunto de ataques registrados pelo dispositivo. Mas mesmo o que é agora permite que você se mantenha a par dos eventos sem se conectar aos servidores.
No meu código, os erros não são tratados e um possível estouro do contador não é monitorado. O programa, entre outras coisas, me mostra que até minha rede doméstica está constantemente sendo atacada na forma de solicitações de URLs especiais. Os invasores tentam obter acesso à rede por meio de qualquer vulnerabilidade que descobrem (isso gera exceções, mas não para o programa).
Uma das últimas tarefas que tive de resolver durante o trabalho no projeto foi configurar o Raspberry Pi. Ou seja, eu precisava que o quadro iniciasse o script imediatamente após o carregamento, e então tudo funcionou. Esta tarefa é resolvida editando o arquivo
/etc/rc.local. Usei o editor vi para adicionar um comando ao arquivo que geralmente é usado para iniciar programas:
python3 /home/pi/PiAlert/pialert.py &
Depois disso, eu só tinha uma tarefa a resolver. Era para fornecer acesso ininterrupto do meu VPS ao Raspberry Pi, que estava na rede doméstica, atrás de um firewall, e tinha um endereço IP dinâmico. Eu poderia usar DNS dinâmico ou qualquer um dos inúmeros serviços que existem. No entanto, alguém da comunidade autônoma do Reddit criou um serviço gratuito freemyip.com, que resolve exatamente o problema que eu precisava resolver. E ele resolve bem. O serviço ainda não é muito popular e tenho a certeza que, devido ao seu custo gratuito, não permanecerá como está por muito tempo. Mas, considerando como é fácil de trabalhar, eu pagaria por isso de bom grado. Encontrei outro serviço interessante na mesma comunidade, sliceport.com . Vou tentar algum dia também.
Resultado
O
PiAlert Demonstration é um dispositivo que não pode ser comparado a algumas das coisas mais legais de hacking dos filmes. O objetivo é lembrar você que todos os dias milhares de bots estão tentando acessar algo ao qual não deveriam ter acesso. O dispositivo que criei simplesmente transfere informações sobre essas tentativas para o mundo real, lembrando-nos delas. Também ficou muito fofo.
Que outras coisas boas posso dizer sobre PiAlert? O dispositivo parece neutro e é muito flexível. Se eu decidir que não preciso mais dele como está, posso reescrever o código e transformá-lo em um relógio. Ou posso transformá-lo em um contador de visitas às páginas do meu site. Na verdade, existem inúmeras opções para usar LEDs RGB e um display de 4 dígitos. Além disso, o dispositivo acabou sendo compacto. Ele fica na minha frente na minha mesa quando escrevo um código e me lembra que existem pessoas no mundo que estão fazendo coisas ruins. O PiAlert requer muito pouca energia para funcionar, por isso pode funcionar com baterias. Ele pode ser colocado em qualquer lugar da casa, desde que possa se conectar a uma rede sem fio. Lá, ele simplesmente fará seu trabalho.E se eu precisar de outra rede, bastará me conectar ao Raspberry Pi via SSH ou criar um novo arquivo
wpa_supplicant.confno /boot.
Como resultado, quero observar que meu código, é claro, não parece muito bom. Ele pode e deve ser refatorado. Se algum dia eu aprender Python, vou aprender aí mesmo. O case também pode ser melhorado e eu, novamente, se eu dominar algum tipo de programa de modelagem 3D, irei trabalhar no case. Mas, se você não levar isso em conta, posso dizer que estou feliz com o que fiz.
Você está planejando fazer um dispositivo como o PiAlert?