<?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>セキュリティ &#8211; エンジニア見習い</title>
	<atom:link href="https://otonan-syusyoku.work/archives/tag/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3/feed" rel="self" type="application/rss+xml" />
	<link>https://otonan-syusyoku.work</link>
	<description>三流プログラマー</description>
	<lastBuildDate>Fri, 17 Oct 2025 01:48:38 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://otonan-syusyoku.work/wp-content/uploads/2023/10/cropped-名称未設定のデザイン-16-32x32.png</url>
	<title>セキュリティ &#8211; エンジニア見習い</title>
	<link>https://otonan-syusyoku.work</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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>RESTful APIとSPAの関係についてReactとPHPで解説します</title>
		<link>https://otonan-syusyoku.work/archives/1674</link>
					<comments>https://otonan-syusyoku.work/archives/1674#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sun, 25 Feb 2024 12:40:20 +0000</pubDate>
				<category><![CDATA[好きではないJS]]></category>
		<category><![CDATA[絶対に必要なIT基礎知識]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[Vue]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1674</guid>

					<description><![CDATA[RESTful APIとは？ RESTful APIは、ウェブアプリケーションやウェブサービスで使われるプログラミングインターフェースです。 REST（Representational State Transfer）の原 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>RESTful APIとは？</h2>
<p><img fetchpriority="high" decoding="async" src="https://otonan-syusyoku.work/wp-content/uploads/2024/02/DMARCを設定しなくちゃ-1.png" alt="What&#96;s up" width="1000" height="500" class="aligncenter size-full wp-image-1665" srcset="https://otonan-syusyoku.work/wp-content/uploads/2024/02/DMARCを設定しなくちゃ-1.png 1000w, https://otonan-syusyoku.work/wp-content/uploads/2024/02/DMARCを設定しなくちゃ-1-300x150.png 300w, https://otonan-syusyoku.work/wp-content/uploads/2024/02/DMARCを設定しなくちゃ-1-768x384.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></p>
<p>RESTful APIは、ウェブアプリケーションやウェブサービスで使われるプログラミングインターフェースです。<br />
REST（Representational State Transfer）の原則に基づいて設計されており、ウェブ上のリソースへのアクセスや操作を統一的な方法で提供します。<br />
リソースはURLで識別され、HTTPメソッド（GET、POST、PUT、DELETEなど）を使ってアクセスされます。</p>
<p>[getpost id=&#8221;1672&#8243; cat_name=&#8221;1&#8243; date=&#8221;0&#8243;]</p>
<h2>SPA（シングルページアプリケーション）とは？</h2>
<p>SPAは、ユーザーがアプリケーションを操作する際にページの再読み込みをせずに、必要なデータのみをサーバーから非同期に取得し、動的にページの内容を更新するウェブアプリケーションの形式です。</p>
<p>これにより、<span class="sc_marker blue"><strong>従来のマルチページアプリケーションに比べてユーザーエクスペリエンスが向上します。</strong></span></p>
<p>僕が所属しているチームでも<strong>ページのリロードが嫌だというユーザーの使用感からSPAへの移行が少しづつ始まってきています</strong>。<br />
世間的にもSPAは流行っていますよね。（流行っているから偉いというわけではない。知ることが大事</p>
<h2>RESTful APIとSPAの関係性</h2>
<p><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" /></p>
<p>SPAでは、<strong>ページの初回読み込み時にアプリケーションの全てのコード（HTML、CSS、JavaScript）がロード</strong>されます。</p>
<p>その後の<span class="sc_marker blue"><strong>ユーザーの操作によってデータが必要になる場合、SPAはRESTful APIを通じてサーバーからデータを非同期に取得</strong></span>します。<br />
<strong>このデータはJSONやXML形式で返され、JavaScriptを用いてクライアントサイドで処理され、ページの一部分だけが動的に更新</strong>されます。</p>
<p>このアーキテクチャにより、SPAはユーザーにスムーズで反応の良いインターフェイスを提供できます。</p>
<p><span class="sc_marker blue"><strong>RESTful APIはこのプロセスの背後にあるデータ通信の基盤となります。</strong></span></p>
<h2>PHPとReactを使った例</h2>
<p>ここでは、PHPで書かれた簡単なRESTful APIと、Reactを使ったSPAの例を示します。</p>
<h3>PHPによるRESTful API</h3>
<p>PHPで簡単なAPIエンドポイントを作成します。この例では、GETリクエストを受け取り、簡単なJSONデータを返します。</p>
<div class="dark bg-gray-950 rounded-md">
<div>
<pre class="line-numbers"><code class="language-php">&lt;?php 
    header('Content-Type: application/json');
    $response = ['message' =&gt; 'Hello, world!'];
    echo json_encode($response); 

<code>    // Response
    //{"message": "Hello, world!"}</code> ?&gt;</code></pre>
</div>
</div>
<p>このPHPスクリプトは、サーバーに配置してのようにアクセスすると<span style="background-color: #ffffff; color: #333333; font-family: 游ゴシック, YuGothic, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Verdana, メイリオ, Meiryo, Osaka, 'ＭＳ Ｐゴシック', 'MS PGothic', sans-serif;">JSONが返されます。</span></p>
<h3>ReactによるSPA</h3>
<p>Reactで簡単なSPAを作成し、上記のAPIからデータを取得して表示します。</p>
<div class="dark bg-gray-950 rounded-md">
<div class="p-4 overflow-y-auto">
<pre class="line-numbers"><code class="language-js">import React, { useState, useEffect } from 'react';
import axios from 'axios';

function App() {
  const [message, setMessage] = useState('');

  useEffect(() =&gt; {
    axios.get('http://yourserver.com/index.php')
      .then(response =&gt; {
        setMessage(response.data.message);
      })
      .catch(error =&gt; console.error('There was an error!', error));
  }, []);

  return (
    &lt;div&gt;
      &lt;button&gt;{message}&lt;/button&gt;
    &lt;/div&gt;
  );
}

export default App;
</code></pre>
<p>このコードは、コンポーネントがマウントされた後にAPIからデータを取得し、取得したメッセージを表示します。<br />
React（クライアントサイド）とPHP（サーバーサイド）を使った、RESTful APIとSPAの基本的な連携を示しています。</p>
</div>
<p>今回のコードでは、データを取得して表示するだけのコードになっていますが、Event処理などによりリロードされることなく動的にページの内容を変更させることが可能です。</p>
<h2>セキュリティとパフォーマンスの考慮</h2>
</div>
<p>SPA（シングルページアプリケーション）とRESTful APIを使用する際には、セキュリティとパフォーマンスの両方に配慮することが重要です。<br />
以下では、これらの観点から基本的なガイドラインをいくつか紹介します。</p>
<h3>セキュリティ</h3>
<ol>
<li><strong>HTTPSを使用する<br />
</strong>データの暗号化を確実に行うため、APIとの通信には常にHTTPSを使用します。（当たり前です）<br />
これにより、中間者攻撃（MITM）のリスクを減らすことができます。</li>
<li><strong>CORSポリシーを適切に設定する<br />
</strong>クロスオリジンリソースシェアリング（CORS）ポリシーを適切に設定し、信頼できるオリジンからのリクエストのみを許可します。<br />
不適切なCORS設定は、セキュリティリスクを招く可能性があります。</li>
<li><strong>認証と認可<br />
</strong>JWT（JSON Web Tokens）やOAuthなどの堅牢な認証メカニズムを使用して、APIへのアクセスをセキュアに管理します。<br />
また、ユーザーの権限に基づいてアクセスを制御する認可も重要です。</li>
<li><strong>入力の検証とサニタイズ<br />
</strong> SQLインジェクションやクロスサイトスクリプティング（XSS）攻撃を防ぐため、サーバー側とクライアント側の両方で入力値の検証とサニタイズを行います。</li>
<li><strong>依存関係のセキュリティ<br />
</strong>使用するライブラリやフレームワークのセキュリティ脆弱性に注意し、定期的に更新を行い脆弱性を修正します。</li>
</ol>
<p>この辺の対策については過去に記事にしていますので時間ある人は読んでみてくださーい</p>
<p>[getpost id=&#8221;1618&#8243; cat_name=&#8221;1&#8243; date=&#8221;0&#8243;][getpost id=&#8221;1256&#8243; cat_name=&#8221;1&#8243; date=&#8221;0&#8243;]</p>
<h3>パフォーマンス</h3>
<ol>
<li><strong>コードの分割<br />
</strong>ユーザーが必要とするコードのみをダウンロードするように、コード分割（Code Splitting）を実装します。<br />
これにより、初期ロード時間を短縮できます。</li>
<li><strong>キャッシュ戦略の利用<br />
</strong>静的リソースやAPIレスポンスのキャッシュを適切に利用することで、パフォーマンスを向上させることができます。<br />
ブラウザのキャッシュやCDNの利用が有効です。</li>
<li><strong>遅延ローディング（Lazy Loading）<br />
</strong> 画像やコンポーネントなど、必要になるまでロードしないようにします。<br />
これにより、初期ロードのパフォーマンスを向上させることができます。</li>
<li><strong>APIの最適化<br />
</strong>不必要なデータの送受信を避けるため、APIのレスポンスをできるだけ小さく保ちます。<br />
また、必要なデータのみを取得するためのフィルタリングやページネーションをAPI側でサポートします。</li>
<li><strong>フロントエンドのパフォーマンス最適化<br />
</strong>Reactなどのフロントエンドフレームワークを使用する場合は、不要な再レンダリングを避け、メモ化（memoization）や仮想DOMの効率的な利用などのテクニックを活用します。</li>
</ol>
<p>セキュリティとパフォーマンスは、アプリケーションの設計と開発の初期段階から考慮する必要があります。<br />
これらの基本的なガイドラインを実践することで、ユーザーに安全で快適な体験を提供することができます。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1674/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DMARCって何？メールの安全を守るスゴイやつ！</title>
		<link>https://otonan-syusyoku.work/archives/1661</link>
					<comments>https://otonan-syusyoku.work/archives/1661#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sun, 18 Feb 2024 01:25:31 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1661</guid>

					<description><![CDATA[みんな、メールを使ってると思うけど、時々変なメール来ない？ 「これ、本当に〇〇さんから？」って疑っちゃう時があると思います。 そんな不安を解消してくれるのが、DMARCっていう技術。今日はこのDMARCについて、わかりや [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><span>みんな、メールを使ってると思うけど、時々変なメール来ない？</span></p>
<p><span>「これ、本当に〇〇さんから？」って疑っちゃう時があると思います。</span></p>
<p><span>そんな不安を解消してくれるのが、DMARCっていう技術。今日はこのDMARCについて、わかりやすく解説していこうと思います〜</span></p>
<h2>DMARCってどんなもの？</h2>
<p><img decoding="async" src="https://otonan-syusyoku.work/wp-content/uploads/2024/02/DMARCを設定しなくちゃ-1.png" alt="What&#96;s up" width="1000" height="500" class="aligncenter size-full wp-image-1665" srcset="https://otonan-syusyoku.work/wp-content/uploads/2024/02/DMARCを設定しなくちゃ-1.png 1000w, https://otonan-syusyoku.work/wp-content/uploads/2024/02/DMARCを設定しなくちゃ-1-300x150.png 300w, https://otonan-syusyoku.work/wp-content/uploads/2024/02/DMARCを設定しなくちゃ-1-768x384.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></p>
<p><span>DMARC（Domain-based Message Authentication, Reporting, and Conformance）は、フィッシング詐欺やスプーフィング攻撃といったメールによるセキュリティ脅威からブランドを保護するための電子メール認証プロトコルです。</span></p>
<p><span>このプロトコルは、送信者のドメインがSPF（Sender Policy Framework）とDKIM（DomainKeys Identified Mail）による認証を経て、正当なものであるかどうかを受信者に確認させることで、不正なメールを効果的にフィルタリングします。</span></p>
<p>[getpost id=&#8221;1651&#8243; cat_name=&#8221;1&#8243; date=&#8221;0&#8243;]</p>
<h2>DMARCの設定</h2>
<p>DMARCを設定するには、<span class="sc_marker blue"><strong>まずSPFとDKIMが正しく設定されていることを確認する</strong></span>必要があります。</p>
<p>その後、DMARCレコードをドメインのDNSに追加します。<br />
このレコードには、<strong>メールがSPFやDKIMの検証に失敗した場合の取扱い</strong>（例：報告のみ、隔離、拒否）、報告書の送付先、ポリシーの適用範囲などが記載されます。</p>
<div class="sc_toggle_box">
<h3 class="sc_toggle_title active">検証に失敗した場合の取り扱い</h3>
<div class="sc_toggle_content">
<h4>1. なにもしない（none）</h4>
<ul>
<li>説明<br />
このポリシーは、検証に失敗したメールに対して特に行動を起こさないことを意味します。メールは通常通り受信者のメールボックスに配信されますが、送信者は検証失敗に関するレポートを受け取ることができます。このポリシーは、DMARCを導入する初期段階で設定されることが多く、送信者がどのようなメールが失敗しているかを把握するのに役立ちます。</li>
<li>目的<br />
監視とレポーティング。</li>
</ul>
<h4>2. 隔離（quarantine）</h4>
<ul>
<li>説明<br />
検証に失敗したメールは、受信者のメインの受信トレイではなく、スパムフォルダーや隔離フォルダーに移動されます。これにより、受信者は潜在的なリスクを伴うメールに対して注意することができます。このポリシーは、DMARCの導入が進んでおり、認証プロセスに自信が持てるようになった送信者によって選択されます。</li>
<li>目的<br />
リスクのあるメールを警告することで受信者を保護。</li>
</ul>
<h4>3. 拒否（reject）</h4>
<ul>
<li>説明<br />
このポリシーは、検証に失敗したメールを完全に拒否し、受信者のメールボックスには届かないようにするものです。メールは、送信時に拒否されるため、受信者はこれらのメールを見ることはありません。このポリシーは、DMARCの設定に最も自信があり、なりすましやフィッシング詐欺から受信者を積極的に保護したい場合に適用されます。</li>
<li>目的<br />
不正なメールの配信を完全に防ぐ。</li>
</ul>
</div>
</div>
<h2>DMARCの利点</h2>
<p>DMARCの最大の利点は、フィッシングやスプーフィングによる攻撃からユーザーとブランドを守ることです。</p>
<p>また、送信者が自分のドメインを使用して送信されるメールをより詳細にコントロールできるようになり、<span class="sc_marker blue"><strong>送信メールの認証失敗に関するフィードバックを受け取る</strong></span>ことができます。</p>
<p>これにより、メール配信の問題を迅速に特定し、解決することが可能になります。</p>
<div class="sc_toggle_box">
<h3 class="sc_toggle_title active">認証失敗に関するフィードバックを受け取るメリット</h3>
<div class="sc_toggle_content">
<h4>1. 配信問題の早期発見</h4>
<p>認証が失敗すると、それは何らかの問題があることのサインです。フィードバックを通じて、送信者は自分のメールが期待通りに配信されていないことを迅速に知ることができます。これにより、問題を早期に発見し、対処することが可能になります。</p>
<h4>2. 認証設定の最適化</h4>
<p>フィードバックを分析することで、SPFやDKIM、DMARCの設定に問題がないか確認できます。認証失敗の原因を特定し、設定を調整することで、将来的に認証を成功させる確率を高めることができます。</p>
<h4>3. メール送信の信頼性向上</h4>
<p>認証失敗に迅速に対応することで、送信メールの信頼性を向上させることができます。これは、受信者がメールをスパムとして扱う可能性を減らすことにもつながります。信頼性の高いメール送信は、受信者との良好な関係を維持する上で重要です。</p>
<h4>4. ブランド保護</h4>
<p>メール認証の失敗は、ドメインがなりすましやフィッシング攻撃に利用されている可能性があることを示す場合があります。フィードバックを利用してこうした問題に迅速に対応することで、ブランドの評判を保護し、顧客の信頼を守ることができます。</p>
</div>
</div>
<h2>DMARCの課題</h2>
<p>DMARCの導入は、設定の複雑さや誤設定によるメール配信の問題が生じる可能性があるという課題を伴います。</p>
<p>特に、小規模な組織や技術的なリソースが限られている場合、DMARCの設定と維持が難しいことがあります。</p>
<p>また、DMARCでは全てのメール脅威を防ぐことはできないため、他のセキュリティ対策と併用することが推奨されます。</p>
<h2>まとめ</h2>
<p>DMARCは、メールによるセキュリティ脅威に対抗するための強力なツールです。</p>
<p>正しく設定されたDMARCポリシーは、不正なメールを効果的にフィルタリングし、受信者と送信者の信頼を高めることができます。</p>
<p>しかし、その設定と維持には注意が必要であり、導入にあたっては適切な知識とリソースが求められます。</p>
<p>DMARCを導入することで、メールを通じた安全な通信を行うことができまっす。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1661/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SPFとDKIMを正しく設定したい</title>
		<link>https://otonan-syusyoku.work/archives/1651</link>
					<comments>https://otonan-syusyoku.work/archives/1651#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sat, 10 Feb 2024 09:00:07 +0000</pubDate>
				<category><![CDATA[絶対に必要なIT基礎知識]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[インフラ]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1651</guid>

					<description><![CDATA[SPF（Sender Policy Framework）について SPFは、メール送信者が使用しているドメイン名が正規のものであるかを検証するための技術です。つまり、あるドメインから送られてくるメールが、そのドメインの管 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>SPF（Sender Policy Framework）について</h2>
<p>SPFは、<span class="sc_marker blue"><strong>メール送信者が使用しているドメイン名が正規のものであるかを検証するための技術</strong></span>です。つまり、あるドメインから送られてくるメールが、そのドメインの管理者によって認められたサーバーから送信されたものであることを確認する仕組みです。</p>
<p>SPFの設定は、ドメインのDNSレコードにSPFレコードを追加することで行います。<br />
このレコードには、<span class="sc_marker blue"><strong>「このドメインからメールを送ることが許可されているIPアドレスは何か」</strong></span>という情報が含まれています。<br />
メールを受け取ったサーバーは、この情報をもとに、<strong>メールが正規のサーバーから送られてきたものかを検証</strong>します。もし一致しなければ、そのメールはスパムやフィッシングの可能性が高いとみなされ、適切に処理されます。</p>
<h2>SPFの設定方法</h2>
<p>SPFの設定は、<span class="sc_marker blue"><strong>基本的にはドメインのDNS設定にSPFレコードを追加する</strong></span>ことで行います。以下は、SPFレコードの設定手順の概要です。</p>
<ol>
<li><strong>SPFレコードの作成</strong>：
<ul>
<li>SPFレコードは、<code>v=spf1</code>から始まります。これに続けて、メールを送信することが許可されているIPアドレスやドメイン、ポリシーを指定します。</li>
<li>例えば、<code>v=spf1 ip4:123.456.789.0/24 -all</code>というレコードは、<code>123.456.789.0/24</code>からのメール送信を許可し、それ以外からの送信は拒否することを意味します。</li>
</ul>
</li>
<li><strong>DNSレコードへの追加</strong>：
<ul>
<li>ドメインの管理画面にログインし、DNS設定セクションを探します。</li>
<li>新しいTXTレコードを作成し、先ほど作成したSPFレコードの値を入力します。</li>
<li>設定を保存し、変更が適用されるのを待ちます（数時間かかることがあります）。</li>
</ul>
</li>
</ol>
<h2>DKIM（DomainKeys Identified Mail）について</h2>
<p>DKIMは、<span class="sc_marker blue"><strong>メールが送信途中で改ざんされていないことを確認するための技術</strong></span>です。<br />
メールの送信者は、メールにデジタル署名を加えます。この署名は、送信者のドメインに関連付けられた公開鍵を使って検証することができます。公開鍵は、同じくドメインのDNSレコードに追加されます。</p>
<p>メールを受信した側は、この公開鍵を用いてデジタル署名を検証します。<br />
もし署名が正しく検証できれば、メールは途中で改ざんされていないとみなされ、信頼性が高いと判断されます。このプロセスにより、メールの送信者が本当に主張しているドメインの管理者であること、そしてメール内容が改ざんされていないことが確認されます。</p>
<h2>DKIMの設定方法</h2>
<p>DKIMの設定は、少し複雑で、メールサーバーでの設定変更が含まれます。以下は、DKIMを設定する基本的なステップです。</p>
<ol>
<li><strong>DKIM鍵の生成</strong>：
<ul>
<li>DKIM公開鍵と秘密鍵のペアを生成します。この作業は、使用しているメールサーバーのソフトウェアによって異なります。多くの場合、メールサービスプロバイダーがこれをサポートしており、自動的に行われます。</li>
</ul>
</li>
<li><strong>公開鍵をDNSレコードに追加</strong>：
<ul>
<li>公開鍵をドメインのDNSレコードにTXTレコードとして追加します。これにより、メールを受信した側が、送信されたメールのDKIM署名を検証できるようになります。</li>
<li>レコード名は通常、<code>default._domainkey</code>のような形式で、<code>_domainkey</code>はDKIMの標準です。値は公開鍵です。</li>
</ul>
</li>
<li><strong>メールサーバーの設定</strong>：
<ul>
<li>メールを送信する際に、DKIM署名をメールに自動的に追加するよう、メールサーバーを設定します。これは、メールサーバーの設定ファイルで指定するか、メールサービスプロバイダーの指示に従います。</li>
</ul>
</li>
</ol>
<h2>SPFとDKIMの併用</h2>
<p>SPFとDKIMは、<span class="sc_marker blue"><strong>それぞれ異なるアプローチでメールセキュリティを向上</strong></span>させます。</p>
<p>SPFは送信者のドメインが正しいかを検証し、DKIMはメールの内容が改ざんされていないことを保証します。これら二つの技術を組み合わせることで、より強固なメールセキュリティ体制を築くことができます。</p>
<p>特に、フィッシング詐欺やスパムメールは巧妙化しているため、送信者の正当性を検証し、メールの内容が安全であることを確認することが非常に重要です。SPFとDKIMを適切に設定することで、これらの脅威からユーザーを守る助けとなります。</p>
<h2>まとめ</h2>
<p>SPFとDKIMは、メールの安全性を確保するための重要な技術です。これらを正しく理解し、適切に設定することで、フィッシングやスパムから自分自身や組織を守ることができます。今回の記事が、SPFとDKIMの基本を理解し、より安全なメール環境を構築するきっかけになれば幸いです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1651/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【セキュリティ】ufw と waf について</title>
		<link>https://otonan-syusyoku.work/archives/1422</link>
					<comments>https://otonan-syusyoku.work/archives/1422#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Mon, 09 Oct 2023 04:04:41 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[設計]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1422</guid>

					<description><![CDATA[サーバー構築を任されたとき、ufwとwaf の違いがいまいちピンとこなかったので、ちょっと勉強してみました。 両者の違いをわからないままノリで進めていくと大恥かくので先に学んでおく事をおすすめします。 UFW（Uncom [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>サーバー構築を任されたとき、ufwとwaf の違いがいまいちピンとこなかったので、ちょっと勉強してみました。</p>
<p>両者の違いをわからないままノリで進めていくと大恥かくので先に学んでおく事をおすすめします。</p>
<h2>UFW（Uncomplicated Firewall）とは</h2>
<p>UFWは、<span class="sc_marker blue"><strong>Linuxベースのシステムでファイアウォールを設定するためのツール</strong></span>です。</p>
<p>UFWは、iptablesと呼ばれるより高度なファイアウォール設定を簡略化したもので、コマンドラインを通じて簡単に設定できます。</p>
<p>主な特徴は以下です</p>
<ul>
<li>ポートベースのファイアウォール設定をサポート
<ul>
<li>特定のポートへのアクセスを制御</li>
<li>IPアドレス、サブネット、アプリケーションなどの設定が可能。</li>
</ul>
</li>
<li>シンプルな構文
<ul>
<li>ufwは非常に簡単な構文を持っており、コマンドラインで簡単に設定できる</li>
<li>ufwはシステム全体のファイアウォールとして機能する。</li>
<li>ネットワークトラフィックを制御するために使用される。</li>
<li>特にWebアプリケーションのセキュリティには直接関係なし。</li>
</ul>
</li>
</ul>
<h3>使用例</h3>
<p>サーバーに対してセキュリティに関わる制限を設ける。</p>
<pre class="line-numbers"><code class="language-other">#HTTPS の port 開放 
sudo ufw allow 443

#MySQL の port 開放 
sudo ufw allow 3306

#sshの port 閉鎖 
sudo ufw deny 22</code></pre>
<p>&nbsp;</p>
<p>ufw にてポートの開閉を明示的に指示ができる。</p>
<div class="sc_frame_wrap inline red">
<div class="sc_frame_title"><span class="sc_frame_icon"><i class="fa fa-check-square-o" aria-hidden="true"><span>fa-check-square-o</span></i></span>ssh のポート開閉設定には注意</div>
<div class="sc_frame">
<p>ufw にて ssh のポートを閉じた場合、<span class="sc_marker blue"><strong>当たり前ですが ssh を用いてサーバーに接続することができなくなります</strong></span>。</p>
<p>当時の私の権限では、コントロールパネルから操作する権限を与えられていないアカウントで作業を行っていたため、構築作業が何もできない状況に陥りました。</p>
<p>サーバー管理者に申請を出す時間がないくらい案件を掛け持ちしていたため、サーバーを削除して最初から構築するという事態に陥りました。</p>
<p>ssh 周りの設定は注意しながら進めましょう。笑</p>
</div>
</div>
<h2>WAF（Web Application Firewall）とは</h2>
<p>WAFは、<span class="sc_marker blue"><strong>Webアプリケーションのセキュリティを強化するためのセキュリティツール</strong></span>です。</p>
<p>WAFは、Webトラフィックに対する特定のセキュリティルールを適用し、Webアプリケーション攻撃（例：SQLインジェクション、クロスサイトスクリプティングなど）から保護します。</p>
<p>主な特徴は以下です</p>
<ul>
<li>Webアプリケーションに対するトラフィックフィルタリング
<ul>
<li>WAFは、HTTPおよびHTTPSトラフィックを対象として、不正なリクエストや攻撃を検出し、遮断します。</li>
<li>パターンマッチング：WAFは特定の攻撃パターンや脆弱性に対する署名またはルールを使用して攻撃を検出します。</li>
<li>ロギングと監視：WAFは攻撃試行をログに記録し、セキュリティエンジニアがそれを監視および対応できるようにします。</li>
</ul>
</li>
</ul>
<p>WAFはWebサーバーとWebアプリケーションの間に配置され、攻撃をブロックしてWebアプリケーションを保護します。</p>
<h3>WAFは販売されている</h3>
<p>今回の勉強をするまでは、WAFの防御する内容が SQLインジェクションや XSS などであったため、自分で記述するプログラムにて防御するものだと思っていました。（自分で書くべきプログラムの総称と思っていた…</p>
<p>内容を深掘っていくとWAFはかなりの数が外反されており、運用を楽にするためにたくさんの企業が導入しているということがわかりました。</p>
<p>独自のルールを付加させる事のできるAWS WAF はその内勉強しないといけないなぁという印象です…</p>
<h2>用途の異なるセキュリティツール</h2>
<p>UFW（Uncomplicated Firewall）とWAF（Web Application Firewall）は、異なるセキュリティ関連のツールであり、異なる用途と機能を持っています。</p>
<p>簡単にまとめると以下のとおりですー。</p>
<ul>
<li>UFWはシステムのファイアウォール設定を簡単に行うためのツール</li>
<li>WAFはWebアプリケーションのセキュリティを向上させるための特化したセキュリティツール</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1422/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>「このメールアドレスは使用されています」が危険な理由【セキュリティ】</title>
		<link>https://otonan-syusyoku.work/archives/1386</link>
					<comments>https://otonan-syusyoku.work/archives/1386#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Wed, 23 Aug 2023 15:36:02 +0000</pubDate>
				<category><![CDATA[絶対に必要なIT基礎知識]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1386</guid>

					<description><![CDATA[セキュリティを担保したつもりが 有効なメールアドレスかどうかを検証するために以下のような流れで処理を組むことはよくあると思います。 メールアドレス入力（ユーザー） ランダムな文字列を入力されたメールアドレスに送信（システ [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>セキュリティを担保したつもりが</h2>
<p>有効なメールアドレスかどうかを検証するために以下のような流れで処理を組むことはよくあると思います。</p>
<ol>
<li>メールアドレス入力（ユーザー）</li>
<li>ランダムな文字列を入力されたメールアドレスに送信（システム）</li>
<li>受け取ったランダムな文字列を入力（ユーザー）</li>
<li>ユーザーが入力した文字列を送信した文字列と一致するか判定（システム）</li>
<li>4の検証が正常に通過したら1で入力されたメールアドレスを有効なアドレスとして登録</li>
</ol>
<p>そうですよね。メールアドレスの検証は絶対必要ですよね。<br />
上記の流れに間違いはないはずです。</p>
<p>レビューを貰うまで完璧な実装をしたと思い込んでいました。</p>
<h2>何が良くないのか？</h2>
<p>問題になったのは、1で実施する<span class="sc_marker blue"><strong>ユーザーが入力したメールアドレスの検証</strong></span>です。</p>
<p>ユーザーが入力したメールアドレスの検証では、以下の検証を実施しなければいけません。</p>
<ol>
<li>メールアドレス形式か</li>
<li>DBに登録されていないメールアドレスか</li>
<li>必要であればその他バリデーション</li>
</ol>
<p>&nbsp;</p>
<p>僕が実装した内容で問題となったのは、2の<span class="sc_marker blue"><strong>DBに登録されていないメールアドレス</strong></span>です。</p>
<p>僕の実装内容では、<span class="sc_marker blue"><strong>DBに登録されているメールアドレスが入力されたら「既に登録済みのメールアドレスです」とバリデーションエラーを出力</strong></span>していました。</p>
<p>それって、<span class="sc_marker blue"><strong>バリデーションに引っかかったメールアドレスが既に使用されている誰かのメールアドレスだと世に発表してしまっている状況</strong></span>でした。</p>
<p>具体的に以下の事象を引き起こしてしまう問題です。</p>
<ol>
<li>バリデーションに引っかかったメールアドレスを用いて総当たり攻撃に使用される（ログインなど）</li>
<li>バリデーションに引っかかったメールアドレスを自分が管理しているシステム以外で使用される</li>
</ol>
<p>&nbsp;</p>
<p>1に関しては試行回数に制限をかければ問題ないのですが、2に関しては僕らが出来ることは何一つ有りません。<br />
だって、自分らが管理しいない場所で悪用されるからです。</p>
<p>&nbsp;</p>
<p>ここで取得されたメールアドレスを悪意のある業者に売ったり、取得した悪意のある人がよからぬメールを送信することが出来ちゃいます。</p>
<p>なんて恐ろしい事態に陥ってしまうのでしょう。。</p>
<h2>対策</h2>
<p>対策は色々あると思いますが、僕が思いつくやつ挙げていきます。</p>
<ul>
<li>「無効な値です。」というバリデーションエラーを出力
<ul style="list-style-type: circle;">
<li>既に使われている事を明記しない</li>
<li>正確な対策ではない</li>
</ul>
</li>
<li>認証メールに添付するエンドポイントを絶対に検証が通らないエンドポイントにする
<ul style="list-style-type: circle;">
<li>ランダム文字列を入力するフォームに特定の条件のみアクセス可能とするなどが必要（ちょっと面倒）</li>
</ul>
</li>
</ul>
<p>他にもあるはずなので、各自のシステムに合わせて実装してください。</p>
<h2>預かったデータは大切に</h2>
<p>良かれと思って実装した内容がユーザーの個人情報を危険に晒してしまうことがあることを学べた貴重な経験でした。</p>
<p>やりがちなミスだと思うので、皆様もお気をつけください。</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1386/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[PHP]セッションハイジャック</title>
		<link>https://otonan-syusyoku.work/archives/1294</link>
					<comments>https://otonan-syusyoku.work/archives/1294#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Tue, 04 Apr 2023 00:24:11 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1294</guid>

					<description><![CDATA[セッションハイジャック 攻撃内容 WEBシステムのログイン後にセッションIDを盗み、ログイン者として該当のシステムを操作する「なりすまし行為」です。 システムで扱う内容にもよりますが、以下のことが可能です。 不正送金 不 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>セッションハイジャック</h2>
<h3>攻撃内容</h3>
<p>WEBシステムのログイン後にセッションIDを盗み、ログイン者として該当のシステムを操作する「<strong>なりすまし行為</strong>」です。</p>
<p>システムで扱う内容にもよりますが、以下のことが可能です。</p>
<ul>
<li>不正送金</li>
<li>不正購入</li>
</ul>
<p>&nbsp;</p>
<p>他人の運転免許(名義)で契約したり他人のパスポートで海外で悪さするなどが似ている犯罪になります。</p>
<p>そのため<span class="sc_marker blue"><strong>自分の情報は守りましょうね！</strong></span>というのが非常に大切になってきます。</p>
<div class="sc_frame_wrap inline orange">
<div class="sc_frame_title">セッションとは？</div>
<div class="sc_frame">
<p>アクセス開始から終了までの一連の通信の事を指します。<br />
例えばシステムにログインして検索をしてデータを登録するという処理をしたとします。<br />
上記の例では2つの処理を行っているのですが、検索と登録の2処理を1回のアクセスで行っているので1セッションとカウントします。</p>
<p>HTTP通信では状態を保持することが出来ないので、セッションという値を用いて状態を保持すると覚えましょ。</p>
</div>
</div>
<h3>対策</h3>
<p>攻撃する人にセッションIDを推測されないことが鉄則です。</p>
<p>まず最初にやることは<span class="sc_marker blue"><strong>見える位置にセッションIDを配置しないで</strong></span>ください。</p>
<ul>
<li>URLにセッションを含まない</li>
<li>hiddenにセッション値を設定しない(やる人いないと思いますが、一応)</li>
</ul>
<p>&nbsp;</p>
<p>その上でなりすましを防ぐためにログイン後にセッションIDを書き換えましょう。</p>
<p>PHPの場合は組み込み関数のsession_regenerate_id();を使用します。</p>
<p>上記関数を使用することで使用しているセッションIDを書き換える事が可能です。ログイン処理の関数を作って最後にsession_regenerate_id()関数を記述すれば安全にセッションIDを管理できます。</p>
<pre class="line-numbers"><code class="language-php">echo session_id(); //①
session_regenerate_id(); //セッションID書き換え
echo session_id(); //②</code></pre>
<p>&nbsp;</p>
<p>また仕組み上、セッションIDはCookieに保存されるのでHTTPS通信にのみCookieを有効化するように設定します。</p>
<pre class="line-numbers"><code class="language-php">//Apacheでの設定方法
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure

//php.iniでの設定方法
session.cookie_httponly = 1</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1294/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Apache2]オラのセキュリティ対策</title>
		<link>https://otonan-syusyoku.work/archives/1289</link>
					<comments>https://otonan-syusyoku.work/archives/1289#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Mon, 03 Apr 2023 23:50:10 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[絶対に必要なIT基礎知識]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1289</guid>

					<description><![CDATA[Apache2の設定ファイルについて はじめにApache2の設定ファイルについて理解しておきます。 &#160; WEB検索にてApacheのセキュリティ対策と検索するとApache導入後に自動生成される「/etc/a [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>Apache2の設定ファイルについて</h2>
<p>はじめにApache2の設定ファイルについて理解しておきます。</p>
<p>&nbsp;</p>
<p>WEB検索にてApacheのセキュリティ対策と検索するとApache導入後に自動生成される「/etc/apache2/apache2.conf」に定義してと書いてあります。</p>
<p>私のようにSSL化に伴い、設定ファイルを作成した場合は作成したファイルにセキュリティ対策を定義します。</p>
<p>/etc/apache2/sites-available/ドメイン名.conf</p>
<p>&nbsp;</p>
<p>「/etc/apache2/apache2.conf」と「/etc/apache2/sites-available/ドメイン名.conf」の違いとしては、</p>
<ul>
<li>全般的な設定は/etc/apache2/apache2.confに定義してね</li>
<li>サイトごとの設定をしたい場合は作成した設定ファイルに定義してね</li>
</ul>
<p>って感じになります。</p>
<p>&nbsp;</p>
<p>基本的に1サーバー1ドメインって形になるので、自動生成ファイルに記述していくことになるかと思います。</p>
<h2>エラーが出る場合</h2>
<p>これから紹介する対策を設定ファイルに定義した際にエラーが出る場合は下記のコマンドを実行してくださーい。</p>
<h3>Invalid command &#8216;Header&#8217;, perhaps misspelled or defined by a module not included in the server configuration</h3>
<h4>エラー内容</h4>
<p>Apache内でHTTPヘッダーの操作が許可されていませんよー。という内容</p>
<h4>対策</h4>
<p>下記コマンドでHTTPヘッダの有効化。</p>
<pre class="line-numbers"><code class="language-other">sudo a2enmod headers</code></pre>
<h2>クリックジャギング</h2>
<h3>クリックジャギングとは</h3>
<p>悪意のあるウェブページや広告をユーザーが踏むことで、意図しない操作を実行してしまう攻撃です。</p>
<p>具体的にはiframeタグやリンクなどを挿入し、既存のコンテンツの上に透過した悪意のあるコンテンツを重ねることで悪意のあるコードを実行させてしまう手法です。<br />
ユーザーからすると通常のボタンを押しただけなのに個人情報が盗まれてしまうという事象が発生します。</p>
<h3>対策</h3>
<p>HTTPヘッダーによる対策を実施します。</p>
<p>X-Frame-Options とはブラウザが特定のタグを許可するかどうかの設定です。</p>
<ul>
<li>DENY：どのサイトからも埋め込まれないようにする。</li>
<li>SAMEORIGIN：同じオリジン（同じドメイン・プロトコル・ポート番号）のサイトからのみ埋め込まれるようにする。</li>
<li>ALLOW-FROM：特定のURLからのみ埋め込まれるようにする。<br />
<span style="font-size: 10pt;">※今は非推奨らしい</span></li>
</ul>
<p>個人的には複数のサーバー(ロードバランサー)等で運用することが多いと思うので、SAMEORIGINを設定するケースが多いと思いますー。</p>
<p>&nbsp;</p>
<p>Apacheの場合は以下のファイルに追記します。</p>
<pre class="line-numbers"><code class="language-php">X-Frame-Options: DENY</code></pre>
<p>&nbsp;</p>
<p>HTMLページに設定する場合は以下のように設定します。<br />
<span style="font-size: 10pt;">※WEBサーバーに設定するのが推奨とのこと。</span></p>
<pre class="line-numbers"><code class="language-markup">&lt;meta http-equiv="X-FRAME-OPTIONS" content="DENY" /&gt;</code></pre>
<p>&nbsp;</p>
<h2>XSS</h2>
<h3>XSSとは</h3>
<p>悪意のあるスクリプトを注入し、ユーザーのブラウザで実行させることで、クッキー情報やセッションIDなどの個人情報を盗んだり、偽のWebページを表示してユーザーの意図しない行為を実施することができます。</p>
<p>&nbsp;</p>
<p>具体的にはGETパラーメーターに悪意のあるウェブページのリンクを入れたりすることで実現できます。</p>
<h3>考え方</h3>
<p>基本的にアプリケーション側で文字列のエスケープ処理やサニタイズ処理を実施します。</p>
<h3>Apacheでの対策</h3>
<p>XSSフィルター機能を設定します。</p>
<p>XSSフィルター機能とはブラウザの機能であり、ウェブページに含まれるリクエストパラーメーターやHTMLタグなどの入力値を検査し、悪意のあるスクリプトがあれば削除/エスケープするなどの対策を実施します。</p>
<pre class="line-numbers"><code class="language-other">Header set X-XSS-Protection "1; mode=block"</code></pre>
<h2>CSP</h2>
<h3>CSPとは</h3>
<p>Webページに埋め込まれる外部リソースの取り扱いを制限することを指します。</p>
<h3>対策</h3>
<pre class="line-numbers"><code class="language-other">Header set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; object-src 'none'; frame-ancestors 'none'"
</code></pre>
<p>&nbsp;</p>
<p>CSPの設定後に以下のエラーが出る方はドメインも含む形で &#8216;unsafe-eval&#8217;を設定してください。</p>
<p>ご自身のJSファイルが正規のものと判断させるために必要です。</p>
<p>Uncaught EvalError: Refused to evaluate a string as JavaScript because &#8216;unsafe-eval&#8217; is not an allowed source of script in the following Content Security Policy directive: &#8220;script-src &#8216;self&#8217; &#8216;unsafe-inline'&#8221;.</p>
<p>&nbsp;</p>
<p>ただし、Eval関数は文字列をJSの構文として扱うことが出来るので、推奨されません。</p>
<pre class="line-numbers"><code class="language-js">#実行されちゃう
let alert = alert('aiueo');
eval( "alert")</code></pre>
<p>そのため、他にも追加で対策してください。<br />
追加の対策として以下が考えられます。(N重にすることである程度は担保できるはずです。)</p>
<ul>
<li>XSSフィルター(サーバー側)</li>
<li>入力データの検証(アプリケーション側)</li>
</ul>
<h2>DOS/Ddos</h2>
<h3>DOS/DDOS</h3>
<p>システムに対して大量のリクエストを送ることで正常なリクエストを中止/失敗させサービスを正常に運用させなくする攻撃です。</p>
<h3>対策</h3>
<p>mod_evasiveというモジュールを使用します。</p>
<p>Linuxのディストリビューションやバージョンによって記載するファイルが異なります。</p>
<pre class="line-numbers"><code class="language-other">&lt;IfModule mod_evasive20.c&gt;
   DOSHashTableSize 3097
   DOSPageCount 10
   DOSSiteCount 50
   DOSPageInterval 1
   DOSSiteInterval 1
   DOSBlockingPeriod 10
   DOSLogDir "/var/log/mod_evasive"
   DOSEmailNotify admin@yourdomain.com
   DOSWhitelist 127.0.0.1
&lt;/IfModule&gt;</code></pre>
<p>&nbsp;</p>
<h2>画像の直リンク</h2>
<h3>直リンクされて困ること</h3>
<p>案件によっては、画像やPDFなどに情報を詰め込んだデータを扱う事があると思います。(保険の明細や履歴書など)</p>
<p>そういったデータをバイナリ化してDBへ登録するのではなく、特定ディレクトリに保管する場合に関しては、そのディレクトリに直接アクセスされてしまうと個人情報が公開されてしまいます。</p>
<p>そのための対策ですよん。</p>
<h3>対策</h3>
<p>リファラを使って直アクセスの対策を実施。</p>
<pre class="line-numbers"><code class="language-other">RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?ドメイン.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]</code></pre>
<p>一応、Apacheならではの.htaccessを使用したアクセス禁止方法もあります。</p>
<p>[getpost id=&#8221;1215&#8243; cat_name=&#8221;1&#8243; date=&#8221;0&#8243;]</p>
<h2>バージョン情報の非表示</h2>
<p>バージョンを表示することで対象のバージョンに合わせた攻撃を実施される/バージョンのセキュリティホールを見抜くなどの脅威があります。</p>
<p>サーバーにてコマンドを打てばバージョンを確認できるので、バージョンは非表示にしましょう。</p>
<h3>Apacheのバージョン非表示</h3>
<pre class="line-numbers"><code class="language-other">ServerTokens Prod</code></pre>
<h3>PHPのバージョン非表示</h3>
<p>/etc/php/{PHPのバージョン}/apache2/php.iniを編集。</p>
<pre class="line-numbers"><span style="color: #222222; font-family: monospace;"><span style="background-color: #e9ebec;">expose_php=off</span></span></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1289/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[ubuntu/Laravel]ブルートフォースアタック対策</title>
		<link>https://otonan-syusyoku.work/archives/1287</link>
					<comments>https://otonan-syusyoku.work/archives/1287#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Mon, 03 Apr 2023 22:35:20 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[絶対に必要なIT基礎知識]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1287</guid>

					<description><![CDATA[ブルートフォースアタックとは 簡単に言うとパスワード認証を通すために何回もidとpwを試してログイン認証を突破する攻撃手法です。 この攻撃手法は単純な実施方法ですが、定義しているパスワードが強力なものであっても時間とコン [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>ブルートフォースアタックとは</h2>
<p>簡単に言うとパスワード認証を通すために何回もidとpwを試してログイン認証を突破する攻撃手法です。</p>
<p>この攻撃手法は単純な実施方法ですが、定義しているパスワードが強力なものであっても時間とコンピュータリソースさえあれば攻撃者に突破される事が可能です。</p>
<p>昨今ではクラウドサーバーやレンタルサーバーなど誰でもサーバーを立ち上げやすくなっているので要注意です。</p>
<h2>Ubuntuでの対策</h2>
<p>サーバー側の設定です。</p>
<p>ブルートフォースアタックをさせないために<span class="sc_marker blue"><strong>PWでのログインではなく鍵認証でのログインのみを有効にすることがベストな対策</strong></span>です。(むしろやらないと駄目です。)</p>
<p>&nbsp;</p>
<p>Ubuntuでの対策はSSHファイルを編集します。</p>
<pre class="line-numbers"><code class="language-other">sudo nano /etc/ssh/sshd_config</code></pre>
<p>&nbsp;</p>
<p>ファイル内で以下の行をコメントアウト。<br />
やりたいことは<strong>パスワードによるSSH接続を許可するかどうかを制御</strong></p>
<pre class="line-numbers"><code class="language-other">#PasswordAuthentication yes</code></pre>
<p>&nbsp;</p>
<p>ファイル内で以下の行を追記。<br />
やりたいことは<strong>パスワードが空の場合でもSSH接続を制御<br />
</strong><span style="font-size: 10pt;">※上記のPasswordAuthenticationで制御しているので必須ではない。むしろ不要かも。</span></p>
<pre class="line-numbers"><code class="language-other">PermitEmptyPasswords no</code></pre>
<p>&nbsp;</p>
<p>最後にsshサービスの再起動。</p>
<pre class="line-numbers"><code class="language-other">sudo systemctl restart sshd</code></pre>
<p>&nbsp;</p>
<h2>Laravelでの対策</h2>
<p>アプリケーション側での設定です。</p>
<p>&nbsp;</p>
<p>Laravelでは、既存のファイルを編集することで対策可能です。</p>
<p>app/Http/Requests/Auth/LoginRequest.phpを編集。</p>
<h3>ログイン回数の設定</h3>
<p>tooManyAttemptsの引数：ログイン試行回数の設定</p>
<pre class="line-numbers"><code class="language-php">public function ensureIsNotRateLimited(): void
    {
        if (! RateLimiter::tooManyAttempts($this-&gt;throttleKey(), 5)) {
            return;
        }

        event(new Lockout($this));

        $seconds = RateLimiter::availableIn($this-&gt;throttleKey());

        throw ValidationException::withMessages([
            'email' =&gt; trans('auth.throttle', [
                'seconds' =&gt; $seconds,
                'minutes' =&gt; ceil($seconds / 60),
            ]),
        ]);
    }</code></pre>
<h3>ログイン停止時間の設定</h3>
<p>RateLimiter::hitの引数：停止時間の設定<br />
※秒数指定。10分なら600。</p>
<pre class="line-numbers"><code class="language-php">public function authenticate(): void
{
        if (! Auth::guard($guard)-&gt;attempt(
                [$credentials_key['id'] =&gt; $email, $credentials_key['pw'] =&gt; $password],
                $remenber)
            ) {
            RateLimiter::hit($this-&gt;throttleKey(),60);

            throw ValidationException::withMessages([
                'email' =&gt; trans('auth.failed'),
            ]);
        }
}</code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1287/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【PHP】インジェクション対策</title>
		<link>https://otonan-syusyoku.work/archives/1175</link>
					<comments>https://otonan-syusyoku.work/archives/1175#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sun, 31 Jul 2022 10:45:59 +0000</pubDate>
				<category><![CDATA[絶対に必要なIT基礎知識]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1175</guid>

					<description><![CDATA[SQLインジェクション &#160; 起こりうる脅威 ■ 発生しうる脅威 SQL インジェクション攻撃により、発生しうる脅威は次のとおりです。 &#8211; データベースに蓄積された非公開情報の閲覧 個人情報の漏えい  [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>SQLインジェクション</h2>
<p>&nbsp;</p>
<h3>起こりうる脅威</h3>
<blockquote><p>■ 発生しうる脅威<br />
SQL インジェクション攻撃により、発生しうる脅威は次のとおりです。<br />
&#8211; データベースに蓄積された非公開情報の閲覧<br />
個人情報の漏えい 等<br />
&#8211; データベースに蓄積された情報の改ざん、消去<br />
ウェブページの改ざん、パスワード変更、システム停止 等<br />
&#8211; 認証回避による不正ログイン4<br />
ログインした利用者に許可されている全ての操作を不正に行われる<br />
&#8211; ストアドプロシージャ等を利用した OS コマンドの実行<br />
システムの乗っ取り、他への攻撃の踏み台としての悪用 等</p>
<div class="blockquote_ref">
<div><a href="https://www.ipa.go.jp/files/000017316.pdf" target="_blank" rel="noopener">安全なウェブサイトの作り方 改訂第７版</a></div>
</div>
</blockquote>
<h3>ＰＨＰでの対策</h3>
<h4>プレースホルダ使おうね</h4>
<p>フォーム入力がある値を直接SQL文に使用せず下記のようにバインド。</p>
<p>バインドは２パターンあるのですが、両方を一緒に使用することが出来ないので注意して下さい。</p>
<p>個人的には名前付きプレスホルダーで実装したほうがわかりやすいです。。。。</p>
<pre class="line-numbers"><code class="language-php">//疑問符パラメータ
$Stmt = $pdo-&gt;prepare('SELECT * FROM test WHERE id = ? and input_date = ?');

$Stmt-&gt;bindValue(1, '100');
$Stmt-&gt;bindValue(2, '2022-08-01');

$Stmt-&gt;execute();

//名前付きプレスホルダー
$Stmt = $pdo-&gt;prepare('SELECT * FROM test WHERE id = :id and input_date = :input_daet');

$Stmt-&gt;bindValue(':id', '100');
$Stmt-&gt;bindValue(':input_daet', '2022-08-01');

$Stmt-&gt;execute();
</code></pre>
<p>&nbsp;</p>
<h2>コマンドインジェクション</h2>
<p>&nbsp;</p>
<p>タグ内に悪意のあるコマンドを実行する内容を記述し、セキュリティ事故を起こす方法。</p>
<pre class="line-numbers"><code class="language-other">ｄｆ</code></pre>
<h3>起こりうる脅威</h3>
<blockquote><p>&#8211; サーバ内ファイルの閲覧、改ざん、削除<br />
重要情報の漏えい、設定ファイルの改ざん 等<br />
&#8211; 不正なシステム操作<br />
意図しない OS のシャットダウン、ユーザアカウントの追加、変更 等<br />
&#8211; 不正なプログラムのダウンロード、実行<br />
ウイルス、ワーム、ボット等への感染、バックドアの設置 等<br />
&#8211; 他のシステムへの攻撃の踏み台</p>
<div class="blockquote_ref">
<div><a href="https://www.ipa.go.jp/files/000017316.pdf" target="_blank" rel="noopener">安全なウェブサイトの作り方 改訂第７版</a></div>
</div>
</blockquote>
<p>&nbsp;</p>
<h3>ＰＨＰでの対策</h3>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1175/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
