NILFS2 - куленепробивна файлова система для /home

NILFS2 - куленепробивна файлова система для /home

Як відомо, якщо неприємність може статися, вона обов'язково відбудеться. Напевно, у кожного були випадки, коли випадково був стертий свіжий важливий файл, або випадково було виділено та знищено текст у текстовому редакторі.

Якщо ви - хостер або власник сайту, то, напевно, стикалися зі зломами облікових записів користувача або свого сайту. У таких випадках важливо відновити хронологію, знайти спосіб проникнення та вразливість, яку використовував зловмисник.

Для вирішення подібних проблем чудово підійде файлова система NILFS2.

Вона є в ядрі Linux, починаючи з версії 2.6.30.

Особливістю даної файлової системи є те, що вона подібна до системи контролю версій: ви завжди можете відкотити стан системи назад і подивитися на те, якою вона була деякий час тому.

Для забезпечення цього функціоналу вам не потрібно налаштовувати Cron-скрипти, робити снепшоти тощо. Файлова система NILFS2 робить це сама. Вона ніколи не переписує старі дані і завжди пише в новій області диска, якщо достатньо вільного дискового простору. У повній відповідності до принципу Copy-on-Write.

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

Історія

NILFS2 - куленепробивна файлова система для /homeNILFS2 була розроблена в надрах Nippon Telegraph and Telephone Corporation, фактично, державною (воно має контрольний пакет) та найбільшою телекомунікаційною компанією Японії. А конкретніше у лабораторії CyberSpace Laboratories під керівництвом Ryusuke Konishi.

Для чого конкрентно вона розроблялася — невідомо, однак, можна припустити, що подібна ФС, з її функціоналом “машини часу” ідеальна для зберігання даних, у яких може виникнути бажання поколупатися спецслужбам, щоб повторно програти всю картину СМС, емейлів тощо.

NILFS2 також, потенційно, дуже цінний інструмент для служб внутрішньої безпеки, оскільки дозволяє відновити всі віддалені листи в поштовій базі даних, розкрити косяки співробітників, які згодом можуть спробувати їх замаскувати, вилучивши або змінивши свої файли.

Як можна відстежити всю історію листуванняУ Linux на серверах (а саме туди і варто ставити NILFS2 для цілей внутрішньої безпеки) для зберігання поштових повідомлень часто-густо використовується файловий спосіб зберігання е-мейлів. Так званий формат Maildir. Достатньо поставити Кур'єрський поштовий сервер та налаштувати зберігання листів у Maildir. Інший формат mbox представляє собою великий текстовий файл, який легко парситься на окремі повідомлення.

Якщо поштовий сервер використовує базу даних, то NILFS2 дасть можливість відновити точний хронометраж змін бази та можливість відновити базу на будь-який з цих моментів. А далі потрібно скористатися інструментами БД, щоб подивитися, що в ній було на той момент часу.

Однак щось пішло не так. Чи то уряд Японії передумав за всіма стежити (а-ля принцип Яровий), чи продуктивність NILFS2 на традиційних HDD виявилася нижчою за плінтус, і NILFS2 була випущена під GPL ліцензією і дуже швидко увійшла в ядро ​​Linux, оскільки особливих претензій до коду, написаного висококваліфікованими японцями, розробники ядра Linux не мали.

На що схожа NILFS2?

З погляду використання: на систему контролю версій SVN. Кожен чекпоінт ФС — це коміт, який робиться автоматично без відома користувача при будь-якій зміні: видалення, зміна вмісту файлу або прав доступу. Кожен коміт має номер, що лінійно збільшується.

