Quantcast
Channel: openSUSE Planet - Global
Viewing all articles
Browse latest Browse all 23308

Alexander Naumov: openSUSE 13.1 :: Encrypted File Systems

$
0
0

Криптография–наукаошифрах–оченьглубокая, требующаяизучения, тема, историякоторойнасчитываетболеечетырехтысячлет. Этоодинизосновныхинструментов, использующихсяпризащитеинформации. СпецслужбыбывшегоСоветскогоСоюза, США, Францииидругихстранвкладывалиогромныесредствавразработкукриптостойкихалгоритмовдлясвоихинформационныхканалов, параллельнопытаясьвскрыватьчужие. Сегодняэтимитехнологиямимыпользуемсякаждыйдень, даженезадумываясьобэтом.
Причинзашифроватьинформациюможетбытьнесколько. Кпримеру, увасестьлюбогородасекретнаяинформация, котораянивкоемслучаенедолжнапопастьккому-токонкретно, аможетвыпростохотитеоградитьсвоюличнуюжизньотчужихглаз. Мытеряемнетбукиилифлешки, ананих, какправило, конфиденциальнаяинформаця. Простополомканосителяэтоужепечально, нонамногохуже, когданашаинформацияпопадаетвчужиеруки. Можнолишьдогадыватьсякакбудетиспользованнаэтаинформация, инадеяться, чтоонанебудетиспользованнанамвовред.
Вэтомпостеярасскажуометодешифрованияфайловыхсистем (ФС) вopenSUSE 13.1-m3, котораясобрананаосновепоследнейнаданныймомент stable-версииядра– 3.10.0.

LUKS & cryptsetup

Спектрреализаций, обеспечивающихшифрованиеданныхдля GNU/Linux, оченьширок. Всеонипредназначенныдляразныхзадач, поддерживаютразныепротоколыистандарты. ДляшифрованияФСв openSUSE используется LUKS (реализацияшифрованияблочногоустройствачерезмодульядраdm-crypt (CONFIG_DM_CRYPT)) вкупесутилитойcryptsetup, котораяпозволяетсоздаватьвиртуальноеустройство, запрашиваяпарольнуюфразу (passphrase). Парольнаяфразапреобразуетсявключ, которыйнехранитсянаустройствеииспользуетсядлядешифровки.

> cat /etc/SuSE-release
openSUSE 13.1 Milestone 3 (i586)
VERSION = 13.1
CODENAME = Bottle> rpm -q cryptsetup
cryptsetup-1.6.1-1.2.i586
# modinfo dm_crypt
filename:       /lib/modules/3.10.0-2.gc5ad3f9-desktop/kernel/drivers/md/dm-crypt.ko
license:        GPL
description:    device-mapper target for transparent encryption / decryption
author:         Christophe Saout 
srcversion:     74A4BECADF48FF808AE451F
depends:        dm-mod
intree:         Y
vermagic:       3.10.0-2.gc5ad3f9-desktop SMP preempt mod_unload modversions 686

Краткоеописаниетехническойчасти (спецификаций) можнонайтивдокументеLUKS on-disk-specification.

Янапомню, чтопоследешифровкиинформациянаФСабсолютнооткрыта. Другимисловами, использованиеэтойтехнологиинеспасет, например, присетевойатакенавашсервер, номожетбытьполезнойпришифрованииФСнафлешкеилинетбуке.

Flash drive

Давайтеначнемсчего-нибудьбанального, счеммыработаемкаждыйдень. Напримерс USB флешки. ЗатемрассмотримслучайшифрованиявсейФСвовремяустановкиОС. Итак, пускайустройствоназывается /dev/sdb. Создаем:

# cryptsetup luksFormat /dev/sdb
WARNING!
========
This will overwrite data on /dev/sdb irrevocably.
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:

Темсамыммысоздали LUKS-контенер:

# mount /dev/sdb /mnt/usb/
mount: unknown filesystem type 'crypto_LUKS'

Длядальнейшейработысэтимустройствомнампонадобится cryptsetup. Именночерезнего (аконкретней– черезмодульядра dm-crypt) будетпротекатьинформационныйобмен. Работатьстакимустройствомможеттолько root:

> /sbin/cryptsetup luksOpen /dev/sdb usb
WARNING!!! Possibly insecure memory. Are you root?
Cannot open device /dev/sdb for read-only access.
# cryptsetup luksOpen /dev/sdb usb
Enter passphrase for /dev/sdb:
# l /dev/mapper/usb
lrwxrwxrwx 1 root root 7 Jul 19 22:47 /dev/mapper/usb -> ../dm-0

Вомзможновыработалис LVM, исразужеузнали/dev/mapper/-устройство, темнеменее, к LVM этоникакогоотношениянеимеет. Подсистемаядра, черезкоторуюработаетdm-crypt, используеттужеинфраструктуру/интерфейсвнутриядра (тотжедрайвер).
Форматируемнаш LUKS-контенер:

