九 OpenStack安全组与外部网络

(本文所有提及OSP=OpenStack Platform)

1 管理外部网络

1)OpenStack网络:

  • OpenStack网络服务(代号Neutron)是 OpenStack 的网络框架。使用基于插件的架构
  • 管理员可以通过创建和配置网络、子网、虚拟设备和网络路由来部署复杂网络拓扑
  • 原始的OpenStack 网络实施(代号Nova)的 网络隔离通过利用VLAN和Netfilter来进行。Neutron 网络服务使用插件来提供可插拔式API后端。可以针对各种不同的供应商技术来编写插件。Neutron 网络服务插件支持VLAN,以及L2-in-L3 隧道和OpenFlow 等

  • OpenStack中的子网: OpenStack实例分配到子网中,以允许网络连接。为预先存在的网络配置子网。每个项目可以具有一个或多个子网,在使用同一网络的不同系统之间实现网络隔离

  • 项目网络:OpenStack中的项目能够访问各种不同的网络类型,例如VLAN分隔,其中的每个网络使用一个唯一的VLAN标识符。项目还可使用虚拟可扩展局域网(VXLAN) 或GRE隧道VXLAN是一种网络虚拟化技术,它可以解决与大型云计算部署相关的扩展问题。它将扩展能力增加到最多1600万个逻辑网络,并允许在IP网络间的第2层邻接VXLAN用以封装第2层网络并将它们作为第3层网络上的隧道

  • 外部网络:允许实例访问其专用网络范围以外的网络,如互联网。这种类型的网络默认使用网络地址转换(NAT)。 若要使流量能够到达实例,管理员必须为每种流量类型(如SSH或ICMP)创建安全规则。此外,还需要关联一个浮动IP到该实例。在OpenStack中,外部网络是可以在多个项目之间共享的特殊网络类型。外部路由受NeutronL3 代理管理,后者提供第3层路由和NAT转发

  • 网络命名空间:RHEL7内核支持网络命名空间。网络命名空间通过虚拟化对端口和接口等网络资源的访问,覆盖具有抽象层的网络访问。ip命令和ip route命令都可用于查询网络命名空间中的资源

2)实例创建时的联网工作流:

  1. 在创建实例时,Nova 计算服务从Neutron API 查询必要的资源,如网络端口。Neutron 网络服务随后请求分配一个IP地址。此类请求由NeutronDHCP服务管理,该服务利用dnsmasq服务。dnsmasq 从地址池中返回一个可用IP地址
  2. 为新实例分配了IP地址后,OpenStack 网络服务请求Open vSwitch 设置必要的网络端口,从而将实例连接到子网
  3. 可选择路由器并加入到网络环境中,为实例提供外部访问。OpenStack 创建一系列Netfilter 规则来配置网络路由

3)利用Horizon 控制面板管理外部网络:

  1. 以管理员用户身份登录Horizon 控制面板, 再导航到Network > Networks
  2. 单击+Create Network 以创建新网络。为网络命名,再单击Next
  3. 在Subnet 选项卡中,使用CIDR表示法输入子网名称和子网范围,然后单击Next
  4. 选择是否要为网络启用DHCP服务,再输入用作分配池的范围

4)利用命令行界面管理外部网络:

  1. 提供项目的管理员用户的Keystone 凭据。
  2. 通过openstack network create命令创建网络。将网络创建为外部共享网络。注明物理网络提供商名称和网络提供商类型。
  3. 提供普通用户的Keystone 凭据。
  4. 使用openstack subnet create命令为网络创建一个子网。确保该子网属于能够从外部访问的范围。
  5. 使用 ovs-vsctl 命令检查网桥及其端口。
  6. 网络配置文件/etc/sysconfig/network-scripts/ifcfg-br-ex包含Open vSwitch网桥的网络定义。网络配置文件/etc/sysconfig/network- scripts/ifcfg-eth0包含封装到OpenvSwitch 网桥的网络端口的网络定义

2 OpenStack路由器

