• chemtech – новый статус:   8 г., 1 мес. назад · Просмотр

    Первая игра отборочного тура Yandex.Root 2015. Задачи и решения.

    Для начала кто не знает что такое Яндекс.Root – олимпиада Яндекса для unix-инженеров, системных администраторов и всех любителей Open Source и Linux. Участники олимпиады соревнуются в умении быстро и правильно решать задачи, с которыми ежедневно сталкиваются системные администраторы. Игроки, наиболее быстро справившиеся со всеми заданиями, получают денежный приз.

    Сайт олимпиады: root.yandex.com

    Задания находятся по ссылке: http://paste.omsklug.com/2607

    Как мы решил эти задачи (нумерация из задания)

    1. SSL

    Подпись:
    #генерация ключа сервера:
    openssl genrsa -out server.omsklug.com.key 2048
    #генерация запроса для CA:
    openssl req -new -key server.omsklug.com.key -out server.omsklug.com.csr
    #подписание запроса у CA и получение сертификата:
    openssl x509 -req -in server.omsklug.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.omsklug.com.crt -days 365
    #готовый файлик для HTTPS сервера:
    cat server.omsklug.com.key server.omsklug.com.crt > server.omsklug.com.pem

    конфиг:
    $SERVER["socket"] == ”:443” {
    ssl.engine = ”enable”
    ssl.pemfile = ”/etc/lighttpd/certs/server.omsklug.com.pem”
    ssl.ca-file = ”/etc/lighttpd/certs/ca.crt”
    server.document-root = ”/home/lighttpd/certs/https”
    server.errorlog = ”/var/log/lighttpd/certs/serror.log”
    accesslog.filename = ”/var/log/lighttpd/certs/saccess.log”
    ssl.cipher-list = ”aRSA+HIGH +kEDH -kRSA !kSRP !kPSK +3DES !MD5 !SSLv3”
    }

    server.modules = (
    mod_access,
    ”mod_accesslog”,
    mod_alias,
    mod_compress,
    mod_redirect,
    ”mod_rewrite”,
    ”mod_fastcgi”,
    )

    качаем сертификат в папку /etc/ssl/certs:
    wget http://crt.usertrust.com/USERTrustLegacySecureServerCA.crt
    update-ca-trust

    2. MariaDB repair

    #сброс пароля:
    systemctl stop mysqld.service
    mysqld_safe –skip-grant-tables
    mysql -u root
    update user set password=PASSWORD(”mynewpassword”) where User=’root’;
    flush privileges;

    #права на базу:
    chown -Rf mysql:mysql /var/lib/mysql

    #права:
    GRANT ALL PRIVILEGES ON *.* TO ’checker’@’10.0.0.1’ IDENTIFIED BY ’masterkey’ WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    #маскировка в конфиге:
    #разкомменченый не пускает в интернет:
    #skip-networking
    #для ipv4:
    bind-address = 0.0.0.0
    #Если не закомментирован, все таблицы будут read-only:
    #innodb_force_recovery = 2

    3. Binary
    #поставил вайн, затем моно
    #пытался пересобрать бинарник
    #пытался запустить бинарник
    #начал смотреть зависимости, не хватало либы
    #нашел либу, скачал, залил через scp
    #запустил 1.exe и выполнил game

    pacman -S mono
    #Cкачать себе https://dnanalytics.codeplex.com/releases/view/25456
    scp /tmp/dnAnalytics_managed.zip root@ip:/root/dnAnalytics_managed.zip
    unzip
    mv bin/* ~/1
    mono 1.exe &
    game

    4. Mongo

    #Три директории
    /data/s1 сюда распаковываем нашу БД
    /data/s2
    /data/config

    #запускаем шарды, конфиг сервер и какую-то штуку:

    mongod –dbpath /data/s1 –port 27010
    mongod –dbpath /data/s2 –port 27020
    mongod –configsvr –dbpath /data/config –port 27000

    mongos –configdb 127.0.0.1:27000 –port 27017

    #коннектится к нашей БД
    mongo –port 27017

    #там мышардим root.features

    use admin
    sh.enableSharding(”root”)
    use root
    db.features.ensureIndex({_id: 1})
    use admin
    db.runCommand({shardCollection: ”root.features”, key: {_id: 1}})

    5. Strange protocol

    Не осилили

    6. File (который /root/file)

    в общем, сначала захотелось понять, что это за файл:
    #file file
    file: LVM2 PV (Linux Logical Volume Manager), UUID: XT6zLL-YAUv-nmA9-BSrw-2pBV-CTi2-vqKe35, size: 31457280
    потом вспомнил, что есть такая приблуда, как kpartx, которая монтирует образы дисков.
    #kpartx -a file
    получилось loopback устройство /dev/loop0
    просканировал физические тома:
    # pvscan
    PV /dev/loop0 VG VolGroup00 lvm2 [28,00 MiB / 0 free]
    потом активировал группу томов:
    #vgchange -a y VolGroup00
    после этого появился логическй том lv0 в /dev/VolGroup00
    и его теперь можно подмонтировать в предварительно созданный
    каталог с названием yadisk:
    # mount /dev/VolGroup00/lv0 yadisk
    там в корне лежит файлик root.txt.gz, содержимое которого яндексу не понравилось.
    после этого возникла мысль, что, возможно, на разделе есть затёртый файл,
    который нужно восстановить. смотрм, что за файловая система смонтирована:
    #mount

    /dev/mapper/VolGroup00-lv0 on /tmp/yadisk type btrfs (rw,relatime,space_cache)
    ага… btrfs… возникает мысль о том, что используются subvolumes. проверяем:
    # btrfs subvolume list yadisk/
    ID 256 gen 11 top level 5 path root
    ID 257 gen 14 top level 5 path root_1
    на всякий пожарный проверяем, какой том монтируется по умолчанию:
    # btrfs subvolume get-default yadisk/
    ID 256 gen 11 top level 5 path root
    значит нужно смонтировать root_1 и посмотреть, что в нём:
    # mkdir root_1
    # mount -o subvol=root_1 /dev/VolGroup00/lv0 root_1/
    # ls -lR root_1
    root_1:
    итого 4
    drwxr-xr-x 1 root root 0 апр 9 18:05 root
    -rw-r–r– 1 root root 66 дек 23 21:30 root.txt.gz
    root_1/root:
    итого 0
    # zcat root_1/root.txt.gz
    You fount it!
    D2Dfbb4Sxxkl23Dfcs1082
    таким образом, делаем вывод о том, что именно этот файл мы и должны были найти.

    7. MariaDB tuning

    правим конфиги

    query_cache_size = 32M
    thread_cache_size = 6
    innodb_buffer_pool_size = 2G можно было и поменьше…

    закомментировал
    #innodb_file_per_table = 1

    Оптимизировал таблицы OPTIMIZE TABLE data;

    8. HG

    ”Создать файл /root/repo/exclude
    в файл exclude написать exclude *.gz”

    в файле nano /etc/mercurial/hgrc написать
    [extensions]
    convert=
    hg convert –filemap exclude /root/repo /root/repo2

    Смотрим лог hg
    hg log | grep 7c695bb105a1
    Видим что 7c695bb105a1 имеет номер 0
    changeset: 0:7c695bb105a1
    Удаляем запись с номером 0
    hg strip -r 0

    запустить сервер
    hg serve –daemon –port 8000 –prefix /root/repo2

    9. Strange file

    chattr -i file