суббота, 21 июня 2008 г.

Создание и работа с зашифрованными разделами/"образами" под Ubuntu 8.04. Автоматическое монтирование при логине(pam_mount). Управление.

Создание и работа с зашифрованными разделами/"образами" под Ubuntu 8.04. Автоматическое монтирование при логине(pam_mount). Управление.

1. ставим cryptsetup

# sudo apt-get install dmsetup cryptsetup e2fsprogs

2. проверяем какие есть модули в ядре для шифрования

# /sbin/modinfo /lib/modules/`uname -r`/kernel/crypto/* |grep description
# /sbin/modinfo /lib/modules/`uname -r`/kernel/arch/i386/crypto/* |grep description

3. загружаем модули в ядро
# sudo modprobe aes

или то чем хотим шифровать, проверяем что type:cipher появился в ядре

$ cat /proc/crypto
name : cbc(blowfish)
driver : cbc(blowfish-generic)
module : cbc
priority : 0
refcnt : 2
type : blkcipher
blocksize : 8
min keysize : 4
max keysize : 56
ivsize : 8

name : blowfish
driver : blowfish-generic
module : blowfish
priority : 0
refcnt : 2
type : cipher
blocksize : 8
min keysize : 4
max keysize : 56


4. загружаем dm-crypt
# sudo modprobe dm-crypt

5. добавляем в загрузку необходимые для работы модули

# sudo -i (to make yourself root)
# echo aes >> /etc/modules
# echo dm_mod >> /etc/modules
# echo dm_crypt >> /etc/modules

6. проверяем что dm-setup распознал crypt модули и поддерживает crypt target
# sudo dmsetup targets

# sudo dmsetup targets
crypt v1.5.0
striped v1.0.2
linear v1.0.2
error v1.0.1

7. В зависимости от необходимости переходим к созданию - зашифрованного раздела/файла

создаём файл с случайным содержанием для шифрования

# sudo dd if=/dev/urandom of=/home/.eugen.img bs=1M count=5120

для проверки состояния делаем
$ ps aux | grep "dd if"
root 17427 86.0 0.1 4128 1752 pts/1 R+ 14:35 1:04 dd if /dev/urandom of /home/.eugen.img bs 1M count 5120

после этого делаем

$ sudo kill -s SIGINFO 17427
или даже так
$ while [ 1 ]; do sudo kill -s SIGUSR1 17427;sleep 2; done


в консоли где запущен dd

355+1 записей считано
355+0 записей написано
скопировано 372244480 байт (372 MB), 174,582 c, 2,1 MB/c
465+2 записей считано
465+1 записей написано
скопировано 488523650 байт (489 MB), 231,741 c, 2,1 MB/c
467+3 записей считано
547+4 записей считаноо
547+3 записей написано
скопировано 575443162 байта (575 MB), 271,428 c, 2,1 MB/c
696+4 записей считано
695+4 записей написано
скопировано 731193910 байт (731 MB), 342,065 c, 2,1 MB/c


8.Ассоциируем файл с loop устройством:

$ sudo losetup /dev/loop0 /home/.eugen.img

проверяем что все в порядке

$ sudo losetup -a
/dev/loop0: [0801]:6965819 (/home/.eugen.img)


8.а - не обязательный шаг

далее можно сделать или так
$ pwgen -s 500 | \
openssl enc -aes-256-ecb >/home/.eugen.key
или так
$ dd if=/dev/urandom bs=1c count=$[ 256/8 ] | \
openssl enc -aes-256-ecb >/home/.eugen.key
проверяем
$ openssl enc -d -aes-256-ecb -in /home/.eugen.key

!! шифруем с ключом совпадающим паролем от пользователя если хотим делать pam_mount

9. открываем шифрованный раздел
если пропускали 8.а то делам так
$ sudo cryptsetup -c aes-cbc-essiv:sha256 -s 256 --verify-passphrase luksFormat /dev/loop0
если 8.а есть
#$ sudo cryptsetup -c aes-cbc-essiv:sha256 -s 256 --key-file=/home/.eugen.key --key-size=256 luksFormat /dev/loop0
$ openssl enc -d -aes-256-ecb -in /home/.eugen.key | sudo cryptsetup -c aes-cbc-essiv:sha256 -s 256 --key-size=256 luksFormat /dev/loop0

проверяем
$ sudo cryptsetup luksDump /dev/loop0
LUKS header information for /dev/loop0

Version: 1
Cipher name: aes
Cipher mode: cbc-essiv:sha256
Hash spec: sha1
Payload offset: 2056
MK bits: 256
MK digest: c5 ba 86 d7 08 c3 65 d3 1c c7 bd 92 6a 7f 2e aa a2 ef dc 5e
MK salt: 30 8f b1 70 a5 cc b9 26 49 bc 0f e5 04 60 f3 aa
e3 d9 31 71 34 93 40 2e 29 cd 4b ca d9 9b 7a ed
MK iterations: 10
UUID: 94e48889-8969-4d19-b011-75affcce72dd

10. открываем шифрованный раздел

с интерактивным ключом
$ sudo cryptsetup -c aes-cbc-essiv:sha256 -s 256 --key-size=256 luksOpen /dev/loop0 _home_eugen.img
или так
$ sudo cryptsetup luksOpen /dev/loop0 _home_eugen.img

с ключом из файла
$ openssl enc -d -aes-256-ecb -in /home/.eugen.key | sudo cryptsetup -c aes-cbc-essiv:sha256 -s 256 --key-size=256 luksOpen /dev/loop0 _home_eugen.img
enter aes-256-ecb decryption password:
key slot 0 unlocked.
Command successful.

проверяем
$ sudo dmsetup ls
_home_eugen.img (254, 1)

$ ls -l /dev/mapper/
итого 0
crw-rw---- 1 root root 10, 62 2008-06-21 12:09 control
brw-rw---- 1 root disk 254, 1 2008-06-21 16:57 _home_eugen.img

можно добавить ключ
cryptsetup luksAddKey /dev/loop0 /home/.eugen_new.key

11. создаём фаловую систему

$ sudo mkfs.ext3 -j -m 1 -O dir_index,filetype,sparse_super /dev/mapper/_home_eugen.img

12. монтируем
mount /dev/mapper/_home_eugen.img /mnt

------------------------------------------------------------------------------------------------------------

SWAP

1.Выкл SWAP

# swapoff /dev/sda2

Рандом в соджержание

# dd if=/dev/urandom of=/dev/sda2 bs=1M

1954+0 records in

1953+0 records out

2048094208 bytes (2.0 GB) copied, 529.177 s, 3.9 MB/s


2.Конфигурируем крипто своп

Добавляем /etc/crypttab

# cat /etc/cryptab

...

cryptoswap /dev/sda2 /dev/urandom cipher=aes-cbc-essiv:sha256,size=256,hash=sha256,swap



3.Перенастраиваем /etc/fstab

# cat /etc/fstab

...

/dev/mapper/cryptoswap swap swap sw 0 0

при старте ключ рандом.

4. Тестируем.

Ребут

проверяем

# cat /proc/swaps

Filename Type Size Used Priority

/dev/mapper/cryptoswap partition 2000084 0 -1



# cryptsetup status cryptoswap

/dev/mapper/cryptoswap is active:

cipher: aes-cbc-essiv:sha256

keysize: 256 bits

device: /dev/sda2

offset: 0 sectors

size: 4000185 sectors

mode: read/write


-----------------------------------------------------------------------------------------------------------------------------------
PAM_MOUNT

1: правим /etc/fstab

Вместо строки home

# cat /etc/fstab

...

/dev/mapper/_home_eugen.img /mnt/_home_eugen.img ext3 relatime,errors=remount-ro 0 2