1) 在OpenStack中实施路由器:

  • 若要让实例与任何外部子网通信,必须部署路由器
  • OSP通过软件定义型网络(SDN)提供这种路由功能。基于SDN的虚拟路由器与物理路由器相似,要求每个接口一个子网路由器收到的流量将路由器的默认网关用作下一个跃点虚拟网桥将流量路由到外部网络
  • 在OpenStack中,路由器拥有的接口数量与它们需要为其路由流量的子网数量相同
  • 创建路由器时,Neutron 服务会在虚拟路由器的网络命名空间内创建一组新的路由规则
  • 路由仅存在于网络命名空间内
    ip netns exec qrouter-UUID route

2) 使用Horizon 控制面板管理路由器:

  1. 登录Horizon 控制面板。在Project 选项卡中,导航到Network > Routers
  2. 单击>CreateRouter以创建新路由器。为路由器命名,再单击Create
  3. Router单击路由器的名称,以访问其详细信息。单击Interfaces选项卡,以管理该路由器的接口
  4. 单击+ Add Interface以添加新接口。从Subnet子网列表中选择并单击Submit, 将路由器连接到一个子网
  5. 单击各个条目的Delete Interface, 断开路由器与子网的连接
  6. 单击Set Gateway 以定义路由器的网关。从External Network 列表中,选择一个外部网络,再单击Submit
  7. 从Routers选项卡中,单击Clear Gateway来删除网关。从路由器关联的下拉菜单中,单击Delete Router以删除该路由器

3)使用命令行界面管理路由器:

  1. 若要创建路由器,可提供用户的Keystone 凭据文件,再运行openstack router create命令
  2. 若要将路由器连接到专用网络,可运行openstack router add subnet 命令
  3. 若要将路由器定义为外部网络的网关,可运行neutron router-gateway-set命令
  4. 要从路由器删除接口,可运行neutron router-interface -delete
  5. 若要移除作为子网网关的路由器,可运行neutron router. gateway-clear 命令
  6. 若要删除路由器,可运行openstack router delete命令

3 浮动IP

1)浮动IP地址:

在OpenStack术语中,浮动IP是从外部网络地址池中分配的IP地址
浮动IP用于实现从外部网络到实例的通信。管理员可以在实例启动后为它关联浮动IP地址
默认情况下,项目的浮动IP数限值为50。当浮动IP被取消关联后,它在为外部网络分配的浮动IP池中变为可用,可以连接到其他实例

2)在OpenStack 中管理浮动IP :

在OpenStack中,管理员用户可以分配特定的浮动IP,非管理员用户则只能查询随机分配的浮动IP
OpenStack读取在创建子网时指定的分配池,来确定要分配的浮动IP
OpenStack网络服务使用内部数据库来维护可用和已分配浮动IP的状态

3)利用Horizon 控制面板管理浮动IP :

  1. 登录Horizon 控制面板,再导航到Compute > Access & Security。单击FloatingIPs选项卡,再单击Allocate IP To Project。选择Pool 作为外部网络,再单击AllocateIP
  2. 若要管理分配给实例的浮动IP, 可单击浮动IP地址所在行上的Associate。出现ManageFloating IP Associations窗口时,从Port to be associated列表选择连接到该实例的网络端口。单击Associate
  3. 若要从实例取消关联浮动IP, 可导航到Compute > Instances。单击实例所在行上Create Snapshot按钮旁边的箭头,再选择Disassociate FloatingIP。出现ConfirmDisassociate FloatingIP窗口时,单击Disassociate FloatingIP
  4. 若要从项目释放浮动IP, 可单击Access & Security选项卡。单击浮动IP所在行上Associate 按钮旁边的箭头,再选择Release FloatingIP使浮动IP返回到池中。出现Confirm Release FloatingIP窗口时,单击ReleaseFloating IP

4)利用命令行界面管理浮动IP :

  1. 若要从外部网络创建特定的浮动IP, 可提供管理员凭据文件并运行openstack floating ip create --floating-ip-address IP extermal-network命令
  2. 若要创建浮动IP但不指定地址,可提供非管理员用户的凭据文件,再运行openstack floating ip create external-network命令
  3. 若要将浮动IP地址关联到实例,可运行openstack server add floating ip IP instance 命令

