freebsd-operating-systems

Криптографія в FreeBSD

FreeBSD є однією з моїх улюблених Linux-систем. Вона звісно не була першою в списку ОС сімейства Linux які я використовував, однак стала тою системою, робота з якою у мене є найтривалішою. Це і настільна версія FreeBSD, а також звичайна серверна версія (стоїть у мого хостинг-провайдера) з якою мені часто доводиться мати справу. Люблю я цього червоного демона :) Отож васшій увазі представляється переклад статті про криптографію у чудовій FreeBSD.


У зв'язку з останніми подіями багато всерйоз замислюються про безпеку своїх комп'ютерних систем. Новинні стрічки рясніють повідомленнями про те, що спецслужби промишляють стеженням за спинами звичайних громадян. Гучні арешти, викриття і скандали не сходять зі сторінок ЗМІ. І звичайно, кожному хочеться себе убезпечити від очей Великого Брата, будь то реальне життя або віртуальна реальність.

Loading…

Забезпечення безпеки - справа важка. Можна порівняти її зі стіною з цегли: якщо правильно їх скласти і скріпити, то вийде міцна конструкція. Але навіть сама наворочена захист не врятує від зловмисника, якщо той може спокійно отримати фізичний доступ до об'єкту нападу. Тому забезпечувати безпеку ми почнемо з обмеження такого доступу. А точніше, розглянемо випадок, коли зловмисник (спецслужби, сантехнік дядя Вася ...) вже отримав його і має намір прочитати твої секрети.

Уявімо, що в тебе є сервер в дата-центрі, персональний комп'ютер вдома або ноутбук на роботі. І не дуже хочеться, щоб хтось підійшов і покопався в них. За певних умов паролі не рятують від завантаження з іншого носія, і тим більше (що ще гірше) - від розкрадання HDD. У таких ситуаціях на допомогу приходить криптографія. Ось до неї-то ми і вдамося, щоб захистити нашу інформацію.


Pre-install

Не секрет, що від конфігурації комп'ютера залежить дуже багато, а робота із засобами шифрування накладає ще більші вимоги на залізо. Моя тестова система виглядає так:
Intel Xeon SL8P2 3,8 ГГц
8192 RAM DDR-333 ECC
Intel RAID Controller SRCU42L Ultra320 SCSI, RAID 0/1/4/5/10, Cache 64 Мбайт
6 HDD SCSI MAT3073NC Ultra 320 SCSI/SCA2/LVD in RAID-10
OS: FreeBSD 10.1

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


Щоб уникнути настільки неприємної ситуації, ми об'єднаємо описані варіанти в один і на виході отримаємо зашифрований диск з ОС, яка буде завантажуватися зі знімного носія. Ядро системи буде знаходитися на тому ж самому носії: щоб завантажитися, нам знадобиться фізична присутність. Вірніше, для завантаження з зашифрованого кореневого розділу необхідно, щоб ядро ​​ОС було незашифрованим. У цьому випадку краще всього його розмістити окремо. Так ми вб'ємо відразу двох зайців одним пострілом: без носія (ядра) система не завантажиться, а зловмисникові доведеться подумати, як, не вимикаючи сервер, перенести його в інше місце для більш детального вивчення :). Та й сам факт присутності ОС буде прихований від сторонніх очей, що не може не радувати.

Звичайно, це доставляє багато незручностей, особливо якщо сервер критичний і робота повинна йти 24/7/365. Але подітися нікуди: чим безпечніше система, тим важче їй користуватися. Можливо, в майбутньому ці заходи врятують тобі життя. Погодься, вагомішою аргумент знайти вельми скрутно ...

Отже, нам знадобиться дистрибутив FreeBSD 10.1, записаний на будь-який носій. Настійно рекомендую скачувати останні з офіційного сайту виробника і звіряти контрольні суми. В якості знімного носія, на якому ми будемо зберігати наше ядро, візьмемо Kingston DataTraveler microDuo USB 2.0. Вибір припав на нього, тому що він дуже маленький - його можна легко проковтнути або швидко знищити в екстрених ситуаціях.

flashdrive

Не менш важлива надійність носія. Якщо у нас якимось чарівним чином пропаде інформація з нього, ми можемо зі стовідсотковою впевненістю розпрощатися з інформацією на жорстких дисках нашого сервера. У Kingston, за численними відгуками користувачів, з надійністю все нормально. Варто відзначити, що стандарт USB 2.0 буде накладати обмеження на швидкість завантаження ОС. Для досягнення більш високих швидкостей використовуй версію USB 3.0, якщо її підтримує твоє обладнання.

