Linux Quest. Поздравляем победителей и рассказываем про решения заданий

1hzhnd4vk8qks_p2sjyylz-kpy4.png

25 марта мы открыли регистрацию на Linux Quest, это Игра для любителей и знатоков операционной системы Linux. Немного статистики: зарегистрировалось на игру 1117 человек, из них 317 — нашли хотя бы один ключ, 241 успешно справились с заданием первого этапа, 123 — второго и 70 прошли третий этап. Сегодня наша игра подошла к концу, и мы поздравляем наших победителей!

  • Первое место занял Александр Тельдеков.
    Александр про себя сказал, что он самый типичный сисадмин. Живет в Волгограде, разные Unix-like системы администрирует уже лет двадцать. Успел поработать в интернет-провайдерах, банке, системном интеграторе. Сейчас работает удалённо в небольшой фирме, занимается облачной инфраструктурой для крупного зарубежного заказчика. Любит читать, слушать музыку. Про Игру Александр сказал, что игра в целом понравилась, он любит такие задачки. В одной из компаний на собеседовании занимался похожим на Hackerrank, было интересно.
  • Второе место — Роман Суслов.
    Роман из Москвы. Ему 37 лет. Работает Linux/Unix-инженером в компании «Инфосистемы Джет». По работе приходится заниматься администрированием и траблшутингом Linux/Unix-систем + SAN. Интересы самые разные: Linux-системы, программирование, reverse engineering, информационная безопасность, Arduino. Про Игру Роман отметил, что игра в целом понравилась. «Размял немного свои извилины и отвлекся от серых будней повседневной работы. :) Хотелось бы побольше заданий, а то не успел войти во вкус как игра уже закончилась».
  • Третье — alex3d.
    Алекс живет в Москве, занимается разработкой ПО. «Спасибо за контест, было интересно проверить свой скилл google-fu».


Так же в рейтинге 10-ти лучших игроков:

  • Yevgeniy Saldayev
  • Маркел Мохначевский
  • Константин Коносов
  • Павел Сергеев
  • Владимир Боваев
  • Иван Бубнов
  • Pavlo Klets


Мы понимаем, что вариантов решения всех наших задач много, ниже описаны одни из возможных вариантов решения.

1. Первый этап


Мы назвали его «А ты точно админ?», так как задание было довольно простое — починить теплый ламповый сервис.

1.1. Интересные факты:


Двое игроков нашли первый ключ за первые 15 минут игры, а за первый час у нас появилось три лидера, которые справились с заданием.

1.2. Задание


Ты вышел на работу в компанию, где долгое время не было грамотного специалиста по информационным технологиями. Прежде чем начать наводить порядок, нужно решить горящую проблему, блокирующую работу офиса.

Уборщица зацепила шваброй кабель питания серверного шкафа. Питание восстановили, но очень важный веб-сайт всё равно не работает. Веб-сайт важный, потому что компания не очень озабочена информационной безопасностью, и на главной страничке этого можно найти в открытом виде пароль администратора от компьютера генерального директора.

На днях пароль поменяли, а новый все забыли, директор не может работать. Ходят слухи, что на этой машине были ещё ключи, которые могут помочь нам в дешифровке резервной копии бухгалтерских документов.

Все ждут от оперативного решения вопроса!

1.3. Решение


1. Первым делом нужно поменять пароль root на виртуальной машине, чтобы получить на нее доступ. При запуске замечаем, что это Ubuntu 16.04 Server.

Для сброса пароля рута рестартуем машину, при загрузке, в момент отображения меню grub-а, переходим в редактирование пункта Ubuntu кнопкой «e». Редактируем строчку linux, добавляем в конец init=/bin/bash. Грузимся через Ctrl+x, получаем баш. Перемонтируем корень с rw, поменяем пароль:

$ mount -o remount,rw /dev/mapper/ubuntu--vg-root
$ passwd


Не забываем про sync, ребутаем.

2. В условии сказано, что у нас не работает веб-сервер, смотрим:

$ curl localhost
Not Found
The requested URL / was not found on this server.
Apache/2.4.18 


