Операційна система
програмне забезпечення, що керує апаратними ресурсами
Що це таке
Операційна система — це програмне забезпечення, яке запускається на комп’ютері першим і працює під усім іншим: ділить між програмами процесор, пам’ять, сховище й мережу та дає їм усім однакові способи читати файли, користуватися пристроями й виходити в мережу. Її зазвичай скорочують до ОС. Windows, macOS, Android, iOS і дистрибутиви Linux, як-от Debian та Ubuntu, — це операційні системи.
Глосарій NIST містить два описи, які доповнюють один одного. Перший називає її головною керувальною програмою, що керує комп’ютером: першою програмою, яка завантажується після ввімкнення комп’ютера, чия головна частина, ядро, постійно перебуває в пам’яті і яка задає стандарти для всіх прикладних програм, наприклад для вебсервера. Другий, із настанов NIST щодо безпеки операційних технологій, називає її цілісним набором службових процедур, що керують послідовністю виконання програм, можуть відповідати за керування введенням і виведенням, планування ресурсів і роботу з даними та дають прикладним програмам основні команди для керування комп’ютером.
Ядро — це серцевина, але операційна система більша за своє ядро. Довкола нього стоять системні бібліотеки, які викликають програми, оболонка й повсякденні інструменти командного рядка, наглядовий процес, що запускає служби під час завантаження й перезапускає їх, менеджер пакетів, що встановлює й оновлює програмне забезпечення, і великий обсяг типових налаштувань, які вирішують, що ввімкнено, куди йдуть журнали і хто може входити в систему. Дистрибутив Linux збирає все це довкола ядра Linux, і тому дві системи з однаковим ядром можуть поводитися зовсім по-різному.
Більшість того, що операційна система пропонує програмі, — це короткий список абстракцій, які заступають залізо. POSIX, стандарт, на якому стоять Unix-подібні системи, визначає їх точно. Процес — це адресний простір з одним або кількома потоками, що в ньому виконуються, разом із системними ресурсами, потрібними цим потокам. Файл — це об’єкт, у який можна писати, з якого можна читати або і те, і те, з правами доступу й типом: звичайний файл, каталог, символьне посилання, FIFO, сокет або символьний чи блоковий спеціальний файл, що представляє пристрій. Блоковий спеціальний файл дає доступ до пристрою так, що його апаратні характеристики лишаються поза увагою програми. Сам пристрій визначено як периферійний пристрій комп’ютера або об’єкт, який для програми виглядає як такий пристрій. Заявлена мета POSIX — зробити програми переносними на рівні вихідного коду, щоб програму, написану під ці інтерфейси, можна було скомпілювати на іншій сумісній системі й запустити.
З пам’яттю поводяться так само. Документація ядра Linux виходить із того, що фізична пам’ять — обмежений ресурс, і описує віртуальну пам’ять як шар, що приховує її подробиці від прикладного програмного забезпечення. Кожна програма бачить власний адресний простір, а операційна система щомиті вирішує, які частини яких програм тримати в справжній пам’яті, а які стиснути, вивантажити на диск або відкинути, щоб пізніше прочитати знову.
Чому це важливо
Вибір операційної системи вирішує багато чого одразу: які програми працюватимуть, які інструменти вже знають люди, що її обслуговують, хто постачає виправлення безпеки й як довго і скільки коштуватиме угода про підтримку, якщо вона буде. Змінити її пізніше означає перенести кожну програму й кожну звичку, що на ній виросли, тож вибір зазвичай переживає залізо, на якому його вперше зробили.
Це також головна межа довіри всередині однієї машини. Користувачі, групи, права на файли й відокремлення процесів одне від одного — усе це можливості операційної системи, і саме вони визначають, як далеко може сягнути вада в одній програмі. Машина, на якій кожна служба працює з повними правами, має лише одну стіну — край мережі.
Її типові налаштування — це рішення, які ухвалив хтось інший. Свіжа інсталяція приходить з увімкненими службами, файлами в домовлених місцях і вже вибраними параметрами. Більшість із них розумні; кілька заважатимуть саме цій роботі, і ніхто не скаже, які саме. Добре обслуговувати машину — це зокрема знати, які типові налаштування ти прийняв.
І вона визначає, як далеко може помандрувати код. Програма, що тримається переносних інтерфейсів, переходить на іншу систему після повторного збирання. Програма чи скрипт, що спирається на розширення однієї системи, переходить лише так далеко, як ці розширення.
Як це виглядає на практиці
На ноутбуці програма заповнювала пам’ять, доки операційна система примусово її не завершила. Зафіксований випадок дійшов до 111 ГБ стиснутих сторінок на машині з 36 ГБ і зростав приблизно на 41 МБ за секунду, а це показує, як далеко операційна система розтягує пам’ять, перш ніж втрутитися. Сторінка додає, що примусове завершення настає вже після того, як через підкачування все інше на робочому столі перестало відповідати. Причину виправили в самій програмі: обмеженими потоками подій, підпискою за типом події та бюджетом швидкості для журналювання, і 610 996 рядків журналу за один сеанс стали 1 411.
На хості компанії роль автоматизації місяцями записувала свої налаштування SSH під час кожного запуску, коли звіт про доступ прочитав власні фактичні налаштування демона й знайшов два, що розходилися із записаними. Розповідь про те, як посилили захист SSH триетапною перевіркою, називає причину: операційна система постачає власні значення за замовчуванням розкоментованими й вище того місця, куди потрапляє додатковий файл конфігурації, а для цих двох параметрів діє перше входження. Виправленням став префікс у назві файлу, що сортується раніше за файл постачальника, і тепер 24 директиви звіряються з тим, що повідомляє сам демон.
Той самий хост зустрів інший вибір системи, коли налаштовували його службу блокування спроб вторгнення. Джерело журналу переведено на автовизначення, бо операційна система постачається без традиційного журналу автентифікації, а за хибного вибору служба мовчки ламається, стежачи за файлом, який ніколи не з’явиться.
Де виникають проблеми
Скрипт несе звички системи, на якій його написали. Скрипт оболонки,
написаний на Mac і запущений на сервері з Linux, або навпаки, зустрічає ті самі
назви команд з іншими параметрами. sed за POSIX приймає -E і -n;
редагування файлу на місці через -i — це розширення, і дві поширені версії
розуміють його по-різному:
sed -i 's/old/new/' notes.txt # GNU sed, у більшості систем Linux
sed -i '' 's/old/new/' notes.txt # BSD sed, у macOS
Кожна форма ламається на іншій системі. Тримайтеся того, що визначає POSIX, там, де цього досить, запускайте скрипт на тій системі, яка виконуватиме його в робочому середовищі, і встановлюйте однаковий інструмент на обидві, коли розширення варте того.
Дві машини з однаковою операційною системою відрізняються. «Debian» — це назва цілої родини випусків, і два хости, про які кажуть, що на них Debian, можуть бути на роки розведені за випуском, ядром і версіями пакетів, з різними встановленими пакетами й різними локальними змінами. Перш ніж порівнювати машини, прочитайте, чим кожна з них є насправді:
cat /etc/os-release
uname -srm
Перша команда виводить назву й випуск дистрибутива, друга — назву й випуск ядра та апаратну платформу. Будуйте кожен хост з того самого письмового опису й тримайте випуск в інвентарі.
Служби працюють від імені адміністратора. Служба, що працює від root в Unix-подібній системі, може прочитати кожен файл і змінити кожне налаштування, тож будь-яка вада в ній стає вадою всієї машини. Дайте кожній службі власного непривілейованого користувача з правом запису лише туди, куди вона пише, і додавайте права по одному, коли служба показує, що вони їй потрібні.
Випуск переживає свою підтримку безпеки. Кожен випуск перестає отримувати виправлення за оприлюдненим розкладом. Команда безпеки Debian, наприклад, підтримує стабільний дистрибутив упродовж трьох років після його випуску. Хост, залишений на старому випуску, далі працює, і саме тому про нього забувають. Записуйте дату кінця підтримки кожного хоста поруч з іншими датами поновлення й плануйте оновлення заздалегідь.
Що почитати далі
- operating system — NIST CSRC Glossary — обидва визначення, від головної керувальної програми до набору службових процедур.
- POSIX.1-2024, Base Definitions: Definitions — точні формулювання для процесу, файлу, пристрою та інших слів, з яких складається операційна система.
- POSIX.1-2024: sed
— параметри, які приймає кожен сумісний
sed, як мірило того, що може використовувати переносний скрипт. - Linux kernel documentation: Concepts overview — віртуальна пам’ять, сторінковий кеш і повернення пам’яті так, як їх описує саме ядро.
- Debian security FAQ — як Debian працює з виправленнями безпеки і як довго їх отримує стабільний випуск.