openstack havana块存储Cinder磁盘加密方法研究

http://blog.csdn.net/cloudresearch/article/details/19092219

在openstack havana的release note中有如下介绍“Attached Cinder volumes can now be encrypted. Data is decrypted as needed at read and write time while presenting instances with a normal block storage device”。

众所周知,在以前版本的openstack中,块存储创建出volume后,将其挂载给虚拟机,就可以启动虚拟机。但这种实现方式也存在一些安全隐患:若存在不怀好意的系统管理员或者黑客在攻陷nova节点时,就可以从宿主系统中,查看guest os中用户存放的数据。如果用户在其磁盘中存在敏感私人数据时,则存在数据泄密的风险。

关于磁盘加密的BluePrint链接:https://wiki.openstack.org/wiki/VolumeEncryption ,通过分析其实现方式可以发现,cinder中的卷在挂载到HyperVisor主机上时,对其进行加密,再讲加密后的块设备提供给虚拟机使用,最终虚拟机使用的加密后的磁盘。如果此时黑客攻陷主机的话,他看到的将是加密后的volume,如果不知道磁盘的加密密码,他看到将是没有任何意义的一堆数据。

通过分析nova中代码实现,可以发现磁盘加密的实现细节,openstack中的磁盘加密使用了Linux中的一个加密组件:cryptsetup!

[python] view plain copy

  1. def _open_volume(self, passphrase, **kwargs):
  2. """Opens the LUKS partition on the volume using the specified
  3. passphrase.
  4. :param passphrase: the passphrase used to access the volume
  5. """
  6. LOG.debug(_("opening encrypted volume %s"), self.dev_path)
  7. # NOTE(joel-coffman): cryptsetup will strip trailing newlines from
  8. # input specified on stdin unless --key-file=- is specified.
  9. cmd = ["cryptsetup", "create", "--key-file=-"]
  10. cipher = kwargs.get("cipher", None)
  11. if cipher is not None:
  12. cmd.extend(["--cipher", cipher])
  13. key_size = kwargs.get("key_size", None)
  14. if key_size is not None:
  15. cmd.extend(["--key-size", key_size])
  16. cmd.extend([self.dev_name, self.dev_path])
  17. utils.execute(*cmd, process_input=passphrase,
  18. check_exit_code=True, run_as_root=True)
  19. def attach_volume(self, context, **kwargs):
  20. """Shadows the device and passes an unencrypted version to the
  21. instance.
  22. Transparent disk encryption is achieved by mounting the volume via
  23. dm-crypt and passing the resulting device to the instance. The
  24. instance is unaware of the underlying encryption due to modifying the
  25. original symbolic link to refer to the device mounted by dm-crypt.
  26. """
  27. key = self._get_key(context).get_encoded()
  28. passphrase = self._get_passphrase(key)
  29. self._open_volume(passphrase, **kwargs)
  30. # modify the original symbolic link to refer to the decrypted device
  31. utils.execute(‘ln‘, ‘--symbolic‘, ‘--force‘,
  32. ‘/dev/mapper/%s‘ % self.dev_name, self.symlink_path,
  33. run_as_root=True, check_exit_code=True)

可见,在attach_volume方法的_open_volume中,会调用cryptsetup系统命令对输入的待挂载设备进行加密,再将加密的设备生成挂载给虚拟机的软链接,这样虚拟机在启动时感知不到加密方法的存在,即磁盘加密对虚拟机是透明的。cryptsetup

由于手头没有havana的环境,下面打算根据cinder的实现原理对磁盘加密进行模拟,同时研究其实现:

1、首先使用truncate命令生成一个空洞文件

[plain] view plain copy

  1. [[email protected] tmp]# truncate --size=10G 10G
  2. [[email protected] tmp]#  ll /tmp/10G
  3. -rw-r--r--. 1 root root 10737418240 12月  3 23:37 /tmp/10G
  4. [[email protected] tmp]#

2、将上述空洞文件转化为loop设备

[plain] view plain copy

  1. [[email protected] tmp]#
  2. [[email protected] tmp]# losetup -f /tmp/10G
  3. [[email protected] tmp]#
  4. [[email protected] tmp]# losetup -a
  5. /dev/loop0: [0030]:33006 (/tmp/10G)
  6. [[email protected] tmp]#

