
No dia 25 de março, abrimos as inscrições para , um jogo para amantes e conhecedores do sistema operacional Linux. Um pouco de estatísticas: 1117 pessoas se inscreveram para o jogo, das quais 317 encontraram pelo menos uma chave, 241 conseguiram completar a primeira etapa, 123 a segunda e 70 passaram pela terceira etapa. Hoje, nosso jogo chega ao fim e parabenizamos os vencedores!
- A primeira posição foi conquistada por Alexander Teldikov.
Alexander disse sobre si mesmo que é o típico administrador de sistemas. Mora em Volgogrado e faz a administração de vários sistemas Unix-like há cerca de 20 anos. Já trabalhou em provedores de internet, bancos e integradores de sistemas. Atualmente, trabalha remotamente em uma pequena empresa, cuidando da infraestrutura de nuvem para um grande cliente estrangeiro. Gosta de ler e ouvir música. Sobre o jogo, Alexander comentou que gostou em geral, ele aprecia esse tipo de desafio. Em uma das empresas, durante uma entrevista, fez algo parecido com Hackerrank, e foi interessante. - A segunda posição — Roman Suslov.
Roman é de Moscovo. Ele tem 37 anos. Trabalha como engenheiro Linux/Unix na empresa 'Infossistemas Jet'. No trabalho, precisa lidar com a administração e solução de problemas de sistemas Linux/Unix + SAN. Seus interesses são variados: sistemas Linux, programação, engenharia reversa, segurança da informação, Arduino. Sobre o jogo, Roman ressaltou que gostou em geral. "Exercitei um pouco minha mente e me distrai da rotina cinza do trabalho cotidiano. 🙂 Gostaria de ver mais задания, pois não consegui entrar no ritmo antes que o jogo já acabasse." - Terceiro — alex3d.
Alex vive em Moscovo e trabalha com desenvolvimento de software. "Obrigado pelo contest, foi interessante testar minha habilidade de google-fu."
Além disso, no ranking dos 10 melhores jogadores:
- Yevgeniy Saldayev
- Markel Mohnachevski
- Konstantin Konosov
- Pavel Sergeyev
- Vladimir Bovaev
- Ivan Bubnov
- Pavlo Klets
Entendemos que há muitas maneiras de resolver nossas tarefas, abaixo estão algumas das possíveis soluções.
1. Primeira etapa
Nós a chamamos de 'Você realmente é um admin?', pois a tarefa era bastante simples — consertar um serviço quentinho e acolhedor.
1.1. Fatos interessantes:
Dois jogadores encontraram a primeira chave nos primeiros 15 minutos do jogo, e na primeira hora, três líderes apareceram, que completaram a tarefa.
1.2. Tarefa
Você começou a trabalhar em uma empresa onde, por muito tempo, não havia um especialista qualificado em tecnologia da informação. Antes de começar a organizar as coisas, é necessário resolver um problema urgente que está bloqueando o funcionamento do escritório.
A faxineira prendeu o cabo de alimentação do servidor com o mop. A energia foi restaurada, mas um site da web muito importante ainda não está funcionando. Este site é importante porque a empresa não se preocupa muito com a segurança da informação, e na página principal pode-se encontrar abertamente a senha de administrador do computador do diretor geral.
Recentemente, a senha foi alterada, mas ninguém se lembra da nova, e o diretor não consegue trabalhar. Há rumores de que nessa máquina havia também chaves que poderiam nos ajudar a decifrar o backup dos documentos contábeis.
Todos estão aguardando uma solução rápida para a questão!
1.3. Solução
1. Primeiro, precisamos alterar a senha root da máquina virtual para poder acessá-la. Ao iniciar, percebemos que é o Ubuntu 16.04 Server.
Para redefinir a senha do root, reinicializamos a máquina, e durante a inicialização, no momento em que o menu do grub aparece, entramos no modo de edição do item Ubuntu pressionando a tecla «e». Editamos a linha linux, adicionando ao final init=\/bin\/bash. Iniciamos através de Ctrl+x e obtemos o shell. Remontamos a raiz como rw e alteramos a senha:
$ mount -o remount,rw \/dev\/mapper\/ubuntu--vg-root
$ passwdNão esqueçamos do sync, vamos reiniciar.
2. Nas condições, é dito que nosso servidor web não está funcionando, então vamos verificar:
$ curl localhost
Not Found
The requested URL \/ was not found on this server.
Apache\/2.4.18 Ou seja, na verdade, o Apache está em execução, mas responde com um código 404. Vamos verificar o config:
$ vim \/etc\/apache2\/sites-enabled\/000-default.confAqui está a chave — StevenPaulSteveJobs.
Verificamos o caminho /usr/share/WordPress — que não existe, mas há /usr/share/wordpress. Corrigimos o config e reiniciamos o Apache.
$ systemctl restart apache23. Tentamos novamente, e recebemos o erro:
Warning: mysqli_real_connect(): (HY000\/2002): Connection refused in \/usr\/share\/wordpress\/wp-includes\/wp-db.php on line 1488O banco de dados não está rodando?
$ systemctl status mysql\nActive: active (running) Qual é o problema então? Precisamos investigar. Para isso, devemos acessar o MySQL, como descrito em . Um dos pontos da documentação nos recomenda incluir a opção skip-grant-tables em /etc/mysql/mysql.conf.d/mysqld.cnf. Aqui também encontramos a chave — AugustaAdaKingByron.
Corrigimos as permissões para o usuário 'wp'@'localhost'. Iniciamos o MySQL, tornando-o acessível pela rede, comentando a opção no config skip-networking.
4. Após as ações realizadas, o servidor web é iniciado, mas o site ainda não está funcionando, pois
Aviso: require_once( /usr/share/wordpress/wp-content/themes/twentysixteen/footer.php): falha ao abrir fluxo: Permissão negada em /usr/share/wordpress/wp-includes/template.php na linha 562Alteramos as permissões do arquivo.
$ chmod 644 /usr/share/wordpress/wp-content/themes/twentysixteen/footer.php
Atualizamos a página, acessamos o site e encontramos a chave — BjarneStroustrup! Encontramos as três chaves, nosso diretor pode trabalhar, deciframos os arquivos contábeis. Todos estão felizes, e você ainda tem muito trabalho pela frente para estabelecer a infraestrutura, backups e segurança na empresa.
2. Segunda Etapa
Era necessário resolver a tarefa sobre a coleta de análises. Todos amam análises — quem e de onde e em quantidades estão acessando. Pensamos em um caso, mas com o qual todos os engenheiros podem se deparar de alguma forma na vida.
2.1. Fatos Interessantes
Um dos nossos jogadores inseriu a chave certa nos primeiros 10 minutos do jogo, e na primeira hora tivemos um líder que completou a tarefa.
2.2. Tarefa
Você começou a trabalhar na empresa, vieram gerentes e pediram para descobrir para quem foram enviados os e-mails da África. É necessário construir um top-21 de endereços de destinatários a partir deles. As primeiras letras dos endereços dos destinatários são a chave. Um porém: o servidor de correio, pelo qual os e-mails foram enviados, não está carregando. Todos aguardam uma solução rápida para a questão!
2.3. Solução
1. O servidor não está carregando devido à seção de swap inexistente no fstab, ao carregar, o sistema tenta montá-la e falha. Como iniciar?
Baixamos a imagem, baixamos o CentOS 7, iniciamos com Live CD/DVD (Solução de Problemas -> Resgate), montamos o sistema, corrigimos /etc/fstabAqui encontramos a primeira chave — GottfriedWilhelm11646Leibniz!
Criamos o swap:
$ lvcreate -n swap centos -L 256M
$ sync && reboot2. Como sempre, não há senha, precisamos mudar a senha do root na máquina virtual. Já fizemos isso na primeira tarefa. Mudamos e conseguimos acessar o servidor, mas ele imediatamente reinicia. O servidor reinicia tão rapidamente que nem conseguimos olhar todos os logs com atenção. Como entender o que está acontecendo?
Novamente, iniciamos com livecd, analisamos atentamente os logs do sistema e, por precaução, damos uma olhada no cron, dada tal periodicidade. Lá encontramos o problema e a segunda chave — Alan1912MathisonTuring!
É necessário /etc/crontab remover ou comentar a linha echo b > /proc/sysrq-trigger.
3. Após o servidor ser inicializado, podemos executar a tarefa dos gerentes: "Quais são os endereços da África?" Essas informações são geralmente públicas. É possível encontrá-las na internet através das expressões "endereço IP África", "banco de dados geoip". Para resolver a tarefa, podem-se usar bancos de dados de distribuição de endereços disponíveis gratuitamente (geoip). Como referência, utilizamos o DB , disponível sob a licença Creative Commons Attribution-ShareAlike 4.0.
Vamos tentar resolver nossa tarefa usando apenas utilitários do Linux, mas, na verdade, existem várias formas de solucioná-la: utilizando utilitários de filtragem de texto e scripts em várias linguagens de programação.
Para começar, vamos obter pares "IP do remetente - destinatário" do log de e-mails /var/log/maillog (vamos construir uma tabela de destinatários de e-mail - IP do remetente). Isso pode ser feito com o seguinte comando:
$ cat /var/log/maillog | fgrep -e ' connect from' -e 'status=sent' | sed 's/[][]/ /g' | awk '/connect from/ {ip=$11} /status=sent/ {print $10" "ip}' > log1.txtE antes de continuarmos com a compilação do Banco de Dados de endereços da África, vamos dar uma olhada nos principais IPs dos remetentes.
$ cat log1.txt | cut -d' ' -f1 | sort | uniq -c | sort -r | head -n 40
5206 L2JhbjAbM67GA99jg@mail.ru
4165 iHKTBkegOQa6fIALq@mail.ru
3739 nHkcBl7BdgXxijSYD7@mail.ru
3405 SMAzPJAzbl9vp4hAXo@mail.ru
3346 xILz6d7P@mail.ru
Entre todos, destacam-se os três primeiros destinatários com o maior número de e-mails. Se buscarmos os endereços IP dos remetentes que enviaram para os endereços desse top 3, podemos notar um claro predomínio de certas redes:
$ cat log1.txt | fgrep 'L2JhbjAbM67GA99jg@mail.ru' | cut -d' ' -f2 | sort | cut -d'.' -f1 | uniq -c | sort -r | head
831 105
806 41
782 197
664 196
542 154
503 102
266 156
165 45
150 160
108 165A maior parte das redes 105/8, 41/8, 196/8, 197/8 é alocada pela AFRINIC — um dos cinco registradores regionais da internet que realizam a distribuição de recursos da internet. A AFRINIC distribui o espaço de endereços na região da África. E 41/8 pertence integralmente à AFRINIC.
https://www.nic.ru/whois/?searchWord=105.0.0.0
https://www.nic.ru/whois/?searchWord=41.0.0.0
Assim, a resposta para a tarefa está, de fato, no próprio log.
$ cat log1.txt | fgrep -e '105.' -e '41.' -e '196.' -e '197.' -e '154.' -e '102.' | awk '{print $1}' | sort | uniq -c | sort -r | head -n 21
4209 L2JhbjAbM67GA99jg@mail.ru
3313 iHKTBkegOQa6fIALq@mail.ru
2704 nHkcBl7BdgXxijSYD7@mail.ru
2215 uvRbp1O@mail.ru
1774 sPmMsmmFiV@mail.ru
1448 BtG3aHgQgCKuze2AKuRH@mail.ru
1233 eQpuuQ2uQdbwRL3@mail.ru
958 nJT5dpaBZ@mail.ru
862 ef4WbQiB@mail.ru
762 dQCqKL6eVminFfH7wLA@mail.ru
632 ifq6Rd1HxuCQOdO9@mail.ru
539 cFwm2ssypMmx1sA7@mail.ru
531 twtTnr4G@mail.ru
431 TSrczgYASrR11Hs3qCi@mail.ru
380 o3r3exc3OL@mail.ru
357 rzmjr2VAHK@mail.ru
348 vnPr6YjJ3ndw@mail.ru
312 anOjFXrwOtLP2Rl1Vcz6@mail.ru
289 dvny5zHmRW8fiT@mail.ru
282 sgg9jPxFDYvzw8Kr@mail.ru
274 tKSevzA7GntJ@mail.ruNeste estágio, recebemos a string «LinuxBenedictTorvadst».
A chave correta: «LinusBenedictTorvalds».
A string obtida contém um erro em relação à chave correta nos 3 últimos caracteres. Isso se deve ao fato de que as redes selecionadas por nós não estão totalmente alocadas aos países da África e à forma como os e-mails estão distribuídos pelos endereços IP em nosso log.
Com um refinamento suficiente das maiores redes alocadas aos países da África, é possível obter uma resposta precisa.:
$ cat log1.txt | fgrep -e' '105.{30..255}. -e' '41. -e' '196.{64..47}. -e' '196.{248..132}. -e' '197.{160..31}. -e' '154.{127..255}. -e' '102.{70..255}. -e' '156.{155..255}. | awk '{print $1}' | sort | uniq -c | sort -r | head -n 21
3350 L2JhbjAbM67GA99jg@mail.ru
2662 iHKTBkegOQa6fIALq@mail.ru
2105 nHkcBl7BdgXxijSYD7@mail.ru
1724 uvRbp1O@mail.ru
1376 sPmMsmmFiV@mail.ru
1092 BtG3aHgQgCKuze2AKuRH@mail.ru
849 eQpuuQ2uQdbwRL3@mail.ru
712 nJT5dpaBZ@mail.ru
584 ef4WbQiB@mail.ru
463 dQCqKL6eVminFfH7wLA@mail.ru
365 ifq6Rd1HxuCQOdO9@mail.ru
269 cFwm2ssypMmx1sA7@mail.ru
225 twtTnr4G@mail.ru
168 TSrczgYASrR11Hs3qCi@mail.ru
142 o3r3exc3OL@mail.ru
111 rzmjr2VAHK@mail.ru
96 vnPr6YjJ3ndw@mail.ru
78 anOjFXrwOtLP2Rl1Vcz6@mail.ru
56 lHzWiB7ExvRtSbAcU9@mail.ru
56 dvny5zHmRW8fiT@mail.ru
40 sgg9jPxFDYvzw8Kr@mail.ru A tarefa também pode ser resolvida de outra maneira.
Baixamos o MaxMind, descompactamos e os próximos três comandos também resolvem nossa tarefa.
$ cat GeoLite2-Country-Locations-ru.csv | grep "África" | cut -d',' -f1 > africaIds.txt
$ grep -Ff africaIds.txt GeoLite2-Country-Blocks-IPv4.csv | cut -d',' -f1 > africaNetworks.txt
$ grepcidr -f africaNetworks.txt log1.txt | cut -d' ' -f1 | sort | uniq -c | sort -r | head -n21
De uma forma ou de outra, acabamos contando as estatísticas, e os gerentes obtiveram os dados necessários para o seu trabalho!
3. Terceira etapa
A terceira etapa é um pouco parecida com a primeira — você também precisa consertar o serviço quente a lâmpada, mas tudo é mais complicado do que na primeira tarefa.
3.1. Fatos interessantes
Nos primeiros 15 minutos, três jogadores encontraram a primeira chave, e 2 horas e 20 minutos após o início da etapa, nosso vencedor resolveu a tarefa.
3.2. Tarefa
Você começou a trabalhar em uma empresa onde todos os documentos da empresa são armazenados em um servidor interno Wiki. No ano passado, um engenheiro encomendou 3 novos discos para o servidor, além de um existente, argumentando que, para garantir a resistência a falhas do sistema, os discos precisam ser configurados em certos arranjos. Infelizmente, algumas semanas após a instalação, o engenheiro foi de férias para a Índia e não retornou.
Durante vários anos, o servidor funcionou sem falhas, mas há alguns dias a rede da empresa foi invadida. De acordo com as instruções, os funcionários de segurança removeram os discos do servidor e os enviaram para você. No processo de transporte, um disco foi irremediavelmente perdido.
É necessário restaurar a funcionalidade do Wiki, principalmente o conteúdo das páginas do wiki. Um trecho de texto que estava em uma das páginas desse wiki é a senha do servidor 1C e é urgentemente necessário para desbloqueá-lo.
Além disso, em algum lugar das páginas do wiki ou em outro local, estavam as senhas do servidor de logs e do servidor de videovigilância, que também é desejável recuperar, sem elas a investigação do incidente é impossível. Como sempre, esperam uma solução rápida para o problema!
3.3. Solução
1. Tentamos inicializar sequencialmente a partir dos discos que temos e em todos recebemos a mesma mensagem:
No bootable medium found! System halted
É preciso inicializar de algum lugar. Novamente, a inicialização a partir do Live CD/DVD ajuda (Solução de Problemas -> Resgate). Ao inicializar, tentamos encontrar a partição inicializável, não conseguimos, e vamos parar no shell. Tentamos estudar como as coisas funcionam com os discos. Sabe-se que há três. Ferramentas para isso são mais abundantes na 7ª versão do CentOS, onde existem comandos blkid ou lsblk, que nos mostram todas as informações sobre os discos.
Como e o que fazemos:
$ ls /dev/sd*Logo se vê que
/dev/sdb1 - ext4
/dev/sdb2 - часть lvm
/dev/sda1 и /dev/sdc1 - части рейда
/dev/sda2 и /dev/sdc2 - про них ничего не известно на текущий моментMontamos sdb1, e fica claro que é a partição inicializável do CentOS 6.
$ mkdir /mnt/sdb1 && mount /dev/sdb1 /mnt/sdb1Obviamente, vamos para a partição grub e encontramos a primeira chave — James191955Gosling em um arquivo incomum.
2. Estudamos pvs e lvs, já que estamos trabalhando com LVM. Vemos que deve haver 2 volumes físicos, um não está presente e reclama de uid perdido. Vemos que deve haver 2 volumes lógicos: root e swap, sendo que o root está parcialmente perdido (atributo P no volume). Não conseguimos montá-lo, o que é uma pena! Precisamos muito dele.
Há mais 2 discos, olhamos para eles, reunimos e montamos:
$ mdadm --examine --verbose --scan
$ mdadm --assemble --verbose --scan
$ mkdir /mnt/md127 && mount /dev/md127 /mnt/md127 Observamos que este é a partição inicializável do CentOS 6 e uma duplicata do que já está em /dev/sdb1, e aqui novamente a mesma chave — DennisBMacAlistairCRitchie!
Vemos como foi montado /dev/md127.
$ mdadm --detail /dev/md127
Vemos que deveria ter sido montado a partir de 4 discos, mas foi montado a partir de dois /dev/sda1 e /dev/sdc1, que deveriam ser os números 2 e 4 no sistema. Presumimos que /dev/sda2 e /dev/sdc2 também pode-se formar um arranjo. Não está claro por que não há metadados neles, mas isso é responsabilidade do administrador que está em algum lugar em Goa. Presumimos que deve haver RAID10 aqui, embora haja opções. Montamos:
$ mdadm --create --verbose /dev/md0 --assume-clean --level=10 --raid-devices=4 missing /dev/sda2 missing /dev/sdc2
Vemos blkid, pvs, lvs. Descobrimos que montamos o volume físico que nos faltava anteriormente.
O lvroot foi corrigido imediatamente, vamos montá-lo, mas primeiro ativamos o VG:
$ vgchange -a y
$ mkdir /mnt/lvroot && mount /dev/mapper/vg_c6m1-lv_root /mnt/lvroot
E lá está tudo, incluindo a chave no diretório home do root — /root/sweet.
3. Estamos tentando revive nosso servidor para que ele inicie normalmente. Todos os volumes lógicos do nosso /dev/md0 (onde encontramos tudo) estão sendo movidos para /dev/sdb2, onde originalmente todo o servidor funcionava.
$ pvmove /dev/md0 /dev/sdb2
$ vgreduce vg_c6m1 /dev/md0Desligamos o servidor, removemos os discos 1 e 3, deixamos o segundo, e iniciamos com um Live CD/DVD em Rescue. Localizamos a partição de inicialização e restauramos o carregador de inicialização no grub:
root (hd0,0)
setup (hd0)
Removemos o disco de inicialização e conseguimos iniciar, mas o site não funciona.
4. Existem duas opções para iniciar o site: configurar o Apache do zero ou usar o nginx já configurado com php-fpm:
$ /etc/init.d/nginx start
$ /etc/init.d/php-fpm start
Finalmente, precisamos iniciar o MySQL:
$ /etc/init.d/mysqld start Ele não inicia, e a solução está em /var/log/mysql. Assim que você resolver o problema com o MySQL, o site funcionará, na página inicial haverá uma chave — RichardGCCMatthewGNUStallman! Agora temos acesso ao 1C, e os funcionários poderão receber seus salários. E você, como sempre, ainda tem muito trabalho pela frente para ajustar a infraestrutura e a segurança da empresa.
Também podemos compartilhar novamente a lista de livros que ajudaram a nós e nossos participantes a se prepararem para o jogo: .
Obrigado por estarem conosco! Fiquem atentos às notícias dos próximos jogos!
Fonte: habr.com
