<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ALB &#8211; エンジニア見習い</title>
	<atom:link href="https://otonan-syusyoku.work/archives/tag/alb/feed" rel="self" type="application/rss+xml" />
	<link>https://otonan-syusyoku.work</link>
	<description>三流プログラマー</description>
	<lastBuildDate>Wed, 19 Nov 2025 03:55:19 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://otonan-syusyoku.work/wp-content/uploads/2023/10/cropped-名称未設定のデザイン-16-32x32.png</url>
	<title>ALB &#8211; エンジニア見習い</title>
	<link>https://otonan-syusyoku.work</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>unprivileged かつ distroless なイメージ について理解しようぜ</title>
		<link>https://otonan-syusyoku.work/archives/2156</link>
					<comments>https://otonan-syusyoku.work/archives/2156#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Wed, 19 Nov 2025 03:50:41 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[生涯独学]]></category>
		<category><![CDATA[ALB]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[nginx]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=2156</guid>

					<description><![CDATA[コンテナ技術は現代のアプリケーション開発・運用に欠かせないものとなりましたが、コンテナを運用する上で「セキュリティ」と「イメージサイズ」は常に大きな課題として立ちはだかります。 あなたのコンテナイメージは本当に安全で、そ [&#8230;]]]></description>
										<content:encoded><![CDATA[<div _ngcontent-ng-c2987940602="" inline-copy-host="" class="markdown markdown-main-panel stronger enable-updated-hr-color" id="model-response-message-contentr_c303978cc0204370" aria-live="polite" aria-busy="false" dir="ltr">
<p>コンテナ技術は現代のアプリケーション開発・運用に欠かせないものとなりましたが、コンテナを運用する上で「セキュリティ」と「イメージサイズ」は常に大きな課題として立ちはだかります。</p>
<p>あなたのコンテナイメージは本当に安全で、そして最小限に保たれていますか？</p>
<p>&nbsp;</p>
<p>多くの開発者は、手軽さからコンテナを<code>root</code>（管理者）権限で実行し、また開発やデバッグに不要なOSパッケージをそのまま含めてしまいがちです。</p>
<p>これが、<b>セキュリティリスクの増大</b>と、<b>イメージサイズの肥大化</b>を招く原因となります。</p>
<p>この記事では、この課題を解決するための <strong>Unprivileged（非特権ユーザー実行）</strong>と<strong>Distroless（ディストロレス）</strong>イメージについて、その概念から実践的な使い方、そして運用上の注意点までを解説します。</p>
<h2>そもそも「Unprivileged」と「Distroless」とは何か？</h2>
<h3>1. Unprivileged (非特権ユーザー実行) とは？</h3>
<p><b>Unprivileged実行</b>とは、「最小特権の原則」をコンテナで実践することです。</p>
<ul>
<li><b>定義<br />
</b>コンテナ内のメインプロセスを<code>root</code>ユーザー（UID 0）ではなく、一般ユーザー（非特権ユーザー）として実行すること。</li>
<li><b>メリット<br />
</b>コンテナが何らかの理由で侵害されたり、エスケープ（コンテナの外側にあるホストOSへの侵入）が試みられたりした場合でも、プロセスが持つ権限が最小限に抑えられます。<br />
これにより、ホストシステムへの影響範囲を劇的に制限できます。</li>
<li><b>実現方法<br />
</b>Dockerfile内で<code>USER</code>命令を使用して、コンテナの実行ユーザーを切り替えます。</li>
</ul>
<h3>2. Distroless (ディストロレス) イメージとは？</h3>
<p><b>Distrolessイメージ</b>とは、セキュリティとサイズを極限まで追求したベースイメージです。</p>
<ul>
<li><b>定義<br />
</b>OSディストリビューション（Linux）の要素、具体的には<code>bash</code>、<code>apt</code>、<code>ls</code>といった一般的なシェルやパッケージ管理ツール<b>を</b>意図的に含めない、アプリケーション実行に必要な最小限のランタイムとライブラリのみで構成されたコンテナイメージです。</li>
<li><b>「通常のイメージ」との違い<br />
</b>通常のイメージ（例: <code>ubuntu:latest</code>）には多くの汎用ツールが含まれていますが、Distrolessイメージにはそれらが一切含まれていません。デバッグツールさえないため、その名（Distro-less = ディストリビューションがない）が示す通り、極めて軽量です。</li>
</ul>
<p><a href="https://otonan-syusyoku.work/archives/1674/lets-go" rel="attachment wp-att-1680"><img fetchpriority="high" decoding="async" src="https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO.png" alt="Let&#96;s GO" width="1000" height="500" class="aligncenter size-full wp-image-1680" srcset="https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO.png 1000w, https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO-300x150.png 300w, https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO-768x384.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></p>
<h2>Unprivileged &amp; Distroless を組み合わせるメリット</h2>
<p>この二つのアプローチを組み合わせることで、コンテナの運用は次のレベルに引き上げられます。</p>
<h3>1. 圧倒的なセキュリティ向上</h3>
<ul>
<li><b>攻撃対象領域の削減<br />
</b>Distroless化により、イメージに含まれるバイナリやライブラリの数が最小限になります。<br />
その結果、<b>既知の脆弱性（CVE）を持つ可能性のあるパッケージが激減</b>し、攻撃対象となる領域を大幅に縮小します。</li>
<li><b>権限昇格リスクの低減<br />
</b>Unprivileged実行により、仮にコンテナに侵入されても、攻撃者がホストシステムで<code>root</code>権限を得るのが極めて困難になります。</li>
</ul>
<h3>2. イメージサイズの劇的な削減</h3>
<ul>
<li>不要なOSレイヤーやツールがないため、イメージサイズは通常のベースイメージに比べて<b>数百MB単位で削減</b>されることがあるらしい</li>
<li>これにより、レジストリへのプッシュ/プル時間が短縮され、デプロイ時間の高速化、そしてストレージコストの削減につながります。</li>
</ul>
<h3>3. ビルド時間の短縮と効率化</h3>
<p>ベースイメージが小さくなることで、CI/CDパイプラインでのダウンロード時間が短縮され、コンテナのビルドプロセス全体が効率化されます。</p>
<h2>Unprivileged &amp; Distroless なコンテナの使い方</h2>
<p>Unprivileged &amp; Distrolessを実現する最も一般的な方法は、<b>マルチステージビルド</b>を利用することです。</p>
<h3>1. Distroless イメージの基本構造</h3>
<ol start="1">
<li><b>Build Stage<br />
</b>開発に必要なコンパイラ、パッケージマネージャなどを含む通常のイメージ（例: <code>golang:latest</code>, <code>node:latest</code>）を使い、アプリケーションのビルドや依存関係のインストールを行います。</li>
<li><b>Final Stage<br />
</b>Distrolessイメージをベースとし、Build Stageで生成された<b>最終的なバイナリ</b>や<b>必要なランタイムファイル</b>だけをコピーします。</li>
</ol>
<h3>2. Unprivileged実行の設定</h3>
<p>Distrolessイメージの多く（例: <code>gcr.io/distroless/...</code>）は、セキュリティのため、デフォルトで<code>非root</code>ユーザー（例: <code>nonroot</code>）が設定されています。</p>
<p>もしご自身でベースイメージから構築する場合、Dockerfileに以下のコマンドを追加してユーザーを切り替えます。</p>
<p><response-element class="" ng-version="0.0.0-PLACEHOLDER"><code-block _nghost-ng-c519592647="" class="ng-tns-c519592647-2060 ng-star-inserted"></code-block></response-element></p>
<div _ngcontent-ng-c519592647="" class="code-block ng-tns-c519592647-2060 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" jslog="223238;track:impression,attention;BardVeMetadataKey:[[&quot;r_c303978cc0204370&quot;,&quot;c_2e6b4137d5b58b23&quot;,null,&quot;rc_9ed9dae3948441fd&quot;,null,null,&quot;ja&quot;,null,1,null,null,1,0]]">
<div _ngcontent-ng-c519592647="" class="formatted-code-block-internal-container ng-tns-c519592647-2060">
<div _ngcontent-ng-c519592647="" class="animated-opacity ng-tns-c519592647-2060">
<pre _ngcontent-ng-c519592647="" class="ng-tns-c519592647-2060"># ユーザーを作成し、パーミッションを設定
RUN adduser --disabled-password --gecos "" appuser

# 実行ユーザーを一般ユーザーに切り替える
USER appuser</pre>
</div>
</div>
</div>
<p><a href="https://otonan-syusyoku.work/archives/1519/%e3%81%ae" rel="attachment wp-att-1540"><img decoding="async" src="https://otonan-syusyoku.work/wp-content/uploads/2023/12/の.png" alt="title" width="1000" height="500" class="aligncenter size-full wp-image-1540" srcset="https://otonan-syusyoku.work/wp-content/uploads/2023/12/の.png 1000w, https://otonan-syusyoku.work/wp-content/uploads/2023/12/の-300x150.png 300w, https://otonan-syusyoku.work/wp-content/uploads/2023/12/の-768x384.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></p>
<h2>運用上の注意点：非特権ユーザーとポート番号の壁</h2>
<p>UnprivilegedコンテナをECS（または任意のLinuxホスト）で運用する際、セキュリティの恩恵と引き換えに、ある<b>実用上の課題</b>に直面します。</p>
<h3>1. ポート1024未満のバインドはroot権限が必要</h3>
<p>Linux OSのセキュリティ原則により、Webサーバーなどで一般的に使われる<b>ポート番号1024未満</b>（ウェルノウンポート、例: HTTPの<code>80</code><b>、</b>HTTPSの<code>443</code><b>）にバインドするには、</b><code>root</code>権限（特権）が必要です。</p>
<p>あなたがECSでUnprivilegedかつDistrolessなNginxイメージを使った際、Nginxがデフォルトで<code>80</code>番ポートを使おうとすると、権限がないため「<b>Permission Denied</b>」といった<b>エラーが発生し、コンテナの起動に失敗</b>してしまいます。</p>
<h3>2. ECS/Fargate環境での具体的な解決策</h3>
<p>この問題を解決しつつ、Unprivilegedのセキュリティメリットを維持するには、以下の方法が最も推奨されます。</p>
<ol start="1">
<li>アプリケーション側のポート変更:Webサーバー（Nginxなど）の設定ファイルを変更し、1024番以上のポート（例: 8080、8081）で待ち受けるように設定を変更します。</li>
<li><b>ロードバランサー (ALB) でのポートマッピング:</b>
<ul>
<li>ECS（Fargate）の<b>タスク定義</b>で、コンテナが使用するポートを<code>8080</code>などに設定します。</li>
<li><b>Application Load Balancer (ALB)</b> を利用し、ALBは外部からのアクセスを<code>80</code>番（標準HTTP）で受けます。</li>
<li>ALBは、内部のECSタスクグループに対しては<code>8080</code>番でルーティングします。</li>
</ul>
</li>
</ol>
<p>これにより、コンテナ内部は非特権ユーザーで安全に運用され、外部ユーザーはポート番号を意識することなくWebサイトにアクセスできるようになります。</p>
<h2>次世代コンテナの標準へ</h2>
<p>UnprivilegedとDistrolessの組み合わせは、<b>コンテナのセキュリティ基準</b>と<b>デプロイ効率</b>を大きく引き上げる、次世代コンテナの標準パターンです。</p>
<ul>
<li><b>Distroless:</b> 攻撃対象領域とイメージサイズを最小化。</li>
<li><b>Unprivileged:</b> 権限昇格リスクを最小化。</li>
</ul>
<p>特にECSなどの本番環境で運用する際は、<b>ポート1024未満の制限</b>に注意を払い、<b>ロードバランサー</b>を活用して安全かつ効率的な構成を構築しましょう。</p>
<p>あなたのプロジェクトも、今日からこの強力なセキュリティパターンに移行してみませんか？</p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/2156/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【AWS解説】ALBのHTTPSリダイレクト、コンテナはポート80でなぜOK？</title>
		<link>https://otonan-syusyoku.work/archives/2147</link>
					<comments>https://otonan-syusyoku.work/archives/2147#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Fri, 17 Oct 2025 01:45:08 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[ALB]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[ネットワーク]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=2147</guid>

					<description><![CDATA[AWSでWebアプリケーションを構築する際、ALB (Application Load Balancer) を使ってHTTPS化するのはもはや常識です。しかし、多くの開発者が一度は疑問に思う点があります。 「ALBでHT [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>AWSでWebアプリケーションを構築する際、ALB (Application Load Balancer) を使ってHTTPS化するのはもはや常識です。しかし、多くの開発者が一度は疑問に思う点があります。</p>
<p><b>「ALBでHTTPS化したのに、なぜ後ろにいるECSコンテナはポート80（HTTP）のままで通信できるんだろう？」</b></p>
<p>この一見不思議な挙動は、ALBが持つ2つの重要な役割を理解することで、スッキリと解決します。今回は、このALBの「魔法」の仕組みを、セキュリティグループの設定から紐解いていきましょう。</p>
<h2>最終的な構成：安全な3層アーキテクチャ</h2>
<p>まず、私たちが目指すのは、セキュリティと可用性のベストプラクティスに基づいた、以下のような3層アーキテクチャです。</p>
<ul>
<li><b>Web層</b>: ALBがインターネットからのリクエストをすべて受け付けます。</li>
<li><b>AP層</b>: ECSコンテナがプライベートな領域でアプリケーションを動かします。</li>
<li><b>DB層</b>: RDSがさらに内側のプライベートな領域でデータを安全に保管します。</li>
</ul>
<p>この構成のセキュリティの肝は<strong>「ECSはALBからの通信しか受け付けない」</strong>というルールです。これを実現するのが、次に説明するセキュリティグループです。</p>
<p>&nbsp;</p>
<h2>門番の役割を担う「セキュリティグループ」</h2>
<p>セキュリティグループは、リソースのドアを守る「バーチャルな門番」です。今回は3人の門番を配置します。</p>
<ol start="1">
<li><b>ALBの門番</b>: インターネットからの訪問者（ポート80, 443）を全員受け入れます。</li>
<li><b>ECSの門番</b>: <b>ALBの門番から紹介された人</b>（ALBからのトラフィック）<b>だけ</b>を通します。それ以外の人は全員お断りです。</li>
<li><b>RDSの門番</b>: <b>ECSの門番から紹介された人</b>（ECSからのトラフィック）<b>だけ</b>を通します。</li>
</ol>
<p>この連携により、たとえ攻撃者がECSに直接アクセスしようとしても、門前払いされる仕組みが完成します。</p>
<h2>ALBがこなす2つの全く異なる仕事</h2>
<p>さて、ここからが本題です。ユーザーが<code>http://</code>でアクセスしてきた時に、ALBとコンテナの間で何が起きているのでしょうか。実は、これは<b>2段階の独立した処理</b>になっています。</p>
<p>ポイントは役割が2つ存在するということです。</p>
<h3>ブラウザへの「リダイレクト指示」</h3>
<p>最初のやり取りは、ユーザーのブラウザとALBの間だけで完結します。</p>
<ol start="1">
<li><b>ユーザー</b>: ブラウザで <code>http://example.com</code> (ポート80) にアクセス。</li>
<li><b>ALB (ポート80の受付係)</b>: リクエストを受け取ると、中身は見ずにこう応答します。「<b>すみません、こちらの窓口は安全ではありません。向かいにある安全な443番の窓口へ行き直してください</b>」。これが<b>HTTP 301リダイレクト</b>です。</li>
</ol>
<p><b>この時点では、リクエストはまだECSコンテナには一切届いていません。</b></p>
<h3>ステップ2：コンテナへの「リクエスト転送」</h3>
<p>ブラウザはALBからの指示に従い、今度は最初から安全な窓口へ向かいます。</p>
<ol start="1">
<li><b>ユーザー</b>: ブラウザが自動的に <code>https://example.com</code> (ポート443) に<b>新しいリクエスト</b>を送信します。</li>
<li><b>ALB (ポート443の受付係)</b>:
<ul>
<li>暗号化されたリクエストを受け取り、持っているSSL証明書を使って<b>通信を復号</b>します（SSL/TLS終端）。</li>
<li>安全な平文になったリクエストを、宛先である<b>ECSコンテナのポート80</b>へ転送（フォワード）します。</li>
</ul>
</li>
<li><b>ECSコンテナ (ポート80)</b>: ALBから来た通常のHTTPリクエストを受け取り、処理を実行します。</li>
</ol>
<p>このように、ALBは<strong>ユーザーを正しい入口へ案内する「案内係」</strong>の仕事と、<strong>リクエストを内部の担当者へ届ける「取次係」</strong>の仕事という、2つの全く異なる役割をこなしているのです。</p>
<p>コンテナからすれば、常にALBという信頼できる取次係から、暗号化が解かれた分かりやすいリクエストが届くだけなので、ポート80で待ち受けていれば良い、というわけです。</p>
<p>非常に便利ですね。。</p>
<h2>CDKの実装</h2>
<h3>SecurityGroup の実装</h3>
<pre class="line-numbers"><code class="language-php">// ALB用セキュリティグループ
const albSecurityGroup = new ec2.SecurityGroup(this, 'AlbSg', { vpc });
albSecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(80), 'Allow HTTP');
albSecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(443), 'Allow HTTPS');

// ECS用セキュリティグループ
const ecsSecurityGroup = new ec2.SecurityGroup(this, 'EcsSg', { vpc });
// ALBからの通信のみを、コンテナのポート80で許可
ecsSecurityGroup.addIngressRule(
    albSecurityGroup,
    ec2.Port.tcp(80),
    'Allow traffic only from ALB'
);</code></pre>
<h3>ALBリスナー</h3>
<pre class="line-numbers"><code class="language-js">// ALB本体を作成
const alb = new elbv2.ApplicationLoadBalancer(this, 'MyAlb', {
    vpc,
    internetFacing: true,
    securityGroup: albSecurityGroup,
});

// HTTPリスナー (ポート80): HTTPSへリダイレクトするだけ
alb.addListener('HttpListener', {
    port: 80,
    defaultAction: elbv2.ListenerAction.redirect({
        protocol: 'HTTPS',
        port: '443',
        permanent: true,
    }),
});

// HTTPSリスナー (ポート443): ECSへリクエストを転送する
alb.addListener('HttpsListener', {
    port: 443,
    certificates: [certificate], // ACMで発行した証明書
    defaultAction: elbv2.ListenerAction.forward([ecsTargetGroup]), // ECSのターゲットグループ
});</code></pre>
<h2>まとめ</h2>
<ul>
<li>ALBのHTTP→HTTPSリダイレクトは、「リダイレクト指示」<b>と</b>「リクエスト転送」の2段階で行われる。</li>
<li>SSL/TLSによる暗号化・復号の処理はALBがすべて肩代わりしてくれる（<b>SSL/TLS終端</b>）。</li>
<li>コンテナは、ALBから転送されてくる<b>暗号化されていないHTTPリクエスト</b>を受け取るだけで良い。</li>
<li><b>セキュリティグループ</b>を正しく設定することで、この安全な通信経路が完成する。</li>
</ul>
<p>役割が2つあることが分からなければ理解できなかったなぁ。</p>
<p>&nbsp;</p>
<h2>参考記事</h2>
<div class="awsui_grid-column_14yj0_16am7_186 awsui_colspan-12_14yj0_16am7_307">
<div class="awsui_restore-pointer-events_14yj0_16am7_357">
<ol>
<li><a href="https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html">What is an Application Load Balancer?</a></li>
<li><a href="https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html">Listeners for your Application Load Balancers</a></li>
</ol>
</div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/2147/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【実録】AWS ALBのデフォルトルールが招いた悲劇 &#8211; DoS攻撃からアプリを守るには？</title>
		<link>https://otonan-syusyoku.work/archives/2083</link>
					<comments>https://otonan-syusyoku.work/archives/2083#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sat, 24 May 2025 03:31:25 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[生涯独学]]></category>
		<category><![CDATA[ALB]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[EC2]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=2083</guid>

					<description><![CDATA[こんにちは、比嘉です！以前は自社開発企業で開発をしていましたが、現在は一時的にニートライフを満喫しています。 今日は、僕がAWS環境で構築したWEBアプリケーションがDoS攻撃を受け、サーバーダウンに至った際の障害対応に [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>こんにちは、比嘉です！以前は自社開発企業で開発をしていましたが、現在は一時的にニートライフを満喫しています。</p>
<p>今日は、僕がAWS環境で構築したWEBアプリケーションがDoS攻撃を受け、サーバーダウンに至った際の障害対応について、その全貌を語りたいと思います。</p>
<p>特に、ALB（Application Load Balancer）の思わぬ落とし穴が原因だったという、衝撃の事実を皆さんに共有します。<br />
同じような問題で悩んでいる方、これからAWS環境を構築する方は、ぜひ参考にしてください。</p>
<p>&nbsp;</p>
<p><a href="https://otonan-syusyoku.work/archives/1674/lets-go" rel="attachment wp-att-1680"><img decoding="async" src="https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO.png" alt="Let&#96;s GO" width="1000" height="500" class="aligncenter size-full wp-image-1680" srcset="https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO.png 1000w, https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO-300x150.png 300w, https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO-768x384.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></p>
<h2>障害内容</h2>
<p>ある日突然、ALB配下のアプリケーションサーバーがDoS攻撃によりダウンしてしまいました。</p>
<p>緊急事態発生です！確認すると、アクセスのあったIPはまさかのオレゴンリージョンから。</p>
<p>僕が管理しているアプリケーションサーバーは東京リージョンにあるため、なぜ遠く離れたオレゴンから大量のアクセスが来ているのか、この時点では全く見当がつきませんでした。</p>
<div class="sc_frame_wrap inline orange">
<div class="sc_frame no-title shadow">
<ul>
<li>ALB配下のアプリケーションサーバーがDos攻撃によりサーバーダウン。</li>
<li>アクセスのあったIPの出どころはオレゴンリージョン</li>
<li>私の管理しているアプリケーションサーバーは東京リージョン。</li>
</ul>
</div>
</div>
<h2>調査内容</h2>
<p>まずは手がかりを求めて、nginxやアプリケーションのアクセスログ、エラーログを徹底的に漁りました。<br />
しかし、一向に決定的な手がかりが見つかりません。</p>
<p>そんな中、アクセスログを注意深く見ていたところ、ある異変に気づきました。<br />
通常、僕たちが意図的に公開している <strong>EIP</strong> で抑えているグローバルIPとは全く関係ないIPアドレスから、アプリケーションサーバーにアクセスが到達しているのです。</p>
<p>そこで、すかさずdigコマンドを実行してみると、やはり先ほどのEIPとは無関係のIPアドレスが確認できました。<br />
しかし、「なぜ、僕たちに関わりのないIPがアプリケーションへアクセスを流しているんだ？」</p>
<p>この疑問が頭から離れません。ルーティングテーブルや他のAWSリソースを調べても問題は見当たらず、「うーん、わからない…」という状況が3時間ほど続きました。</p>
<p>&nbsp;</p>
<p>精神的に疲弊し始めたその時、ふとALB（Application Load Balancer）のルールに問題があるのではないかという考えがよぎりました。そして、確認してみると…ビンゴです！</p>
<p>&nbsp;</p>
<p><strong>ALBのデフォルトルールが、アプリケーションサーバーが所属するターゲットグループにトラフィックを転送する設定</strong>になっていたのです。</p>
<p>そして、<strong>Route 53のAレコードにALBのエイリアスを指定していることで、ALBに紐づくサブネットのグローバルIPでもアクセスが可能になっている仕様</strong>もここで理解しました。</p>
<p>つまり、<span class="sc_marker blue"><strong>ALBのグローバルIPに直接アクセスが入ると、意図せずアプリケーションサーバーへ流れてしまう状態になっていた</strong></span>のです。</p>
<p>この瞬間、「これで勝ち確定！」と心の中で叫びましたね。</p>
<h2>対策</h2>
<p>今回の障害を受けて、最も効果的な対策はALBのデフォルトルールを適切に設定することです。意図しないアクセスをアプリケーションサーバーに流さないために、以下のように設定することをおすすめします。</p>
<ul>
<li>デフォルトルールで固定レスポンスを返す:レスポンスコード: 503 Service Unavailable</li>
<li>本文: 許可されていないリクエストです</li>
</ul>
<p>これにより、正規のドメインを通さないALBへの直接アクセスはアプリケーションサーバーに到達せず、DoS攻撃のリスクを大幅に低減できます。</p>
<p>もし、プロジェクトの制約上、固定レスポンスを返すのが難しい場合は、少なくともアプリケーションサーバーへリクエストを流さない設定にすることが重要です。例えば、別のダミーのターゲットグループを指定するか、アクセスを拒否するアクションを設定することも検討してください。</p>
<h2>調査に使ったもの</h2>
<h3>nginx のアクセスログ</h3>
<p>該当のリクエストがあった時間帯のアクセスを dig ることで出どころのIP等がわかります。</p>
<p>IPでどの辺りの地域かが判別できたり、content-type を元に BOT からのリクエストなのかがわかったりします。一旦、アクセスログを覗いてみましょう。</p>
<p>2025年に入って、生成AIからのリクエストが頻繁に来ている事を確認できているのでアクセスログを覗いてみると面白いですよ。</p>
<h3><span>VPC フローログ</span></h3>
<p>AWS のサービスです。VPC内の監視ができるのでかなり有用です。。使っていないプロジェクトは導入オススメします。</p>
<blockquote><p>VPC、サブネット、またはネットワークインターフェイスのフローログを作成できます。サブネットまたは VPC のフローログを作成する場合、そのサブネットまたは VPC 内の各ネットワークインターフェイスが監視されます。</p>
<p>監視されるネットワークインターフェイスのフローログデータは、フローログレコードとして記録されます。これは、トラフィックフローについて説明するフィールドで構成されるログイベントです。詳細については、「フローログレコード」を参照してください</p>
<p><cite class="blockquote_ref"> <a href="https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/flow-logs-basics.html" target="_blank" rel="noopener noreferrer">フローログの基礎</a> </cite></p></blockquote>
<h3>コマンド類</h3>
<h4 data-sourcepos="7:1-7:114">nslookup</h4>
<p>DNS が正しく設定されているか、IPがEIPと同値かに使用した、</p>
<h4>dig</h4>
<p data-sourcepos="7:1-7:114">ドメイン名に関する詳細な情報を取得するためのツールです。今回はDNSの設定が正しいか検証するために使用しました。</p>
<h4 data-sourcepos="7:1-7:114">tail</h4>
<p>アクセスログを掘り起こすのに使用しました。リアルタイム監視を後輩に見せたら尊敬されたのでドヤりたい人使ってください。（後輩が可愛いだけ</p>
<p>&nbsp;</p>
<h2>まとめ</h2>
<p>誰でも簡単に作れるようになっているのがAWSの特徴ですが、結果として穴ができてしまうことが多々あるので皆さんの環境も見てみましょう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/2083/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
