Статьи

Заглядаємо під капот Chrome OS

  1. Зміст статті Що десктопні програми, та й сам десктоп рано чи пізно переїде в Інтернет, було зрозуміло...
  2. базові концепції
  3. Все починається з BIOS
  4. INFO
  5. всюдисущий Linux
  6. INFO
  7. Безпека
  8. висновки

Зміст статті

Що десктопні програми, та й сам десктоп рано чи пізно переїде в Інтернет, було зрозуміло чи не після народження JavaScript, тому поява Chrome OS багато в чому передбачувано. І що хмарну ОС випустила саме Google, теж абсолютно закономірно. Але давай спробуємо відійти від нескінченних дебатів про майбутнє десктопа, що розпалюють консервативною частиною айтішників, і подивимося на Chrome OS з точки зору технічної реалізації.

Дорога в хмари

Google анонсувала Chrome OS влітку 2009 року і вже в листопаді продемонструвала її публіці і виклала исходники у відкритий доступ під ім'ям Chromium OS. Тоді операційка була досить проста і являла собою запущений на повний екран браузер Chrome, який працює поверх сильно урізаного дистрибутива Ubuntu. У ній були реалізовані всі ті ж механізми ізоляції вкладок браузера і плагінів, все та ж многопроцессность модель роботи браузера, але в цілому нічим особливим операційка не відрізнялася.

Протягом наступних п'яти років Google безперервно, але не особливо афішуючи свою роботу розвивала Chrome OS. Попутно вона випускала так звані Chromebook'і і Chromebox'и, що стали популярними серед юніксоід, які зносили Chrome OS відразу після покупки. Поступово Gooogle відмовилася від Ubuntu на користь Gentoo (судячи з усього - щоб отримати можливість складання пакетів без «непотрібних» для неї залежностей і плюшки Hardened-версії дистрибутива) і замінила-таки одновіконний режим на стандартний для десктопів багатовіконний зі стандартною панеллю задач знизу. Google свідомо відмовилася від нього в перших версіях Chrome OS, оскільки ОС була орієнтована на нетбуки з їх невеликими екранами, але, судячи з усього, користувачі цього не оцінили.

З'явилися і офлайнові веб-додатки (доступні також в звичайному Chrome) і, нарешті, підтримка ряду додатків для Android. Остання обставина стало цілком очікуваним після того, як керівництво розробкою обох операційних систем перейшло в руки Сундара Пічая (Sundar Pichai), який завжди був відповідальним за розвиток Chrome, Chrome OS і веб-додатків Google.

Chrome OS розвивається разом з самим браузером, тому їх версії збігаються. На момент написання статті це була версія 41, але на відміну від браузера у Chrome OS немає готових збірок для установки за винятком офіційно підтримуваних Chromebook'ов і Chromebox'ов. Однак в Мережі цілком можна знайти неофіційні збірки на базі початкових кодів Chromium OS. наприклад, тут завжди можна скачати щоденні збірки для x86, x64 і ARM. Досить записати одну з них на флешку і завантажитися з неї. Однак треба бути готовим, що не всі компоненти машини заведуться (в моєму випадку відвалився тачпад). До того ж Chromium OS не підтримує Flash, DRM і Netflix, зате в ній є доступ до консолі з правами root.

Робочий стіл Chrome OS з вікном налаштувань і панеллю

базові концепції