То есть по факту Apache запущен, но отвечает с кодом 404. Смотрим конфиг:

$ vim /etc/apache2/sites-enabled/000-default.conf


Тут же находится ключ — StevenPaulSteveJobs.

Проверяем путь /usr/share/WordPress — такого нет, но есть /usr/share/wordpress. Правим конфиг и перезапускаем апач.

$ systemctl restart apache2


3. Пробуем снова, получаем ошибку:

Warning: mysqli_real_connect(): (HY000/2002): Connection refused in /usr/share/wordpress/wp-includes/wp-db.php on line 1488


БД не запущена?

$ systemctl status mysql
Active: active (running)


В чём же дело? Надо разбираться. Для этого нужно получить доступ в MySQL, как это сделать описано в документации. Один из пунктов документации рекомендует нам прописать опцию skip-grant-tables в /etc/mysql/mysql.conf.d/mysqld.cnf. Тут тоже находится rлюч — AugustaAdaKingByron.

Поправляем права пользователю 'wp'@'localhost'. Запускаем MySQL, делаем его доступным по сети, комментируя в конфиге опцию skip-networking.

4. После проделанных действий веб-сервер запускается, но сайт все равно не работает, так как

Warning: require_once(/usr/share/wordpress/wp-content/themes/twentysixteen/footer.php): failed to open stream: Permission denied in /usr/share/wordpress/wp-includes/template.php on line 562


Правим права на файл.

$ chmod 644 /usr/share/wordpress/wp-content/themes/twentysixteen/footer.php


Обновляем страницу, заходим на сайт и находим ключ — BjarneStroustrup! Мы нашли все три ключа, наш директор может работать, мы расшифровали файлы бухгалтерии. Все счастливы, а у тебя впереди много работы по налаживанию инфраструктуры, бэкапов и безопасности в компании.

2. Второй этап


Нужно было решить задачу про сбор аналитики. Аналитику любят все — кто и откуда и в каких количествах ходят. Мы придумали случай, но с которым может в том или ином виде могут столкнуться все инженеры в жизни.

2.1. Интересные факты


Один из наших игроков ввел правильный ключ за первые 10 минут игры, а за первый час у нас появился лидер, который справился с заданием.

2.2. Задание


Ты вышел на работу в компанию, к тебе пришли менеджеры и попросили найти, кому отправлялись письма из Африки. Нужно построить топ-21 адресов получателей по ним. Первые буквы адресов получателей — ключ. Одно но: почтовый сервер, через который письма были отправлены, не загружается. Все ждут от оперативного решения вопроса!

2.3. Решение


1. Сервер не грузится из-за несуществующего раздела swap в fstab, при загрузке система пытается его примонтировать и падает. Как загрузиться?

Скачиваем образ, мы скачали CentOS 7, грузимся с Live CD/DVD (Troubleshooting → Rescue), монтируем систему, правим /etc/fstab. Тут же находим первый ключ — GottfriedWilhelm11646Leibniz!

Создаем swap:

$ lvcreate -n swap centos -L 256M
$ sync && reboot


2. Пароля как всегда нет, нужно поменять пароль root на виртуальной машине. Мы это уже проделывали в первом задании. Меняем и успешно заходим на сервер, но он сразу уходит в перезагрузку. Сервер перегружается с такой скоростью, что не успеть даже посмотреть все логи внимательно. Как понять, что происходит?

Опять загружаемся с livecd, внимательно изучаем логи системы и на всякий случай заглядываем в крон, раз такая периодичность. Там находим проблему и второй ключ — Alan1912MathisonTuring!

Нужно в /etc/crontab удалить или закомментировать строчку echo b > /proc/sysrq-trigger.

3. После чего сервер загрузился, и можно выполнить задание менеджеров: «Какие адреса Африки?» Данная информация, в целом, общедоступна. Найти эту информацию можно в интернете по словосочетаниям «ip address africa», «geoip database». Для решения задачи можно использовать свободно доступные базы распределения адресов (geoip). Мы в качестве эталона использовали БД MaxMind GeoLite2, доступную по лицензии Creative Commons Attribution-ShareAlike 4.0.