Install

Завантажується з потрібного нам пристрою. Нас вітає синій екран bsdinstall. Тиснемо Install => Вибираємо Keymap => Пишемо Hostname => За бажанням виставляємо галочки в меню компонентів системи => У меню Partitioning вибираємо Shell. bsdinstall_shell
Перед установкою ОС заб'ємо наш диск (у мене апаратний RAID-масив / dev / da0) сміттям. Процес довгий і нудний, так що запасіться терпінням:
# /bin/dd if=/dev/random of=/dev/da0 bs=100m
Так само зробимо з флешкою (/ dev / da1):
# /bin/dd if=/dev/random of=/dev/da1 bs=10m
Знищимо таблиці розділів на пристроях:
# /sbin/gpart destroy –F /dev/da0
# /sbin/gpart destroy –F /dev/da1

Створимо таблицю розділів GPT на флешці:
#/sbin/gpart create –s gpt /dev/da1
da1 created

Для завантаження c USB-пристрої нам необхідний маленький розділ з завантажувачем на ньому:
# /sbin/gpart add -t freebsd-boot -l bootcode -s 64k /dev/da1
da2p1 added

Далі створимо розділ, на якому буде зберігатися ядро ОС:
# /sbin/gpart add –t freebsd-usf –l bootfs –s 2g /dev/da1
da2p2 added

У перший сектор записуємо завантажувач MBR (це робиться для старого обладнання, яке не підтримує GPT), якому передає управління BIOS після включення комп'ютера. Він шукає розділ freebsd-boot по таблиці GPT і якщо його знаходить, то завантажує його вміст в пам'ять, тим самим передаючи естафету управління йому. Там у нас прописався / boot / gptboot, який перевіряє коректність таблиць і заголовків, а також шукає розділ freebsd-ufs і вже з нього намагається завантажити ядро. Прапор -i вказує, що другий завантажувач треба записати в перший розділ:
# /sbin/gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 /dev/da1
bootcode written to da1

Створюємо файлову систему (далі ФС) UFS2, включаємо Soft Updates і журналирование:
# /sbin/newfs –U –O2 –j /dev/da1p2
Працювати з повністю зашифрованим диском набагато зручніше, ніж окремо з розділами. На даному етапі змонтуємо новостворену ФС на розділі і створимо ключ шифрування для всього диска:
# /sbin/mount /dev/da1p2 /mnt
# cd /mnt && /bin/mkdir keys && cd keys
# /bin/dd if=/dev/random of=da0.key bs=512 count=10

Шифруємо диск. Прапор -b активує запит пароля при початковій завантаженні до монтування кореневої файлової системи. Прапор -K визначає файл ключа, -e задає алгоритм шифрування, -l визначає довжину ключа, -s змінює розмір дешіфруемого сектора, що позитивно впливає на продуктивність при шифруванні / дешифровании.
До вибору алгоритму шифрування варто підходити з обережністю. Надійність - це чи не найголовніший критерій, за яким слід вибирати. Якщо алгоритм не зможе протистояти криптоанализу, то немає сенсу його використовувати. По можливості треба вибирати старі алгоритми, які випробувані часом, відкриті для криптоаналізу і перевірені мільйонами людей по всьому світу. Тільки так можна бути більш-менш впевненим, що в алгоритмі немає ніяких закладок і вразливостей - інакше можна наштовхнутися на security through obscurity.

FUI


Security through obscurity (рос. «Безпека через неясність») - принцип, використовуваний для забезпечення безпеки в різних сферах діяльності людини. Основна ідея - приховати внутрішній устрій системи або реалізацію для забезпечення безпеки. Чому це погано і чим це загрожує, докладніше дивись тут.

Не варто забувати, що від того, який алгоритм використовується, залежатиме швидкість дискової підсистеми. Про вплив шифрування на читання / запис можна почитати в незалежних дослідженнях.
# /sbin/geli init -b -K da0.key -e Camellia -l 256 -s 4096 /dev/da0
Enter new passphrase:
Reenter new passphrase:

Тепер, коли диск зашифрований, його можна розмічати, але спочатку його треба приєднати. Зверни увагу, що працювати ми будемо з da0.eli. Букви в кінці назви пристрою означають, що наш диск зашифровано за допомогою криптографічного підсистеми geli:
# /sbin/geli attach –k da0.key /dev/da0
Enter passphrase for da0:
# /sbin/gpart create –s gpt /dev/da0.eli
da0.eli created

