Linux Quest Вітаємо переможців та розповідаємо про рішення завдань

Linux Quest Вітаємо переможців та розповідаємо про рішення завдань

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. Тут же знаходимо перший ключ - Gottfried Wilhelm11646 Leibniz!

Створюємо swap:

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

2. Пароля як завжди немає, необхідно змінити пароль root на віртуальній машині. Ми це вже робили в першому завданні. Змінюємо та успішно заходимо на сервер, але він відразу йде у перезавантаження. Сервер перевантажується з такою швидкістю, що не встигнути навіть уважно подивитися всі логи. Як зрозуміти, що відбувається?

Знову завантажуємося з livecd, уважно вивчаємо логи системи і про всяк випадок заглядаємо в крон, якщо така періодичність. Там знаходимо проблему і другий ключ - Alan1912 Mathison Turing!

Потрібно в /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 [email protected]
4165 [email protected]
3739 [email protected]
3405 [email protected]
3346 [email protected]

Серед усіх явно виділяються за кількістю листів три перших одержувача з топу. Якщо grep-нути IP-адреси відправників, що відправляли на адреси з цього топ-3, можна помітити явну перевагу певних мереж:

$ cat log1.txt | fgrep '[email protected]' | 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 [email protected]
3313 [email protected]
2704 [email protected]
2215 [email protected]
1774 [email protected]
1448 [email protected]
1233 [email protected]
958 [email protected]
862 [email protected]
762 [email protected]
632 [email protected]
539 [email protected]
531 [email protected]
431 [email protected]
380 [email protected]
357 [email protected]
348 [email protected]
312 [email protected]
289 [email protected]
282 [email protected]
274 [email protected]

На даному етапі ми отримуємо рядок "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 [email protected]
2662 [email protected]
2105 [email protected]
1724 [email protected]
1376 [email protected]
1092 [email protected]
849 [email protected]
712 [email protected]
584 [email protected]
463 [email protected]
365 [email protected]
269 [email protected]
225 [email protected]
168 [email protected]
142 [email protected]
111 [email protected]
 96 [email protected]
 78 [email protected]
 56 [email protected]
 56 [email protected]
 40 [email protected]

Завдання також можна вирішити іншим шляхом.
Завантажуємо 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 з нашого /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.

Дякую за те, що були з нами! Слідкуйте за анонсами наступних ігор!

Джерело: habr.com

Додати коментар або відгук