5)检查浮动IP实施:

  1. 运行ip netns list 命令以列出网络命名空间,再定位到路由器命名空间,它以qrouter-开头,后接路由器的UUID。
  2. 运行ip netns exec qrouter-UUID ipa命令,以列出命名空间中存在的所有IP地址。找到名为qg-UUID 的接口,浮动IP被分配到此接口
  3. 运行ip netns exec qrouter-UUID iptables -L -nv -t nat | grep floating_IP命令,以列出所有Netfilter 规则,这些规则管理从浮动IP 到实例所分配的专用IP的路由

4 安全性

1)密钥对简介:

  • SSH密钥对是一种不使用帐户密码、通过SSH协议连接远程服务器的安全且可信的方式
  • SSH密钥始终成对出现,即一个私钥和一个公钥
  • 私钥通常存储在~/.ssh/id_ KEY TYPE下,公钥则存储在~/.ssh/id_KEYTYPE.pub下
  • KEY TYPE是加密算法,如RSA或DSA。最常用的默认加密类型是RSA,所以密钥将会命名为id_rsa和id_rsa.pub
  • 私钥必须在本地计算机上通过严格的访问规则来加以保护
  • 用户无法更新私钥或公钥,用户一旦丢失私钥或公钥,便无法恢复,唯一的解决办法是创建新的密钥对

2)在OpenStack中实施密钥对:

  • OpenStack提供生成密钥对和导入现有密钥对的功能
  • 生成密钥后, 公钥存储在数据库中,而私钥则不存储, 因为未经授权访问数据库会破坏密钥的完整性和安全性
  • 在生成了密钥对后, 用户可以使用它来连接实例。用户将公钥导入OpenStack时,它会存储在Nova数据库中。导入公钥假设用户已持有与该公钥关联的私钥。根据镜像的配置方式,若无密钥对,可能无法连接实例

3)访问实例:

  • 如果用户希望使用密钥对连接他们的实例,实例必须已配置为支持此类系统。
  • 这种配置在模板创建过程中完成,该过程包括:
  • 确保SSH服务器已经安装(由openssh-server 软件包提供),并配置为支持SSH密钥身份验证。
  • 确保实例可由Nova 计算服务配置,它会将公钥注入到实例中。此类操作依赖于cloud-init软件,该软件可执行系统的初始配置,如自定义主机名、创建用户和注入SSH公钥等
  • 当用户生成实例时,需要使用--key-name KEY NAME指定密钥#ssh-i PRIVATE-KEY USER@IP

4)安全组简介:

  • OpenStack利用安全组来提供来自实例和对实例的访问控制
  • 安全组是高级访问控制规则, 定义哪些网络或协议有权访问实例安全组由IP规则组成,这些规则以项目为基础
  • 项目成员可以编辑其群组的默认规则,也可添加新的规则集,这些规则集称为安全组
  • 所有项目都有一个名为default 的默认安全组,如果用户在创建新实例时不指定安全组, 就会使用这个安全组
  • 当前项目的安全组可以从Horizon 控制面板的Access & Security选项卡下访问
  • 若要访问安全组的详细信息,管理员可以为给定的安全组选择ManageRules操作。还可以通过单击Create Security Group从同一窗口创建新的安全组

5)防火墙与安全组的区别:

  • OpenStack中的安全组默认使用Netfilter 软件来管理安全规则。Netfilter 分析并检查数据包,从而确定应当如何处理它们
  • 安全组规则的语法要比iptables 语法简单。下方演示了使用openstack 和 iptables命令创建规则:
    • iptables-I INPUT 5 -ieth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
    • openstack security group rule create --protocol tcp --dst-port 80 security group
  • 安全规则在项目基础.上进行管理,而Netfilter 规则应用到整个系统或在命名空间基础.上应用
  • Horizon控制面板提供了用于管理安全规则的图形用户界面;如果管理员想要使用图形用户界面来管理Netfilter规则,则需要安装额外的软件,如Firestarter或Firewall Builder
  • Horizon控制面板提供- -组适用于基本服务的预配置规则,如HTTP或SSH访问
  • 普通用户可以管理OpenStack 安全组规则。Netfiter 需要管理特权

