こんにちは!インフラやセキュリティの世界へようこそ。
新人のIT担当者さんや、アプリ開発は得意だけどインフラは少しドキドキしてしまう……という開発者の方に向けて、今回はクラウド時代の要塞である「セキュリティグループ(Security Group)」についてお話ししていきますね。
セキュリティって聞くと、「なんだか難しそう」「専門用語が多くて挫折しそう」と感じてしまうかもしれません。でも大丈夫です。実は、クラウドのセキュリティも、私たちが普段暮らしている「お家の防犯」と全く同じ考え方で紐解くことができるんです。
今回は、攻撃者がどこを狙ってくるのか、そしてどうやってそれを防げばいいのかを、一緒に一歩ずつ優しく学んでいきましょう!
—
1. 家の鍵と泥棒に学ぶ「セキュリティグループ」の基本
想像してみてください。あなたが新しく買ったマイホーム。この家には、外から自由に出入りできる玄関ドアがありますよね。
もし、この玄関の鍵が「誰でも開けられる状態」だったらどうでしょう? さらに、「夜中でも泥棒ウェルカム!」とばかりに、家のあちこちの窓が全開になっていたら……想像するだけでゾッとしますよね。泥棒(サイバー攻撃者)は、まさにそんな「鍵の空いた隙」を毎日世界中で手ぐすねを引いて探しています。
クラウドの世界における「家」がサーバーであり、その家全体を取り囲む「頑丈な門(ゲート)」の役割をするのがセキュリティグループです。
セキュリティグループでは、主に次の2つの門番を設定します。
- インバウンドルール(外から家に入ってくる通信の制限)
- アウトバウンドルール(家の中から外に出ていく通信の制限)
この門番たちに「どんな人(IPアドレス)なら通していいか」「どの扉(ポート)を通るなら許可するか」を厳しくルール決めしてあげるのが、要塞化の第一歩なんです。
—
2. 攻撃者が好む「やってはいけない設定」の罠
新米の頃や、急いで開発テストをしていると、ついやってしまいがちな「危険な設定」があります。それが、すべての通信を許可してしまう「ガバガバ設定」です。
例えば、次のようなルールを見たことはありませんか?
- プロトコル: すべて (All)
- ポート範囲: すべて (0-65535)
- ソース(送信元):
0.0.0.0/0
ここで登場する 0.0.0.0/0 という見慣れない記号、これはネットワークの世界では「地球上のすべての人、すべてのIPアドレスからのアクセスを許可する」という意味になります。つまり、家の鍵を開けっ放しにして、「どうぞ自由にお入りください」と看板を出しているようなものなんです。
攻撃者は、自動化されたボットプログラムを使って、この 0.0.0.0/0 が設定されているクラウド上のサーバーを常にスキャンしています。見つかったが最後、あっという間にサーバーを乗っ取られ、勝手に仮想通貨をマイニングされたり、スパムメールの踏み台にされてしまったりするのです。
—
3. 最小権限の原則と「ステートフル」という賢い仕組み
では、どうやって家を守ればいいのでしょうか? ここで大切になるのが、セキュリティの世界の合言葉である「最小権限の原則(The Principle of Least Privilege)」です。
最小権限の原則とは、簡単に言えば「必要な人に、必要な場所だけ、最小限の期間だけアクセスを許可する」というルールです。
CIDR制限とポート制限で「通り道」を絞る
例えば、Webサーバー(HTTP/HTTPS)を一般公開する場合、世界中の誰もがWebサイトを見る必要があるので、Web用のポート(80 や 443)だけは開ける必要があります。しかし、サーバーの中身をいじるためのリモート管理用ポート(例えばSSHの 22 番ポートや、WindowsのRDPの 3389 番ポート)まで世界中に公開する必要はあるでしょうか?
答えは「絶対ノー」ですよね。管理用のポートは、あなたの会社のオフィスや、あなた自身の自宅のIPアドレス(例: 203.0.113.50/32 のように特定の1つのIPに絞る)からしかアクセスできないように制限すべきです。
クラウドの門番は「ステートフル」
もう一つ、クラウドのセキュリティグループを語る上で欠かせないのが「ステートフル(Stateful)」という性質です。
これは難しく考える必要はありません。門番の「記憶力」のことです。
- インバウンド(行き): あなたのパソコンから「このWebページを見せてください」とサーバーにリクエストを送ります。門番はこれを許可します。
- アウトバウンド(帰り): サーバーが「はい、これがそのページですよ」と返事をするとき、アウトバウンド側のルールをわざわざ個別に書かなくても、門番が「あ、さっきの通信の返事だな」と覚えていて、自動的に通してくれる仕組みのことです。
このステートフルな性質のおかげで、私たちは複雑なルール設定に頭を悩ませずに済むようになっています。
—
4. 実践!AWSセキュリティグループの安全な設定例
それでは、実際にクラウド(AWSのTerraformやCloudFormationをイメージしてください)で、安全な最小権限のルールを設定するコード例を見てみましょう。
今回は、セキュアなWebサーバーを守るための模範的な設定をコードで表現します。
# セキュリティグループの定義(Webサーバー用)
resource "aws_security_group" "web_server_sg" {
name = "web-server-hardened-sg"
description = "Minimal privilege security group for production web servers"
vpc_id = aws_vpc.main.id
# ==========================================
# インバウンドルール(外からのアクセス)
# ==========================================
# 1. HTTP(ポート80): 世界中からのアクセスを許可(Webサイト公開のため)
ingress {
description = "Allow HTTP from anywhere for public web traffic"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # Web公開なのでここは例外的に許可
}
# 2. HTTPS(ポート443): 世界中からの暗号化通信を許可
ingress {
description = "Allow HTTPS from anywhere for secure web traffic"
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
# 3. SSH(ポート22): 管理用!会社の固定IP(例: 203.0.113.50)からのみ許可
# ※絶対にお手元の環境に合わせて書き換えてください。「0.0.0.0/0」には絶対にしないこと!
ingress {
description = "Allow SSH administration strictly from company office IP"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["203.0.113.50/32"]
}
# ==========================================
# アウトバウンドルール(中からの外へのアクセス)
# ==========================================
# 通常、OSのアップデートや外部API通信のために全方向への通信を許可しつつ、
# より厳格な環境では信頼できるドメインやIPだけに絞ることもあります。
egress {
description = "Allow all outbound traffic for OS updates and API calls"
from_port = 0
to_port = 0
protocol = "-1" # すべてのプロトコルを意味します
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "Web-Server-SG"
}
}
このコードのポイントは、SSH(ポート22)の送信元(cidr_blocks)に、世界中を意味する 0.0.0.0/0 ではなく、特定の信頼できるIPアドレス(203.0.113.50/32)を指定している点です。これだけで、不正アクセスのリスクを劇的に減らすことができます。
—
5. まとめ:今日からできる第一歩
セキュリティ対策は、一度やったら終わりではなく、日々の積み重ねがとても大切です。最後に、今日から実践できるポイントを振り返っておきましょう。
1. 「とりあえず全開放(0.0.0.0/0)」の癖を直す
- 開発やテストであっても、不要なポートや送信元を全開放しない習慣をつけましょう。
2. 管理用ポート(SSHやRDP)は厳重にロックする
- 自分のIPアドレスや踏み台サーバー(バステスチョン)経由でのみアクセスできるようにCIDRを絞りましょう。
3. 定期的にセキュリティグループの棚卸しをする
- 「昔作ったけれど、もう使っていない古いテスト用の開放ルール」が放置されていないか、定期的に見直すことが最高の防御につながります。
最初は難しく感じるかもしれませんが、一つひとつのポートやIPアドレスの意味が分かってくると、パズルを解くようにインフラを守る楽しさがわかってきますよ。
一歩ずつ、確実にセキュアなシステムを作っていきましょう!応援しています!
コメント