Projeto de ferro: como construímos uma sala com uma missão hacker
Há algumas semanas, passamos busca online por hackers: construiu uma sala cheia de dispositivos inteligentes e lançou uma transmissão do YouTube a partir dela. Os jogadores podem controlar dispositivos IoT no site do jogo; o objetivo era encontrar uma arma escondida na sala (um poderoso apontador laser), hackeá-la e causar um curto-circuito na sala.
Para adicionar ação, colocamos um triturador na sala, no qual carregamos 200 rublos: o triturador comia uma nota por hora. Depois de vencer o jogo, era possível parar o triturador e pegar todo o dinheiro restante.
Houve muitos pedidos para mostrar o momento da limpeza do quarto - mostramos como o desmontamos
Arquitetura de hardware: controle de sala
Começamos a projetar uma solução de hardware quando o cenário já estava aproximadamente claro, o back-end estava pronto e tínhamos uma sala vazia pronta para a instalação do equipamento.
Lembrando a velha anedota “O S em IoT significa Segurança” (“A letra S em IoT significa Segurança”), decidimos que desta vez os jogadores do cenário do jogo interagem apenas com o front-end e back-end do site, mas não tenha a oportunidade de chegar diretamente ao ferro.
Isso foi feito por motivos de segurança e entretenimento: com os jogadores acessando diretamente o hardware, seria muito mais difícil isolar ações seguras e potencialmente perigosas, como acelerar um triturador ou controlar pirotecnia.
Antes de iniciar o design, formulamos vários princípios para controlar dispositivos de jogos, que se tornaram a base do design:
Não use soluções sem fio
Todo o espaço de jogo está em um quadro, cada canto do qual pode ser alcançado. Não havia necessidade real de conexões sem fio e elas se tornariam apenas outro ponto de falha.
Não use nenhum dispositivo doméstico inteligente especial
Basicamente, por uma questão de flexibilidade de personalização. É claro que muitas versões em caixa de sistemas domésticos inteligentes com um painel de administração e controle prontos podem ser configuradas para nossa tarefa, mas os custos de mão-de-obra seriam comparáveis à criação de nossa própria solução simples.
Além disso, era necessário inventar dispositivos que mostrassem claramente que foram os jogadores que mudaram seu estado: ligaram / desligaram ou colocaram uma luz específica nas letras FALCON.
Coletamos todos os elementos do ferro disponível ao público, que pode ser comprado em lojas comuns de peças de rádio: entre a entrega de pizza e Coca-Cola Diet, os correios Chip e Deep e Leroy iam constantemente ao local.
A escolha de montar tudo nós mesmos simplificou a depuração, a escalabilidade, porém, exigia mais precisão durante a instalação.
Todos os relés e arudino não devem estar visíveis no quadro
Decidimos trazer todos os elementos controlados para um só lugar e escondê-los nos bastidores para poder controlar a performance e, se necessário, rastejar cuidadosamente para fora do campo de visão da câmera e substituir a unidade com falha.
Com isso, todos ficaram escondidos embaixo da mesa e a câmera foi instalada de forma que nada pudesse ser visto embaixo da mesa. Este foi o nosso "ponto cego" para o engenheiro de rastreamento
Como resultado, na verdade, obtivemos um dispositivo inteligente: ele recebeu o estado de cada uma de suas partes do back-end e o alterou com o comando apropriado.
Em termos de implementação de hardware, este dispositivo controlava 6 elementos:
Vários candeeiros de mesa, têm estado ligado/desligado e são controlados pelos jogadores
Letras na parede, podem mudar de cor ao comando dos jogadores
Ventiladores que giram e abrem o flipchart quando o servidor está sobrecarregado
Laser controlado via PWM
Schroeder que comeu dinheiro no horário
Uma máquina de fumaça que disparava antes de cada disparo de laser
Testando uma máquina de fumaça com um laser
Mais tarde, outra luz de palco foi adicionada, posicionada nos bastidores e controlada exatamente como as lâmpadas do ponto 1. A luz de palco funcionou em dois casos: iluminava o laser quando a energia era aplicada a ele e iluminava o peso antes do lançamento do laser em modo de combate.
O que era este dispositivo inteligente
Durante todo o caminho, Yura, nosso especialista em hardware, tentou não complicar as coisas e apresentou a solução mais simples e minimalista possível.
Supunha-se que rodaria apenas um script no VPS, que recebe o json com o estado dos dispositivos e envia para o arduino conectado via usb.
Portas conectadas a:
16 relés comuns (foram eles que fizeram o clique que se ouviu no vídeo. Nós os escolhemos principalmente por causa desse som)
4 relés de estado sólido para controlar canais PWM, como ventiladores,
saída PWM separada para laser
saída que gera um sinal para a faixa de LED
Aqui está um exemplo de um comando json que veio do servidor para o relé
Para acompanhar o momento em que o laser finalmente queima a corda e o peso voa para o aquário, fizemos um pequeno botão que respondia à queda do peso e dava um sinal ao sistema.
Botão de monitoramento de movimento Kettlebell
A esse sinal, bombas de fumaça feitas de bolas de pingue-pongue deveriam acender. Colocamos 4 chaminés diretamente na caixa do servidor e trouxemos um fio de nicromo para elas, que deveria esquentar e funcionar como um fusível.
Estojo com bombas de fumaça e guirlanda chinesa
arduino
No arduino, de acordo com o plano original, ocorreram duas ações.
Primeiro, quando uma nova solicitação era recebida, ela era analisada usando a biblioteca ArduinoJson. Em seguida, cada dispositivo gerenciado foi associado a duas de suas propriedades:
estado de energia "ligado" ou "desligado" (estado padrão)
o período em que o dispositivo está ligado — o tempo em microssegundos desde o início da placa, quando é hora de desligá-lo, ou seja, trazer o estado para o padrão
O último horário foi definido quando o parâmetro correspondente foi recebido em JSON, porém, não foi possível passar, então o valor foi definido como 0 e não ocorreu o zeramento.
A segunda ação que o arduino realizava a cada ciclo era a atualização dos estados, ou seja, verificar se há necessidade de ligar algo ou se é hora de desligar algum aparelho.
Ponteiro laser - o mesmo Megatron 3000
Este é um módulo convencional de corte e marcação a laser LSMVR450-3000MF 3000mW 450nm com foco manual.
letras do falcão
Feito de forma muito simples - apenas copiamos as letras do logotipo, recortamos em papelão e colamos com fita led. Ao mesmo tempo, tive que soldar pedaços de fita, 4 contatos em cada costura, mas o resultado valeu a pena. Nosso backender Pasha mostrou milagres de habilidade, fazendo isso em menos de algumas horas.
Os primeiros testes do dispositivo iot e acabamento
Fizemos os primeiros testes e ao mesmo tempo novas tarefas nos aproximaram. O fato é que, no meio do processo, um verdadeiro produtor de cinema e cinegrafista da VGIK, Ilya Serov, se juntou à equipe - ele alinhou o quadro, adicionou iluminação cinematográfica adicional e mudou ligeiramente o roteiro do jogo para tornar o enredo mais emocional, e a imagem mais dramática e teatral.
Isso aumentou significativamente a qualidade, mas havia elementos que também precisavam ser conectados ao relé e prescrever o algoritmo de operação.
Outro problema era o laser: fizemos vários experimentos com diferentes tipos de corda e lasers de diferentes potências. Para o teste, simplesmente penduramos a carga verticalmente em uma corda.
Ao rodar com o token de teste, a potência regulada pelo PWM foi inferior a 10% e a corda não danificou mesmo com longa exposição.
Para o modo de combate, o laser foi desfocado para cerca de um ponto com diâmetro de 10 mm e queimou com segurança a corda com uma carga a uma distância de cerca de um metro.
Então o laser funcionou perfeitamente nos testes
Quando começamos a testar tudo na sala em um peso suspenso, descobrimos que não era tão fácil consertar o laser com segurança. Então, quando a corda queima, ela derrete, estica e sai do foco original.
E assim não funcionou mais: a corda mudou
Ilya moveu o laser para a extremidade oposta da sala da corda, de modo que o feixe de laser atravessou toda a cena e ficou lindo no quadro, que dobrou a distância.
Depois de realizar mais alguns experimentos com a queima da corda já em batalha, decidimos não tentar o destino e garantir o corte da corda com a ajuda de um fio de nicromo. Ela destruiu o fio 120 segundos depois de ligar o laser no modo de combate. Isso, assim como a desconexão do fio e do fusível das bombas de fumaça quando o contato de corte é acionado, decidimos codificá-lo diretamente no hardware do microcontrolador.
O fio que acabou queimando a corda nos bastidores
Assim, surgiu a terceira tarefa que o arduino resolveu - descobrir as sequências associadas à execução desses comandos.
Também decidimos dar ao arduino a necessidade de contar dinheiro na TV e executar o triturador. Inicialmente, assumiu-se que o back-end cuidaria disso e o saldo atual ficaria visível no site, e na TV mostraríamos os comentários do YouTube como um elemento interativo adicional que avisa aos espectadores que os eventos na sala estão acontecendo em tempo real.
Mas durante o teste, Ilya assistiu à cena e sugeriu mostrar o saldo do jogo na tela maior: quanto dinheiro sobrou, quanto foi comido e a contagem regressiva até o próximo lançamento do triturador.
Vinculamos o Arduino ao horário atual: a cada hora completa, o triturador iniciava. A imagem na TV foi emitida com a ajuda de um framboesa, que naquele momento já recebia solicitações do servidor e as enviava ao arduino para execução. Imagens com indicadores monetários foram desenhadas chamando o utilitário de console fim assim
image = subprocess.Popen(["fim", "-q", "-r", "1920×1080", fim_str]), где fim_str
E foi formado com base na quantidade ou tempo necessário.
Geramos as fotos com antecedência: apenas pegamos o vídeo finalizado com um cronômetro e exportamos 200 fotos.
Este é o tipo de mecânica que foi programada na cruz. Quando começou a contagem regressiva, todos fomos ao local, nos armamos com extintores e sentamos para esperar o fogo (que ardia com força e força apenas na discórdia)
Como fazer uma transmissão que dura uma semana: escolhendo uma câmera
Para a missão, precisávamos de uma transmissão contínua no YouTube por 7 dias - é quanto estabelecemos como duração máxima do jogo. Havia duas coisas que poderiam interferir conosco:
Superaquecimento da câmera por operação contínua
pausa na internet
A câmera tinha que dar uma imagem de pelo menos Full HD para reproduzir e assistir a sala confortavelmente.
Inicialmente, procuramos webcams lançadas para streamers. Cortamos o orçamento, então não queríamos comprar uma câmera, mas descobrimos que eles não alugam. No mesmo momento, encontramos milagrosamente uma câmera Xbox Kinect em minha casa, colocamos na sala e lançamos uma transmissão de teste por uma semana.
A câmera funcionou bem e não superaqueceu, mas Ilya quase imediatamente percebeu que faltavam configurações, em particular, era impossível definir a exposição.
Ilya tentou aproximar a aparência da transmissão dos padrões de produção de filmes e vídeos: transmitir uma cena de luz que muda dinamicamente com fontes de luz brilhantes, fundo escuro e objetos no quadro. Ao mesmo tempo, quis manter a elaboração da imagem tanto nos destaques quanto nas sombras, com o mínimo de ruído digital.
Portanto, embora o kinect tenha se mostrado confiável durante os testes e não exigisse placa de captura de vídeo (outro ponto de falha), decidimos abandoná-lo. Após três dias testando câmeras diferentes, Ilya escolheu a Sony FDR-AX53 - uma filmadora pequena e confiável, acessível para aluguel, mas ao mesmo tempo com confiabilidade suficiente e bom desempenho.
Alugamos uma câmera, ligamos por uma semana em conjunto com uma placa de captura de vídeo e percebemos que com ela poderíamos contar com transmissão contínua durante toda a busca.
Fazendo um Filme: Palco e Iluminação
Trabalhar a iluminação exigia uma certa elegância, precisávamos construir uma partitura de luz com o mínimo de meios:
1. Iluminação dos objetos quando são encontrados pelos jogadores (laser, peso), bem como uma luz constante no triturador. Aqui usamos dedolight 150 - luminárias confiáveis e compactas com lâmpadas halógenas de baixa tensão que permitem focar o feixe em um assunto específico sem tocar no fundo e em outros objetos.
2. Luz de jogo prática - candeeiro de mesa, candeeiro de chão, estrela, guirlanda. Toda a luz prática foi distribuída harmoniosamente no quadro para iluminar sua área de imagem, dentro havia lâmpadas led com temperatura de cor de 3200K, a lâmpada na luminária de chão foi coberta com um filtro vermelho Rosco para criar uma ponta de destaque de cor incomum.
Eu sou o engenheiro da minha mãe ou lanço amanhã
Como reservamos internet e eletricidade
A questão da tolerância a falhas foi abordada quase como em um data center: eles decidiram não se desviar dos princípios básicos e reservaram de acordo com o esquema N + 1 usual.
Se a transmissão parar no YouTube, significa que não será mais possível reconectar usando o mesmo link e continuar transmitindo. Era um momento crítico e, além disso, a sala era um escritório comum.
Para fazer isso, usamos um roteador baseado em OpenWRT e o pacote mwan3. Ele testou automaticamente a disponibilidade do canal a cada 5 segundos e, em caso de interrupção, mudou para um modem de backup da Yota. Como resultado, a mudança para o canal de backup levou menos de um minuto.
Também era igualmente importante excluir interrupções de energia, porque mesmo uma pequena oscilação de energia faria com que todos os computadores fossem reinicializados.
Portanto, pegamos a fonte de alimentação ininterrupta ippon innova g2 3000, que daria suporte a todos os dispositivos de jogos: o consumo total de energia do nosso sistema era de cerca de 300 watts. Seria o suficiente para 75 minutos, o suficiente para nossos propósitos.
Decidimos sacrificar a iluminação adicional no caso de falta de eletricidade na sala - ela não estava conectada à fonte de alimentação ininterrupta.
Agradecimentos
equipe inteira RUVDSque projetou e desenvolveu o jogo.
Separadamente, para os administradores do RUVDS, para monitorar o trabalho dos servidores, a carga foi aceitável e tudo funcionou normalmente no modo normal.
melhor chefe ntsaplin pelo fato de que em resposta ao chamado “há uma ideia: vamos pegar um servidor, colocar um aquário nele e pendurar um peso sobre ele, boom, bang, tudo foi inundado com água, curto-circuito, fogo!” ele sempre diz com confiança "faça!"
Obrigado Publicação Tilda e separadamente a Mikhail Karpov por não apenas seguir em frente e nos permitir violar os Termos de Uso, mas também nos dar uma conta comercial por um ano quando conversamos sobre o projeto.
Ilya Serov S_ILya por entrar e se tornar co-produtor do projeto, pronto para engatinhar meia noite, colar fita de LED, buscar soluções técnicas e fazer de tudo para que tenhamos um filme de verdade.
Jovner por estar sempre pronto para salvar a situação quando os outros davam de ombros, lutadores, apoio moral e conversas até de manhã.
Samat por nos colocar em contato com o melhor pentester do país que nos aconselhou e nos ajudou com os quebra-cabeças.
daniemilk para a produção de vídeo legal de todos os vídeos.
Delfos para uma mão firme e prontidão para trabalhar até o fim.
E o agradecimento maior é aos jogadores por todas as emoções que vivemos enquanto vocês invadiam a busca por dois dias sem dormir e até adiando o trabalho.
Outros artigos sobre a missão com a destruição do servidor