こんにちは!インフラやクラウドのセキュリティの世界へようこそ。
初めてクラウドを触る時、「VPCってなに?サブネット?パブリックとプライベートってどう違うの?」と、頭がクラクラしてしまいますよね。
大丈夫です、一歩ずつ一緒に紐解いていきましょう!
今回は、クラウド(AWSなどのVPC環境)における「ゼロトラストネットワークの境界定義とサブネット分離」というテーマについて、私たちの身近な「お家の防犯」に例えながら、優しく、そして現場のプロならではの視点でお話ししていきますね。
—
1. クラウドのネットワーク設計は「大きなお家」の防犯と同じ
突然ですが、みなさんが住んでいるお家を想像してみてください。
お家には、宅配便の配達員さんが気軽に入ってくる「玄関」がありますよね。この玄関は、誰もが外から歩いてたどり着ける場所です。
一方で、ご家族がゆっくりくつろぐ「寝室」や「リビングの奥」、あるいは大事な通帳をしまっている「金庫室」はどうでしょうか?
泥棒が玄関から入ってきたとしても、すぐに金庫室にたどり着いちゃったら大問題ですよね。だから、廊下に鍵付きのドアをつけたり、簡単に侵入できないような工夫をしますよね。
クラウドのネットワーク(VPC)も、これとまったく同じなんです。
- パブリックサブネット = 誰でも来られる「玄関」
- インターネットの世界から直接アクセスできる場所です。Webサーバーなど、一般のお客さまに見てもらうシステムを置きます。
- プライベートサブネット = 家族だけが入れる「奥の部屋や金庫室」
- インターネットからは直接見えない、隠された安全な部屋です。データベースや、社内の機密データを扱うサーバーを置きます。
「ゼロトラスト(何も信じない)」というセキュリティの考え方は、まさにこのお家の防犯そのもの。「玄関の鍵を閉めておけば中安全でしょ」ではなく、「たとえ玄関から誰かが侵入しても、奥の部屋には絶対にたどり着けないように鉄板のドアと鍵を用意する」というアプローチになります。
—
2. 攻撃者はどこを狙う?「踏み台」にされる恐怖
もし、パブリックサブネットに置いたWebサーバーのプログラムにバグ(脆弱性)があったとします。
悪いハッカー(泥棒)は、その小さな隙をついてWebサーバーの乗っ取りを試みます。
ここでサブネットの分離ができていない(すべてが同じ平屋の部屋のように繋がっている)とどうなるでしょうか?
ハッカーはWebサーバーという「玄関」を乗っ取りに成功した瞬間、同じネットワーク上にあるデータベース(金庫室)へ、ノーチェックで侵入できてしまいます。これが、実際のイン現場で恐れられている「踏み台攻撃」のメカニズムです。
だからこそ、「パブリックサブネット(Web)」と「プライベートサブネット(DB)」を完全に切り離すことが、クラウド要塞化の第一歩になるのです。
—
3. プライベートサブネットから「外」と通信する仕組み:NATゲートウェイ
ここで、新人エンジニアの皆さんからよくこんな質問をいただきます。
> 「プライベートサブネットが完全な安全地帯(ネットから隔離された部屋)なのは分かったけど、中のサーバーがOSのアップデートとかでインターネット上のプログラムをダウンロードしたい時はどうするんですか?」
とても鋭い質問ですね!
お家の奥の部屋にこもっている子供が、外に手紙を出したい時を想像してください。子供が直接外に出るのではなく、「信頼できる執事(NATゲートウェイ)」に手紙を託して、執事が代わりに外へ出しに行って、返事を受け取って部屋まで持ってきてくれますよね。
クラウドでもまったく同じ仕組みを使います。
プライベートサブネットにあるサーバーは、自分からは外のインターネットへ直接出ていけませんが、NATゲートウェイという中継地点をとおることで、「自分からのアウトバウンド(外向き)通信だけ」を安全に行うことができるのです。
これにより、「外からの侵入は完全に遮断しつつ、こちらからの必要なアップデート通信だけは許可する」という、堅牢な環境が完成します。
—
4. 実践!Terraformで学ぶセキュアなVPC設計コード
それでは、実務でそのまま使える、セキュアなVPCとサブネット分離のコード例(Terraform)を見てみましょう。
コード内の日本語コメントを読みながら、構成のイメージを膨らませてみてくださいね。
# 1. VPC(お家の敷地全体)の作成
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true
tags = {
Name = "my-secure-vpc"
}
}
# 2. パブリックサブネット(誰もが訪れる「玄関」)の作成
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-1a"
map_public_ip_on_launch = true # 外から見えるIPを自動付与
tags = {
Name = "public-subnet-玄関"
}
}
# 3. プライベートサブネット(誰もが入れない「金庫室」)の作成
resource "aws_subnet" "private" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.100.0/24"
availability_zone = "ap-northeast-1a"
tags = {
Name = "private-subnet-金庫室"
}
}
# 4. 弾力IP(NATゲートウェイ用の固定住所)の確保
resource "aws_eip" "nat" {
domain = "vpc"
depends_on = [aws_internet_gateway.gw]
tags = {
Name = "nat-gateway-eip"
}
}
# 5. インターネットゲートウェイ(外の世界への出入り口)
resource "aws_internet_gateway" "gw" {
vpc_id = aws_vpc.main.id
tags = {
Name = "main-igw"
}
}
# 6. NATゲートウェイ(安全に外へ荷物を出し入れする執事役)の配置
# ※NATゲートウェイは必ず「パブリックサブネット」に置きます!
resource "aws_nat_gateway" "nat" {
allocation_id = aws_eip.nat.id
subnet_id = aws_subnet.public.id
tags = {
Name = "secure-nat-gateway"
}
}
設定のポイント
上記のコードで非常に重要なポイントは、「NATゲートウェイ自体はパブリックサブネットに配置する」という点です。
プライベートサブネット側のサーバーは、このパブリックサブネットにある執事(NAT)を頼って、安全に外の世界と通信します。泥棒がプライベートサブネットへ直接侵入するルートは、この設計によって完全に断たれます。
—
5. まとめ:一歩ずつ、堅牢なインフラを作ろう
いかがでしたでしょうか?
「VPCのサブネット分離」や「ゼロトラストな境界定義」と聞くと、難解な呪文のように聞こえますが、要するに「お家の防犯と同じように、アクセスされる場所と守るべき場所をしっかり部屋分けして、ドアに鍵をかけること」です。
現場のインフラエンジニアやセキュリティ担当者は、常にこうした「もし侵入されたらどうするか(多層防御)」という視点を持ってシステムを組んでいます。
最初は覚えることが多くて大変ですが、一つひとつの仕組みを身近な例に置き換えて理解していけば、必ず自信がつきますよ。
一歩ずつ、安全で強いインフラストラクチャを一緒に作っていきましょう!
コメント