Криптография–наукаошифрах–оченьглубокая, требующаяизучения, тема, историякоторойнасчитываетболеечетырехтысячлет. Этоодинизосновныхинструментов, использующихсяпризащитеинформации. СпецслужбыбывшегоСоветскогоСоюза, США, Францииидругихстранвкладывалиогромныесредствавразработкукриптостойкихалгоритмовдлясвоихинформационныхканалов, параллельнопытаясьвскрыватьчужие. Сегодняэтимитехнологиямимыпользуемсякаждыйдень, даженезадумываясьобэтом.
Причинзашифроватьинформациюможетбытьнесколько. Кпримеру, увасестьлюбогородасекретнаяинформация, котораянивкоемслучаенедолжнапопастьккому-токонкретно, аможетвыпростохотитеоградитьсвоюличнуюжизньотчужихглаз. Мытеряемнетбукиилифлешки, ананих, какправило, конфиденциальнаяинформаця. Простополомканосителяэтоужепечально, нонамногохуже, когданашаинформацияпопадаетвчужиеруки. Можнолишьдогадыватьсякакбудетиспользованнаэтаинформация, инадеяться, чтоонанебудетиспользованнанамвовред.
Вэтомпостеярасскажуометодешифрованияфайловыхсистем (ФС) в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, носоздатьихвсежеполучилось, итасистемаработаетдосихпор