Попробуем решить нашу задачу, используя только системные утилиты Linux, но вообще ее можно решать огромным количеством способов: с помощью утилит фильтрации текста и с помощью скриптов на различных языках программирования.

Для начала, просто получим пары «IP-отправителя — получатель» из почтового лога /var/log/maillog (построим таблицу email получателей — IP отправителя). Это можно сделать вот такой командой:

$ 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.txt


И прежде чем мы продолжим с составлением БД адресов Африки, глянем на топ IP-адресов отправителей.

$ 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


Среди всех явно выделяются по кол-ву писем три первых получателя из топа. Если grep-нуть IP-адреса отправителей, что отправляли на адреса из этого топ-3, можно заметить явное преобладание определённых сетей:

$ 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 165


Большая часть сетей 105/8, 41/8, 196/8,197/8 выделена AFRINIC — один из пяти региональных интернет-регистраторов, выполняющих распределение интернет-ресурсов. AFRINIC распределяет адресное пространство на территории Африки. А 41/8 относится к AFRINIC вовсе вся.

https://www.nic.ru/whois/?searchWord=105.0.0.0 
https://www.nic.ru/whois/?searchWord=41.0.0.0


Таким образом, ответ на задачу, собственно, есть в самом логе.

$ 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.ru


На данном этапе мы получаем строку «LinuxBenedictTorvadst».

Правильный ключ: «LinusBenedictTorvalds».

Полученная строка содержит опечатку по отношению к правильному ключу в 3 крайних символах. Это связано, с тем, что выбранные нами сети не целиком выделены странам Африки и с тем, как распределены email-ы по IP-адресам в нашем логе.

При достаточном уточнении наиболее крупных сетей, выделенных странам Африки, можно получить точный ответ.:

$ 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


Задачу также можно решить другим путём.
Скачиваем MaxMind, распаковываем, и следующие три команды также решают нашу задачу.

$ cat GeoLite2-Country-Locations-ru.csv | grep "Африка" | 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


Тем или иным способом мы в итоге посчитали статистику, и менеджеры получили необходимые им данные для работы!

3. Третий этап


Третий этап чем-то похож на первый — тоже нужно починить теплый ламповый сервис, но все сложнее, чем в первом задании.

3.1. Интересные факты


За первые 15 минут три игрока нашли первый ключ, через 2 часа 20 минут после начала этапа наш победитель справился с заданием.

3.2. Задание


Ты вышел на работу в компанию, где все документы компании хранятся на внутреннем сервере Wiki. В прошлом году инженер заказал 3 новых диска для сервера в дополнение к одному существующему, аргументируя это тем, что для отказоустойчивости системы нужно ставить диски в некие массивы. К сожалению, спустя несколько недель после их установки инженер уехал отдыхать в Индию и не вернулся.

Несколько лет сервер работал без сбоев, но пару дней назад сеть компании была взломана. По инструкции сотрудники охраны извлекли диски из сервера и отправили их тебе. В процессе транспортировки, один диск был безвозвратно утрачен.

Нужно восстановить работоспособность Wiki, прежде всего интересует содержание страниц вики. Некий кусок текста, который был на одной из страниц данной вики, является паролем от сервера 1C и срочно нужен для его разблокировки.

Кроме того, где-то на страницах вики или в ином месте были пароли от сервера логов и сервера видеонаблюдения, которые так же желательно восстановить, без них исследование происшествия невозможно. Как всегда ждут от оперативного решения вопроса!

3.3. Решение


1. Пытаемся загрузиться по очереди с тех дисков, что у нас есть и везде получаем одинаковое сообщение:

No bootable medium found! System halted 


Надо с чего-то загрузиться. Опять спасает загрузка с Live CD/DVD (Troubleshooting → Rescue). При загрузке пытаемся найти загрузочный раздел, не находим, попадаем в shell. Пытаемся изучать что и как с дисками. Известно, что их три. Инструментов для этого больше в 7-й версии CentOS, где есть команды blkid или lsblk, которые нам показывают всю информацию про диски.

