Здравствуйте. Решил написать серию статей по криптованию. Что такое криптование, и какие есть шифры, алгоритмы и т.п. рассказывать не буду, так как есть море литературы, из которой можно почерпнуть все, что интересует по данному вопросу. Я буду использовать систему криптования dm-crypt, для управления которой используется утилита cryptsetup в которой есть встроенная поддержка LUKS для криптования операционных систем семейства Linux. В данном случаи это будут самые распространенные ОС – семейство deb (Ubuntu, Debian) и семейство rpm (Centos, Red Hat).
Начнем с самого простого метода – шифрование при установке ОС. Все действия я проделал на VMware workstation. Для начала возьмем Ubuntu 12.04 server. Процесс установки – стандартный, пока не дойдем до разметки диска. Где нам нужно выбрать Guided – use entire disk and set up encrypted LVM.
Далее Вас попросят записать все изменения на диск (жмем YES) и предложат ввести пароль шифрования. На данном этапе можно ввести любой пароль, так как в дальнейшем его можно очень просто поменять.
Далее все идет по старинке.
После перезагрузки нас попросят ввести пароль для разлочки диска с файловой системой.
После введения пароля cryptsetup расшифрует зашифрованный диск и смонтирует его в рутовую файловую систему. Теперь можно войти в систему и посмотреть на смонтированные диски.
root@ubuntu:~# df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/ubuntu-root ext4 19G 1.3G 17G 7% / udev devtmpfs 484M 4.0K 484M 1% /dev tmpfs tmpfs 198M 312K 198M 1% /run none tmpfs 5.0M 0 5.0M 0% /run/lock none tmpfs 495M 0 495M 0% /run/shm /dev/sda1 ext2 228M 28M 189M 13% /boot
Из вывода не понять – зашифровано диск или нет… Для этого мы можем посмотреть заголовок диска.
root@ubuntu:~# ls -l /dev/disk/by-uuid/ total 0 lrwxrwxrwx 1 root root 10 Sep 9 08:44 2601e28d-a376-4e0c-86ca-0b0366db8b03 -> ../../dm-1 lrwxrwxrwx 1 root root 10 Sep 9 08:44 a8f47a3a-295c-4943-9612-b0ae18faa44c -> ../../sda5 lrwxrwxrwx 1 root root 10 Sep 9 08:44 ac168f69-bbad-4918-828e-9dbc45b12f11 -> ../../dm-2 lrwxrwxrwx 1 root root 10 Sep 9 08:44 dd05faae-0144-4454-8aef-175f3f362126 -> ../../sda1 root@ubuntu:~# hexdump -C /dev/sda5 | head 00000000 4c 55 4b 53 ba be 00 01 61 65 73 00 00 00 00 00 |LUKS....aes.....| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000020 00 00 00 00 00 00 00 00 63 62 63 2d 65 73 73 69 |........cbc-essi| 00000030 76 3a 73 68 61 32 35 36 00 00 00 00 00 00 00 00 |v:sha256........| 00000040 00 00 00 00 00 00 00 00 73 68 61 31 00 00 00 00 |........sha1....| 00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000060 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 20 |............... | 00000070 4a 42 ae 10 94 9d 98 40 b7 47 0e 93 d1 7d 12 54 |JB.....@.G...}.T| 00000080 28 f2 a8 19 f9 d5 02 17 6f a6 75 8c 2a bf d5 5c |(.......o.u.*..\| 00000090 c5 71 76 42 0f 13 76 5f 52 24 14 77 05 ca ef 19 |.qvB..v_R$.w....|
Как видно, диск зашифровано алгоритмом AES + cbc-essiv + sha256.
Точно такие же шаги нужно сделать для шифрования ОС семейства rpm (Centos, Red Hat). Хочу заметить, в Linux можно шифровать блочные устройства из-за существования initramfs – файловой системы, которая монтируется до того, как смонтируется рутовая файловая система. Об этом пойдет речь в следующей статье. А пока можно поэкспериментировать.
Посмотрим, сколько слотов ключей используется на данный момент для зашифрованного диска.
root@ubuntu:~# cryptsetup luksDump /dev/sda5 LUKS header information for /dev/sda5 Version: 1 Cipher name: aes Cipher mode: cbc-essiv:sha256 Hash spec: sha1 Payload offset: 4096 MK bits: 256 MK digest: 4a 42 ae 10 94 9d 98 40 b7 47 0e 93 d1 7d 12 54 28 f2 a8 19 MK salt: f9 d5 02 17 6f a6 75 8c 2a bf d5 5c c5 71 76 42 0f 13 76 5f 52 24 14 77 05 ca ef 19 13 4d eb 8f MK iterations: 35125 UUID: a8f47a3a-295c-4943-9612-b0ae18faa44c Key Slot 0: ENABLED Iterations: 140979 Salt: b6 be 7b 49 9b ea 61 78 ed 6b c2 9f 2b 3b 8f ad 18 e0 a5 cb 94 50 96 12 e9 5c 6c 3b bc c3 30 8a Key material offset: 8 AF stripes: 4000 Key Slot 1: DISABLED Key Slot 2: DISABLED Key Slot 3: DISABLED Key Slot 4: DISABLED Key Slot 5: DISABLED Key Slot 6: DISABLED Key Slot 7: DISABLED
Как видно, используется только один ключ для шифрования/дешифрования (ключ, который вводили при установке ОС для криптования раздела). Добавим еще один ключ.
root@ubuntu:~# cryptsetup luksAddKey /dev/sda5 Enter any passphrase: Enter new passphrase for key slot: Verify passphrase: root@ubuntu:~# cryptsetup luksDump /dev/sda5 LUKS header information for /dev/sda5 Version: 1 Cipher name: aes Cipher mode: cbc-essiv:sha256 Hash spec: sha1 Payload offset: 4096 MK bits: 256 MK digest: 4a 42 ae 10 94 9d 98 40 b7 47 0e 93 d1 7d 12 54 28 f2 a8 19 MK salt: f9 d5 02 17 6f a6 75 8c 2a bf d5 5c c5 71 76 42 0f 13 76 5f 52 24 14 77 05 ca ef 19 13 4d eb 8f MK iterations: 35125 UUID: a8f47a3a-295c-4943-9612-b0ae18faa44c Key Slot 0: ENABLED Iterations: 140979 Salt: b6 be 7b 49 9b ea 61 78 ed 6b c2 9f 2b 3b 8f ad 18 e0 a5 cb 94 50 96 12 e9 5c 6c 3b bc c3 30 8a Key material offset: 8 AF stripes: 4000 Key Slot 1: ENABLED Iterations: 130410 Salt: b3 2e ca 72 ca c7 58 16 f5 b1 51 fb 57 6f 7d 9c 20 69 4e a4 e4 e1 6b 17 d7 21 51 9c 46 a9 87 7a Key material offset: 264 AF stripes: 4000 Key Slot 2: DISABLED Key Slot 3: DISABLED Key Slot 4: DISABLED Key Slot 5: DISABLED Key Slot 6: DISABLED Key Slot 7: DISABLED
Теперь у нас есть 2 ключа для расшифровки диска. Так же мы можем добавить бинарный ключ, или же записать длинный пароль в текстовый документ и добавить к ключам.
root@ubuntu:~# echo -ne `openssl rand -base64 32` > key.txt root@ubuntu:~# cat key.txt w3loOHwRiyS6Xv28M7FpoGqJ+Kp27MWcZ5j51+9EOKA=root@ubuntu:~# root@ubuntu:~# cryptsetup -q luksAddKey /dev/sda5 /home/alex/key.txt Enter any passphrase: root@ubuntu:~# cryptsetup luksDump /dev/sda5 LUKS header information for /dev/sda5 Version: 1 Cipher name: aes Cipher mode: cbc-essiv:sha256 Hash spec: sha1 Payload offset: 4096 MK bits: 256 MK digest: 4a 42 ae 10 94 9d 98 40 b7 47 0e 93 d1 7d 12 54 28 f2 a8 19 MK salt: f9 d5 02 17 6f a6 75 8c 2a bf d5 5c c5 71 76 42 0f 13 76 5f 52 24 14 77 05 ca ef 19 13 4d eb 8f MK iterations: 35125 UUID: a8f47a3a-295c-4943-9612-b0ae18faa44c Key Slot 0: ENABLED Iterations: 140979 Salt: b6 be 7b 49 9b ea 61 78 ed 6b c2 9f 2b 3b 8f ad 18 e0 a5 cb 94 50 96 12 e9 5c 6c 3b bc c3 30 8a Key material offset: 8 AF stripes: 4000 Key Slot 1: ENABLED Iterations: 130410 Salt: b3 2e ca 72 ca c7 58 16 f5 b1 51 fb 57 6f 7d 9c 20 69 4e a4 e4 e1 6b 17 d7 21 51 9c 46 a9 87 7a Key material offset: 264 AF stripes: 4000 Key Slot 2: ENABLED Iterations: 143385 Salt: de c0 16 f9 c9 6d 76 1c f3 3b 50 7c b8 90 1a 87 67 e8 90 24 6a ac 92 a8 ca b3 1f 8e bd 5d 80 77 Key material offset: 520 AF stripes: 4000
Здесь мы добавили 256 битный ключ, который можно ввести из клавиатуры (используется кодировка base64 ). Также можно добавить бинарный ключ, который с клавиатуры ввести нереально (для простых смертных). Такие ключики нужно сохранять на съемном носителе, на незашифрованной файловой системе или где-то на удаленном сервере. Это ключи типа
root@ubuntu:~# dd if=/dev/urandom of=my.key bs=1 count=256 256+0 records in 256+0 records out 256 bytes (256 B) copied, 0.00294037 s, 87.1 kB/s root@ubuntu:~# less my.key "my.key" may be a binary file. See it anyway? i^F0Mrq<8C>Vl^VT-^G<8C>d<81>;^?^V<8D><81>4d<98>g^Y,z pZaU^V0б„Ћ*R@<гџЄ_!K0Ъ‰B<9F>m6^G<9B>ЕЇ<8D>ШЏ5<88>О‰<8C> f<91>? ^Cg<85>Un9<86><81>\w:О¤<96>]I^C ^_C-VX|4<82>^S,Yx<86>^U|L|^Q<87>M^\<83>x<99>Е“O<99>6I^M^N^Tk<96>%^W^Yn^W6^R^X^]<8A><92>^L^QJ^Qv#C^K<91>5<9C>]<95>$P<9D>^KНЅMW<^_yМіVk<8F>
Теперь удалим ключ (в конце строки указывается номер слота, который нужно удалить).
root@ubuntu:~# cryptsetup luksKillSlot /dev/sda5 1 Enter any remaining LUKS passphrase: root@ubuntu:~# cryptsetup luksDump /dev/sda5 LUKS header information for /dev/sda5 Version: 1 Cipher name: aes Cipher mode: cbc-essiv:sha256 Hash spec: sha1 Payload offset: 4096 MK bits: 256 MK digest: 4a 42 ae 10 94 9d 98 40 b7 47 0e 93 d1 7d 12 54 28 f2 a8 19 MK salt: f9 d5 02 17 6f a6 75 8c 2a bf d5 5c c5 71 76 42 0f 13 76 5f 52 24 14 77 05 ca ef 19 13 4d eb 8f MK iterations: 35125 UUID: a8f47a3a-295c-4943-9612-b0ae18faa44c Key Slot 0: ENABLED Iterations: 140979 Salt: b6 be 7b 49 9b ea 61 78 ed 6b c2 9f 2b 3b 8f ad 18 e0 a5 cb 94 50 96 12 e9 5c 6c 3b bc c3 30 8a Key material offset: 8 AF stripes: 4000 Key Slot 1: DISABLED Key Slot 2: ENABLED Iterations: 143385 Salt: de c0 16 f9 c9 6d 76 1c f3 3b 50 7c b8 90 1a 87 67 e8 90 24 6a ac 92 a8 ca b3 1f 8e bd 5d 80 77 Key material offset: 520 AF stripes: 4000
Если у нас есть ключ в виде файла, то удалять и добавлять ключи можно используя опцию.
root@ubuntu:~# cryptsetup --key-file /home/alex/my.key luksKillSlot /dev/sda5 0
Немного полезной информации можно почерпнуть здесь
root@ubuntu:~# less /usr/share/doc/cryptsetup/README.Debian.gz
Проверить какие алгоритмы шифрования поддерживаться в вашем ядре и какая минимальная и максимальная длинна ключа.
root@ubuntu:~# cat /proc/crypto name : cbc(aes) driver : cbc(aes-generic) module : kernel priority : 100 refcnt : 65 selftest : passed type : givcipher async : no blocksize : 16 min keysize : 16 max keysize : 32 ivsize : 16 geniv : eseqiv name : cbc(aes) driver : cbc(aes-generic) module : kernel priority : 100 refcnt : 65 selftest : passed type : blkcipher blocksize : 16 min keysize : 16 max keysize : 32 ivsize : 16 geniv : <default> name : hmac(sha256) driver : hmac(sha256-generic) module : kernel priority : 0 refcnt : 2 selftest : passed type : shash blocksize : 64 digestsize : 32 name : hmac(sha1) driver : hmac(sha1-generic) module : kernel priority : 0 refcnt : 2 selftest : passed type : shash blocksize : 64 digestsize : 20 name : stdrng driver : krng module : kernel priority : 200 refcnt : 2 selftest : passed type : rng seedsize : 0 name : crc32c driver : crc32c-generic module : kernel priority : 100 refcnt : 1 selftest : passed type : shash blocksize : 1 digestsize : 4 name : aes driver : aes-generic module : kernel priority : 100 refcnt : 129 selftest : passed type : cipher blocksize : 16 min keysize : 16 max keysize : 32 name : sha256 driver : sha256-generic module : kernel priority : 0 refcnt : 5 selftest : passed type : shash blocksize : 64 digestsize : 32 name : sha224 driver : sha224-generic module : kernel priority : 0 refcnt : 1 selftest : passed type : shash blocksize : 64 digestsize : 28 name : sha1 driver : sha1-generic module : kernel priority : 0 refcnt : 3 selftest : passed type : shash blocksize : 64 digestsize : 20 name : md5 driver : md5-generic module : kernel priority : 0 refcnt : 1 selftest : passed type : shash blocksize : 64 digestsize : 16
В следующей статье пойдет речь об конкретной установке и настройке зашифрованной Ubuntu и удаленной разлочке.
А как там дела обстоят, если внезапно отрубили свет/какой форс-мажор с самой системой и внезапное отключение раздела шифрованного?
данные летят?
Все в один голос одни и те же статьи штампуют что ли?
Ни в одной из них этот момент не оговаривается.
Копипастят?
Какой-то странный и не по теме вопрос… Что значит «отключение раздела шифрованного» ?! Если имеется ввиду, что после отключения света мы получили битый кластер в котором хранились заголовки шифрования и что теперь делать, то ответ — бекапить хедер диска.
Или использовать встроенные возможности, типа
Оно ? Или имелось ввиду что-то другое?