Чому ми обрали саме geli, а не іншу криптосистему? Оскільки Geli - Нативне засіб шифрування, підвищується продуктивність і крипостійкість системи в цілому. Є маса переваг: прозорість роботи для кінцевого користувача, підтримка цілого ряду алгоритмів шифрування, можливість мати кілька ключів, завантаження з зашифрованого кореневого розділу, висока швидкість роботи за рахунок простого криптування сектор - сектор, підтримка одноразових ключів шифрування і багато іншого.

Створюємо розділ для кореневої файлової системи в 2 Гбайт. Вказуємо тип freebsd-ufs:
# /sbin/gpart add –t freebsd-ufs –l rootfs –s 2g /dev/da0.eli
da0.elip1 added

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

Якщо ти все-таки надумаєш скористатися цим варіантом, то у geli є чудова можливість зашифрувати розділ підкачки тимчасовим ключем. Про це можна почитати в керівництві по FreeBSD на офіційному сайті. Формула, за якою я розраховую розмір підкачки, дуже проста: SWAP> = RAM.
# /sbin/gpart add –t freebsd-swap –l swap –s 9g /dev/da0.eli
da0.elip2 added

Під / var віддамо 90 Гбайт місця:
# /sbin/gpart add –t freebsd-ufs –l varfs –s 90g da0.eli
da0.elip3 added

Під / tmp - 13 Гбайт, так як деякі програми при компіляції займають багато місця і можуть переповнити його. Це зробить неможливим подальше коректне функціонування ОС:
# /sbin/gpart add –t freebsd-ufs –l tmpfs –s 13g /dev/da0.eli
da0.elip4 added

Під / usr виділимо 60 Гбайт, а під / home - місце, що залишилося:
# /sbin/gpart add –t freebsd-ufs –l usrtfs –s 60g /dev/da0.eli
da0.elip5 added
# /sbin/gpart add –t freebsd-ufs –l homefs /dev/da0.eli
da0.elip6 added

Створюємо ФС на наших розділах, крім SWAP (da0.elip2):
# /sbin/newfs –O2 –U –j /dev/da0.elip1
# /sbin/newfs –O2 –U –j /dev/da0.elip3
# /sbin/newfs –O2 –U –j /dev/da0.elip4
# /sbin/newfs –O2 –U –j /dev/da0.elip5
# /sbin/newfs –O2 –U –j /dev/da0.elip6

Размонтіруем / dev / da1p2 і змонтуємо кореневу ФС в / mnt. Потім створимо точки монтування для решти розділів:
# cd && /sbin/umount /mnt
# /sbin/mount /dev/da0.elip1 /mnt
# cd /mnt && /bin/mkdir var && /bin/mkdir tmp && /bin/mkdir usr && /bin/mkdir home
# /sbin/mount /dev/da0.elip3 var
# /sbin/mount /dev/da0.elip4 tmp
# /sbin/mount /dev/da0.elip5 usr
# /sbin/mount /dev/da0.elip6 home

Тепер нам необхідно створити тимчасовий файл fstab для «правильної» установки FreeBSD:
# /usr/bin/vi /tmp/bsdinstall-tmp-fstab
/dev/da0.elip1 /mnt ufs rw 1 1
/dev/da0.elip3 /mnt/var ufs rw 1 1
/dev/da0.elip4 /mnt/tmp ufs rw 1 1
/dev/da0.elip5 /mnt/usr ufs rw 1 1
/dev/da0.elip6 /mnt/home ufs rw 1 1

Перевіряємо, що нічого не забули, виходимо з shell'а і чекаємо, коли завершиться установка:
# /sbin/gpart show
# /bin/df -h
# exit

Після інсталяції системи встановлюємо пароль суперкористувача. За бажанням налаштовуємо мережу, часовий пояс, додаємо користувачів. У меню Final Configuration вибираємо Exit => No => LiveCD. Логіном під root'ом, монтуємо пристрій, на який скопіюємо ядро ОС, і переміщаємо туди папку з ключами:
# /sbin/mount /dev/da1p2 /mnt/mnt/ && cd /mnt/mnt
# /bin/cp –R ../boot . && /bin/mv keys boot

