Шифрование Linux (часть 1). Полное шифрование Ubuntu/Centos при установке (LUKS,cryptsetup)

Здравствуйте. Решил написать серию статей по криптованию. Что такое криптование, и какие есть шифры, алгоритмы и т.п. рассказывать не буду, так как есть море литературы, из которой можно почерпнуть все, что интересует по данному вопросу. Я буду использовать систему криптования 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 и удаленной разлочке.

Автор: admin, 10 сентября 2013
Рубрики: Безопасность
Метки: , , ,
2 комментария к сообщению: “Шифрование Linux (часть 1). Полное шифрование Ubuntu/Centos при установке (LUKS,cryptsetup)”
  1. Dmitry:

    А как там дела обстоят, если внезапно отрубили свет/какой форс-мажор с самой системой и внезапное отключение раздела шифрованного?
    данные летят?
    Все в один голос одни и те же статьи штампуют что ли?
    Ни в одной из них этот момент не оговаривается.
    Копипастят?

    • Какой-то странный и не по теме вопрос… Что значит «отключение раздела шифрованного» ?! Если имеется ввиду, что после отключения света мы получили битый кластер в котором хранились заголовки шифрования и что теперь делать, то ответ — бекапить хедер диска.

      # Берем офсет хедеров
      cryptsetup luksDump /dev/<device> | grep "Payload offset"
      Payload offset:	2020
      # Берем размер сектора
      fdisk -l /dev/<device> |grep "Sector size"
      Sector size (logical/physical): 512 bytes / 512 bytes
      # Бекапим хедеры 
      dd if=/dev/<device> of=/path/to/<file>.img bs=512 count=2020
      # Востанавливаем 
      dd if=path/to/<file>.img of=/dev/<device> bs=512 count=2020
      

      Или использовать встроенные возможности, типа

       
      cryptsetup luksHeaderBackup /dev/<device> --header-backup-file /mnt/<backup>/<file>.img
      cryptsetup luksHeaderRestore /dev/<device> --header-backup-file /mnt/<backup>/<file>.img
      

      Оно ? Или имелось ввиду что-то другое?

Написать комментарий

Последние статьи

Яндекс.Метрика
?>