З погляду програміста: на циклічний буфер. Файлова система накопичує зміни і записує їх у шматок рівний приблизно 8 МБ (2000 * 4096, де 2000 - кількість елементів у блоці, а 4096 - розмір сторінки пам'яті). Весь диск поділено на такі чанки. Запис йде послідовно. Коли закінчується вільне місце, найстаріші знімки видаляються, а чанки перезаписуються.

Основні плюшки NILFS2

  • Версійність!
  • Процедура відновлення ФС після збою елементарна: при завантаженні шукається останній чанк, що має вірну контрольну суму, і на нього встановлюється суперблок. Це майже миттєва операція.
  • У зв'язку з тим, що запис завжди йде лінійно, то:
    • може показувати хороші результати під час роботи на SSD, з повільним випадковим записом.
    • NILFS2 заощаджує ресурс SSD, тому що майже відсутній фактор мультиплікації запису.
      Точніше, він трохи більше 2.Справа в тому, що при циклічному перезаписі всього диска NILFS2 буде переносити незмінні дані в нові шматки (чанки).

      Якщо маємо на диску 10% незмінних даних, ми отримаємо 10% приріст записи при 1 повної перезапису. Та й 50% приріст при 50% заповненості пристрою на 1 повний перезапис диска.

      Максимальний коефіцієнт посилення записи 2. Це обмаль з урахуванням те, що пишеться послідовно. Загалом мультиплікація запису буде меншою, ніж у звичайної фрагментованої ФС із сектором 4096 байт. (На думці наведено коментом).

  • Потенційна простота реалізації реплікації на віддалену NILFS2 ФС

NILFS2 для /home

У Unix-подібних ОС, як правило, є папка /home, в якій зберігаються дані користувачів. Різні програми зберігають у цій папці свої налаштування, що стосуються конкретного користувача.

А хто, як не користувачі, найчастіше косить? Тому, як кажуть, сам Бог велів використовувати на /home NILFS2.

Тим більше, що з повсюдним розповсюдженням SSD ми тепер можемо не хвилюватися щодо сильної просідання при використанні файлових систем CoW.

Так, знімки ФС (снепшоти) ми можемо скільки завгодно часто створювати і в ZFS і BTRFS, але завжди є ризик, що втрачена зміна файлу виявиться між знімками. І знімки ще потрібно адмініструвати: видаляти старі. У NILFS2 це відбувається автоматично, буквально кожні кілька секунд.

Я створив логічний том за допомогою lvcreate (у групі томів nvme, тонкий пул thin). Я рекомендую створювати саме на томі lvm, тому що надалі він може бути легко розширений. Рекомендую мати 50% вільного місця на диску NILFS2 для пристойної глибини версійності.

lvcreate -V10G -T nvme/thin -n home

і відформатував його в NILFS2:

mkfs.nilfs2 -L nvme_home /dev/nvme/home

mkfs.nilfs2 (nilfs-utils 2.1.5)
Start writing file system initial data to the device
      Blocksize:4096  Device:/dev/nvme/home1  Device Size:10737418240
File system initialization succeeded !!

Після цього необхідно скопіювати всі дані з поточного /home.

Я це зробив відразу після завантаження комп'ютера, до входу до свого облікового запису, з-під користувача root. Якби я зайшов під своїм користувачем, то якісь програми відкрили б сокети та файли у папці мого користувача /home/user, що зробило б чисте копіювання скрутним. Як відомо, домашня папка для користувача root зазвичай знаходиться шляхом /root, тому на розділі /home ніякі файли не відкриються.

mkdir /mnt/newhome
mount -t nilfs2 /dev/nvme/home /mnt/newhome
cp -a /home/. /mnt/newhome

З приводу останнього рядка див. статтю.

Далі керуємо /etc/fstab, в якій монтується файлова система для /home, на

/dev/disk/by-label/nvme_home /home nilfs2    noatime 0 0

Опція noatime потрібна підвищення продуктивності, щоб у кожному зверненні до файлів не змінювалося atime. Далі перезавантажуємось.

Види знімків у NILFS2.

Звичайний знімок без імунітету видалення називається чекпоінт (checkpoint або точка відновлення).
Знімок із захистом від автовидалення називається снепшот (snapshot), далі просто знімок.

Перегляд чекпойтів робиться за допомогою команди lscp

Перегляд знімків (снепшотів) lscp -s

Ми можемо і самі створювати знімки та чекпоїти у будь-який момент за допомогою:

mkcp [-s] устройство

Відновлюємо дані.

NILFS дозволяє нам монтувати скільки завгодно старих знімків паралельно із роботою з основною гілкою ФС. Але тільки в режимі читання.

Влаштовано так. Звичайні чекпоїнти, які робить NILFS2, можуть бути автоматично видалені в будь-який момент (коли закінчиться дисковий простір або за правилами nilfs_cleanerd), тому перед монтажем ми повинні перевести чекпоінт в снепшот або, російською мовою, зафіксувати знімок.

chcp ss номер_чекпоинта

Після цього ми можемо примонтувати знімок, наприклад, так:

mount -t nilfs2 -r -o cp=номер_чекпоинта /dev/nvme/home /mnt/nilfs/номер_чекпоинта

Після чого ми копіюємо файли, що відновлюються, зі знімка в /home.
А згодом знімаємо прапор невдалості зі знімка, щоб у майбутньому автоматичний збирач сміття міг видалити застарілі дані:

chcp cp номер_чекпоинта

Утиліти для NILFS2

А ось із цим біда. Так, звичайно, ми можемо створювати ФС, змінювати її розмір он-лайн, переглядати список чейпоінтів, робити та видаляти їх. Пакет nilfs2-utils надає мінімальний джентльменський набір.

Оскільки NTT згорнула фінансування, немає швидких низькорівневих утиліт, які дозволяють виводити історію змін файлів, робити diff між знімками.

Моя утиліта n2u

Щоб заповнити цей вакуум, я написав свою утиліту n2uяка вміє виводити історію змін конкретного файлу/директорії:

n2u log filename

Висновок приблизно такий:

          CHECKPOINT        DATE     TIME     TYPE          SIZE  MODE
             1787552  2019-11-24 22:08:00    first          7079    cp
             1792659  2019-11-25 23:09:05  changed          7081    cp

Вона працює досить швидко для обраного способу реалізації: шукає різницю між файлами методом бісекції, швидко монтуючи і порівнюючи файл/директорію в різних знімках.

Можна встановити діапазон чекпоінтів за допомогою ключа -cp CP1:CP2 або -cp {YEAR-MM-DD}:{YEAR-MM-DD}.

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

n2u diff -r cp1:cp2 filename

Можна вивести всю хронологію змін: всі різниці між чекпоінтами певного файлу/директорії:

n2u blame [-r cp1:cp2] filename

Інтервал дат у цій команді також підтримується.

Клич до розробників

На Хабре багато спеців. Прошу, допиляйте NILFS2. Зробіть реплікацію, низькорівневий швидкий diff між ревізіями, reflink та інші плюшки!

Посилання

Офіційний сайт NILFS.

Репозиторії:
NILFS2.
NILFS2 утиліти та модулі.

Розсилки:
Е-мейл розсилка розробників NILFS2. Ідентифікатор підписки linux-nilfs.
Архів розсилки.

Посібник з налаштування nilfs_cleanerd.
Порівняльні тести продуктивності EXT4, Btrfs, XFS & NILFS2.

Подяки:

  • Розробникам NILFS2: Ryusuke Konishi, Koji Sato, Naruhiko Kamimura, Seiji Kihara, Yoshiji Amagai, Hisashi Hifumi та Satoshi Moriai. Другими великими contributors є: Andreas Rohner, Dan McGee, David Arendt, David Smid, dexen deVries, Dmitry Smirnov, Eric Sandeen, Jiro SEKIBA, Matteo Frigo, Hitoshi Mitake, Takashi Iwai, Vyacheslav Dubeyko.
  • Компаніям Amblin Entertainment та Universal Pictures за чудову серію фільмів "Назад у майбутнє". Перша картинка посту взята з фільму "Назад у майбутнє - 3".
  • Компанії РУВДС за підтримку та можливість публікації у своєму блозі на Хабрі.

PS Помічені помилки спрямовуйте у особу. Підвищую за це карму.

Ви можете поекспериментувати з NILFS2, замовивши віртуальну машину РУВДС по купону нижче. Для всіх нових клієнтів безкоштовний тестовий період 3 дні.

NILFS2 - куленепробивна файлова система для /home

Джерело: habr.com

Додати коментар або відгук