Ключова ідея Chrome OS в тому, що за великим рахунком це ОС для тонких клієнтів, де все, крім графічного інтерфейсу і браузера, знаходиться в Мережі. Фактично без підключення до інтернету і свого облікового запису Google операційка навіть не пустить користувача всередину (по крайней мере в перший раз). Файли Google пропонує зберігати в свій Google Drive (покупцям Chromebook'ов компанія дає 100 Гб), настройки, розширення і встановлені програми синхронізуються стандартним для браузера Chrome способом. Для друку пропонується використовувати Google Cloud Print.

У російських реаліях такий підхід нічого не дає і створює масу труднощів, та й в іншому світі теж. Але Chrome OS - це заділ Google на майбутнє, і така модель роботи дозволила програмістам реалізувати ряд цікавих архітектурних рішень і підходів до забезпечення безпеки. Про що ми і поговоримо в частині статті.

Все починається з BIOS

Незважаючи на те що Chromium OS може працювати на комп'ютерах зі стандартним BIOS, Chromebook'і базуються на CoreBoot. І це не просто одна з їх технічних особливостей, а навмисна оптимізація. CoreBoot - повністю 32-бітний «BIOS», позбавлений баласту з великої кількості коду ініціалізації обладнання, марного в наші дні. Укупі з оптимізаціями Google він здатний виконати холодний старт від натискання кнопки живлення до завантаження ядра буквально за частки секунди.

Далі CoreBoot знаходить завантажувальний розділ GPT і завантажує в пам'ять бінарник, що містить бутлоадер u-boot (він зазвичай використовується під вбудовується електроніці) і ядро ​​Linux, після чого віддає управління u-boot, і починається майже стандартна для Linux-дистрибутивів процедура завантаження, що включає в себе монтування кореневого розділу, запуск демонів, графічної системи і, нарешті, інтерфейсу.

Цікаво у всій цій процедурі те, що у завантажувача з ядром і кореневої ФС є «резервні копії» в окремих розділах, і ця особливість використовується для оновлення ОС і відкату в разі збою. Під час автоматичного оновлення Chrome OS взагалі не чіпає поточну установку, а замість цього прописує нову версію ОС в ті самі «резервні розділи», які стають «поточними» після перезавантаження. У разі збою при завантаженні нової версії ОС відбудеться зворотна зміна місцями і користувач може отримати доступ до свідомо робочої системі (система сама здатна зрозуміти, що вона успішно завантажилася, і поставити відповідний прапор на поточні GPT-розділи).

Більш того, на кожному етапі передачі управління від одного компонента до іншого (наприклад, від CoreBoot до u-boot) відбувається звірка цифрового підпису (у разі кореневої ФС - по блоках звірка контрольних сум на льоту), при розбіжності якої система також відкотиться до минулій версії . Це працює, тому що розділи з поточною версією системи монтуються тільки на читання і користувач навіть випадково не зможе їх змінити.

Процес завантаження Chrome OS

INFO

EEPROM Chromebook'а містить не тільки дві копії firmware (одна з яких резервна), але і неперезапісиваемий recovery firmware, що дозволяє завантажити систему з USB-флешки або карти пам'яті і провести перевірку і відновлення системи.

Крім CoreBoot, EEPROM будь-якого Chromebook'а включає в себе SeaBIOS - відкриту реалізацію BIOS, яка дозволяє без зайвого клопоту встановити на пристрій Windows або Linux.

всюдисущий Linux

Поточні версії Chrome OS засновані на Gentoo Linux з тим винятком, що замість стандартної для даного дистрибутива системи ініціалізації OpenRC тут задіяний убунтовскій Upstart. У порівнянні зі звичайним дистрибутивом Linux система сильно урізана, тому завантажувати тут особливого годі й стартує вона буквально за секунду. Звичайного терміналу немає, але є місцевий shell crosh, доступний за.

Звичайного терміналу немає, але є місцевий shell crosh, доступний за

Linux і в Chrome OS Linux

Виконавши в ньому команду shell, ми отримаємо доступ до стандартного bash з правами root (в Chromium OS, природно) і зможемо дослідити систему. Тут є всім нам відомі демони rsyslogd, dbus-daemon (D-Bus використовується в Chrome OS для обміну даними між браузером і іншими частинами системи), wpa_supplicant (аутентифікація в Wi-Fi-мережах), dhcpcd, ікси, ModemManager (робота з 3G -модеми), udev, ConnMan (управляє з'єднаннями з мережею) плюс більше десятка специфічних для Chrome OS демонів, що відповідають в тому числі за оновлення системи (update_engine), роботу з TPM-модулем (chapsd), шифрування домашнього каталогу (cryptohomed), налагодження (debugd) та інші завдання.

Особливе місце тут займає демон session_manager, відповідальний за ініціалізацію високорівневою частини ОС. У його завдання входить:

  1. Запустити X-сервер.
  2. Ініціалізувати змінні оточення для браузера Chrome.
  3. Створити необхідні каталоги, файли і правила cgroups для Chrome.
  4. Запустити Chrome.
  5. Викликати Upstart-подія login-prompt-visible, в результаті чого на екрані з'явиться вікно логіна.

Під час цього процесу дійсно не запускаються будь-які компоненти, що відповідають за формування «робочого столу» (за винятком вікна логіна). Його отрисовкой займається сам браузер, покладаючись на фреймворк Aura, що включає в себе низькорівневі функції для роботи з графікою і вікнами (з хардварний прискоренням через DRI) і оточення робочого столу Ash, яке отрісовиваєт панель задач, декорації вікон, Google Now і інші стандартні елементи інтерфейсу ОС. Будучи частиною браузера Chrome, вони, тим не менш, працюють всередині декількох незалежних процесів.

Будучи частиною браузера Chrome, вони, тим не менш, працюють всередині декількох незалежних процесів

З чого складається Chrome OS

INFO

У разі збою завантаження системи, який реєструється, якщо процес браузера не може бути запущений в протягом 30 с, Chromium OS автоматично запускає SSH-сервер і перезапускає опитування ядра на наявність обладнання за допомогою команди udevtrigger.

Завдяки інтеграції Aura і Ash в сам Chrome отримати робочий стіл Chrome OS можна в будь-який ОС, запустивши браузер з прапором --open-ash.

Безпека

Крім уже розглянутих методів забезпечення безпеки і цілісності даних, таких як безпечна завантаження системи, зашифрований домашній каталог з кеш даними (шифрування виконується окремо для кожного користувача), а також стандартних для браузера Chrome методів ізоляції процесів, плагінів і Native Client від системи (тут використовується механізм seccomp-bpf, що дозволяє фільтрувати звернення до системних викликів), в Chrome OS задіяний ряд інших підходів до забезпечення безпеки.

Центральне місце серед них займає minijail - невеликий додаток, що застосовується для ізоляції системних сервісів (демонів) і інших компонентів системи. Це дуже гнучке додаток, яке дозволяє виконувати такі функції, як наділення додатки «можливостями» або їх відкликання (capabilities - спеціальна підсистема ядра Linux для наділення НЕ SUID-бінарників деякими можливостями root), замкнути його в chroot, відкликати права root, встановити ліміти на ресурси (rlimits), розмістити процес в виділених просторах імен (на манер LXC і Docker) і застосувати до нього правила cgroups.

Якщо поглянути на висновок ps aux | grep minijail (див. Скріншот) в працюючій системі, то можна помітити, що minijail використовується для запуску демонів з тими чи іншими настройками, але число таких демонів по відношенню до всіх працюючих в системі не так вже й велика . Судячи з документам розробників , В майбутньому minijail планують істотно розширити і застосовувати його до набагато більшій кількості компонентів системи, включаючи графічний стек і Chrome. Поки ж що є, то є.

Поки ж що є, то є

Демони, запущені під контролем minijail

З інших засобів забезпечення безпеки можна відзначити застосування прапорів компілятора для мінімізації ризику зриву стека (-fno-delete-null-pointer-checks, -fstack-protector, FORTIFY_SOURCE), задіяння «посиленого» механізму ASLR (Address space layout randomization) в ядрі Linux (патч PaX), використання capabilities замість SUID-бінарників де це можливо, обмеження на завантаження модулів ядра, використання модуля TPM (в Chromebook'ах) для зберігання ключів шифрування диска і пароля користувача, заборона на запуск звичайних ELF-бінарників користувачем і деякі інші цілком стандартні техніки, багато з яких перетинаються з Android і Hardened Gentoo.

висновки

Звичайно, Chrome OS набагато складніше, ніж я зміг описати в цій статті. У ній є безліч нюансів і величезна кількість цікавих ідей. Про все це можна почитати на сайті проекту Chromium , Благо автори відкриті по відношенню до стороннім розробникам і написали досить непогану документацію.

Новости