3、在上述loop设备上创建pv、vg

[plain] view plain copy

  1. [[email protected] tmp]# pvcreate qixiaozhen /dev/loop0
  2. Device qixiaozhen not found (or ignored by filtering).
  3. Physical volume "/dev/loop0" successfully created
  4. [[email protected] tmp]#
  5. [[email protected] tmp]# vgcreate qixiaozhen /dev/loop0
  6. Volume group "qixiaozhen" successfully created
  7. [[email protected] tmp]#

4、创建用以测试用的lv

[plain] view plain copy

  1. [[email protected] tmp]# lvcreate -n test001 -L 100M qixiaozhen
  2. Logical volume "test001" created
  3. [[email protected] tmp]#

5、使用cryptsetup对上述lv进行加密(注意此处需要用户输入密码)

[plain] view plain copy

  1. [[email protected] tmp]#
  2. [[email protected] tmp]# cryptsetup luksFormat /dev/qixiaozhen/test001
  3. WARNING!
  4. ========
  5. This will overwrite data on /dev/qixiaozhen/test001 irrevocably.
  6. Are you sure? (Type uppercase yes): YES
  7. Enter LUKS passphrase:
  8. Verify passphrase:
  9. [[email protected] tmp]#

6、打开加密后的磁盘,生成供虚拟机使用磁盘(需要输入密码)

[plain] view plain copy

  1. [[email protected] tmp]#
  2. [[email protected] tmp]# cryptsetup luksOpen /dev/qixiaozhen/test001 qixiaozhen_device
  3. Enter passphrase for /dev/qixiaozhen/test001:
  4. [[email protected] tmp]#

7、在/dev/mapper路径下可以找到上述生成的qixiaozhen_device设备

[plain] view plain copy

  1. [[email protected] tmp]#
  2. [[email protected] tmp]# ll /dev/mapper/qixiaozhen_device
  3. lrwxrwxrwx. 1 root root 7 12月  3 23:48 /dev/mapper/qixiaozhen_device -> ../dm-4
  4. [[email protected] tmp]#
  5. [[email protected] tmp]#

8、分析逻辑卷test001与qixiaozhen_device设备间的关系

[plain] view plain copy

  1. [[email protected] tmp]#
  2. [[email protected] tmp]# dmsetup table
  3. fedora_armstrong-swap: 0 12255232 linear 8:9 2048
  4. fedora_armstrong-root: 0 104857600 linear 8:9 995198976
  5. qixiaozhen-test001: 0 204800 linear 7:0 2048
  6. qixiaozhen_device: 0 200704 crypt aes-cbc-essiv:sha256 0000000000000000000000000000000000000000000000000000000000000000 0 253:3 4096
  7. fedora_armstrong-home: 0 982941696 linear 8:9 12257280
  8. [[email protected] tmp]#

可见qixiaozhen_device设备是由test001设备偏移4096个扇区(2MB)而生成。

9、往qixiaozhen_device中写入部分数据,本文中通过格式化成ext4文件系统进行测试

[plain] view plain copy

  1. [[email protected] tmp]# mkfs.ext4 /dev/mapper/qixiaozhen_device
  2. mke2fs 1.42.5 (29-Jul-2012)
  3. 文件系统标签=
  4. OS type: Linux
  5. 块大小=1024 (log=0)
  6. 分块大小=1024 (log=0)
  7. Stride=0 blocks, Stripe width=0 blocks
  8. 25168 inodes, 100352 blocks
  9. 5017 blocks (5.00%) reserved for the super user
  10. 第一个数据块=1
  11. Maximum filesystem blocks=67371008
  12. 13 block groups
  13. 8192 blocks per group, 8192 fragments per group
  14. 1936 inodes per group
  15. Superblock backups stored on blocks:
  16. 8193, 24577, 40961, 57345, 73729
  17. Allocating group tables: 完成
  18. 正在写入inode表: 完成
  19. Creating journal (4096 blocks): 完成
  20. Writing superblocks and filesystem accounting information: 完成
  21. [[email protected] tmp]#

10、下面分析使用dd命令读取test001偏移2MB和qixiaozhen_device进行比较。