6)管理安全组:

  • 添加新安全组时,操作员必须为安全组设置一个描述性名称
  • 使用清楚的描述可以更容易对安全组规则进行故障排除。下表列出了使用
  • openstackcli在OpenStack 中管理安全组的一些可用操作

7)使用Horizon 控制面板管理密钥对:

  1. 登录Horizon 控制面板,再导航到Project > Compute > Access & Security。单击KeyPairs 选项卡, 以管理密钥对
  2. 单击+Create Key Pair。 出现Create Key Pair窗口时,输入密钥对的名称。单击Create Key Pair,以生成公钥和私钥。
  3. 下一屏幕中会显示一条消息,并且自动发起私钥下载。同时也提供用于重新生成私钥的链接私钥保存在用户的Downloads 目录中
  4. 在能够使用该私钥前,需要对它进行保护。使用600,运行chmod 命令,以设置密钥上的正确特权
  5. 若 要使用该私钥连接实例,可使用ssh 命令及-i标志。将私钥路径作为参数传递
  6. 若要删除密钥对,可单击Access & Security。 在需要删除的密钥对所在的行中,单击Delete Key Pair。出现Confirm Delete Key Pair窗口时,单击Delete Key Pair来确认删除

8)使用命令行界面管理密钥对:

  1. 提供用户的Keystone 凭据,再运行openstack keypair create
  2. key_ pair_ name >private_ key_ path 命令。private_ key_ path 表示路径,如/home/student/keys/private-key.pem2. 使用chmod 命令及模式600来保护私钥
  3. 若要使用该私钥连接实例,可使用ssh 命令及-i标志。将私钥路径作为参数传递
  4. 若要 删除密钥对,可运行openstack keypair delete key_ pair_name命令,然后运行rm命令来删除私钥

9)使用Horizon 控制面板管理安全组:

  1. 登录Horizon 控制面板,再导航到Project > Compute > Access & Security。单击Security Groups选项卡,以管理安全组。
  2. 若要创建新安全组,可单击+ Create Security Group。 输入安全组的名称,再选择性地输入描述。单击Create Security Group,以确认创建该安全组。
  3. 若要为该组定义规则,可单击安全组旁边的Manage Rules。 窗口中列出四条安全规则:*允许所有IPv4传出流量
    • 允许所有IPv6 传出流量。
    • 允许组内实例间的所有IPv4 流量。
    • 允许组内实例间的所有IPv6 流量。

单击+ Add Rule, 为该安全组定义一条新规则。出现Add Rule窗口时,从Rule列表中选择一条规则。从Remote列表中选择远程网络。也可以在CIDR字段中指定一个值,以进一步限制访问。单击Add以创建该规则。
4. 如果已经添加了HTTP等规则,可打开Web浏览器并通过浮动IP访问实例。确认网页显示出来
5. 若要删除规则, 可单击规则行中的Delete Rule。出现Confirm Delete Rule窗口时,单击Delete Rule
6. 若要删除安全组,可单击Access & Security 链接以返回到安全组列表。选中需要删除的安全组旁边的复选框。这可激活按钮Delete Security Groups。单击该按钮。出现ConfirmDelete Security Groups窗口时,单击DeleteSecurity Groups来确认删除

10)使用命令行界面管理安全组:

  1. 提供用户的Keystone 凭据,再运行openstack security group create security_group 命令
  2. 若要在安全组中创建新规则,可运行openstack security group rule create --protocol protocol --dst-port port security_ group命令。–protocol 接受三个值:TCP、UDP和ICMP。 如果指定了ICMP, 则–src-port 和–dst-port 标志不受支持
  3. 如果已经添加了openstack security group rule create --protocol TCP --dst-port 22 security_ group等规则, 可使用ssh命令连接实例。确认连接成功
  4. 若要删除安全组中的规则,可运行openstack security group rule list security_ group命 令来列出组中的所有规则。复制需要删除的规则的UUID,再运行openstack security group rule delete UUID命令
  5. 若要删除安全组,可运行openstack security group delete security_group 命令

你可能感兴趣的:(OpenStack)