- •1.1. Поняття операційної системи, її призначення та функції
- •1.1.1. Поняття операційної системи
- •1.1.2. Призначення операційної системи
- •1.1.3. Операційна система як розширена машина
- •1.1.4. Операційна система як розподілювач ресурсів
- •1.2. Історія розвитку операційних систем
- •1.3. Класифікація сучасних операційних систем
- •1.4. Функціональні компоненти операційних систем
- •1.4.1. Керування процесами й потоками
- •1.4.2. Керування пам'яттю
- •1.4.3. Керування введенням-виведенням
- •1.4.4. Керування файлами та файлові системи
- •1.4.5. Мережна підтримка
- •1.4.6. Безпека даних
- •1.4.7. Інтерфейс користувача
- •2.1. Базові поняття архітектури операційних систем
- •2.1.1. Механізми і політика
- •2.1.2. Ядро системи. Привілейований режим і
- •2.2. Реалізація архітектури операційних систем
- •2.2.1. Монолітні системи
- •2.2.2. Багаторівневі системи
- •2.2.3. Системи з мікроядром
- •2.2.4. Концепція віртуальних машин
- •2.3.1. Взаємодія ос і апаратного забезпечення
- •2.3.2. Взаємодія ос і виконуваного програмного коду
- •2.4.1. Базова архітектура unix
- •2.4.2. Архітектура Linux
- •2.5. Особливості архітектури: Windows хр
- •2.5.1. Компоненти режиму ядра
- •2.5.2. Компоненти режиму користувача
- •2.5.3. Об'єктна архітектура Windows хр
- •3.1. Базові поняття процесів і потоків
- •3.1.1. Процеси і потоки в сучасних ос
- •3.1.2. Моделі процесів і потоків
- •3.1.3. Складові елементи процесів і потоків
- •3.2. Багатопотоковість та її реалізація
- •3.2.1. Поняття паралелізму
- •3.2.2. Види паралелізму
- •3.2.3. Переваги і недоліки багатопотоковості
- •3.2.4. Способи реалізації моделі потоків
- •3.3. Стани процесів і потоків
- •3.4. Опис процесів і потоків
- •3.4.1. Керуючі блоки процесів і потоків
- •3.4.2. Образи процесу і потоку
- •3.5. Перемикання контексту й обробка переривань
- •3.5.1. Організація перемикання контексту
- •3.5.2. Обробка переривань
- •3.6. Створення і завершення процесів і потоків
- •3.6.1.Створення процесів
- •3.6.2.Ієрархія процесів
- •3.6.3.Керування адресним простором під час створення процесів
- •3.6.4. Особливості завершення процесів
- •3.6.5. Синхронне й асинхронне виконання процесів
- •3.6.6. Створення і завершення потоків
- •4.1. Загальні принципи планування
- •4.1.1. Особливості виконання потоків
- •4.1.2. Механізми і політика планування
- •4.1.3. Застосовність принципів планування
- •4.2. Види планування
- •4.2.1. Довготермінове планування
- •4.2.2. Середньотермінове планування
- •4.2.3. Короткотермінове планування
- •4.3. Стратегії планування. Витісняльна і невитісняльна багатозадачність
- •4.4. Алгоритми планування
- •4.4.1. Планування за принципом fifo
- •4.4.2. Кругове планування
- •4.4.3. Планування із пріоритетами
- •4.4.4. Планування на підставі характеристик подальшого виконання
- •4.4.5. Багаторівневі черги зі зворотним зв'язком
- •4.4.6. Лотерейне планування
- •4.5. Реалізація планування в Linux
- •4.5.1. Планування процесів реального часу в ядрі
- •6.1. Види міжпроцесової взаємодії
- •6.1.1.Методи розподілюваної пам'яті
- •6.1.2.Методи передавання повідомлень
- •6.1.3.Технологія відображуваної пам'яті
- •6.1.4.Особливості міжпроцесової взаємодії
- •6.2. Базові механізми міжпроцесової взаємодії
- •6.2.1. Міжпроцесова взаємодія на базі спільної пам'яті
- •6.2.2. Основи передавання повідомлень
- •6.2.3. Технології передавання повідомлень
- •8.1. Основи технології віртуальної пам'яті
- •8.1.1. Поняття віртуальної пам'яті
- •8.1.2. Проблеми реалізації віртуальної пам'яті. Фрагментація пам'яті
- •8.1.4. Підхід базового і межового регістрів
- •8.2. Сегментація пам'яті
- •8.2.1. Особливості сегментації пам'яті
- •8.2.2. Реалізація сегментації в архітектурі іа-32
- •8.3. Сторінкова організація пам'яті
- •8.3.1. Базові принципи сторінкової організації пам'яті
- •8.3.2. Порівняльний аналіз сторінкової організації пам'яті та сегментації
- •8.3.3. Багаторівневі таблиці сторінок
- •8.3.4. Реалізація таблиць сторінок в архітектурі іа-32
- •8.3.5. Асоціативна пам'ять
- •8.4. Сторінково-сегментна організація пам'яті
- •8.5. Реалізація керування основною пам'яттю: Linux
- •8.5.1. Використання сегментації в Linux. Формування логічних адрес
- •8.5.2. Сторінкова адресація в Linux
- •8.5.3. Розташування ядра у фізичній пам'яті
- •8.5.4.Особливості адресації процесів і ядра
- •8.5.5.Використання асоціативної пам'яті
- •8.6. Реалізація керування основною пам'яттю: Windows хр
- •8.6.1.Сегментація у Windows хр
- •8.6.2.Сторінкова адресація у Windows хр
- •8.6.3.Особливості адресації процесів і ядра
- •8.6.4. Структура адресного простору процесів і ядра
- •11.1. Поняття файла і файлової системи
- •11.1.1. Поняття файла
- •11.1.2.Поняття файлової системи
- •11.1.3.Типи файлів
- •11.1.4. Імена файлів
- •11.2. Організація інформації у файловій системі
- •11.2.1. Розділи
- •11.2.2. Каталоги
- •11.2.3. Зв'язок розділів і структури каталогів
- •11.3. Зв'язки
- •11.3.1. Жорсткі зв'язки
- •11.3.2. Символічні зв'язки
- •11.4. Атрибути файлів
- •11.5. Операції над файлами і каталогами
- •11.5.1. Підходи до використання файлів процесами
- •12.1. Базові відомості про дискові пристрої
- •12.1.1. Принцип дії жорсткого диска
- •12.1.2. Ефективність операцій доступу до диска
- •12.2. Розміщення інформації у файлових системах
- •12.2.1. Фізична організація розділів на диску
- •12.2.2. Основні вимоги до фізичної організації файлових систем
- •12.2.3. Неперервне розміщення файлів
- •12.2.4. Розміщення файлів зв'язними списками
- •12.2.5. Індексоване розміщення файлів
- •12.2.6. Організація каталогів
- •15.1. Завдання підсистеми введення-виведення
- •15.1.1. Забезпечення ефективності доступу до пристроїв
- •15.1.2. Забезпечення спільного використання зовнішніх пристроїв
- •15.1.3. Універсальність інтерфейсу прикладного програмування
- •15.1.4. Універсальність інтерфейсу драйверів пристроїв
- •15.2. Організація підсистеми введення-виведення
- •15.2.1. Символьні, блокові та мережні драйвери пристроїв
- •15.2.2. Відокремлення механізму від політики за допомогою
- •15.3. Способи виконання операцій введення-виведення
- •15.3.1. Опитування пристроїв
- •15.3.2. Введення-виведення, кероване перериваннями
- •15.3.3. Прямий доступ до пам'яті
- •15.4. Підсистема введення-виведення ядра
- •15.4.1. Планування операцій введення-виведення
- •15.4.2. Буферизація
- •15.7. Керування введенням-виведенням: unix і Linux
- •15.7.1. Інтерфейс файлової системи
- •15.7.2. Передавання параметрів драйверу
- •15.7.3. Структура драйвера
- •15.7.4. Виконання операції введення-виведення для пристрою
- •15.8. Керування введенням-виведенням: Windows хр
- •15.8.1. Основні компоненти підсистеми введення-виведення
- •15.8.2. Виконання операції введення-виведення для пристрою
- •15.8.3. Передавання параметрів драйверу пристрою
- •17.1. Термінальне введення-виведення
- •17.1.1. Організація термінального введення-виведення
- •17.1.3. Термінальне введення-виведення у Win32 api
- •17.2. Командний інтерфейс користувача 17.2.1.
- •17.2.2. Переспрямування потоків введення-виведення
- •17.2.3. Використання каналів
- •17.3. Графічний інтерфейс користувача
- •17.3.1. Інтерфейс віконної та графічної підсистеми Windows хр
- •17.3.2. Система X Window
- •17.4. Процеси без взаємодії із користувачем
- •17.4.1. Фонові процеси на основі posix
- •17.4.2. Служби Windows хр
- •16.1. Загальні принципи мережної підтримки
- •16.1.1. Рівні мережної архітектури і мережні сервіси
- •16.1.2. Мережні протоколи
- •16.2. Реалізація стека протоколів Інтернету
- •16.2.1. Рівні мережної архітектури tcp/ip
- •16.2.2. Канальний рівень
- •16.2.3. Мережний рівень
- •16.2.4. Транспортний рівень
- •16.2.5. Передавання даних стеком протоколів Інтернету
- •16.3. Система імен dns
- •16.3.1. Загальна характеристика dns
- •16.3.2. Простір імен dns
- •16.3.3. Розподіл відповідальності
- •16.3.4. Отримання ір-адрес
- •16.3.5. Кешування ір-адрес
- •16.3.6. Типи dns-ресурсів
- •16.4. Програмний інтерфейс сокетів Берклі
- •16.4.1. Особливості роботи з адресами
- •16.4.2. Створення сокетів
- •16.4.3. Робота з потоковими сонетами
- •16.4.4. Введення-виведення з повідомленням
- •19.1. Загальні принципи завантаження ос
- •19.1.1. Апаратна ініціалізація комп'ютера
- •19.1.2. Завантажувач ос
- •19.1.3. Двоетапне завантаження
- •19.1.4. Завантаження та ініціалізація ядра
- •19.1.5. Завантаження компонентів системи
- •19.2. Завантаження Linux
- •19.2.1. Особливості завантажувача Linux
- •19.2.2. Ініціалізація ядра
- •19.2.3. Виконання процесу init
- •19.3. Завантаження Windows хр
- •20.1. Багатопроцесорні системи
- •20.1.1. Типи багатопроцесорних систем
- •20.1.2. Підтримка багатопроцесорності в операційних системах
- •20.1.3. Продуктивність багатопроцесорних систем
- •20.1.4. Планування у багатопроцесорних системах
- •20.1.5. Спорідненість процесора
- •20.1.6. Підтримка багатопроцесорності в Linux
- •20.1.7. Підтримка багатопроцесорності у Windows хр
- •20.2. Принципи розробки розподілених систем
- •20.2.1. Віддалені виклики процедур
- •20.2.2. Використання Sun rpc
- •20.2.3. Використання Microsoft rpc
- •20.2.4. Обробка помилок і координація в розподілених системах
- •20.3. Розподілені файлові системи
- •20.3.1. Організація розподілених файлових систем
- •20.3.2. Файлова система nfs
- •20.3.3. Файлова система Microsoft dfs
- •20.4. Сучасні архітектури розподілених систем
- •20.4.1. Кластеры системи
- •20.4.2. Grid-системи
- •18.1. Основні завдання забезпечення безпеки
- •18.2. Базові поняття криптографії
- •18.2.1. Поняття криптографічного алгоритму і протоколу
- •18.2.2. Криптосистеми з секретним ключем
- •18.2.3. Криптосистеми із відкритим ключем
- •18.2.4. Гібридні криптосистеми
- •18.2.5. Цифрові підписи
- •18.2.6. Сертифікати
- •18.3. Принципи аутентифікаціїі керування доступом
- •18.3.1. Основи аутентифікації
- •18.3.2. Основи керування доступом
- •18.4. Аутентифікація та керування доступом в unix
- •18.4.1. Облікові записи користувачів
- •18.4.2. Аутентифікація
- •18.4.3. Керування доступом
- •18.5. Аутентифікація і керування доступом у Windows xp
- •18.5.1. Загальна архітектура безпеки
- •18.5.2. Аутентифікація
- •18.5.3. Керування доступом
- •18.6. Аудит
- •18.6.1. Загальні принципи організації аудиту
- •18.6.2. Робота із системним журналом unix
- •18.6.3. Журнал подій Windows xp
- •18.7. Локальна безпека даних
- •18.7.1. Принципи шифрування даних на файлових системах
- •18.7.2. Підтримка шифрувальних файлових систем у Linux
- •18.7.3. Шифрувальна файлова система Windows xp
- •18.8. Мережна безпека даних
- •18.8.1. Шифрування каналів зв'язку
- •18.8.2. Захист інформації на мережному рівні
- •18.8.3. Захист інформації на транспортному рівні
- •18.9. Атаки і боротьба з ними
- •18.9.1. Переповнення буфера
- •18.9.2. Відмова від обслуговування
- •18.9.3. Квоти дискового простору
- •18.9.4. Зміна кореневого каталогу застосування
18.5. Аутентифікація і керування доступом у Windows xp
18.5.1. Загальна архітектура безпеки
Архітектури безпеки Windows XP [14] містять такі основні компоненти.
♦ Процес реєстрації користувачів (logon process, winlogon) обробляє запити користувачів на реєстрацію у системі та приймає дані від них.
♦ Менеджер аутентифікації (Local Security Authority Subsystem, LSASS) безпосередньо проводить аутентифікацію користувача. Цей компонент — центральний у підсистемі безпеки. Крім аутентифікації, він контролює політику аудиту, про яку йтиметься у розділі 18.6.
♦ Менеджер облікових записів (Security Accounts Manager, SAM) підтримує базу даних облікових записів (базу даних SAM), що містить імена локальних користувачів і груп, а також паролі. Під час перевірки прав користувача SAM взаємодіє із менеджером аутентифікації.
♦ Довідковиймонітор захисту (Security Reference Monitor, SRM) перевіряє права користувача на доступ до об'єкта і виконує необхідну дію з об'єктом за наявності цих прав. Це єдиний компонент, що виконується в режимі ядра, він реалізує політику контролю доступу, визначену менеджером аутентифікації. SRM гарантує, що будь-який користувач або процес, що дістав доступ до об'єкта, має всі права на нього.
Ця архітектура реалізована у системах, що не використовують мережної аутентифікації. Для неї інформація про облікові записи має зберігатися не у базі даних SAM, а у спеціальному централізованому сховищі даних - активному каталозі (Active Directory). Під час мережної аутентифікації менеджер аутентифікації звертається до служби активного каталогу віддаленого комп'ютера, на якому розташований цей каталог. База даних SAM, однак, є у будь-якій установці OC лінії Windows XP — у ній зберігають облікові записи для локальної аутентифікації.
Подальший виклад торкатиметься локальної аутентифікації.
18.5.2. Аутентифікація
Windows XP вимагає, щоб кожному користувачу відповідав обліковий запис. Він пов'язаний із профілем захисту, який є набором інформації щодо контролю доступу (ім'я користувача, список його груп, пароль тощо). Профілі захисту зберігають у базі даних SAM і використовують для аутентифікації.
Розглянемо послідовність кроків реєстрації користувача у системі. Процес winlogon очікує введення від користувача. Потік цього процесу виявляє спробу користувача ввійти у систему (натискання комбінації клавіш Ctrl+Alt+Del) і пропонує йому ввести ім'я облікового запису та пароль. При цьому для реалізації такого введення winlogon звертається до спеціальної DLL графічної ідентифікації та аутентифікації (GINA). Стандартне вікно введення даних користувача реалізоване у msgina.dll, програміст може встановити свою версію цієї динамічної бібліотеки, що реалізує альтернативний метод аутентифікації (наприклад, на основі смарт-карт або біометричних даних).
Дані від користувача передаються процесу winlogon, і аутентифікація із використанням бази даних SAM (за яку відповідає LSASS) відбувається відповідно до протоколу «виклик-відповідь». Можна використати і протокол Керберос (цей підхід тут не розглядатиметься).
Якщо аутентифікація пройшла успішно, створюють об'єкт, що унікальним чином визначає цього користувача в усіх його подальших діях. Цей об'єкт, який називають маркером доступу (access token), відіграє ключову роль у підсистемі захисту: він визначає, до яких системних ресурсів мають доступ потоки, створені цим користувачем.
Після успішної аутентифікації користувача LSASS створює процес і приєднує до нього маркер доступу користувача. Цей процес передають підсистемі Win32, що запускає в його адресному просторі застосування, визначене у реєстрі як оболонка системи (за замовчуванням ним є стандартна оболонка explorer.exe). Застосування формує візуальне відображення параметрів робочого столу для користувача.
Ідентифікатори безпеки
Із кожним користувачем і групою у Windows XP пов'язують унікальний ідентифікатор безпеки (Security Identifier, SID). Це цілочислове значення, що складається із заголовка і випадкової частини. Система безпеки звертається до користувачів і груп тільки за їхнім SID.
Win32 API надає ряд функцій для роботи із SID [32]. Для отримання SID користувача або групи за іменем використовують функцію LookupAccountName():
BOOL LookupAccountName(LPCTSTR sname. LPCTSTR username. PSID sid.
LPDWORD sidsize. LPTSTR dname. LPDW0RD dsize. PSID_NAME_USE sidtype);
де: username - ім'я користувача;
sid — покажчик на буфер пам'яті, у який записується отриманий SID, відображений спеціальною структурою SID (цей буфер звичайно розміщують у динамічній ділянці пам'яті);
sidsize — розмір буфера (якщо його недостатньо для розміщення SID1 у дану змінну записується необхідний розмір, а буфер sid не заповнюється); dname — покажчик на буфер пам'яті, у який записується ім'я домена, де зареєстрований користувач (для локального користувача — ім'я комп'ютера), dsize -розмір цього буфера;
sidtype — покажчик на змінну, що задає тип SID (вона може набувати значень SidTypeUser - SID користувача, SidTypeGroup — SID групи).
Наведемо приклад отримання SID користувача за його ім'ям:
DWORD sidsize = 1024. domsize = 1024:
char username[] - "ivanov". domname[1024];
SID_NAME_USE sidtype = SidTypeUser:
PSID sid = (PSID)HeapAlloc(GetProcessHeap(). 0. sidsize);
LookupAccountName(NULL. username, sid, &sidsize. domname,
&domsize. &sidtype): // ... робота з sid FreeSid(sid);
Для перетворення структури SID у рядковий формат, придатний для відображення, використовують функцію ConvertSidToStringSid():
#include <sddl .h> char *ssid = NULL:
// PSIDsid: LookupAccountName(... sid. ...):
ConvertSidToStringSid(sіd. &ssi d);
// пам'ять для ssid буде виділено автоматично
printf("*sW. ssid): // S-1 -5-21 -1844237615-1682526488-1202660629-1002 LocalFree(ssid);
Маркери доступу
Маркер доступу користувача пов'язують з усіма процесами, які він створює. Маркер є «посвідченням особи» процесу, коли той намагається використати який-не-будь системний ресурс, і містить таку інформацію:
♦ SID користувача, із правами якого виконується процес;
♦ список груп, до яких належить цей користувач;
♦ список привілеїв, якими володіє користувач;
♦ список контролю доступу за замовчуванням, який визначає первісні права доступу для об'єктів, створюваних процесами цього користувача (про структуру такого списку йтиметься у пункті 18.5.3).
У разі спроби процесу відкрити дескриптор об'єкта диспетчер об'єктів звертається до SRM. SRM отримує маркер доступу, пов'язаний із процесом, та використовує його SID і список груп, щоб визначити, чи має процес право доступу до об'єкта. Фактично маркер доступу відповідає ідентифікатору eui d для UNIX.
Для отримання маркера доступу процесу використовують функцію Open-ProcessToken():
BOOL OpenProcessToken(HANDLE ph. DWORD access. PHANDLE ptoken):
де: ph — дескриптор процесу;
access — тип доступу до маркера (T0KEN_QUERY — читання інформації); ptoken - покажчик на змінну, в яку записується дескриптор маркера доступу. Ось приклад отримання маркера доступу поточного процесу:
HANDLE mytoken;
OpenProcessToken(GetCurrentProcessO. TOKENQUERY. &mytoken);
Інформація, що зберігається у маркері доступу, може бути отримана за допомогою функції
GetTokenInformation():
BO0L GetTokenInformation(HANDLE token. T0KEN_INF0RMATI0N_CLASS tclass, LPV0ID tibuf. DWORD tisize. PDW0RD realsize);
де: token - дескриптор маркера доступу;
tclass — значення, що визначає тип отримуваної інформації (TokenUser — інформація про обліковий запис користувача, TokenGroups - список груп); ti buf — буфер для розміщення інформації (якщо tcl ass дорівнює TokenUser, цей буфер містить структуру типу T0KEN_USER із полем User, що відображає структуру із полем Sid, яке містить SID цього користувача); tisize - розмір буфера;
realsize - покажчик на змінну, що містить розмір буфера, необхідного для розміщення інформації (якщо tisize недостатньо, функція поверне FALSE і запише в цю змінну потрібний розмір).
Наведемо приклад отримання SID з маркера доступу:
GetTokenInformation(mytoken. TokenUser. buf. sizeof(buf). &size);
ConvertSi dToStri ngSid(((PT0KEN_USER)buf)->User.Si d. &s s і d):
printf("ls\n". ssid);
Запозичення прав
Окремі потоки процесу можуть виконуватися із правами користувачів, які відрізняються від прав творця цього процесу. Такий підхід називають запозиченням прав (impersonation), за своїм призначенням він відповідає системному виклику setuid() в UNIX-системах. Як і setuid(), запозичення прав найчастіше використовують у серверах, які виконує користувач із адміністративними привілеями. У цьому разі потоки, що обслуговують запити користувачів, можуть виконуватися із меншими правами.
Потік, для якого задано запозичення прав, отримує окремий маркер доступу, який називають маркером режиму запозичення прав (impersonation token). Подальшу перевірку прав доступу виконують із використанням цього маркера.
Для отримання маркера доступу довільного користувача необхідно здійснити програмний вхід у систему для цього користувача. Такий вхід реалізує функція LogonUser():
B00L LogonUser(LPTSTR username. LPTSTR domain. LPTSTR passwd. DWORD logon_type. DWORD logon_provider. PHANDLE ptoken);
де: username — ім'я користувача, domain — домен або комп'ютер, у якому зареєстрований користувач (для локальної системи задають "."), passwd — пароль користувача;
logon_type — тип входу у систему (для звичайного користувача потрібно задавати L0G0N32_L0G0N_INTERACTIVE);
logon_provider — алгоритм аутентифікації, який використовують для входу (L0G0N32_PR0VI0ER_DEFAULT - стандартний алгоритм); '
ptoken - покажчик на змінну, у яку поміщається маркер доступу цього користувача.
Наведемо приклад коду, що здійснює програмний вхід у систему: HANDLE itoken;
LogonUser("ivanov". "ivanov_pwd", L0G0N32_L060N_INTERACTIVE. L0G0N32_PR0VIDER_DEFAULT, &itoken):
Реалізацію запозичення прав у користувача, що присутній у системі, здійснюють задопомогою функції ImpersonateLoggedOnUser():
ImpersonateLoggedOnUser(і token);
// ... потік виконується з правами користувача, що володіє itoken
Маркер доступу потоку може бути отриманий за допомогою функції Open-ThreadToken(), аналогічної до OpenProcessToken():
OpenThreadToken(GetCurrentThread(). TOKENQUERY. TRUE, &ttoken);
// ... GetTokenInformation(ttoken, ...) і т. д.
Для повернення до виконання із колишніми правами використовують функцію RevertToSelf():
RevertToSelf():