Как и что делаем:

$ ls /dev/sd*


Сразу видно, что

/dev/sdb1 - ext4
/dev/sdb2 - часть lvm
/dev/sda1 и /dev/sdc1 - части рейда
/dev/sda2 и /dev/sdc2 - про них ничего не известно на текущий момент


Монтируем sdb1, видно, что это загрузочный раздел CentOS 6.

$ mkdir /mnt/sdb1 && mount /dev/sdb1 /mnt/sdb1


Очевидным образом идем в раздел grub и находим там первый ключ — James191955Gosling в необычном файле.

2. Изучаем pvs и lvs, так как работаем с LVM. Видим, что должно быть 2 физических volume, один не находится и ругается на потерянный uid. Видим, что должно быть 2 логически volume: root и swap, при этом root частично потерян (атрибут P у volume). Смонтировать не получается, а жаль! Он нам очень нужен.

Есть еще 2 диска, смотрим на них, собираем и монтируем:

$ mdadm --examine --verbose --scan
$ mdadm --assemble --verbose --scan
$ mkdir /mnt/md127 && mount /dev/md127  /mnt/md127 


Смотрим, видно, что это загрузочный раздел CentOS 6 и дубль того, что уже есть на /dev/sdb1, и тут опять тот же ключ — DennisBMacAlistairCRitchie!
Смотрим как собран /dev/md127.

$ mdadm --detail /dev/md127


Видим, что должен был быть собран из 4-х дисков, собрался из двух /dev/sda1 и /dev/sdc1, они должны были быть номерам 2 и 4 в системе. Предполагаем, что из /dev/sda2 и /dev/sdc2 тоже можно собрать массив. Непонятно, почему нет на них metadata, но это на совести админа, который где-то на Гоа. Предполагаем, что тут должен быть RAID10, хотя есть варианты. Собираем:

$ mdadm --create --verbose /dev/md0 --assume-clean --level=10 --raid-devices=4 missing /dev/sda2 missing /dev/sdc2


Смотрим blkid, pvs, lvs. Обнаруживаем, что собрали физический volume, которого нам ранее не хватало.

Сразу починился lvroot, монтируем его, но предварительно активируем VG:

$ vgchange -a y
$ mkdir /mnt/lvroot && mount /dev/mapper/vg_c6m1-lv_root /mnt/lvroot 


И там все есть, в том числе и ключ в домашней директории root — /root/sweet.

3. Пытаемся все же оживить наш сервер, чтобы он нормально запустился. Все логические volume c нашего /dev/md0 (где у нас все нашлось) перетаскиваем в /dev/sdb2, где изначально и работал весь сервер.

$ pvmove /dev/md0 /dev/sdb2
$ vgreduce vg_c6m1 /dev/md0


Гасим сервер, убираем 1 и 3 диски, оставляем второй, грузимся с Live CD/DVD в Rescue. Находим раздел загрузочный, восстанавливаем загрузчик в grub:

root (hd0,0)
setup (hd0)


Отрываем загрузочный диск и успешно загружаемся, но сайт не работает.

4. Вариантов запустить сайт два: настроить с нуля Apache или использовать уже настроенный заранее nginx c php-fpm:

$ /etc/init.d/nginx start
$ /etc/init.d/php-fpm start


Наконец, нужно запустить MySQL:

$ /etc/init.d/mysqld start


Он не запускается, и отгадка кроется в /var/log/mysql. Как только вы решите проблему с MySQL, сайт заработает, на главной страничке будет ключ — RichardGCCMatthewGNUStallman! Теперь у нас есть доступ в 1С, и сотрудники смогут получить зарплату. А у тебя как всегда впереди много работы по налаживанию инфраструктуры и безопасности в компании.

Так же мы можем еще раз поделиться списком книжек, которые помогали нам и нашим участникам готовиться к игре: linux.mail.ru/books.

Спасибо за то, что были с нами! Следите за анонсами следующих игр!

© Habrahabr.ru