[plain] view plain copy

  1. [[email protected] tmp]# dd if=/dev/qixiaozhen/test001 bs=1M count=1 iflag=direct  skip=2 | hexdump -C | less
  2. 00000000  4c a7 db 72 01 e4 18 1e  bc 1e b9 bf fa 3b 25 01  |L..r.........;%.|
  3. 00000010  cc 22 46 96 aa b9 e8 2c  53 60 7c b3 61 4a 02 33  |."F....,S`|.aJ.3|
  4. 00000020  5d 39 4b 4f 6d b9 5a 57  16 fb a5 f9 c8 7f 9d 65  |]9KOm.ZW.......e|
  5. 00000030  3d 25 38 f5 4b e2 b0 6e  ef 92 24 bd fc cf 56 07  |=%8.K..n..$...V.|
  6. 00000040  4b 5f d9 85 ad f4 01 5d  dd a3 94 db 8b 58 0f a0  |K_.....].....X..|
  7. 00000050  03 0f 08 ad 7a 66 a8 3a  72 16 47 58 0c ba f9 d0  |....zf.:r.GX....|
  8. 00000060  60 34 b4 ba 69 32 27 8c  f8 97 cd 58 86 3e ce 34  |`4..i2‘....X.>.4|
  9. 00000070  ae 28 4f e1 c8 a9 90 5c  08 f9 30 9f a7 4b 6b 21  |.(O....\..0..Kk!|
  10. 00000080  ba d0 39 45 7a 0d a4 c5  a6 c9 a8 40 a2 56 c9 27  |[email protected]‘|
  11. 00000090  9d d4 77 05 77 ae b0 2a  eb fa 3a 1d 1b d0 19 9d  |..w.w..*..:.....|
  12. 000000a0  fe c3 d9 1c ca 3c 51 fa  84 d7 d8 a8 8d 42 1f e0  |.....<Q......B..|
  13. 000000b0  bd b0 09 84 69 25 6d 70  9f b6 78 25 87 52 07 70  |....i%mp..x%.R.p|
  14. 000000c0  e1 9c d9 9c 42 2d 1d fb  92 fd 9d 62 d3 58 27 79  |....B-.....b.X‘y|
  15. 000000d0  2c b3 a5 a8 67 7d 3e 5d  01 15 3d ac 7e 44 77 67  |,...g}>]..=.~Dwg|
  16. 000000e0  8f 4f 71 e9 4e 63 06 4d  9a 78 7c 0f 60 4a da 3b  |.Oq.Nc.M.x|.`J.;|
  17. 000000f0  0d f2 46 ac c0 c7 44 0c  61 dc 6c ef 00 c0 7b 9f  |..F...D.a.l...{.|
  18. 00000100  60 55 94 7f 1f c2 87 1b  10 93 c0 78 92 6a 8f bf  |`U.........x.j..|
  19. 00000110  6d 08 b1 b7 51 86 6e 83  46 26 cb fe 0d 0f c4 72  |m...Q.n.F&.....r|
  20. 00000120  b1 48 88 c5 05 be a9 f1  8a ac a2 ed f6 73 40 f5  |[email protected]|
  21. 00000130  74 51 76 ba f4 db 8c be  f8 9d 73 14 e8 7b 8c 0f  |tQv.......s..{..|
  22. 00000140  06 bb 89 f9 e4 2e 81 8e  5f c8 f4 a2 70 27 03 a5  |........_...p‘..|
  23. 00000150  3e 93 80 b1 38 4d ad 12  9f ca 4c e8 01 5b 26 41  |>...8M....L..[&A|
  24. 00000160  73 f9 3f db 75 c5 d5 d9  c7 25 b9 6d 03 4d 39 98  |s.?.u....%.m.M9.|
  25. 00000170  72 7e 5f 10 31 be e9 92  fa 5c d5 54 9f 61 65 00  |r~_.1....\.T.ae.|
  26. 00000180  bd e0 4a 8f 8a 84 b4 41  5d b5 6c 42 f5 d5 ff 7a  |..J....A].lB...z|
  27. 00000190  7f 97 c5 dc 73 74 c8 94  f7 03 f0 bd 8d 1d 69 9e  |....st........i.|
  28. 000001a0  93 c4 52 52 d8 9e 21 6a  74 2d 1e d4 29 1e 1e 92  |..RR..!jt-..)...|
  29. 000001b0  8a 61 03 9d ed 0c ca c0  e5 33 38 49 d3 7e 5f 94  |.a.......38I.~_.|
  30. 000001c0  44 f9 ae 5d 5f 9c 5a 51  02 20 77 46 9c 46 23 6b  |D..]_.ZQ. wF.F#k|
  31. 000001d0  8b 5e 15 28 4f 09 ce 3e  36 e8 62 21 e4 08 43 e9  |.^.(O..>6.b!..C.|
  32. 000001e0  b3 53 90 e2 68 fb 28 4d  fa 24 e8 7a 3a ce b1 0a  |.S..h.(M.$.z:...|
  33. 000001f0  f8 f1 ae a0 c9 57 82 9d  0e 56 6e f8 d9 d5 81 f8  |.....W...Vn.....|
  34. 00000200  9d f6 fa 8b d2 f2 bd cf  d3 f0 ff e8 52 1f d1 f3  |............R...|
  35. 00000210  c1 aa ed db 78 55 f8 e3  7c 85 bf ec d2 a3 15 ec  |....xU..|.......|
  36. 00000220  8b 6d 04 cf 2d 14 37 1b  f4 22 06 5f c1 8d eb df  |.m..-.7.."._....|
  37. 00000230  77 7b b9 f2 36 f7 b2 63  ad 23 06 ff 23 a1 b5 dc  |w{..6..c.#..#...|
  38. 00000240  56 67 85 1f a2 f5 59 4c  cc a0 c0 97 c1 b1 7e b2  |Vg....YL......~.|
  39. 00000250  e5 7f 6e 3c d2 ee 65 fa  52 10 ea b8 fb e0 38 e8  |..n<..e.R.....8.|
  40. 00000260  cf 95 9e 80 72 e4 5b 22  2b 9f 72 f6 22 2f e1 f7  |....r.["+.r."/..|
  41. 00000270  ec f4 49 cf c3 d2 f4 34  de 00 55 17 e9 1c cf 5a  |..I....4..U....Z|
  42. 00000280  19 7f a0 f4 48 14 f5 ee  2f 75 76 ca 0e 94 9f 16  |....H.../uv.....|
  43. 00000290  51 aa 80 03 a9 e6 2c 69  31 d4 35 d5 d5 b7 e9 58  |Q.....,i1.5....X|
  44. 000002a0  bc a1 f5 8f 56 bc 12 94  9e d7 d8 cc 7d f7 61 bd  |....V.......}.a.|

[plain] view plain copy

  1. [[email protected] tmp]# dd if=/dev/mapper/qixiaozhen_device bs=1M count=1 iflag=direct | hexdump -C | less
  2. 00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
  3. *
  4. 00000400  50 62 00 00 00 88 01 00  99 13 00 00 81 65 01 00  |Pb...........e..|
  5. 00000410  45 62 00 00 01 00 00 00  00 00 00 00 00 00 00 00  |Eb..............|
  6. 00000420  00 20 00 00 00 20 00 00  90 07 00 00 00 00 00 00  |. ... ..........|
  7. 00000430  8c ff 9d 52 00 00 ff ff  53 ef 01 00 01 00 00 00  |...R....S.......|
  8. 00000440  8c ff 9d 52 00 00 00 00  00 00 00 00 01 00 00 00  |...R............|
  9. 00000450  00 00 00 00 0b 00 00 00  80 00 00 00 3c 00 00 00  |............<...|
  10. 00000460  42 02 00 00 79 00 00 00  0e 6c 42 94 c7 e6 4b 18  |B...y....lB...K.|
  11. 00000470  99 55 8d 81 b6 2c 5a 9a  00 00 00 00 00 00 00 00  |.U...,Z.........|
  12. 00000480  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
  13. *
  14. 000004c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 01  |................|
  15. 000004d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
  16. 000004e0  08 00 00 00 00 00 00 00  00 00 00 00 25 2a 68 6f  |............%*ho|
  17. 000004f0  14 38 4a d7 b2 35 fb 62  20 5c ec 36 01 01 00 00  |.8J..5.b \.6....|
  18. 00000500  0c 00 00 00 00 00 00 00  8c ff 9d 52 0a f3 01 00  |...........R....|
  19. 00000510  04 00 00 00 00 00 00 00  00 00 00 00 00 10 00 00  |................|
  20. 00000520  01 c0 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
  21. 00000530  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
  22. 00000540  00 00 00 00 00 00 00 00  00 00 00 00 00 00 40 00  |[email protected]|
  23. 00000550  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
  24. 00000560  01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
  25. 00000570  00 00 00 00 04 00 00 00  5f 11 00 00 00 00 00 00  |........_.......|
  26. 00000580  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
  27. *
  28. 00000800  03 01 00 00 13 01 00 00  23 01 00 00 8c 12 85 07  |........#.......|
  29. 00000810  02 00 00 00 00 00 00 00  00 00 00 00 85 07 b9 cc  |................|
  30. 00000820  04 01 00 00 14 01 00 00  15 02 00 00 fe 1e 90 07  |................|
  31. 00000830  00 00 01 00 00 00 00 00  00 00 00 00 90 07 f4 ce  |................|
  32. 00000840  05 01 00 00 15 01 00 00  07 03 00 00 00 20 90 07  |............. ..|
  33. 00000850  00 00 03 00 00 00 00 00  00 00 00 00 90 07 77 60  |..............w`|
  34. 00000860  06 01 00 00 16 01 00 00  f9 03 00 00 fe 1e 90 07  |................|
  35. 00000870  00 00 01 00 00 00 00 00  00 00 00 00 90 07 36 89  |..............6.|
  36. 00000880  07 01 00 00 17 01 00 00  eb 04 00 00 00 20 90 07  |............. ..|
  37. 00000890  00 00 03 00 00 00 00 00  00 00 00 00 90 07 d2 35  |...............5|
  38. 000008a0  08 01 00 00 18 01 00 00  dd 05 00 00 fe 1e 90 07  |................|
  39. 000008b0  00 00 01 00 00 00 00 00  00 00 00 00 90 07 e0 b7  |................|
  40. 000008c0  09 01 00 00 19 01 00 00  cf 06 00 00 00 10 90 07  |................|
  41. 000008d0  00 00 01 00 00 00 00 00  00 00 00 00 90 07 ad 33  |...............3|
  42. 000008e0  0a 01 00 00 1a 01 00 00  c1 07 00 00 fe 1e 90 07  |................|
  43. 000008f0  00 00 01 00 00 00 00 00  00 00 00 00 90 07 ee 88  |................|
  44. 00000900  0b 01 00 00 1b 01 00 00  b3 08 00 00 00 20 90 07  |............. ..|

结论:可见,直接在主机上读取裸设备上的裸数据时,从加密前设备和加密后设备上的是完全不同的。使用磁盘加密的方法,在删除磁盘时,不需要对磁盘进行格式化,直接把加密用的密码删除即可,再也不用往裸设备中填0实现格式化。

时间: 2024-10-28 11:53:32

openstack havana块存储Cinder磁盘加密方法研究的相关文章

openstack-9块存储服务(此服务可选)

openstack openstack-9块存储服务(此服务可选) 块存储服务(cinder)为实例提供块存储.存储的分配和消耗是由块存储驱动器,或者多后端配置的驱动器决定的.还有很多驱动程序可用:NAS/SAN,NFS,ISCSI,Ceph等. 典型情况下,块服务API和调度器服务运行在控制节点上.取决于使用的驱动,卷服务器可以运行在控制节点.计算节点或单独的存储节点. For more information, see the Configuration Reference. 块存储服务概览

openstack安装(liberty)--安装块存储服务(Block Storage service/cinder)

八.安装块存储服务(Block Storage service/cinder) ###注意注意注意时间同步很重要 8.1安装环境准备中配置主机相应配置,包括主机名称,hosts,时间同步,防火墙,SELINUX以及相关OPENSTACK包 8.2控制节点配置 8.2.1创建数据库并授权 [[email protected] ~]# mysql -uroot -p Enter password: MariaDB [(none)]> create database cinder; Query OK,

探索 OpenStack 之(9):深入块存储服务Cinder (Part 1)

继研究了Neutron之后,继续Nova的外围研究之旅.本站是研究块存储服务Cinder. 0.验证环境 环境包括: 1.一个controller节点,运行nova-api, nova-scheduler, cinder-api, cinder-scheduler, mysql, rabbitmq 2.一个Nova compute节点,运行一个虚机 3.三个cinder volume节点,每个节点使用LVMISCSIDriver来使用本地存储 4. 创建一个volume type,设置 volu

OpenStack Cinder 块存储服务管理(七)

作者:李晓辉 联系方式: [email protected] 环境介绍 类型 控制节点和计算节点等在一起,形成all-in-one 内存 8G 硬盘 200G 网卡 2块 块存储服务概览 块存储服务(cinder)为实例提供块存储.存储的分配和消耗是由块存储驱动器,或者多后端配置的驱动器决定的.还有很多驱动程序可用:NAS/SAN,NFS,ISCSI,Ceph等. 典型情况下,块服务API和调度器服务运行在控制节点上.取决于使用的驱动,卷服务器可以运行在控制节点.计算节点或单独的存储节点. Op

OpenStack —— 块存储服务Cinder(六)

一.Cinder介绍 Cinder(Block Storage service)提供对volume从创建到删除整个生命周期的管理,从instance的角度看,挂载的每一个volume都是一块硬盘. OpenStack早起版本使用nova-volume为云平台虚拟机提供持久性块存储.从F版本后,就把最为Nova组成部分的nova-volume分离了出来,形成了独立的Cinder组件. 二.Cinder主要组件 1.cinder-api 负责接收和处理外界的API请求,通过消息队列服务调用cinde

【恒天云技术分享系列10】OpenStack块存储技术

原文:http://www.hengtianyun.com/download-show-id-101.html 块存储,简单来说就是提供了块设备存储的接口.用户需要把块存储卷附加到虚拟机(或者裸机)上后才可以与其交互.这些卷都是持久的,它们可以被从运行实例上解除或者重新附加而数据保持完整不变.OpenStack 中的实例是不能持久化的,需要挂载 volume,在 volume 中实现持久化.Cinder 就是提供对 volume 实际需要的存储块单元的实现管理功能. 1.单机块存储 1.1 LV

OpenStack搭建企业私有云 六: 块存储服务(持续更新...)

块存储服务概览 OpenStack块存储服务(cinder)为虚拟机添加持久的存储,块存储提供一个基础设施为了管理卷,以及和OpenStack计算服务交互,为实例提供卷.此服务也会激活管理卷的快照和卷类型的功能.?块存储服务(cinder)为实例提供块存储.存储的分配和消耗是由块存储驱动器,或者多后端配置的驱动器决定的.还有很多驱动程序可用:NAS/SAN,NFS,ISCSI,Ceph等. ?典型情况下,块服务API和调度器服务运行在控制节点上.取决于使用的驱动,卷服务器可以运行在控制节点.计算

磁盘工作原理、文件系统及i节点、块存储、文件存储、对象存储、DAS、NAS、还有SAN

(一)磁盘工作原理 一般硬盘正面贴有产品标签,主要包括厂家信息和产品信息,如商标.型号.序列号.生产日期.容量.参数和主从设置方法等.这些信息是正确使用硬盘的基本依据,下面将逐步介绍它们的含义. 硬盘主要由盘体.控制电路板和接口部件等组成,如图1-1所示.盘体是一个密封的腔体.硬盘的内部结构通常是指盘体的内部结构:控制电路板上主要有 硬盘BIOS.硬盘缓存(即CACHE)和主控制芯片等单元,如图1-2所示:硬盘接口包括电源插座.数据接口和主.从跳线,如图1-3所示. 图1-1 硬盘的外观 图1-

RDO单节点部署openstack (Havana)

OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作.OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单.可大规模扩展.丰富.标准统一的云计算管理平台.OpenStack通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成. OpenStack 是一个旨在为公共及私有云的建设与管理提供软件的开源项目.它的社区拥有超过130家企业及1350位开发者,这些机构与个人都将OpenStack作为基础设施即服务(简称I