Створюємо зашифрований контейнер у Linux штатними засобами

6 травня 2023 1 хвилина Автор: Cyber Witcher

Технологія для шифрування образів контейнерів

За останні кілька років у хмарній індустрії відбулося серйозне зрушення від розгортання монолітних застосунків на віртуальних машинах до поділу застосунків на дрібніші компоненти (мікросервіси) та їхнього пакування в контейнери. Популярність контейнеризації сьогодні багато в чому зумовлена роботою Docker. Docker – це компанія, яка стала головною рушійною силою контейнерів: вона надала простий у використанні інструмент для створення та запуску контейнерів Docker і реєстр контейнерів Docker для вирішення завдання їх розподілу. Успіх технології контейнеризації в основному залежить від безпеки контейнерів на різних етапах їхнього життєвого циклу. Одна з проблем безпеки – наявність вразливостей всередині окремих контейнерів. Для їх виявлення пайплайни DevOps, які використовуються для створення контейнерів, доповнюють сканерами, що шукають у контейнерах пакети з можливими вразливостями та попереджають їхніх власників або технічних фахівців у разі їх виявлення.

Vulnerability Advisor в IBM Cloud є прикладом такої утиліти. У цій статті розглядається все ще актуальна проблема безпеки підприємств щодо конфіденційності даних і коду в образах контейнерів. Основна мета безпеки під час роботи з образами контейнерів – дозволити створювати та розповсюджувати зашифровані образи контейнерів, щоб зробити їх доступними лише певному колу одержувачів. У цьому випадку інші можуть мати доступ до цих образів, але вони не зможуть запускати їх або бачити конфіденційні дані всередині них. Шифрування контейнерів ґрунтується на наявній криптографії, такій як технології шифрування Рівеста-Шаміра-Адлемана (RSA), еліптичної кривої та Advanced Encryption Standard (AES), також відомого як Rijndael, – симетричний алгоритм блочного шифрування.

Утиліти, які вже існують у Linux “з коробки” або на рівні ядра

DD (dataset definition) – утиліта UNIX, слугує для копіювання, конвертації файлів, а так само – читання даних. Назва успадкована від оператора DD (Dataset Definition) з мови JCL. Крім усього іншого, ця утиліта дає змогу скопіювати регіони з файлів “сирих” пристроїв, наприклад, зробити резервну копію завантажувального сектору жорсткого диска, або прочитати фіксовані блоки даних зі спеціальних файлів, таких, як /dev/zero або /dev/random.

Cryptsetup – утиліта для налаштування віртуальних блокових пристроїв під керуванням служб ядра “device mapper” (dm) і dm-crypt. Підтримуються віртуальні томи форматів “plain dm-crypt” і LUKS. Формат LUKS більш функціональний, ніж “plain dm-crypt”, завдяки наявності спеціального блоку метаданих.

Ці дві утиліти присутні в більшості дистрибутивів спочатку. Тепер, коли стало зрозуміло що це за утиліти і які функції вони виконують, то перейдемо до створення контейнера. Для початку нам потрібно створити ключовий файл, яким ми будемо розблоковувати контейнер щоразу:

Параметри команд

  • if – вказує на джерело, тобто на те, звідки копіюємо. Вказується файл, який може бути як звичайним файлом, так і файлом пристрою. У цьому випадку – це /dev/random, пристрій випадкових чисел.

  • of – це файл призначення або шлях до файлу. У цьому випадку це створюваний файл enigma. Ви можете назвати його як вам завгодно.

  • bs – кількість байт, які будуть записані за раз. У цьому випадку ми створюємо файл завдовжки 4096 байт.

  • count – число, яке вказує, скільки шматків буде скопійовано.

Простіше кажучи, утиліта dd створює нам файл-ключ під назвою enigma розміром 4096 байт. Вам треба буде зберігати цей файл як зіницю ока, інакше якщо ви його загубите, то контейнер не можна буде розблокувати, відповідно, і всі дані, що зберігаються в ньому, стануть недоступні.

Тепер перейдемо до створення файлу самого контейнера за допомогою все тієї ж утиліти dd:

Тут уже все зрозуміло, крім останнього параметра seek. Він вказує якраз розмір створюваного контейнера. Якщо коротко, то утиліта dd створить файл mystery.mp3 у домашній папці розміром 2 ГБ і перезапише його нулями. Я спеціально створив файл контейнера у форматі .mp3. Хоч слабке, але маскування. Він, звичайно, програватися не буде, але його можна помістити в директорію з купою музичних файлів, що хоч якось ускладнить його виявлення.

Наступним кроком нам треба зашифрувати створений контейнер за допомогою утиліти cryptsetup:

Тут ми шифруємо контейнер алгоритмом aes-xts-plain64, на що вказує параметр -c (cipher), він кращий для контейнерів LUKS і використовується за замовчуванням. Усі підтримувані ядром алгоритми і модулі можна подивитися за допомогою команди:

Параметр -s вказує розмір ключа, що дорівнює 512 бітам. Параметр -h (hash) вказує хеш-функцію (алгоритм), в даному випадку це sha512. Параметр -i (iter-time) вказує скільки мілісекунд витратити на обробку. Параметр –use-random luksFormat відформатує контейнер за допомогою випадкових чисел, що генеруються пристроєм /dev/random.

У разі вдалого виконання команди вам буде показано таке:

При запитанні Are you sure? (Type uppercase yes) вам треба буде ввести великими літерами YES, після чого продовжиться шифрування. Тепер, щоб розблокувати контейнер, вам треба ввести команду:

SECRET – це точка зіставлення, яка використовується для відображення та монтування пристроїв і томів. Ви можете дати їй будь-яку назву. Тепер нам треба відформатувати розблокований контейнер у файлову систему. У дистрибутивах Linux кращим і використовуваним за замовчуванням є формат ext4. Для форматування використовується команда mkfs:

На що отримаєте висновок:

Файл відкритого пристрою зазвичай розташований в /dev/mapper/ім’я. При цьому можна виконувати різні дії, зокрема форматування. Створимо каталог у домашній папці, куди ми будемо монтувати контейнер, наприклад:

Тепер змонтуємо контейнер у цей каталог:

 Бачите, контейнер з’явився в списку пристроїв файлового менеджера і якраз за вказаним шляхом:

Тепер дамо права на використання файлів у контейнері:

Якщо цього не зробити, то всі дії з файлами можна буде здійснювати тільки з правами root. Щоб розмонтувати контейнер, необхідно виконати команду:

 Щоб заблокувати контейнер, виконайте команду:

Можна це зробити однією командою:

Все, наступного разу, коли вам потрібно буде розблокувати контейнер і змонтувати його в каталог, просто наберіть дві команди:

та:

 За SIM відкланяюся. Як бачите, створити зашифрований контейнер можна штатними утилітами Linux, не вдаючись до встановлення сторонніх програм.

Інші статті по темі
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.