任何在云上部署的应用都离不开持久化盘或者说是数据盘,在的虚拟机的使用场景里面,云服务提供商都会提供这样的一个服务。很多人可能不会理解为什么我创建的虚拟机不可以直接在上面写数据,而需要单独的去创建额外的磁盘进行数据的读写。

以OpenStack为例,其虚拟机的配置由Flavor 来觉得,让我们来看下创建flavor 的属性是什么
OpenStack Flavor Details

可以看到其中定义了该VM的vCPU、内存以及root磁盘大小可以理解为sda。另外有一项比较特殊的是 ephemeral, 如果定义了该值后,在操作系统当中会额外的有一个存储设备sdb. 但是如果虚拟机所在的物理机或者由于删除该虚拟机的话,那么其上所写入的数据也会随之删除。所以有了个数据盘(Persistent Disk)的产生,该存储设备可以通过挂载的方式添加到虚拟机里面,OpenStack 里面有Cinder提供这样的服务,对于其它的云服务提供商来说,会有不同的服务。但是无论是那种,无论以什么协议添加到了虚拟机当中,其上面的数据如果不是人为的删除的话,可以放心使用。

虽然persistent disk 解决了数据存储持久化的问题,但是也随之带来了另外的问题。
其上存储的数据如何保护? 如果后端的存储服务器被黑客攻陷的话,那么其上的所有客户数据都会收到威胁, 如何防护云存储(对象 & 块存储)的安全变得直观重要。

下面提供一种简单的但是有效的方式进行数据盘加密,即使是云服务提供商也无法任意的查看你的数据。


Linux Unified Key Setup-on-disk-format (or LUKS) allows you to encrypt partitions on your Linux computer. This is particularly important when it comes to mobile computers and removable media. LUKS allows multiple user keys to decrypt a master key, which is used for the bulk encryption of the partition.

该方法主要通过Linux 提供的LUKS进行磁盘的加密, 其全称为 Linux Unified Key Setup-on-disk-format (or LUKS). 对于移动设备或者可插拔的设备来说尤其的重要。LUKS允许多个用户用其Key 去解密 Master的Key。
关于更多的介绍,请自行 Google Luks

实验步骤

ubuntu@ubuntu-xenial:~$ sudo shred -v --iterations=1 /dev/sdc
sudo: unable to resolve host ubuntu-xenial
shred: /dev/sdc: pass 1/1 (random)...

ubuntu@ubuntu-xenial:~$ sudo cryptsetup --verbose --verify-passphrase >luksFormat /dev/sdc
sudo: unable to resolve host ubuntu-xenial

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

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

需要注意的是在确认时需要大写的 YES

ubuntu@ubuntu-xenial:~$ sudo cryptsetup luksOpen /dev/sdc encrypted
sudo: unable to resolve host ubuntu-xenial
Enter passphrase for /dev/sdc:

任何要操作该设备的操作都要之前输入的秘钥

ubuntu@ubuntu-xenial:~$ ls -l /dev/mapper/ | grep encrypted
lrwxrwxrwx 1 root root 7 Sep 21 04:27 encrypted -> ../dm-0

ubuntu@ubuntu-xenial:~$ sudo mkfs.ext4 /dev/mapper/encrypted
sudo: unable to resolve host ubuntu-xenial
mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 261632 4k blocks and 65408 inodes
Filesystem UUID: b84e4ca5-44f7-453a-a14b-0f0115c9913e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

磁盘挂载

ubuntu@ubuntu-xenial:~$ sudo mount /dev/mapper/encrypted /mnt/
sudo: unable to resolve host ubuntu-xenial
ubuntu@ubuntu-xenial:~$ df -h | grep mnt
/dev/mapper/encrypted 990M 1.3M 922M 1% /mnt


通过👇的vagrant file 创建有附加磁盘的虚拟机供实验

 file_to_disk = 'encrypted-disk.vdi'
 
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"
  config.vm.provider "virtualbox" do |vb|
    vb.gui = false
    vb.memory = "1024"
    vb.name = "luks"
  
    if !File.exist?(file_to_disk)
       vb.customize ['createhd', '--filename', file_to_disk, '--size',  1024]
    end
    vb.customize ['storageattach', :id, '--storagectl', 'SCSI', '--port', 2, '--device', 0, >'--type', 'hdd', '--medium', file_to_disk]
  end

  config.vm.provision "shell", inline: <<-SHELL
       apt-get update
       apt-get install -y ubuntu-desktop
  SHELL
 end

参考

Redhat Docs