# mkfs.ext4 /dev/mapper/usb
mke2fs 1.42.8 (20-Jun-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
244320 inodes, 976761 blocks
48838 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1002438656
30 block groups
32768 blocks per group, 32768 fragments per group
8144 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

Инаконецподключаем/монтируемего:

# mount /dev/mapper/usb /mnt/usb/
# mount | grep mapper
/dev/mapper/usb on /mnt/usb type ext4 (rw,relatime,data=ordered)

Теперьмыможемработатьснейкакисобычнойфлешкой. Незабудьтетолько, чтохотьпослевызоваumountмыиудалимточкумонтирования, интерфейс /dev/mapper дляэтогоустройствавсежеостаетсяактивным:

# umount /dev/mapper/usb
# mount | grep mapper
# ll /dev/mapper/usb 
lrwxrwxrwx 1 root root 7 Jul 22 00:00 /dev/mapper/usb -> ../dm-0
# dmsetup -v ls
usb     (253:0)
# dmsetup -v info
Name:              usb
State:             ACTIVE
Read Ahead:        256
Tables present:    LIVE
Open count:        0
Event number:      0
Major, minor:      253, 0
Number of targets: 1
UUID: CRYPT-LUKS1-4743a0a4c40c41b7a9c7a4dac878682e-usb
# cryptsetup luksClose usb
# dmsetup -v ls
No devices found

LVM

ТеперьсамоевремяпоговоритьобиспользованииLVMповерх LUKS дляшифрованияразделоввовремяустановки openSUSE. Тутнасждетодиннеисправленный bug, которыйможетсмутитьновичка. Багтянетсяизверсиивверсиюуженапротяжениинаверное 3хлет:)Этонекрэш, этопростоблокировка YaST’анапродолжениепроцессаустановки. YaST такзапрограммирован, чтонепозволяетшифроватьФСсточкамимонтирования/, /usr, /bootи/var (мысейчасговоримо LVM). Насамомделе, нельзяшифроватьтолько/boot. Впротивномслучаемыполучимпроблему“курицыияйца”. Именнотамнаходитсяобразядра, накоторыйпередаетуправление GRUB, иккоторомуунасдолженбытьдоступ. Неимеядоступакобразуядра, аследовательноикмодулю dm-crypt, мынесможемдешифроватьостальнуючастьФС…
Дляэтогопридетсяприбегнутькмаленькомухаку: вовремяустановки, послевыборараскладкиклавиатурыиязыкасистемы, перейтинадругуюконсольисоздатьвручнуюсначалазашифрованный LVM-контенер, азатемипарутомоввнутринего.

Итак, припомощи fdisk создаемкакминимум 2 раздела: обычныйпервичныйраздел/bootразмеромгде-товпарусотенметров (егомыоставимнезашифрованным), ивторойразделнастолькобольшой, насколькохотите (другиеОСнатомжедиске?), накоторомразместимнаш LVM.
Кстати, те, кторешилзашифроватьтолько/home, помните, чтово-первыхкускифайловмогутбытьвытянутыизswap, аво-вторыхвременныефайлыполностьюсохраняютсяв/tmp.

Итак, работаемсвторымразделом, создаем LUKS-контейнер:

# cryptsetup luksFormat /dev/sda2
# cryptsetup luksOpen /dev/sda2 root

Послеэтогосоздаемлогическиетомавнутризашифрованного LUKS-конейнера. Естественноразмерыбудутукаждогосвои, даиколичествотомоввыможетесоздатьбольше.

# pvcreate /dev/mapper/root
# vgcreate system /dev/mapper/root
# lvcreate -L 2G -n swap system
# lvcreate -L 100G -n root system

Авоттут, уважаемыемоичитатели, самоевремявспомнить, чтоработаеммывтестовой milestone версии. ;)
Втораякомандауменязаканчиваетсясостатусом (return code) 5. Начасахбезпятичетыреутра, понедельник. Этозначит, чтомыещеуспеемотправить bugreport доначаларабочегодняиобрадоватьребятиз QA :)
Проделываемнавсякийслучайвесьпроцессещераз. Получилосьвоспроизвестиещераз? Да.
Подключаемфлешку, монтируемикопируемтудавыводstraceкоманды-виновницы:

# strace -o aaa vgcreate system /dev/mapper/root

Этотфайлприкрепляемктолькочтосозданномурепорту. Кстати, этотолькоуменяпочтивсегдапослеотправкирепортапоявляютсяидеиотом, чтоянесообщил, иличтосформулировалнеоченьчисто? :)

Итог

Параметрыдоступныхалгоритмовиметодовшифрованияихешированияможнопосмотретьв/proc/crypto. Этооченькриптостойкиеалгоритмы!
Да, покаполучается (дляпользователей openSUSE), чтозашифроватьмыможемтольконезагружаемыйразделнадиске. Последнийразясоздавал LUKS/LVM в openSUSE 12.1 (релиз), итогдатожеприходилосьпереключатьсявконсольисоздаватьвсеразделывручнуюиз-заблокировки YaST, носоздатьихвсежеполучилось, итасистемаработаетдосихпор:)



Viewing all articles
Browse latest Browse all 23308


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>