Azure NSG設定の鉄則!ネットワークセキュリティグループで仮想マシンを守る方法
生徒
「Azure(アジュール)で仮想(かそう)マシンを作ったのですが、外部からの攻撃(こうげき)が心配です。どうやって守ればいいですか?」
先生
「それならAzure NSG、つまりネットワークセキュリティグループの設定が不可欠(ふかけつ)ですね。これは仮想マシンの門番(もんばん)のような役割を果たします。」
生徒
「門番ですか!難しそうですが、初心者(しょしんしゃ)でも設定できますか?」
先生
「はい、基本(きほん)となる鉄則(てっそく)さえ覚えれば大丈夫です。安全な通信(つうしん)制御のやり方を一緒に見ていきましょう!」
1. Azure NSG(ネットワークセキュリティグループ)とは?
Azure NSG(Network Security Group)とは、MicrosoftのクラウドサービスであるAzureにおいて、仮想ネットワーク内のリソースに対するネットワークトラフィック(通信の流れ)を制御するためのフィルター機能です。読み方はそのまま「エヌエスジー」と呼びます。簡単に言うと、家に入る人を確認する「インターホン付きの門」のようなものです。許可(きょか)された人だけを通し、怪しい人は追い返す役割を持っています。
このNSGを設定することで、Azure上のVirtual Machines(仮想マシン、VM)に対して、どのポート(通信の窓口)を開けるか、どのIPアドレス(ネット上の住所)からのアクセスを許すかを細かく決めることができます。サイバー攻撃からシステムを守るための第一歩として、非常に重要なセキュリティ対策(たいさく)となります。歴史的には、オンプレミス環境(自社でサーバーを持つ形態)でのファイアウォール(防火壁)の役割を、クラウド上で手軽に再現したものと言えるでしょう。
2. インバウンドとアウトバウンドの違いを理解する
NSGを設定する上で、まず覚えなければならないのが「方向(ほうこう)」です。通信には外から中へ入ってくるものと、中から外へ出ていくものの2種類があります。これを専門用語でインバウンドとアウトバウンドと呼びます。
- インバウンド(受信)規則:インターネットや他のネットワークから、あなたの仮想マシンへ入ってくる通信です。Webサイトを公開するなら、閲覧者(えつらんしゃ)からのアクセスを許可する必要があります。
- アウトバウンド(送信)規則:あなたの仮想マシンから、外の世界へ向かう通信です。OSのアップデートファイルをダウンロードする際などは、この通信が許可されている必要があります。
初心者のうちは、特に「インバウンド規則」の管理に集中しましょう。なぜなら、外からの不正な侵入(しんにゅう)を防ぐことがセキュリティの要(かなめ)だからです。デフォルトの状態では、安全のために多くの通信が遮断(しゃだん)されています。
3. 優先順位(プライオリティ)の仕組みと鉄則
NSGには「優先順位(ゆうせんじゅんい)」という数字の設定があります。100から4096までの数字で指定し、数値が小さいほど優先されます。これは、ルールのリストを上から順番にチェックしていき、条件に一致(いっち)した時点でその後のルールは見ない、という仕組みです。
鉄則として、「必要な通信だけを小さな数字で許可し、最後はすべて拒否(きょひ)する」という考え方が基本です。これを「ホワイトリスト形式」と呼びます。例えば、特定の管理用PCからのアクセスだけを優先度100で許可し、それ以外の全通信を優先度4000で拒否するといった具合です。ルールを詰め込みすぎると管理が大変になるため、100単位(100, 200, 300...)で設定しておくと、後からルールを追加しやすくなります。
4. 通信を許可する際に指定する4つの要素
NSGのルールを作る際には、必ず以下の4つの項目(こうもく)をセットで考えます。これらは「5タプル」と呼ばれることもありますが、初心者はまずこの4つを意識しましょう。
- ソース(送信元):どこからの通信か(特定のIPアドレスやタグ)。
- ソースポート:送信側のどの窓口から出るか(通常はすべてを意味する「*」でOK)。
- 宛先(あてさき):どこへの通信か(自分の仮想マシンのIPアドレスなど)。
- 宛先ポート:どの窓口に入るか(HTTPなら80、SSHなら22など)。
例えば、Linux(リナックス)サーバーに接続するためのSSH通信を許可する場合のイメージを、設定のデータ構造として見てみましょう。
Priority | Name | Port | Protocol | Source | Action
---------+---------------+------+----------+---------------+-------
100 | AllowSSH | 22 | TCP | 203.0.113.5 | Allow
110 | AllowHTTP | 80 | TCP | Any | Allow
65000 | DenyAllIn | Any | Any | Any | Deny
このように、特定の管理者のIPアドレス(203.0.113.5)からのみ22番ポートへのアクセスを許可し、Webサイト閲覧用の80番ポートは誰でも(Any)許可する、という設定になります。
5. SSHやRDPポートを「すべて許可」にしないこと
仮想マシンを操作するために使うSSH(ポート22)やRDP(リモートデスクトップ、ポート3389)は、非常に強力な権限(けんげん)を持ちます。これらを「Source: Any(すべて許可)」に設定することは、家の鍵を挿しっぱなしにして「誰でもどうぞ」と言っているのと同じで、大変危険(きけん)です。
世界中の攻撃者は、常にこれらのポートが開いているサーバーを探しています。もしパスワードが簡単であれば、数分で乗っ取られてしまうでしょう。必ず自分の会社のIPアドレスや、自宅の固定IPアドレスだけに絞(しぼ)って許可するようにしてください。もし固定IPがない場合は、Azureの「Just-In-Time(JIT)アクセス」という、必要な時だけポートを開ける高度な機能を使うのも一つの手です。
6. サービスタグを活用して管理を楽にする
IPアドレスを一つひとつ入力するのは大変ですし、相手がMicrosoftのサービスだった場合、IPアドレスが頻繁(ひんぱん)に変わることもあります。そこで便利なのが「サービスタグ」です。これは、特定のサービスに関連するIPアドレスのグループに名前をつけたものです。
例えば、「AzureCloud」というタグを指定すれば、Azureの全地域のデータセンターからの通信を一括で指定できます。また、「Internet」というタグを使えば、仮想ネットワーク外のすべての通信を指すことができます。これを使うことで、複雑なIPアドレスのリストを管理する手間が省け、設定ミスによるセキュリティホール(脆弱性、ぜいじゃくせい)を防ぐことができます。
7. Linuxサーバーでの通信確認コマンド
NSGの設定が正しく反映されているかを確認するには、実際に仮想マシンの中でコマンドを打ってみるのが一番です。Linuxの仮想マシンの場合、どのポートで通信を待ち受けているかを確認するコマンドを使います。
以下のコマンドを実行すると、現在サーバーが開いているポートの一覧が表示されます。NSGで許可していても、サーバー側でソフトが動いていなければ通信は成立(せいりつ)しません。
ss -ant
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 80 0.0.0.0:80 0.0.0.0:*
この結果から、22番(SSH)と80番(HTTP)のポートが「LISTEN(リッスン)」、つまり通信を待ち受けている状態であることがわかります。NSGの設定と、このサーバー内部の状態が一致していることが、正しいネットワーク運用の基本となります。
8. SQLデータベースへの接続制御例
次に、仮想マシンからデータベース(SQL Serverなど)へ接続する場合のNSG設定を考えてみましょう。通常、データベースのポート(1433など)は外部に公開せず、Webサーバーからの通信のみを許可するようにします。
まず、現在の仮想ネットワーク内のサーバー一覧をイメージしてください。
id | server_name | role | private_ip
---+-------------+------------+------------
1 | WEB-VM-01 | Web Server | 10.0.1.4
2 | WEB-VM-02 | Web Server | 10.0.1.5
3 | DB-VM-01 | Database | 10.0.2.4
このDB-VM-01を守るために、SQLの接続許可ルールを以下のようなSQL風のロジックで考えてみます(実際の設定はAzureポータルで行いますが、考え方は同じです)。
/* DBサーバー用の許可ルール案 */
SELECT permission
FROM nsg_rules
WHERE source_ip IN ('10.0.1.4', '10.0.1.5') -- Webサーバーのみ
AND destination_port = 1433 -- SQL Serverのポート
AND action = 'Allow';
このように、「誰が(Source)」「どこに(Destination)」アクセスしてよいかを明確に定義(ていぎ)することが、安全なシステム構築の鍵となります。無関係な場所からのアクセスを遮断することで、万が一Webサーバーが攻撃されても、データベースまで一気に被害が広がるのを防ぐ「多層防御(たそうぼうぎょ)」につながります。
9. NSG設定変更時の注意点とトラブルシューティング
設定を変更したのに通信ができない!という場面はよくあります。そんな時に確認すべきポイントをまとめました。ネットワークの世界では、一箇所のミスで道が閉ざされてしまいます。
- 適用の場所:NSGは「サブネット」と「ネットワークインターフェイス(NIC)」の両方に適用できます。両方にある場合、どちらか一方で拒否されていると通信できません。
- 既定のルール:NSGには削除できない「既定(きてい)のルール」があります。例えば、同じ仮想ネットワーク内の通信は標準で許可されています。
- 有効なセキュリティルール:Azureポータルの「サポートとトラブルシューティング」にある「有効なセキュリティルール」機能を使うと、実際にどのルールが適用されているか一目でわかります。
初心者がよくやる失敗は、宛先ポートを間違えることや、優先順位の数字を大きくしすぎて、上の「拒否ルール」に先に捕まってしまうことです。設定後は必ず、疎通(そつう)確認を行いましょう。例えば、WindowsのPowerShell(パワーシェル)を使って、特定のポートが開いているかチェックするコードは以下の通りです。
// C#やPowerShellでポートチェックを行う際の論理イメージ
using System.Net.Sockets;
try {
using (TcpClient client = new TcpClient()) {
client.Connect("あなたのサーバーIP", 80);
Console.WriteLine("接続成功:ポートは開いています。");
}
} catch {
Console.WriteLine("接続失敗:NSGまたはサーバー設定を確認してください。");
}
接続成功:ポートは開いています。
このように、ツールやプログラムを使って客観的(きゃっかんてき)に確認する癖(くせ)をつけると、ネットワーク管理の上達が早まります。Azure NSGは、正しく使えばあなたのクラウド資産を強力に守ってくれる盾(たて)となります。焦らず一つひとつ、ルールの意味を理解しながら設定していきましょう。
まとめ
アジュール(Azure)におけるネットワークセキュリティグループ(NSG)の設定は、クラウド環境の安全性を左右する極めて重要な要素です。仮想マシン(VM)を外部の脅威から守るためには、単にポートを開けるだけでなく、最小権限の原則に基づいた緻密なルール作りが求められます。本記事を通じて、インバウンドとアウトバウンドの通信方向の理解、優先順位(プライオリティ)の数値設計、そしてソースや宛先ポートといった基本構成要素の重要性を学んできました。
特に、SSH(22番ポート)やRDP(3389番ポート)といった管理用ポートを「すべて許可(Any)」に設定するリスクについては、初心者だけでなく実務者も常に意識すべき鉄則です。特定の固定IPアドレスに絞り込むことや、サービスタグを有効活用することで、運用の手間を減らしつつ強固なセキュリティを維持できます。また、ネットワークのトラブルが発生した際には、LinuxのコマンドやAzureポータルの診断機能を駆使して、どのルールが通信をブロックしているのかを冷静に切り分けるスキルも不可欠です。
NSG設定のチェックリスト
設定を完了する前に、以下の項目を再確認しましょう。これらは実際の現場でも頻繁に確認される「ベストプラクティス」の一部です。
- 優先順位は100単位で余裕を持って設定されているか
- 管理ポートのソースIPは特定の信頼できるアドレスに制限されているか
- 不要なインバウンド通信は、最後に「すべて拒否」するルールで遮断されているか
- サービスタグを使用して、Microsoftのサービスとの連携を簡素化できているか
- サブネットとNICの両方にNSGが適用されている場合、競合が発生していないか
これらの設定をプログラムやスクリプトで管理する場合の論理構造も見ておきましょう。例えば、C#を用いてNSGのルールが特定のポート(例:80番)を許可しているかを内部的に判定するロジックをシミュレーションすると、以下のようになります。
using System;
using System.Collections.Generic;
public class NsgRuleChecker
{
public string Name { get; set; }
public int Priority { get; set; }
public int Port { get; set; }
public string Access { get; set; }
public static void Main()
{
List<NsgRuleChecker> rules = new List<NsgRuleChecker>
{
new NsgRuleChecker { Name = "AllowHTTP", Priority = 100, Port = 80, Access = "Allow" },
new NsgRuleChecker { Name = "DenyAll", Priority = 65000, Port = 0, Access = "Deny" }
};
int targetPort = 80;
foreach (var rule in rules)
{
if (rule.Port == targetPort || rule.Port == 0)
{
Console.WriteLine("適用されるルール: " + rule.Name + " 結果: " + rule.Access);
break;
}
}
}
}
適用されるルール: AllowHTTP 結果: Allow
このように、プログラムの条件分岐と同じように、NSGも「上から順番に評価され、一致した時点で決定される」という性質を持っています。この基本原理さえ忘れなければ、複雑なネットワーク構成であっても迷わずに設定を行うことができるでしょう。
生徒
「先生、まとめを読んでNSGの重要性がさらによく分かりました。優先順位を100単位で空けておくのは、後からルールを差し込みやすくするためだったんですね。」
先生
「その通りです。運用が始まってから『100と101の間にルールを入れたい』となると大変ですからね。余裕を持った設計が未来の自分を助けます。他に気になった点はありますか?」
生徒
「SSHのポートをすべて許可にするのがどれだけ危険か、家の鍵の例えでゾッとしました。自分のPCのIPアドレスを確認して、ピンポイントで許可するように設定してみます。」
先生
「素晴らしい心がけです。ちなみに、データベースを守る設定についてはどう感じましたか?」
生徒
「はい、Webサーバーからだけの通信を許可するという『多層防御』の考え方が勉強になりました。テーブルの値で見たIPアドレスの指定方法も具体的で分かりやすかったです。」
id | server_name | allowed_source | status
---+-------------+----------------+---------
1 | DB-SERVER | 10.0.1.4 | Active
2 | DB-SERVER | 10.0.1.5 | Active
3 | DB-SERVER | 0.0.0.0/0 | Blocked
先生
「そのテーブル図のように、常に『誰を許可して誰をブロックするか』を整理しておくとミスが減りますよ。Linuxコマンドでのポート確認も忘れずに活用してくださいね。」
生徒
「はい!さっそく、仮想マシンの中でコマンドを打って、自分の設定が反映されているか確かめてみます。ありがとうございました!」
先生
「応援しています。セキュリティは一度設定して終わりではなく、定期的な見直しも大切ですから、またいつでも相談してくださいね。」