2: Правим /etc/crypttab

Правим /etc/crypttab :

# cat /etc/crypttab

...

_home_eugen.img /home/.eugen.img noauto luks

3: Ставим PAM_Mount

# apt-get install libpam-mount

настраиваем в xml
# cat /etc/security/pam_mount.conf.xml
...


4:настраиваем PAM


# cat /etc/pam.d/common-auth
...
auth optional pam_mount.so use_first_pass

# cat /etc/pam.d/common-session
...
session optional pam_mount.so


5:проверяем

log out -> log in

$ df -h

...

/dev/mapper/_home_eugen.img

20G 296M 20G 2% /home

снимайте backupы!!!!






-------------------------------------------------------------------------------------------------
Hard-disk Encryption


* LUKS

Ставим софт

# apt-get install cryptsetup

Создаем test для показания функционала через loopback

# dd if=/dev/urandom of=testfile bs=1M count=100
# losetup /dev/loop0 testfile

Сейчас шифруем Luks

# cryptsetup luksFormat /dev/loop0
WARNING!
========
This will overwrite data on /dev/loop/0 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: GEHEIM
Verify passphrase: GEHEIM
Command successful.

# cryptsetup luksOpen /dev/loop/0 mytestfs
Enter LUKS passphrase: GEHEIM
key slot 0 unlocked.
Command successful.
# mkfs.ext3 /dev/mapper/mytestfs
# mount /dev/mapper/mytestfs /mnt/mnt/
# umount /dev/mapper/mytestfs
# cryptsetup luksClose /dev/mapper/mytestfs

Можно не вводить пароль при каждом моунте

# pwgen -s 500 > /mnt/usbstick/mykeyfile
# cryptsetup luksFormat /dev/loop/0 /mnt/usbstick/mykeyfile

WARNING!
========
This will overwrite data on /dev/loop/0 irrevocably.

Are you sure? (Type uppercase yes): YES
Command successful.

# cryptsetup -d /mnt/usbstick/mykeyfile luksOpen /dev/loop/0 mytestfs
# mkfs.ext3 /dev/mapper/mytestfs
# mount /dev/mapper/mytestfs /mnt/mnt/
# umount /dev/mapper/mytestfs
# cryptsetup luksClose /dev/mapper/mytestfs

Есть возможность ввести пароль вручную

# cryptsetup -d /mnt/usbstick/mykeyfile luksAddKey /dev/loop0
key slot 0 unlocked.
Enter new passphrase for key slot: FOOBAR
Verify passphrase: FOOBAR
Command successful.

Всегда можно добавить пароль

# cryptsetup luksAddKey /dev/loop0
Enter any LUKS passphrase: FOOBAR
key slot 1 unlocked.
Enter new passphrase for key slot: SECRET
Verify passphrase: SECRET
Command successful.

Для работы сперва открываем шифрованный раздел паролем или ключом

ключ
# cryptsetup -d /mnt/usbstick/mykeyfile luksOpen /dev/loop/0 mytestfs
key slot 0 unlocked.
Command successful.

пароль

# cryptsetup luksOpen /dev/loop/0 mytestfs
Enter LUKS passphrase: SECRET
key slot 1 unlocked.
Command successful.

монтируем

# mount /dev/mapper/mytestfs /mnt/mnt/

размонтируем

# umount /dev/mapper/mytestfs
# cryptsetup luksClose /dev/mapper/mytestfs

Normal Usage with Keyfile

---------------------------------------------------------------------------------------
Ссылки:
http://www.saout.de/misc/dm-crypt/ - dm crypt
http://s.webarmadillo.net/wordpress/?p=16 - file image,pam_mount,luks
http://www.tgunkel.de/it/software/doc/linux_server.en - очень кратко все возможности
http://blog.gnist.org/article.php?story=EncryptedSwapAndHomeUbuntu - очень прилично 8.04