DOI :: Нотатки про Yggdrasil: | якість коду, безпека, та DNS

Нотатки про Yggdrasil: якість коду, безпека, DNS

By Alex Kotov 
Середній
хв
9 вересня 2021 р

Наразі складно просувати мережу Yggdrasil для масового використання. Вона складна для звичайного користувача, оскільки потребує налаштування. Вона не дає нових можливостей обходу найчастіше застосовуваних механізмів державних блокувань Інтернету порівняно з іншими технологіями, такими як VPN. У ній немає великої кількості унікальних ресурсів. Нарешті, це експериментальна технологія, до стабільності та безпеки якої є питання.

Проте сама ідея мереж із пористою топологією вкрай перспективна. На її основі може бути побудований принципово інший інтернет, що ми коротко торкнулися однієї з наших статей . Yggdrasil є найпросунутішим програмним забезпеченням для реалізації таких мереж, тому безумовно заслуговує на увагу тих, хто цікавиться не тільки поточною практичною користю, а й розвитком та перспективами нових технологій.

Крім того, ми вже розповідали про розміщення веб-сайтів у Yggdrasil, але дуже мало висвітлили особливості цієї мережі. При цьому ми підтримуємо дзеркало нашого веб-сайту. Це мотивувало нас докладніше вивчити Yggdrasil. Нашим досвідом та результатами дослідження ми хочемо поділитися з вами.

Якість коду

Неможливо професійно говорити про програмне забезпечення, не розібравшись у його вихідному коді. Ось ми вирішили вивчити вихідний код Yggdrasil. Благо це лише 4874 рядки коду мовою програмування Go, або 6634 рядків коду взагалі, без урахування коментарів і порожніх рядків (виміряти можна за допомогою програми cloc, яка є в більшості дистрибутивів GNU/Linux).

Ми були неприємно здивовані. Почнемо з того, що код майже не протестовано. Є лише один файл із тестами ( src/core/core_test.go), що містить всього 150 рядків коду, тобто це в кращому випадку 1/32 частина всього коду проекту. Це дуже мало. Так, у Bitcoin тести складають 1/7 частину коду, IPFS – 1/6, Tor – 1/4. Ми переконалися, що тести не покривають навіть такі зміни в коді, які унеможливлюють використання Yggdrasil, наприклад, відключення віртуального мережевого інтерфейсу TUN/TAP. Що й казати про більш тонкому тестуванні варіативності даних, яка може становити загрозу безпеці.

Сам код не відрізняється читальністю. Так, функція handlerу файлі src/core/link.goзаймає 110 рядків (без урахування порожніх рядків та коментарів). Працювати із цим досить складно. Проблему визнають і автори коду: у функції є коментар про необхідність розділити її. Ми не просто почали вивчення Yggdrasil саме з цього файлу. Однією з перших наших ідей для занурення у вихідний код було додавання нового транспортного протоколу, такого як QUIC, на додаток до TCP і TLS. Нам здавалося, що це має бути нескладно, але невдовзі ми переконалися у протилежному. Наприклад, структура linksз файлу містить інформацію про підключення транспортного рівня, і вона жорстко прив'язана до протоколу TCP. Для додавання QUIC потрібно спочатку переробити код.

Безпека: привілеї та мережевий екран

Тепер розглянемо безпеку з більш загального погляду. Під час встановлення Yggdrasil в операційних системах, заснованих на Debian і systemd, він запускається з правами суперкористувача. Це потрібно для адміністрування віртуального мережного інтерфейсу TUN/TAP та створення файлу службового роз'єму (admin socket), але потім привілеї варто скинути чого не відбувається. Linux capabilities для процесу встановлено очевидно, що добре.

За промовчанням будь-який учасник мережі може надсилати пакети на вашу адресу. Раніше у Yggdrasil був вбудований мережевий екран, але у версії 0.4 його видалили для спрощення коду. Хоча це не є безпосередньою загрозою, при поєднанні деяких факторів це може збільшити поверхню атаки на ваш пристрій, тому важливо налаштувати мережевий екран. Далі ми запропонуємо найсуворіші налаштування, які не підходять для сервера, але підходять для домашнього комп'ютера. Користувач Yggdrasil отримує одну адресу в підмережі 200::/7, а також цілу підмережу з довжиною префікса 64 біта в підмережі 300::/8, яка є підмножиною першої підмережі, тому не потребує окремої обробки в мережевому екрані. У Linux правила для iptables, які дозволяють лише вихідні з'єднання (TCP, UDP, ICMP та інші) виглядатимуть так:

ip6tables -A INPUT -i ygg0 -s 200::/7 -d 200::/7 -m conntrack --ctstate ESTABLISHED -j ПРИЙНЯТИ
ip6tables -A OUTPUT -o ygg0 -s 200::/7 -d 200:: /7 -m conntrack --ctstate НОВИЙ, ВСТАНОВЛЕНИЙ -j ПРИЙНЯТИ
ip6tables -A ВХІД -i ygg0 -j ВІДХИЛИТИ
ip6tables -A ВИВІД -o ygg0 -j ВІДХИЛИТИ
ip6tables -A ВХІД -s 200::/7 -j ВІДХИЛИТИ
ip6tables - A OUTPUT -s 200::/7 -j REJECT
ip6tables -A INPUT -d 200::/7 -j REJECT
ip6tables -A OUTPUT -d 200::/7 -j REJECT

Тут ygg0- це назва віртуального мережного інтерфейсу TUN/TAP. Його необхідно вказати в налаштуваннях Yggdrasil (файл /etc/yggdrasil.conf) у полі IfNameБажано видалити з конфігураційного файлу ключі ( PublicKey: nullі PrivateKey: null). Тоді ваша IP-адреса буде змінюватися при кожному запуску, що теж ускладнює атаки. Варто змінити налаштування NodeInfoPrivacyна true, щоб не повідомляти інформацію про вашу операційну систему, архітектуру процесора та версію Yggdrasil.

IPv4 у yggdrasil не використовується, але для надійності ви можете заборонити весь такий трафік на мережному інтерфейсі:

iptables -A INPUT -i ygg0 -j REJECT
iptables -A OUTPUT -o ygg0 -j REJECT

Доступність: DNS та відносні шляхи

Адресація в Yggdrasil відбувається за IPv6-адресами. Це не завжди зручно. Адреси складно запам'ятовувати, чи не всі програми їх сприймають як коректні посилання. Тому користувачі намагаються використовувати DNS. Так, існує програма meshname , яка просто перетворює IPv6-адреси на доменні імена. Проблему із запам'ятовуванням це вирішує, до того ж потребує встановлення стороннього програмного забезпечення. Існують різні сервери DNS, які дозволяють використовувати більш короткі доменні імена та стандартне програмне забезпечення операційних систем (наприклад, dnsmasq). Однак це також вимагає налаштування, а також прив'язує користувача до конкретного сервера.

Виходить, що єдиним універсальним способом роздільної здатності імен є використання записів типу AAAA глобальної DNS. Це спричиняє всі відповідні недоліки, але інші механізми в сучасних операційних системах не реалізовані через консерватизму цієї сфери, про що ми вже писали раніше . Ми вважаємо, що без ініціативи з боку розробників операційних систем ситуація не зміниться, оскільки всі альтернативні рішення є надто маргінальними.

Навіть глобальна система доменних імен не вирішує деяких проблем, які виникають у адміністраторів веб-сайтів Yggdrasil. Наприклад, якщо один сервер повинен роздавати сайт і Yggdrasil, і в Інтернет, то не вийде використовувати URL (виду foobar.tld/qwe/rty). Ми просуваємо використання у розподілених мережах відносних шляхів (виду qwe/rty). Це вимагає деякої налаштування веб-додатків або генераторів статичних сайтів, але не становить великої складності. Відносні шляхи є також більш універсальними, ніж абсолютні шляхи (виду /qwe/rty), оскільки дозволяють роздавати веб-сайти не з кореневого шляху. Ми вже пропонували такий варіант для IPFS, але він може бути корисним і в інших випадках, коли не можна розраховувати на стандартні умови Всесвітньої павутини, в тому числі Yggdrasil.

Висновки

Yggdrasil – це сире програмне забезпечення. Його категорично не можна використовувати для якихось важливих завдань. Однак допомагати у його розвитку варто. Обговорення дуже активно ведеться в чаті в Matrix . Є також активна російськомовна спільнота Russian Meshnet у Matrix та Telegram . Якщо ви звичайний користувач, то заходьте в різні чати та форуми, які є в мережі, та розповідайте у спільноті про свій досвід та знайдені проблеми. Якщо ви програміст, то допомагайте написання коду. Активно цим займаються лише дві людини. Думаю, якщо розробників буде більше, то більшість проблем Yggdrasil будуть вирішені і ми побачимо реальні можливості мереж з пористою топологією.

Просмотры:

Коментарі

Популярні публікації