Тепер, для того щоб ОС завантажилася, нам треба «розповісти» їй, що ж ми накоїли. Для цього необхідно відредагувати файл /boot/loader.conf:
# /usr/bin/vi boot/loader.conf
geom_eli_load=«YES»
vsf.root.mountfrom=«ufs:/dev/da0.elip1»
geli_da0_keyfile0_load=«YES»
geli_da0_keyfile0_type=«da0:geli_keyfile0»
geli_da0_keyfile0_name=«/boot/keys/da0.key0»
kern.geom.eli.threads=«4»
kern.geom.eli.batch=«1»

Перша строчка завантажує модуль crypto.ko, без якого ОС не зможе зрозуміти наш диск. Друга говорить, де знаходиться коренева ФС. Подальші три вказують, де лежить ключ шифрування, і пов'язують його з диском. Останні відносяться до тюнінгу підсистеми шифрування і необов'язкові. Вони відповідають за кількість процесів ядра, використовуваних для шифрування. Це дає приріст продуктивності в багатопроцесорних системах за рахунок групових операцій при шифруванні.

На останньому етапі треба упорядкувати файл / etc / fstab для вже встановленої системи:
# vi ../mnt/etc/fstab
/dev/da0.elip1 / ufs rw 1 1
/dev/da0.elip2 none swap sw 0 0
/dev/da0.elip3 /var ufs rw 1 1
/dev/da0.elip4 /tmp ufs rw 1 1
/dev/da0.elip5 /usr ufs rw 1 1
/dev/da0.elip6 /home ufs rw 1 1

Post-install

Тепер перезавантажуємося і виставляємо в BIOS завантаження з нашого USB-пристрої, де лежить ядро. При монтуванні кореневої ФС буде запрошені парольний фраза. Після введення пральний фрази монтується файлова система root. Якщо раптом вилізли якісь помилки або ти щось забув - не панікуйте. Можна завантажитися з інсталяційного диска або флешки, перейти в режим Live CD і виправити помилки.

Якщо у тебе Linux або Windows, чи означає це, що ти не зможеш скористатися засобами шифрування? зовсім немає. Для них є свої рішення. Наприклад, в Linux існує система шифрування LUKS / dm-crypt, на основі підсистеми шифрування ядра, яка дозволяє мати кілька паролів на один розділ і отримувати доступ до зашифрованих дискам з Windows за допомогою FreeOTFE. Управління криптосистемою проводиться за допомогою утиліти cryptsetup. Ще один варіант, loop-AES являє собою модифікацію стандартного драйвера loop.ko, який дозволяє проводити шифрування на льоту.

Для Windows існує EFS - компонент ОС, що дозволяє зберігати інформацію на жорсткому диску в зашифрованому вигляді. BitLocker дозволяє зашифрувати повністю диск, а не окремі файли і папки, як це робить EFS. Є безліч сторонніх комерційних і некомерційних продуктів під ці та інші ОС: PGP, GnuPG, VeraCrypt (форк TrueCrypt), DiskCryptor, Challenger і так далі. Багато хто з цих продуктів доступні в FreeBSD і можуть використовуватися спільно.

Loading Completed

На закінчення хочеться відзначити: навіть якщо USB-пристрій буде вкрадене або загублено, без пральний фрази зловмисник не зможе отримати доступ до даних. Без флешки і пароля жорсткий диск для нього буде простим шматком металу. І як написано в handbook, «Незалежно від того, як атакуючий заволодів жорстким диском або вимкненим комп'ютером, криптографічний підсистема geli FreeBSD може захистити дані файлової системи комп'ютера навіть проти дуже зацікавленою атакуючої сторони з достатніми ресурсами».

Також не варто забувати, що шифрування істотно сповільнює дискову підсистему, і, можливо, кожен читач сам для себе вибере алгоритм шифрування, довжину ключа, кількість спроб введення пральний фрази, читання ключа з файлу по частинах та інше. Для досвідчених параноїків можна додати перевірку цілісності даних HMAC-SHA і зашифрувати SWAP тимчасовим ключем вже на зашифрованому диску :).

Не варто забувати про різні атаках на криптографічні алгоритми. Наприклад, від однієї з них - атаки на повторення - geli захистити не може. Про це та про багато іншого розказано в man geli (8). Те, що ніяка криптографія не зможе врятувати від людського фактора - доведений факт. Одна маленька помилка, і всі твої зусилля підуть коту під хвіст. Будь пильний і пам'ятай: ідеального захисту не існує.


За матеріалами Хакер

Можливо вас зацікавлять подібні статті:

Коментарі

Немає коментарів до цієї статті.

Коментувати

Поля позначені як * потрібні обов'язково. Перед постінгом завжди робіть перегляд свого коментаря.