第3章 リソースの作成
3.3 セキュリティグループ設定
3.3.1 セキュリティグループ作成
セキュリティグループを用いると、仮想サーバに接続されたポートに対してパケットフィルタリング を行うため、ルール設定をグルーピングして定義および設定することができます。ここでは、セキュ リティグループを作成し、確認するまでの手順を解説します。
セキュリティグループには複数のルールを設定できます。1つのポートに設定されたセキュリティグ ループのうち、どれか1つでもルールにマッチしたパケットは通信が許可され、それ以外の通信は遮断 されます。(ホワイトリスト方式、OR条件)
注
セキュリティグループは、仮想ルータおよびDHCPサーバが持つポートには設定できません。
ポートには自動的に通信を遮断するデフォルトセキュリティグループが設定されています。そこで、
新たにセキュリティグループを作成し、必要に応じて通信を許可するルールを設定します。
1. 以下で、必要な設定を行います。
セキュリティグループはアベイラビリティゾーンに紐づかないため、指定は不要です。
$ SG_NAME=<新規セキュリティグループ名(任意)>
2. 次のAPIを実行します。
$ curl -Ss $NETWORK/v2.0/security-groups -X POST -H "X-Auth-Token: $OS_AUTH_TOKEN" \ -H "Content-Type: application/json" -d '{"security_group": {"name": "'$SG_NAME'"}}' | \ jq .
以下のレスポンスが返ります。
{
"security_group": {
"tenant_id": "<プロジェクトID>"
,
"description": "",
"name": "<新規セキュリティグループ名>", "security_group_rules": [
{
"remote_group_id": null, "direction": "egress", "remote_ip_prefix": null, "protocol": null,
"ethertype": "IPv6", "port_range_max": null,
"security_group_id": "<新規セキュリティグループID>", "port_range_min": null,
"tenant_id": "<プロジェクトID>",
"id": "<デフォルトのセキュリティグループルールID>"
}, {
"remote_group_id": null, "direction": "egress", "remote_ip_prefix": null, "protocol": null,
"ethertype": "IPv4", "port_range_max": null,
"security_group_id": "<新規セキュリティグループID>", "port_range_min": null,
"tenant_id": "<プロジェクトID>",
"id": "<デフォルトのセキュリティグループルールID>"
} ],
"id": "<新規セキュリティグループID>"
} }
3. 作成したセキュリティグループを確認するため、以下のAPIを実行します。
$ curl -Ss $NETWORK/v2.0/security-groups -X GET -H "X-Auth-Token: $OS_AUTH_TOKEN" | \ jq '.security_groups[]| .name, .description, .id'
以下のように、設定したセキュリティグループ名を含んだリストが出力された場合、作成は完了で す。
"default"
"default"
"<プロジェクトのデフォルトセキュリティグループID>"
...
"<新規作成したセキュリティグループ名>"
""
"<新規作成したセキュリティグループID>"
...
3.3.2 セキュリティグループルール作成
セキュリティグループにセキュリティグループルールを設定し、確認する手順を解説します。
ヒント
お互いにセキュリティグループが使える仮想サーバ同士の通信の場合、基本的に通信相手を セキュリティグループIDで指定することを推奨します。
ヒント
同じセキュリティグループが設定されている仮想サーバ同士の通信(自らに返ってくる通信も 含む)にも明示的にその通信を許可するルールが必要です。自分自身のセキュリティグルー プIDを指定することで解決します。
ヒント
ingressの場合は送信元、egressの場合は宛先のIPアドレスを指定します。
1. 以下で、必要な設定を行います。
$ DIRECTION=<通信の方向、ingress、 egress で指定>
$ PROTCOL=<通信プロトコルtcp、udp、icmp、0~65535で指定>
$ MIN_PORT_NUM=<最小ポート番号0~65535で指定>
$ MAX_PORT_NUM=<最大ポート番号 0~65535で指定>
$ SG_ID=<ルールを追加したいセキュリティグループのセキュリティグループID>
$ REMOTE_IP=<許可するIPアドレス「XXX.XXX.XXX.0/24」等>
もしくは
$ REMOTE_GROUP_ID=<許可するセキュリティグループID>
2. 次のAPIを実行します。
$ curl -Ss $NETWORK/v2.0/security-group-rules -X POST \
-H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" \ -d '{"security_group_rule": {"direction": "'$DIRECTION'",
"port_range_min": '$MIN_PORT_NUM', "port_range_max": '$MAX_PORT_NUM', "protocol": "'$PROTCOL'", "remote_ip_prefix": "'$REMOTE_IP'",
"security_group_id": "'$SG_ID'"}}' | jq . もしくは
$ curl -Ss $NETWORK/v2.0/security-group-rules -X POST \
-H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" \ -d '{"security_group_rule":{"direction": "'$DIRECTION'",
"port_range_min": '$MIN_PORT_NUM',"port_range_max": '$MAX_PORT_NUM', "protocol": "'$PROTCOL'","remote_group_id": "'$REMOTE_GROUP_ID'", "security_group_id": "'$SG_ID'"}}' | jq .
以下のレスポンスが返ります。
{
"security_group_rule": {
"remote_group_id": "<許可するセキュリティグループID>", "direction": "<通信の方向>",
"remote_ip_prefix": "<許可するIPアドレス>", "protocol": "<プロトコル>",
"tenant_id": "<プロジェクトID>", "port_range_max": <最大ポート番号>,
"security_group_id": "<ルールを追加したセキュリティグループID>", "port_range_min": <最小ポート番号>,
"ethertype": "IPv4",
"id": "<セキュリティグループルールID>", "availability_zone": null
} }
3. 設定したセキュリティグループルールを確認するため、以下のAPIを実行します。
$ curl -Ss $NETWORK/v2.0/security-group-rules -X GET -H "X-Auth-Token: $OS_AUTH_TOKEN" \ | jq .
以下のように、設定したセキュリティグループルールを含んだリストが出力された場合、作成は完 了です。
{
"security_group_rules": [
...
{
"remote_group_id": "<許可するセキュリティグループID>", "direction": "<通信の方向>",
"remote_ip_prefix": "<許可するIPアドレス>",
"protocol": "<プロトコル>", "tenant_id": "<プロジェクトID>", "port_range_max": <最大ポート番号>,
"security_group_id": "<ルールを追加したセキュリティグループID>", "port_range_min": <最小ポート番号>,
"ethertype": "IPv4",
"id": "<セキュリティグループルールID>", }
...
] }
3.3.3 セキュリティグループルールの設定例
目的別のセキュリティグループルールの設定例を示します。
以下の設定を行います。
• ingress : PING(ICMP:0 ~255)
• ingress : SSH(TCP:22)
• ingress : HTTP(TCP:80)
• ingress : HTTPS(TCP:443)
• ingress : NTP(UDP:123)
• ingress : KMS(TCP:1688)
• ingress : RDP(TCP:3389)
egressはデフォルト値を使用します。
ingress : PING(ICMP:0 ~255)
$ DIRECTION=ingress
$ PROTCOL=icmp
$ MIN_PORT_NUM=0
$ MAX_PORT_NUM=255
$ REMOTE_IP=<XXX.XXX.XXX.0/24>
もしくは
$ REMOTE_GROUP_ID=<セキュリティグループID>
$ SG_ID=<設定するセキュリティグループID>
ingress : SSH(TCP:22)
$ DIRECTION=ingress
$ PROTCOL=tcp
$ MIN_PORT_NUM=22
$ MAX_PORT_NUM=22
$ REMOTE_IP=<XXX.XXX.XXX.0/24>
もしくは
$ REMOTE_GROUP_ID=<セキュリティグループID>
$ SG_ID=<設定するセキュリティグループID>
ingress : HTTP(TCP:80)
$ DIRECTION=ingress
$ PROTCOL=tcp
$ MIN_PORT_NUM=80
$ MAX_PORT_NUM=80
$ REMOTE_IP=<XXX.XXX.XXX.0/24>
もしくは
$ REMOTE_GROUP_ID=<セキュリティグループID>
$ SG_ID=<設定するセキュリティグループID>
ingress : HTTPS(TCP:443)
$ DIRECTION=ingress
$ PROTCOL=tcp
$ MIN_PORT_NUM=443
$ MAX_PORT_NUM=443
$ REMOTE_IP=<XXX.XXX.XXX.0/24>
もしくは
$ REMOTE_GROUP_ID=<セキュリティグループID>
$ SG_ID=<設定するセキュリティグループID>
ingress : NTP(UDP:123)
$ DIRECTION=ingress
$ PROTCOL=udp
$ MIN_PORT_NUM=123
$ MAX_PORT_NUM=123
$ REMOTE_IP=<XXX.XXX.XXX.0/24>
もしくは
$ REMOTE_GROUP_ID=<セキュリティグループID>
$ SG_ID=<設定するセキュリティグループID>
ingress : KMS(TCP:1688)
$ DIRECTION=ingress
$ PROTCOL=tcp
$ MIN_PORT_NUM=1688
$ MAX_PORT_NUM=1688
$ REMOTE_IP=<XXX.XXX.XXX.0/24>
もしくは
$ REMOTE_GROUP_ID=<セキュリティグループID>
$ SG_ID=<設定するセキュリティグループID>
ingress : RDP(TCP:3389)
$ DIRECTION=ingress
$ PROTCOL=tcp
$ MIN_PORT_NUM=3389
$ MAX_PORT_NUM=3389
$ REMOTE_IP=<XXX.XXX.XXX.0/24>
もしくは
$ REMOTE_GROUP_ID=<セキュリティグループID>
$ SG_ID=<設定するセキュリティグループID>
その他の詳しい設定項目は機能説明書をご参照ください。
第 8 章