K5でセキュリティを高めるための基本の設定である セキュリティグループ と合わせて、
ファイアーウォールにより不正アクセスなど不要な通信を明示的に拒否することで、
K5で構成したシステムのセキュリティを高めたいといった要求事項に対応するパターンです。
K5で提供されるセキュリティを高めるための2つの機能
K5では、セキュリティを高める機能として セキュリティグループ と ファイアーウォールが用意されています。
セキュリティグループは、アクセス制御ルールをあらかじめグルーピングし、そのグループ名を使用することで、
IPアドレスを意識せずアクセス制御設定を行うことができる機能です。
セキュリティグループ活用パターン に記載したとおり、
仮想サーバやロードバランサーを作成する時に、
グルーピングしたアクセス制御設定(=セキュリティグループ)を指定するだけで、
仮想サーバやロードバランサーの作成と同時にアクセス制御ができるようになります。
オートスケールで増設される仮想サーバに自動的にセキュリティグループを設定するといった使い方も可能です。
これに対して K5が提供するファイアーウォールでは、
セキュリティグループにはない機能として、
アクセス元やアクセス先等を明示して拒否する機能があります。
不正アクセスやサービス不能攻撃などに対しIPアドレス・ポートを使用して明示的に拒否したい場合には、
ファイアーウォールを設定することで特定の通信を拒否できるようになります。
セキュリティグループとファイアーウォールの指定方法の違いと使い分け
K5のセキュリティグループとファイアーウォールのルール指定方法の違いを以下に記載します。
項目 | セキュリティグループ | ファイアーウォール |
---|---|---|
設定する対象 | 仮想サーバやロードバランサー、 仮想サーバに付けられたポート (仮想サーバに付けられたポートといった文脈の場合は、 ポートは、OpenStack用語でいわゆるネットワークインターフェースを指す) | 仮想ルータ |
通信方向の指定 | セキュリティグループを適用するサーバ等に対する 受信(ingress)、送信(egress) | - |
通信相手の指定 | 通信相手のIP/CIDR、相手のセキュリティグループ名 | 送信元IP/CIDR、送信先IP/CIDR |
プロトコル、 ポート番号 | セキュリティグループを適用するサーバ等が オープンするポート番号 | 送信元ポート番号、送信先ポート番号 |
アクション | 許可のみ | 許可、拒否 |
判定 | どれか1つでもルールにマッチした通信は許可 | 優先順位にしたがってルールを判定し、 最初にマッチしたルールで許可、拒否 |
上記の違いにより、K5でセキュリティを高めるそれぞれの機能は、
という使い分けを推奨します。
推奨するセキュリティグループとファイアーウォールの併用パターン
そこで実装サンプルでは、使い分けの例として、セキュリティグループとファイアーウォールを併用した設定例を記載します。
(1) セキュリティグループ
以下の内容で設定します。
セキュリティグループの設定方法については、インターネット接続パターン に記載の手順を参照してください。
ルール | 方向 | オープン ポート | ポート | 接続先 | セキュリティグループ または CIDR | IPバージョン |
---|---|---|---|---|---|---|
カスタムTCPルール | 受信 | ポート | 80 | CIDR | 0.0.0.0/0 | IPv4 |
カスタムTCPルール | 送信 | ポート | 81 | セキュリティ グループ | SG_Web | IPv4 |
ルール | 方向 | オープン ポート | ポート | 接続先 | セキュリティグループ または CIDR | IPバージョン |
---|---|---|---|---|---|---|
カスタムTCPルール | 受信 | ポート | 81 | セキュリティ グループ | SG_LB | IPv4 |
(2) ファイアーウォール
以下の内容で設定します。
ロードバランサーや仮想サーバを配備した内部ネットワークのセグメントは "192.168.1.0/24" とします。
no | 名前 | プロトコル | IP 種別 | アクション | Src アドレス | Src ポート | Dest アドレス | Dest ポート |
---|---|---|---|---|---|---|---|---|
1 | http_ng | tcp | 4 | deny | xx.1.2.3/32 | null | null | null |
2 | http_ok | tcp | 4 | allow | null | null | 192.168.1.0/24 | 80 |
3 | all_ng | null | 4 | deny | null | null | null | null |
K5の仮想ルータで NATで付与したグローバルIPアドレスへのアクセス制限は、グローバルIPアドレスに対する元のプライベートIPアドレスの方に対して設定します。
上記の 構造 (イメージ図) の例の場合、ロードバランサーをインターネットに公開しているため、ロードバランサーにグローバルIPアドレスが付与されていますが、ファイアーウォールでアクセス制御を行う場合は、ロードバランサーのプライベートIPアドレスを使用します。
なおロードバランサーのIPアドレスは、無停止保守により、配備されたセグメントの範囲内で変わることがあります。(その場合、ロードバランサーのグローバルIPアドレスも変わります。)
そのため、ロードバランサーに対してファイアーウォールでアクセス制御する場合は、上記表の "http_ok" で定義した Dest アドレスのように、ロードバランサーを配備した内部ネットワークのセグメント "192.168.1.0/24" への送信に対して設定するようにします。
ロードバランサーに対してファイアーウォールでアクセス制御を行う場合は、上記のとおり、
ロードバランサーを設置するセグメントに対してアクセス制御を行います。
また、ロードバランサーは、Webサーバと同一のセグメントに配置する必要があります。
そのため、ロードバランサーの待ち受けポート番号とWebサーバの待ち受けポート番号を同一にしている場合で、
ファイアーウォールでロードバランサーの待ち受けポート番号を許可と設定すると、
ファイアーウォール上ではWebサーバの待ち受けポート番号が許可された状態になってしまいます。
Webサーバの待ち受けポート番号はセキュリティグループでアクセス制御されていますが、
Webサーバの待ち受けポート番号をロードバランサーと別にしておくことで、より安全性の高い状態になります。
このように、アクセス制御を多重化するという観点で、Webサーバの待ち受けポート番号は、
ロードバランサーの待ち受けポート番号とは別のポート番号とすることを推奨します。
以下の作業フローで、まず基本的な設定をした後、特定通信を拒否するルールを追加する手順を記載します。
(1) ファイアーウォールルールの作成
以下のAPIに、設定項目(json)を設定し、それぞれ実行してください。
(a) "http_ok" ルールの作成
項目 | 設定値 | 内容 |
---|---|---|
$NAME | "http_ok" | 任意の名称 |
$AC | "allow" | アクセス許可(allow)/拒否(deny) |
$DESTINATION_PORT | "80" | 送信先ポート番号 |
$PROTOCOL | "tcp" | tcp/udp/icmp |
$AVAILABILITY_ZONE | "jp-east-1a" | アベイラビリティゾーン名 |
(b) "all_ng" ルールの作成
項目 | 設定値 | 内容 |
---|---|---|
$NAME | "all_ng" | 任意の名称 |
$AC | "deny" | アクセス許可(allow)/拒否(deny) |
$AVAILABILITY_ZONE | "jp-east-1a" | アベイラビリティゾーン名 |
(2) ファイアーウォールポリシーの作成
作成したルールをもとに、ファイアーウォールポリシーを作成します。
設定した順に優先順位がつけられます。
項目 | 設定値 | 内容 |
---|---|---|
$NAME | "testfwp" | 任意の名称 |
$FWR1 | (生成されたID) | (a)のルール作成時に生成されたID |
$FWR2 | (生成されたID) | (b)のルール作成時に生成されたID |
$AVAILABILITY_ZONE | "jp-east-1a" | アベイラビリティゾーン名 |
(3) ファイアーウォールポリシーを仮想ルータに適用
作成しファイアーウォールポリシーを仮想ルータに適用します。
項目 | 設定値 | 内容 |
---|---|---|
$NAME | "testfw" | 任意の名称 |
$FWP | (生成されたID) | ファイアーウォールポリシー作成時に生成されたID |
$ROUTER_ID | (生成されたID) | ファイアーウォールポリシーを割り当てる仮想ルータのID |
$AVAILABILITY_ZONE | "jp-east-1a" | アベイラビリティゾーン名 |
(4) 追加するルールを作成
特定IPアドレスからの接続を拒否する "http_ng" ルールを作成します。
項目 | 設定値 | 内容 |
---|---|---|
$NAME | "http_ng" | 任意の名称 |
$AC | "deny" | アクセス許可(allow)/拒否(deny) |
$SOURCE_IP | "xx.1.2.3/32" | 送信元IPアドレス |
$PROTOCOL | "tcp" | tcp/udp/icmp |
$AVAILABILITY_ZONE | "jp-east-1a" | アベイラビリティゾーン名 |
(5) "http_ng" ルールをファイアーウォールポリシーに挿入
特定IPアドレスからの接続を拒否する "http_ng" ルールをファイアーウォールポリシーに挿入します。
項目 | 設定値 | 内容 |
---|---|---|
$FWP_ID | (生成されたID) | 挿入対象のファイアーウォールポリシーのID |
$FWR_ID | (生成されたID) | 作成した "http_ng" ルールのID |
$INSERT_AFTER | (生成されたID) | 後ろに挿入したい場合のルールID 本例の場合、設定なし |
$INSERT_BEFORE | (生成されたID) | 前に挿入したい場合のルールID 本例の場合、"http_ok" ルールのIDを設定 |
※INSERT_AFTERまたはINSERT_BEFOREは片方のみ指定で構いません。
どちらも空白の場合、最上位(一番上)に挿入されます。
どちらも指定された場合、INSERT_BEFOREが有効になりますが、
仕様が明確ではないため、確実に順序を指定したい場合、片方のみご指定ください。
本パターンを利用して、セキュリティグループとファイアーウォールを併用した場合のメリット・効果は以下の通りです。
K5 で提供する OpenStack ベースのファイアーウォール機能 や セキュリティグループ機能 は、
物理環境での構成と比較すると、仮想環境では以下のような機能配置のイメージになります。