9.2. 使用安全组和密钥对保护实例访问
安全组是一组 IP 过滤规则,它们控制网络和协议对实例的访问,如 ICMP,允许您 ping 实例,以及 SSH 允许您连接实例。安全组规则应用到项目中的所有实例。
所有项目都有一个名为 default 的默认安全组,当您没有为实例指定安全组时使用。默认情况下,默认安全组允许所有传出流量,并拒绝来自同一安全组中实例以外的任何来源的所有传入流量。您可以将规则添加到 default 安全组,也可以为项目创建新的安全组。您可以在实例创建过程中将一个或多个安全组应用到实例。要将安全组应用到正在运行的实例,请将该安全组应用到与实例连接的端口。
您无法在实例创建过程中将基于角色的访问控制 (RBAC) 共享安全组直接应用到实例。要将 RBAC 共享安全组应用到实例,您必须首先创建端口,将共享安全组应用到该端口,然后将该端口分配给实例。请参阅 添加安全组到端口。
密钥对是 SSH 或 x509 凭据,在实例启动时注入到实例中,以启用对实例的远程访问。您可以在 RHOSP 中创建新密钥对,或导入现有的密钥对。每个用户应至少有一个密钥对。密钥对可用于多个实例。
您无法在项目中的用户间共享密钥对,因为每个密钥对属于创建或导入密钥对的单独用户,而不是项目。
9.2.1. 创建安全组 复制链接链接已复制到粘贴板!
您可以创建新的安全组,以应用到项目中的实例和端口。
流程
可选: 要确保您所需的安全组尚不存在,请查看可用的安全组及其规则:
openstack security group list openstack security group rule list <sec_group>
$ openstack security group list $ openstack security group rule list <sec_group>Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
将 <
sec_group> 替换为您从可用安全组列表中检索的安全组的名称或 ID。
-
将 <
创建安全组:
openstack security group create mySecGroup
$ openstack security group create mySecGroupCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在您的安全组中添加规则:
openstack security group rule create --protocol <protocol> \ [--dst-port <port-range>] \ [--remote-ip <ip-address> | --remote-group <group>] \ [--ingress | --egress] mySecGroup
$ openstack security group rule create --protocol <protocol> \ [--dst-port <port-range>] \ [--remote-ip <ip-address> | --remote-group <group>] \ [--ingress | --egress] mySecGroupCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
<protocol> 替换为您要允许与您的实例通信的协议名称。 -
可选:将
<port-range> 替换为为协议打开的目标端口或端口范围。IP 协议 TCP、UDP 和 SCTP 是必需的。设置为-1以允许指定协议的所有端口。 -
可选: 您可以使用
--remote-ip指定远程 IP 地址块( or--remote-group) 来只允许从指定的 IP 地址访问,以指定该规则只适用于来自远程组的成员的接口的数据包。如果使用--remote-ip,请将 <ip-address> 替换为远程 IP 地址块。您可以使用 CIDR 表示法。如果使用--remote-group,请将 替换为现有安全组的名称或 ID。如果未指定选项,则允许访问所有地址,因为远程 IP 访问范围默认为 (IPv4 默认:0.0.0.0/0;IPv6 默认:::/0)。 -
指定协议规则应用到的网络流量的方向,可以是传入(
入口)或传出(egress)。如果没有指定,则默认为ingress。
-
将
重复步骤 3,直到您已经为要允许访问实例的所有协议创建了规则。以下示例创建了允许 SSH 连接到安全组
mySecGroup中的实例的规则:openstack security group rule create --protocol tcp \ --dst-port 22 mySecGroup
$ openstack security group rule create --protocol tcp \ --dst-port 22 mySecGroupCopy to Clipboard Copied! Toggle word wrap Toggle overflow
9.2.2. 更新安全组规则 复制链接链接已复制到粘贴板!
您可以更新您有权访问的任何安全组的规则。
流程
检索您要为其更新规则的安全组的名称或 ID:
openstack security group list
$ openstack security group listCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 确定您需要应用到安全组的规则。
在您的安全组中添加规则:
openstack security group rule create --protocol <protocol> \ [--dst-port <port-range>] \ [--remote-ip <ip-address> | --remote-group <group>] \ [--ingress | --egress] <group_name>
$ openstack security group rule create --protocol <protocol> \ [--dst-port <port-range>] \ [--remote-ip <ip-address> | --remote-group <group>] \ [--ingress | --egress] <group_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
<protocol> 替换为您要允许与您的实例通信的协议名称。 -
可选:将
<port-range> 替换为为协议打开的目标端口或端口范围。IP 协议 TCP、UDP 和 SCTP 是必需的。设置为-1以允许指定协议的所有端口。 -
可选: 您可以使用
--remote-ip指定远程 IP 地址块( or--remote-group) 来只允许从指定的 IP 地址访问,以指定该规则只适用于来自远程组的成员的接口的数据包。如果使用--remote-ip,请将 <ip-address> 替换为远程 IP 地址块。您可以使用 CIDR 表示法。如果使用--remote-group,请将 替换为现有安全组的名称或 ID。如果未指定选项,则允许访问所有地址,因为远程 IP 访问范围默认为 (IPv4 默认:0.0.0.0/0;IPv6 默认:::/0)。 -
指定协议规则应用到的网络流量的方向,可以是传入(
入口)或传出(egress)。如果没有指定,则默认为ingress。 -
使用您要将规则应用到的安全组的名称或 ID 替换
。
-
将
重复步骤 3,直到您已经为要允许访问实例的所有协议创建了规则。以下示例创建了允许 SSH 连接到安全组
mySecGroup中的实例的规则:openstack security group rule create --protocol tcp \ --dst-port 22 mySecGroup
$ openstack security group rule create --protocol tcp \ --dst-port 22 mySecGroupCopy to Clipboard Copied! Toggle word wrap Toggle overflow
9.2.3. 删除安全组规则 复制链接链接已复制到粘贴板!
您可以从安全组中删除规则。
流程
识别规则应用到的安全组:
openstack security group list
$ openstack security group listCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检索与安全组关联的规则 ID:
openstack security group show <sec-group>
$ openstack security group show <sec-group>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除规则或规则:
openstack security group rule delete <rule> [<rule> ...]
$ openstack security group rule delete <rule> [<rule> ...]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<rule> 替换为要删除的规则的 ID。您可以通过指定一个以空格分隔的规则 ID 列表来删除多个规则。
9.2.4. 将安全组添加到端口 复制链接链接已复制到粘贴板!
default 安全组应用于没有指定替代安全组的实例。您可以将替代安全组应用到正在运行的实例上的端口。
流程
确定您要将安全组应用到的实例上的端口:
openstack port list --server myInstancewithSSH
$ openstack port list --server myInstancewithSSHCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将安全组应用到端口:
openstack port set --security-group <sec_group> <port>
$ openstack port set --security-group <sec_group> <port>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 <
;sec_group> 替换为您要应用到正在运行的实例端口的安全组的名称或 ID。您可以根据需要多次使用--security-group选项应用多个安全组。
9.2.5. 从端口中删除安全组 复制链接链接已复制到粘贴板!
要从端口中删除安全组,首先需要删除所有安全组,然后重新添加您要分配给端口的安全组。
流程
列出与端口关联的所有安全组,并记录您要与端口关联的安全组 ID:
openstack port show <port>
$ openstack port show <port>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除与端口关联的所有安全组:
openstack port set --no-security-group <port>
$ openstack port set --no-security-group <port>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将安全组重新应用到端口:
openstack port set --security-group <sec_group> <port>
$ openstack port set --security-group <sec_group> <port>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 <
sec_group> 替换为您要重新应用到运行的实例的安全组的 ID。您可以根据需要多次使用--security-group选项应用多个安全组。
9.2.6. 删除安全组 复制链接链接已复制到粘贴板!
您可以删除没有与任何端口关联的安全组。
流程
检索您要删除的安全组的名称或 ID:
openstack security group list
$ openstack security group listCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检索可用端口的列表:
openstack port list
$ openstack port listCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查每个端口是否有关联的安全组:
openstack port show <port-uuid> -c security_group_ids
$ openstack port show <port-uuid> -c security_group_idsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您要删除的安全组与任何端口关联,您必须首先从端口中删除该安全组。如需更多信息 ,请参阅从端口中删除安全组。
删除安全组:
openstack security group delete <group> [<group> ...]
$ openstack security group delete <group> [<group> ...]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用您要删除的组的 ID 替换
。您可以通过指定一个以空格分隔的组的 ID 列表来删除多个组。
9.2.7. 生成一个新的 SSH 密钥对 复制链接链接已复制到粘贴板!
您可以创建一个新的 SSH 密钥对,以便在项目内使用。
使用 x509 证书为 Windows 实例创建密钥对。
流程
创建密钥对,并将私钥保存在您的本地
.ssh目录中:openstack keypair create <keypair> > ~/.ssh/<keypair>.pem
$ openstack keypair create <keypair> > ~/.ssh/<keypair>.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<keypair> 替换为新密钥对的名称。保护私钥:
chmod 600 ~/.ssh/<keypair>.pem
$ chmod 600 ~/.ssh/<keypair>.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow
9.2.8. 导入现有的 SSH 密钥对 复制链接链接已复制到粘贴板!
您可以在 Red Hat OpenStack Platform (RHOSP)外部创建的项目中导入 SSH 密钥,方法是在创建新密钥对时提供公钥文件。
流程
从现有密钥文件创建密钥对,并将私钥保存在本地
.ssh目录中:要从现有公钥文件导入密钥对,请输入以下命令:
openstack keypair create --public-key ~/.ssh/<public_key>.pub \ <keypair> > ~/.ssh/<keypair>.pem
$ openstack keypair create --public-key ~/.ssh/<public_key>.pub \ <keypair> > ~/.ssh/<keypair>.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
将 <
public_key> 替换为您要用来创建密钥对的公钥文件的名称。 -
将
<keypair> 替换为新密钥对的名称。
-
将 <
要从现有私钥文件导入密钥对,请输入以下命令:
openstack keypair create --private-key ~/.ssh/<private_key> \ <keypair> > ~/.ssh/<keypair>.pem
$ openstack keypair create --private-key ~/.ssh/<private_key> \ <keypair> > ~/.ssh/<keypair>.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
将 <
private_key> 替换为您要用来创建密钥对的公钥文件的名称。 -
将
<keypair> 替换为新密钥对的名称。
-
将 <
保护私钥:
chmod 600 ~/.ssh/<keypair>.pem
$ chmod 600 ~/.ssh/<keypair>.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow