Как создать зашифрованную файловую систему XFS, которая автоматически разблокируется при загрузке, используя clevis (клиент) и tang (сервер)?
Red Hat уже много лет включает шифрование дисков с помощью Linux Unified Key Setup-on-disk-format (LUKS).
Это решение легко внедрить и настроить в целях шифрования, но управление и практичность его ключей ужасны.
Оно требует парольной фразы во время загрузки или монтирования, которую необходимо вводить вручную.
Это превращает решение в головную боль для системных администраторов.
Начиная с RHEL 7.4 и с полной поддержкой в RHEL 7.5, Red Hat внедрила дополнительный компонент, который можно использовать для удаленного включения дисков LUKS.
Он называется Network Bound Disk Encryption (NBDE).
Network Bound Disk Encryption (NBDE) – это:
- Linux Unified Key Setup (LUKS) – это стандарт шифрования дисков.
- Cryptsetup настраивает шифрование на основе диска и включает поддержку LUKS.
- Tang – сетевая служба, предоставляющая криптографические услуги через HTTP.
- Clevis – это система шифрования. Clevis может использовать ключи, предоставленные Tang, в качестве парольной фразы для разблокирования томов LUKS.
- Клиент, clevis, должен быть CentOS/RHEL 8, так как clevis на CentOS/RHEL 7 имеет ограниченную функциональность и требует другого набора команд, которые не рассматриваются в этом руководстве.
- Сервер, tang, может быть запущен на CentOS/RHEL 7 или 8.
Настройка сервера Tang
1. Установите пакеты:
# dnf install -y tang
2. Разрешите нужный порт на брандмауэре:
# firewall-cmd --add-service=http --permanent # firewall-cmd --reload
3. Включите службу:
# systemctl enable --now tangd.socket
Настройка клиента Clevis
Создайте зашифрованную файловую систему
1. Установите необходимые пакеты на клиенте:
# dnf install -y cryptsetup clevis-systemd clevis-luks
2. Создание шифрованного диска на /dev/xvdc:
Примечание: Убедитесь, что диск xvdc является пустым, так как все данные на нем будут удалены.
# cryptsetup luksFormat --type luks2 --cipher aes-xts-plain64 --key-size 512 --hash sha256 --use-random /dev/xvdc WARNING! ======== This will overwrite data on /dev/xvdc irrevocably. Are you sure? (Type uppercase yes): YES Enter passphrase for /dev/xvdc: Verify passphrase:
3. Разблокируйте блочное устройство:
# cryptsetup --verbose luksOpen /dev/xvdc demodisk Enter passphrase for /dev/xvdc: Key slot 0 unlocked. Command successful.
4. Создайте файловую систему на зашифрованном диске:
# mkfs.xfs /dev/mapper/demodisk meta-data=/dev/mapper/demodisk isize=512 agcount=4, agsize=326656 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 data = bsize=4096 blocks=1306624, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
5. Определите UUID новой файловой системы:
# blkid -s UUID /dev/mapper/demodisk /dev/mapper/demodisk: UUID="24f9bfe9-1f6d-491d-8fa2-eab946464166"
6. Создайте запись fstab для файловой системы:
# echo "UUID=24f9bfe9-1f6d-491d-8fa2-eab946464166 /encrypted xfs defaults 0 0" | sudo tee -a /etc/fstab UUID=24f9bfe9-1f6d-491d-8fa2-eab946464166 /encrypted xfs defaults 0 0
7. Смонтируйте файловую систему:
# mkdir /encrypted # mount /encrypted
Добавьте удаленный ключ к зашифрованному устройству
1. Просмотрите ключи:
# cryptsetup luksDump /dev/xvdc LUKS header information Version: 2 Epoch: 3 Metadata area: 16384 [bytes] Keyslots area: 16744448 [bytes] UUID: 47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26 Label: (no label) Subsystem: (no subsystem) Flags: (no flags) Data segments: 0: crypt offset: 16777216 [bytes] length: (whole device) cipher: aes-xts-plain64 sector: 512 [bytes] Keyslots: 0: luks2 Key: 512 bits Priority: normal Cipher: aes-xts-plain64 Cipher key: 512 bits PBKDF: argon2i Time cost: 4 Memory: 399588 Threads: 4 Salt: 0d 75 99 50 22 e2 2a 93 82 51 fc 49 6f 54 61 fe 10 b6 24 62 21 2e 07 2b 04 0a 56 c8 03 23 6f 8f AF stripes: 4000 AF hash: sha256 Area offset:32768 [bytes] Area length:258048 [bytes] Digest ID: 0 Tokens: Digests: 0: pbkdf2 Hash: sha256 Iterations: 30284 Salt: de a0 3f 92 e1 c7 1d 5e 0e 52 65 37 19 84 2b 3c 46 2a ba 56 77 25 78 c3 27 fa 5b 07 e1 9a 25 24 Digest: 5b 95 93 af 0e a9 8d 24 cb 35 1e 77 e5 9f 15 85 eb d1 53 85 5b e4 10 2a 68 d0 11 6b 9b 71 f4 05
2. Добавьте удаленный ключ:
# clevis luks bind -d /dev/xvdc tang '{"url":"http://"}' The advertisement contains the following signing keys: KlbbdbNpdMrVwrk6hZ1wCCeabOY Do you wish to trust these keys? [ynYN] Y Enter existing LUKS password:
3. Покажите, что в слоте 1 находится новый слот для ключей, используемый Clevis:
# cryptsetup luksDump /dev/xvdc LUKS header information Version: 2 Epoch: 5 Metadata area: 16384 [bytes] Keyslots area: 16744448 [bytes] UUID: 47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26 Label: (no label) Subsystem: (no subsystem) Flags: (no flags) Data segments: 0: crypt offset: 16777216 [bytes] length: (whole device) cipher: aes-xts-plain64 sector: 512 [bytes] Keyslots: 0: luks2 Key: 512 bits Priority: normal Cipher: aes-xts-plain64 Cipher key: 512 bits PBKDF: argon2i Time cost: 4 Memory: 399588 Threads: 4 Salt: 0d 75 99 50 22 e2 2a 93 82 51 fc 49 6f 54 61 fe 10 b6 24 62 21 2e 07 2b 04 0a 56 c8 03 23 6f 8f AF stripes: 4000 AF hash: sha256 Area offset:32768 [bytes] Area length:258048 [bytes] Digest ID: 0 1: luks2 Key: 512 bits Priority: normal Cipher: aes-xts-plain64 Cipher key: 512 bits PBKDF: argon2i Time cost: 4 Memory: 508554 Threads: 4 Salt: 21 c8 91 58 22 9f 50 83 77 6f fe 12 0b 3a 66 3c d2 47 70 88 45 70 5e f1 c1 1e d0 e1 8f 96 97 ce AF stripes: 4000 AF hash: sha256 Area offset:290816 [bytes] Area length:258048 [bytes] Digest ID: 0 Tokens: 0: clevis Keyslot: 1 Digests: 0: pbkdf2 Hash: sha256 Iterations: 30284 Salt: de a0 3f 92 e1 c7 1d 5e 0e 52 65 37 19 84 2b 3c 46 2a ba 56 77 25 78 c3 27 fa 5b 07 e1 9a 25 24 Digest: 5b 95 93 af 0e a9 8d 24 cb 35 1e 77 e5 9f 15 85 eb d1 53 85 5b e4 10 2a 68 d0 11 6b 9b 71 f4 05
Смонтируйте зашифрованную файловую систему при загрузке
1. Определите UUID блочного устройства для последующего использования:
# blkid -s UUID /dev/xvdc /dev/xvdc: UUID="47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26"
2. Включите службу, используя UUID, обнаруженный для ‘/dev/xvdc’:
# systemctl enable clevis-luks-askpass@47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26.path Created symlink /etc/systemd/system/basic.target.wants/clevis-luks-askpass@47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26.path → /usr/lib/systemd/system/clevis-luks-askpass@.path.
3. Разблокируйте устройство во время загрузки:
# echo "encrypteddisk UUID=47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26 - _netdev" | sudo tee -a /etc/crypttab encrypteddisk UUID=47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26 - _netdev
4. Смонтируйте файловую систему позже в процессе загрузки:
# vi /etc/fstab
смените запись
UUID=24f9bfe9-1f6d-491d-8fa2-eab946464166 /encrypted xfs defaults 0 0
на:
/dev/mapper/encrypteddisk /encrypted xfs _netdev 0 0
5. Перезапустите сервер и проверьте работоспособность:
# reboot
# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.8G 0 1.8G 0% /dev tmpfs 1.8G 0 1.8G 0% /dev/shm tmpfs 1.8G 8.5M 1.8G 1% /run tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup /dev/mapper/ol_dhcp-root 22G 1.6G 20G 8% / /dev/xvda1 1014M 221M 794M 22% /boot tmpfs 365M 0 365M 0% /run/user/0 /dev/mapper/encrypteddisk 5.0G 68M 5.0G 2% /encrypted
Бонус: Удалить пароль
Вы можете удалить известную парольную фразу из слота 0 и запретить использование сервера tang.
Если сервер tang недоступен, диск не может быть разблокирован и файловая система недоступна.
1. Удалим пароль:
# cryptsetup --verbose luksRemoveKey /dev/xvdc Enter passphrase to be deleted: Key slot 0 unlocked. Keyslot 0 is selected for deletion. Key slot 0 removed. Command successful.
2. Проверим, что теперь есть только Clevis кейслоты:
# cryptsetup --verbose luksRemoveKey /dev/xvdc Enter passphrase to be deleted: Key slot 0 unlocked. Keyslot 0 is selected for deletion. Key slot 0 removed. Command successful.
# cryptsetup luksDump /dev/xvdc LUKS header information Version: 2 Epoch: 6 Metadata area: 16384 [bytes] Keyslots area: 16744448 [bytes] UUID: 47e0d1c3-d74b-41f0-9bc7-5ea367e9cb26 Label: (no label) Subsystem: (no subsystem) Flags: (no flags) Data segments: 0: crypt offset: 16777216 [bytes] length: (whole device) cipher: aes-xts-plain64 sector: 512 [bytes] Keyslots: 1: luks2 Key: 512 bits Priority: normal Cipher: aes-xts-plain64 Cipher key: 512 bits PBKDF: argon2i Time cost: 4 Memory: 508554 Threads: 4 Salt: 21 c8 91 58 22 9f 50 83 77 6f fe 12 0b 3a 66 3c d2 47 70 88 45 70 5e f1 c1 1e d0 e1 8f 96 97 ce AF stripes: 4000 AF hash: sha256 Area offset:290816 [bytes] Area length:258048 [bytes] Digest ID: 0 Tokens: 0: clevis Keyslot: 1 Digests: 0: pbkdf2 Hash: sha256 Iterations: 30284 Salt: de a0 3f 92 e1 c7 1d 5e 0e 52 65 37 19 84 2b 3c 46 2a ba 56 77 25 78 c3 27 fa 5b 07 e1 9a 25 24 Digest: 5b 95 93 af 0e a9 8d 24 cb 35 1e 77 e5 9f 15 85 eb d1 53 85 5b e4 10 2a 68 d0 11 6b 9b 71 f4 05
3. Перезагрузитесь и проверьте работоспособность:
# reboot
# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.8G 0 1.8G 0% /dev tmpfs 1.8G 0 1.8G 0% /dev/shm tmpfs 1.8G 8.5M 1.8G 1% /run tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup /dev/mapper/ol_dhcp-root 22G 1.6G 20G 8% / /dev/xvda1 1014M 221M 794M 22% /boot /dev/mapper/encrypteddisk 5.0G 68M 5.0G 2% /encrypted tmpfs 365M 0 365M 0% /run/user/0