1,943 瀏覽數

RHEL5 – Disk Encryption

從 RHEL(Red Hat Enterprise Linux) 5.3 安裝作業系統在做切割 partition 時你會發現多出一個可以勾選 "Encrypt system"  的選項.
encrypt01
這  Encrypt system 主要的功能就是將我們的 root(/) 做加密的動作, 但是 /boot 磁區是無法做加密的.因為系統必須先載入核心才能使用 Encrypt system 的功能.其 Encrypt system 功能屬於 device mapper 的子模組.

LUKS (Linux Unified Key Setup)主要是針對 block device 做加密 (LUKS 採用了AES – Advanced Encryption Standard 的方式來加密,加密請參考 http://zh.wikipedia.org/zh-tw/AES ).

所以除了一般的磁區外像是LVM physical volumes, LVM logical volumes, 以及 software RAID arrays 都可以使用 LUKS 做加密的動作.

LUKS 主要針對了

  • LUKS 適合用來保護可移動裝置像是 USB 硬碟或是 DiskonKey 之類的裝置.
  • LUKS 主要針對了 Block device 所以像是 swap , LVM 都適合使用.
  • LUKS 採用了加強式的密碼,以避免字典式的攻擊.
  • LUKS 可以同時設定多指令碼.

但是 LUKS 也不是萬能

  • 像是 LUKS 無法讓超過 8 隻鑰匙.
  • LUKS 無法針對檔案作加解密.

LUKS 採用 kernel device mapper 下的 dm-crypt 子模組所完成,我們可以透過系統提供的 #cryptsetup 工具來針對 block device 做加解密的動作.

[root@benjr ~]# lsmod |grep -i dm
dm_multipath           56152  0 
scsi_dh                41665  1 dm_multipath
dm_raid45              99401  0 
dm_message             36289  1 dm_raid45
dm_region_hash         46273  1 dm_raid45
dm_mem_cache           39489  1 dm_raid45
dm_crypt               46665  1 
dm_snapshot            52105  0 
dm_zero                35265  0 
dm_mirror              54737  0 
dm_log                 44993  4 dm_log_clustered,dm_raid45,dm_region_hash,dm_mirror
dm_mod                101521  15 dm_log_clustered,dm_multipath,dm_raid45,dm_crypt,dm_snapshot,dm_zero,dm_mirror,dm_log

LUKS (Linux Unified Key Setup) 是針對整個硬碟磁區做加密.採用的加密方式為  dm-crypt 而工具則是 cryptsetup.如果在安裝時選擇 "Encrypt system" 一開始就需要設定 LUKS 密碼,密碼最短需要 8 碼.
encrypt02
為什麼要採用 LUKS,其實 Linux 有個很嚴重的安全缺失,就是 rescue 模式,通常我們只要從光碟開機並使用 rescue 模式開進系統,不用密碼就可以直接讀取 Linux 下所有的檔案.所以在這一部份 RHEL 採用的 LUKS (Linux Unified Key Setup) 將 Linux root (/) 磁區 partition 作加密不管使用者是從一般模式開啟系統,
encrypt03
或是由 rescue 模式進入系統都必須輸入一組帳號密碼才能開啟系統.
encrypt05
剛剛是在安裝時就選擇 LUKS 的磁區,安裝後需要使用到 LUKS(Linux Unified Key Setup) 時,設定步驟如下:

  • 第一步使用 cryptsetup luksFormat 建立加密的磁區
  • 手動設定使用 cryptsetup luksOpen (重新開機就無效)
  • 可將必要的磁區加入 /etc/crypttab (下次重新開機也有效)
  • LUKS 磁區加入 /etc/fstab

使用 cryptsetup luksFormat 建立加密的磁區

[root@benjr ~]# cryptsetup luksFormat /dev/sdb1
 
WARNING!
========
This will overwrite data on /dev/sdb1 irrevocably.
 
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:
Command successful.

如要使用 LUKS 的磁區其所有的資料都會被清空.在建立好的 LUKS 磁區可以透過 cryptsetup luksDump 查看關於 LUKS 與磁區的資訊.

[root@benjr ~]# cryptsetup luksDump /dev/sdb1
LUKS header information for /dev/sdb1
 
Version:        1
Cipher name:    aes
Cipher mode:    cbc-essiv:sha256
Hash spec:      sha1
Payload offset: 1032
MK bits:        128
MK digest:      cb 4e 23 2c ea 04 f4 34 dd 06 25 29 b0 24 be 65 a7 b2 3c 08
MK salt:        a7 ff f3 ce 5f a5 42 69 06 19 ea 57 36 44 26 0c
                7b 11 3e d8 44 ba 96 c1 9b c6 04 3d 53 4d 2a 13
MK iterations:  10
UUID:           a708db3d-5db8-4db0-8f4a-fde5d0a5a8ea
 
Key Slot 0: ENABLED
        Iterations:             481919
        Salt:                   4e 58 ed a5 ac e9 89 a5 44 21 3c 46 e2 aa c0 3d
                                ee 49 a0 5f d0 19 0f f7 76 ca c5 fa 23 3d c3 2d
        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

如果只是要檢查磁區是否為 LUKS,透過 cryptsetup isLuks 就可以檢查,如果沒回傳任何東西就代表他是使用了 LUKS 的磁區.

[root@benjr ~]# cryptsetup isLuks /dev/sdc1
/dev/sdc1 is not a LUKS partition
[root@benjr ~]# cryptsetup isLuks /dev/sdb1

當磁區使用 LUKS 加密之後就無法透過一般的方式去做存取,包括了要掛載之類的動作.

[root@benjr ~]# mount /dev/sdb1 /mnt
mount: unknown filesystem type 'crypt_LUKS'

我們必須先將此磁區做命名,透過指令  cryptsetup luksOpen  將你原先的磁區命名為你想要的名稱,這邊開始就需要輸入 LUKS 的密碼.

[root@benjr ~]# cryptsetup luksOpen /dev/sdb1 sharedata
Enter LUKS passphrase for /dev/sdb1:
key slot 0 unlocked.
Command successful.

命好名稱之後還可以透過 dmsetup info 來觀察.

[root@benjr ~]# dmsetup info sharedata
Name:              sharedata
State:             ACTIVE
Read Ahead:        256
Tables present:    LIVE
Open count:        0
Event number:      0
Major, minor:      253, 3
Number of targets: 1

因為是使用了 LUKS 的方式加密所以做格式化時也需要透過我們剛剛所命名的名稱來做指定.

[root@benjr ~]# mke2fs /dev/mapper/sharedata
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
8962048 inodes, 17920378 blocks
896018 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
547 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424
 
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
 
This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

剛剛是第一種方式但是重新開機後必須重覆這些動作最好的方式將 LUKS 記錄在 /etc/crypttab 檔案中.不過第一件事我們必須知道這個磁區的 UUID 為何透過 cryptsetup luksUUID 可以知道.

[root@benjr ~]# cryptsetup luksUUID /dev/sdb1
a708db3d-5db8-4db0-8f4a-fde5d0a5a8ea

將這裝置的 UUID 以下面的格式寫在 /etc/crypttab 下次重新開機就可以透過 UUID 裝置直接做存儲.

[root@benjr ~]# vi  /etc/crypttab
luks-a708db3d-5db8-4db0-8f4a-fde5d0a5a8ea UUID=a708db3d-5db8-4db0-8f4a-fde5d0a5a8ea none

格式必須使用 <name> UUID=<UUID> none 其中的 name 為自訂.下次在開機時就必須輸入密碼存能存取該磁區.一樣要使用該磁區指定為 /dev/mapper/luks-a708db3d-5db8-4db0-8f4a-fde5d0a5a8ea . 如要加入到 /etc/fstab 一樣是指定 /dev/mapper/<name> 

關於詳細 LUKS1 的資料請參考
Red_Hat_Enterprise_Linux Chapter 29. Disk Encryption Guide
LUKS 的官方網站
http://code.google.com/p/cryptsetup/

發表迴響