<?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>miyuki &#8211; セキュリティエンジニアの雑多ブログ</title>
	<atom:link href="https://cybermemo.blog/author/cm_writer/feed" rel="self" type="application/rss+xml" />
	<link>https://cybermemo.blog</link>
	<description>セキュリティエンジニアの学習記録</description>
	<lastBuildDate>Mon, 14 Sep 2026 05:56:08 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://cybermemo.blog/wp-content/uploads/2025/10/cropped-トップアイコン-32x32.jpg</url>
	<title>miyuki &#8211; セキュリティエンジニアの雑多ブログ</title>
	<link>https://cybermemo.blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>DNSSEC検証 DNSSEC破壊・検証編</title>
		<link>https://cybermemo.blog/dnssec-lab-testing</link>
					<comments>https://cybermemo.blog/dnssec-lab-testing#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sat, 12 Sep 2026 13:24:46 +0000</pubDate>
				<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[検証]]></category>
		<category><![CDATA[BIND]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[DNSSEC]]></category>
		<category><![CDATA[Unbound]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=802</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2026/08/検証アイキャッチ-1024x768.png" class="webfeedsFeaturedVisual" /></p>はじめに 何をしたいか DNSSECの信頼の連鎖を実際に構築し、DNS応答がどのように署名・検証されるのかを確認する。また、DNSSECに関する設定や署名を意図的に破壊し、検証失敗時にフルリゾルバやクライアントからどのよ [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2026/08/検証アイキャッチ-1024x768.png" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">はじめに</h2>



<h3 class="wp-block-heading">何をしたいか</h3>



<p class="wp-block-paragraph">DNSSECの信頼の連鎖を実際に構築し、DNS応答がどのように署名・検証されるのかを確認する。また、DNSSECに関する設定や署名を意図的に破壊し、検証失敗時にフルリゾルバやクライアントからどのように見えるのかを確認する。<br>前回の「DNSSEC構築編」では、Parent DNSとChild DNSにDNSSECを導入し、UnboundにTrust Anchorを設定することで、lab.test から child.lab.test までの信頼の連鎖を構築した。<br>本記事では、構築したDNSSEC環境を意図的に破壊し、署名の不整合や信頼の連鎖の破損が発生した際に、UnboundによるDNSSEC検証およびClientからの名前解決がどのような結果になるのかを確認する。</p>



<p class="wp-block-paragraph">準備・DNS構築編　<a href="https://cybermemo.blog/dnssec-lab-setup">https://cybermemo.blog/dnssec-lab-setup</a><br>DNSSEC構築編　<a href="https://cybermemo.blog/dnssec-lab-configuration">https://cybermemo.blog/dnssec-lab-configuration</a><br>DNSSEC破壊・検証編　本記事</p>



<h3 class="wp-block-heading">本記事で検証する構成</h3>



<p class="wp-block-paragraph">前回構築したDNSSEC環境を使用し、DNSSECに関する設定やDNSデータを意図的に変更して検証を行う。<br>正常な状態では、Unboundに設定した lab.test のTrust Anchorを起点として、Parent DNSのDNSKEY、Child DNSのDS・DNSKEY、各RRsetのRRSIGへと信頼の連鎖が成立している。<br>本記事では、この正常な状態を基準としてDNSSECを意図的に破壊し、正常時と異常時の応答を比較する。</p>



<pre class="wp-block-code"><code>              ┌─────────────┐
              │ Parent DNS  │　192.168.56.10/24
              │    BIND9    │　権威ゾーン: lab.test
              │             │　DNSKEY / RRSIG
              └──────┬──────┘
                     │
            child.lab.test を委任
              ＋ DSレコード
                     │
                     ▼
              ┌─────────────┐　192.168.56.20/24
              │  Child DNS  │　権威ゾーン: child.lab.test
              │    BIND9    │　DNSKEY / RRSIG
              │             │　└─ www.child.lab.test → 192.168.56.100
              └─────────────┘
                     ▲
                     │ DNS問い合わせ
                     │ ＋ DNSSEC署名情報
                     │
              ┌─────────────┐
              │  Resolver   │ 192.168.56.30/24
              │   Unbound   │ DNSSEC検証
              │             │ Trust Anchor: lab.test
              └──────┬──────┘
                     ▲
                     │ DNS問い合わせ
                     │
              ┌─────────────┐
              │   Client    │ 192.168.56.40/24
              └─────────────┘</code></pre>



<pre class="wp-block-code"><code>【正常時のDNSSECの信頼の連鎖】

Trust Anchor
（lab.test KSK / DNSKEY）
        │
        ▼
lab.test DNSKEY RRset
        │
        │ ParentのDSによってChild KSKを信頼
        ▼
child.lab.test DNSKEY RRset
        │
        │ Child ZSKの公開鍵でRRSIGを検証
        ▼
www.child.lab.test A</code></pre>



<h3 class="wp-block-heading">検証環境</h3>



<p class="wp-block-paragraph">仮想化ソフトウェア：Oracle VirtualBox<br>ゲストOS：Ubuntu Server 26.04.1 LTS（amd64）<br>権威DNS：BIND 9.20.24<br>フルリゾルバ：Unbound 1.24.2<br>DNS確認ツール：DiG 9.20.24<br>内部ネットワーク：192.168.56.0/24<br>検証ドメイン：lab.test / child.lab.test</p>



<h2 class="wp-block-heading">検証</h2>



<h3 class="wp-block-heading">検証1：署名済みAレコードを改ざんし、DNSSEC検証失敗を確認する</h3>



<p class="wp-block-paragraph">本検証では、攻撃者などによって署名済みDNSデータが改ざんされた状況を模擬するため、Child DNSのAレコードを変更し、A RRsetに対応するRRSIGは更新しない。これにより、RRsetとRRSIGが不整合となった際にUnboundがどのように検知するかを確認する。</p>



<h4 class="wp-block-heading">署名済みファイルのAレコードを直接変更</h4>



<p class="wp-block-paragraph">Child DNS で作業。</p>



<pre class="wp-block-code"><code># www.child.lab.test. 3600 IN A 192.168.56.<span class="swl-marker mark_orange">100</span> → www.child.lab.test. 3600 IN A 192.168.56.<span class="swl-marker mark_orange">200</span>
# Serialを変更
$ sudo vim /etc/bind/db.child.lab.test.signed
※一部抜粋
; File written on Wed Sep  9 13:25:36 2026
; dnssec-signzone version 9.20.24-1ubuntu0.3-Ubuntu
child.lab.test.         3600    IN SOA  ns.child.lab.test. dnsmaster.child.lab.test. (
                                        <span class="swl-marker mark_orange">2026091001</span> ; serial
（中略）
www.child.lab.test.     3600    IN A    192.168.56.<span class="swl-marker mark_orange">200</span>
                        3600    RRSIG   A 13 4 3600 (
                                        20261009122536 20260909122536 7661 child.lab.test.
                                        XX27GC+TFLVYuz+Jd8Ox7SyC5yxL1ifF+cuS
                                        mi+J8jcqgW8NQhR+Fi8sFaHbAEZuw691gEoZ
                                        22rXmWlCL5sbOQ== )</code></pre>



<p class="wp-block-paragraph">今回の検証の構成は下記。</p>



<pre class="wp-block-code"><code>署名時
www.child.lab.test A 192.168.56.100
              │
              └── ZSKで署名
                       ↓
                    RRSIG A

                ↓ Aレコードを改ざん

www.child.lab.test A 192.168.56.200
                    +
以前の192.168.56.100に対するRRSIG
                    ↓
                 不一致</code></pre>



<h4 class="wp-block-heading">BINDに改ざん後のゾーンを読み込ませる</h4>



<pre class="wp-block-code"><code># reload
$ sudo rndc reload child.lab.test

# Serialを確認
$ sudo rndc zonestatus child.lab.test
name: child.lab.test
type: primary
files: /etc/bind/db.child.lab.test.signed
<span class="swl-marker mark_orange">serial: 2026091001</span>
nodes: 3
last loaded: Thu, 10 Sep 2026 13:24:27 GMT
secure: yes
inline signing: no
key maintenance: none
next resign node: ns.child.lab.test/NSEC
next resign time: Fri, 02 Oct 2026 12:25:36 GMT
dynamic: no
reconfigurable via modzone: no

# Childが改ざん後のデータを配信していることを確認
$ dig +dnssec @192.168.56.20 www.child.lab.test A

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; +dnssec @192.168.56.20 www.child.lab.test A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 65390
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
; COOKIE: 194a0690a20c4f2e010000006aa2b07b18a3ea84a17f5fad (good)
;; QUESTION SECTION:
;www.child.lab.test.            IN      A

;; ANSWER SECTION:
www.child.lab.test.     3600    IN      A       <span class="swl-marker mark_orange">192.168.56.200</span>
<span class="swl-marker mark_orange">www.child.lab.test.     3600    IN      RRSIG   A 13 4 3600 20261009122536 20260909122536 7661 child.lab.test. XX27GC+TFLVYuz+Jd8Ox7SyC5yxL1ifF+cuSmi+J8jcqgW8NQhR+Fi8s FaHbAEZuw691gEoZ22rXmWlCL5sbOQ==</span>

;; Query time: 0 msec
;; SERVER: 192.168.56.20#53(192.168.56.20) (UDP)
;; WHEN: Thu Sep 10 13:28:27 UTC 2026
;; MSG SIZE  rcvd: 201</code></pre>



<h4 class="wp-block-heading">Client → Unbound で確認</h4>



<pre class="wp-block-code"><code># Resolverで作業。キャッシュ削除
$ sudo unbound-control flush_zone child.lab.test

# Clientで作業。
$ dig +dnssec @192.168.56.30 www.child.lab.test A

; &lt;&lt;>> DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;>> +dnssec @192.168.56.30 www.child.lab.test A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER&lt;&lt;- opcode: QUERY, <span class="swl-marker mark_orange">status: SERVFAIL</span>, id: 32814　　# status: SERVFAIL,　ANSWER: 0 = 問い合わせ失敗
;; flags: <span class="swl-marker mark_orange">qr rd ra</span>; QUERY: 1, <span class="swl-marker mark_orange">ANSWER: 0</span>, AUTHORITY: 0, ADDITIONAL: 1　　# 正常時に存在していた ad フラグなし

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
;; QUESTION SECTION:
;www.child.lab.test.            IN      A

;; Query time: 21 msec
;; SERVER: 192.168.56.30#53(192.168.56.30) (UDP)
;; WHEN: Thu Sep 10 13:32:32 UTC 2026
;; MSG SIZE  rcvd: 47

# ジャーナル確認
$ sudo journalctl -u unbound --since "2 minutes ago" > log
$ grep -E "validated DS|validated DNSKEY|signature mismatch|failed ANSWER|bad rrsets" log
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] info: validated DS child.lab.test. DS IN
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] info: validated DNSKEY child.lab.test. DNSKEY IN
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] debug: <span class="swl-marker mark_orange">verify: signature mismatch</span>
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] info: <span class="swl-marker mark_orange">validator: response has failed ANSWER rrset: www.child.lab.test. A IN</span>
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] info: Validate: message contains bad rrsets
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] debug: <span class="swl-marker mark_orange">verify: signature mismatch</span>
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] info: <span class="swl-marker mark_orange">validator: response has failed ANSWER rrset: www.child.lab.test. A IN</span>
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] info: Validate: message contains bad rrsets
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] debug: <span class="swl-marker mark_orange">verify: signature mismatch</span>
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] info: <span class="swl-marker mark_orange">validator: response has failed ANSWER rrset: www.child.lab.test. A IN</span>
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] info: Validate: message contains bad rrsets
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] debug: <span class="swl-marker mark_orange">verify: signature mismatch</span>
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] info: <span class="swl-marker mark_orange">validator: response has failed ANSWER rrset: www.child.lab.test. A IN</span>
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] info: Validate: message contains bad rrsets
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] debug: <span class="swl-marker mark_orange">verify: signature mismatch</span>
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] info: <span class="swl-marker mark_orange">validator: response has failed ANSWER rrset: www.child.lab.test. A IN</span>
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] info: Validate: message contains bad rrsets
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] debug: <span class="swl-marker mark_orange">verify: signature mismatch</span>
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] info: <span class="swl-marker mark_orange">validator: response has failed ANSWER rrset: www.child.lab.test. A IN</span>
Sep 10 13:44:58 resolver unbound&#91;1538]: &#91;1538:0] info: <span class="swl-marker mark_orange">Validate: message contains bad rrsets</span></code></pre>



<p class="wp-block-paragraph">下記の流れでエラー発生。</p>



<pre class="wp-block-code"><code>Client
   │
   ▼
Unbound
   │
   │ www.child.lab.test A = 192.168.56.200
   │ RRSIG A = 以前の署名
   │
   ▼
Child ZSKの公開鍵（DNSKEY）でRRSIGを検証
   │
   └── ✕ 署名が一致しない
          │
          ▼
        Bogus
          │
          ▼
       SERVFAIL</code></pre>



<p class="wp-block-paragraph">ジャーナルから読み取れる挙動は下記。</p>



<pre class="wp-block-code"><code>validated DS
    ↓
ChildのDSは正常

validated DNSKEY
    ↓
ChildのDNSKEYも正常

signature mismatch
    ↓
AレコードとRRSIGが一致しない

failed ANSWER rrset
    ↓
www.child.lab.test のA RRsetを検証できない

bad rrsets
    ↓
DNSSEC検証失敗</code></pre>



<h4 class="wp-block-heading">検証結果</h4>



<p class="wp-block-paragraph">Resolverのキャッシュを削除した後、ClientからUnboundを経由して www.child.lab.test のAレコードを問い合わせた。結果は SERVFAIL となり、ANSWER SECTIONは0件だった。また、正常時に存在していた ad フラグも付与されていない。これにより、AレコードとRRSIGが不整合な状態では、UnboundがDNSSEC検証を正常に完了できないことを確認した。</p>



<h3 class="wp-block-heading">検証2：DSレコードを不整合にする</h3>



<p class="wp-block-paragraph">本検証では、Parent DNSに登録されている child.lab.test のDSレコードを意図的に変更し、Child DNSのKSKと不整合な状態を作成する。これにより、ParentからChildへの信頼の連鎖が成立しなくなった際に、Unboundがどのように検知するかを確認する。</p>



<h4 class="wp-block-heading">Parent DNSのDSレコードを変更</h4>



<p class="wp-block-paragraph">Parent DNS で作業。</p>



<pre class="wp-block-code"><code># 元ゾーンのDSを確認
$ grep " IN DS " /etc/bind/db.lab.test
child       IN DS 26145 13 2 C0F99483CDF9CE53B7EFBCE8607A73DCAA7B6FA728F24ECFEB01F6532742BF5D

# Serialを変更
# digestの最後の1文字だけ変更　D → E
$ sudo vim /etc/bind/db.lab.test
2026091201 ; Serial
child       IN DS 26145 13 2 C0F99483CDF9CE53B7EFBCE8607A73DCAA7B6FA728F24ECFEB01F6532742BF5<span class="swl-marker mark_orange">E</span>

# ファイル確認
$ cat /etc/bind/db.lab.test
<code>$TTL 3600

@   IN  SOA ns dnsmaster (
        2026091201 ; Serial
        3600       ; Refresh
        900        ; Retry
        604800     ; Expire
        86400      ; Negative Cache TTL
)

    IN  NS  ns.lab.test.

ns  IN  A   192.168.56.10

child       IN NS ns.child
ns.child    IN A  192.168.56.20
child       IN DS 26145 13 2 C0F99483CDF9CE53B7EFBCE8607A73DCAA7B6FA728F24ECFEB01F6532742BF5E
; This is a key-signing key, keyid 25095, for lab.test.
; Created: 20260910122739 (Thu Sep 10 12:27:39 2026)
; Publish: 20260910122739 (Thu Sep 10 12:27:39 2026)
; Activate: 20260910122739 (Thu Sep 10 12:27:39 2026)
lab.test. IN DNSKEY 257 3 13 nzPV3+LMX633npZfI3Seu2cR8SrTegHIi1sCK2OtNTQyRZg/v6yVkRDl nmr52oumop7xFxsx6vcZk3emfTsFbQ==
; This is a zone-signing key, keyid 42600, for lab.test.
; Created: 20260910122712 (Thu Sep 10 12:27:12 2026)
; Publish: 20260910122712 (Thu Sep 10 12:27:12 2026)
; Activate: 20260910122712 (Thu Sep 10 12:27:12 2026)
lab.test. IN DNSKEY 256 3 13 XGx8XP7w7bqg8k9cBXoPvDLsZQFUOAuUbdr8Bd8ZSH25ip1Bq75BGFYO yZhxy0DNqEsEPPpDt2qHAW/kdlJs3g==</code></code></pre>



<p class="wp-block-paragraph">ここで作った状態は下記。</p>



<pre class="wp-block-code"><code>Child KSK
    │
    └─ 本来のSHA-256 digest
             ↓
        ...2742BF5<span class="swl-marker mark_orange">D</span>

Parentに登録したDS
             ↓
        ...2742BF5<span class="swl-marker mark_orange">E</span>
             ↑
          不一致</code></pre>



<h4 class="wp-block-heading">変更後のDSレコードを含むParentゾーンを再署名</h4>



<pre class="wp-block-code"><code># ゾーンファイルを確認
$ sudo named-checkzone lab.test /etc/bind/db.lab.test

# Parentゾーンを再署名
$ cd /etc/bind/keys/lab.test
$ sudo dnssec-signzone \
  -S \
  -o lab.test \
  -f /etc/bind/db.lab.test.signed \
  /etc/bind/db.lab.test
Verifying the zone using the following algorithms:
- ECDSAP256SHA256
Zone fully signed:
Algorithm: ECDSAP256SHA256: KSKs: 1 active, 0 stand-by, 0 revoked
                            ZSKs: 1 active, 0 stand-by, 0 revoked
/etc/bind/db.lab.test.signed</code></pre>



<p class="wp-block-paragraph">改ざん後のDSに対して新しいRRSIG DSが生成される。</p>



<pre class="wp-block-code"><code>偽DS
  │
  └─ Parent ZSKで正常に署名
             ↓
       RRSIG DSは正常

しかし

偽DS
  ↕　一致しない　　　　　　
Child KSK</code></pre>



<h4 class="wp-block-heading">BINDに再署名後のゾーンを読み込ませる</h4>



<pre class="wp-block-code"><code>$ sudo rndc reload lab.test
$ sudo rndc zonestatus lab.test
name: lab.test
type: primary
files: /etc/bind/db.lab.test.signed
<span class="swl-marker mark_orange">serial: 2026091201</span>
nodes: 4
last loaded: Sat, 12 Sep 2026 10:49:13 GMT
secure: yes
inline signing: no
key maintenance: none
next resign node: lab.test/DNSKEY
next resign time: Mon, 05 Oct 2026 09:49:13 GMT
dynamic: no
reconfigurable via modzone: no

# 変更後のDSレコードとRRSIGを確認
$ dig +dnssec +norecurse @192.168.56.10 child.lab.test DS

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; +dnssec +norecurse @192.168.56.10 child.lab.test DS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 7197
;; flags: qr aa ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
; COOKIE: c5bb3449b7fa9da2010000006aa53041466bb4c96a8f1c6c (good)
;; QUESTION SECTION:
;child.lab.test.                        IN      DS

;; ANSWER SECTION:
child.lab.test.         3600    IN      DS      26145 13 2 C0F99483CDF9CE53B7EFBCE8607A73DCAA7B6FA728F24ECFEB01F653 2742BF5<span class="swl-marker mark_orange">E</span>　　# D → E に変更されている
child.lab.test.         3600    IN      RRSIG   DS 13 3 3600 20261012094913 20260912094913 42600 lab.test. BI3iajICF5rg6gHFcItF2XATrIZuHwPiGrBnNN/Bde02gBYnc8n62dI0 N8K3+/7d6wECpKNOjFcsUwBcnfhkQA==

;; Query time: 0 msec
;; SERVER: 192.168.56.10#53(192.168.56.10) (UDP)
;; WHEN: Sat Sep 12 10:58:09 UTC 2026
;; MSG SIZE  rcvd: 223</code></pre>



<h4 class="wp-block-heading">Child KSKから生成されるDSとの不一致を確認する</h4>



<p class="wp-block-paragraph">Child DNS で作業。</p>



<pre class="wp-block-code"><code># Child KSK側の設定を確認
$ cd /etc/bind/keys/child.lab.test
$ dnssec-dsfromkey -2 Kchild.lab.test.+013+26145.key
child.lab.test. IN DS 26145 13 2 C0F99483CDF9CE53B7EFBCE8607A73DCAA7B6FA728F24ECFEB01F6532742BF5<span class="swl-marker mark_orange">D</span></code></pre>



<h4 class="wp-block-heading">Client → Unbound で確認</h4>



<pre class="wp-block-code"><code># キャッシュ削除(Resolverで作業)
$ sudo unbound-control flush_zone lab.test

# Clientから確認
$ dig +dnssec @192.168.56.30 www.child.lab.test A

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; +dnssec @192.168.56.30 www.child.lab.test A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: <span class="swl-marker mark_orange">SERVFAIL</span>, id: 62414
;; flags: <span class="swl-marker mark_orange">qr rd ra</span>; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
;; QUESTION SECTION:
;www.child.lab.test.            IN      A

;; Query time: 17 msec
;; SERVER: 192.168.56.30#53(192.168.56.30) (UDP)
;; WHEN: Sat Sep 12 11:06:35 UTC 2026
;; MSG SIZE  rcvd: 47

# ジャーナル確認　※ログは一部抜粋
$ sudo journalctl -u unbound --since "2 minutes ago" &gt; log
$ grep -Ei "DS|DNSKEY|bogus|fail|mismatch|validate|bad|key" log
Sep 12 11:11:01 resolver unbound&#91;1661]: &#91;1661:0] info: adding trusted key lab.test. DNSKEY IN
Sep 12 11:11:01 resolver unbound&#91;1661]: &#91;1661:0] info: validator operate: query . DNSKEY IN
Sep 12 11:11:01 resolver unbound&#91;1661]: &#91;1661:0] info: resolving . DNSKEY IN
Sep 12 11:11:01 resolver unbound&#91;1661]: &#91;1661:0] debug: request has exceeded the maximum number of sends with 33
Sep 12 11:11:01 resolver unbound&#91;1661]: &#91;1661:0] debug: return error response SERVFAIL
Sep 12 11:11:01 resolver unbound&#91;1661]: &#91;1661:0] info: iterator operate: query . DNSKEY IN
Sep 12 11:11:01 resolver unbound&#91;1661]: &#91;1661:0] info: processQueryTargets: . DNSKEY IN
Sep 12 11:11:01 resolver unbound&#91;1661]: &#91;1661:0] debug: Failed to get a delegation, giving up
Sep 12 11:11:01 resolver unbound&#91;1661]: &#91;1661:0] debug: return error response SERVFAIL
Sep 12 11:11:01 resolver unbound&#91;1661]: &#91;1661:0] info: validator operate: query . DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: generate keytag query _ta-6207.lab.test. NULL IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: validator operate: query lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: resolving lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: resolving (init part 2):  lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: resolving (init part 3):  lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: processQueryTargets: lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: sending query: lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: iterator operate: query lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: response for lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: finishing processing for lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: validator operate: query lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: validate keys with anchor(DS): sec_status_secure
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: Successfully primed trust anchor lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: <span class="swl-marker mark_orange">validated DS child.lab.test. DS IN</span>
(中略)
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: validator operate: query child.lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: resolving child.lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: resolving (init part 2):  child.lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: resolving (init part 3):  child.lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: processQueryTargets: child.lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: sending query: child.lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: iterator operate: query child.lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: response for child.lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: finishing processing for child.lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: validator operate: query child.lab.test. DNSKEY IN
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] debug: <span class="swl-marker mark_orange">DS fail: digest is different
</span>Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] debug: <span class="swl-marker mark_orange">Failed to match any usable DS to a DNSKEY.</span>
Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: <span class="swl-marker mark_orange">Did not match a DS to a DNSKEY, thus bogus.
</span>Sep 12 11:11:05 resolver unbound&#91;1661]: &#91;1661:0] info: <span class="swl-marker mark_orange">Could not establish a chain of trust to keys for child.lab.test. DNSKEY IN</span></code></pre>



<p class="wp-block-paragraph">下記の流れでエラー発生。</p>



<pre class="wp-block-code"><code>Unbound
  |
  | ParentのDSを取得
  v
DS RRset + RRSIG DS
  |
  +-- ○ Parent側の署名検証は成功
  |
  v
Child DNSKEYを取得
  |
  | DNSKEYからdigestを計算
  v
Parent DS     Child KSK由来
...BF5E       ...BF5D
     \         /
      \       /
       × 不一致
          |
          v
Failed to match any usable DS to a DNSKEY
          |
          v
Bogus
          |
          v
SERVFAIL</code></pre>



<p class="wp-block-paragraph">ジャーナルから読み取れる挙動は下記。</p>



<pre class="wp-block-code"><code>validated DS
    ↓
ParentのDS RRset自体の署名検証は成功

DS fail: digest is different
    ↓
DSのdigestとChild DNSKEYから算出したdigestが一致しない

Failed to match any usable DS to a DNSKEY.
    ↓
DSに対応するChild DNSKEYを確認できない

Did not match a DS to a DNSKEY, thus bogus.
    ↓
DNSSEC検証でBogusと判定

Could not establish a chain of trust to keys
    ↓
ParentからChildへの信頼の連鎖を構築できない</code></pre>



<h4 class="wp-block-heading">検証結果</h4>



<p class="wp-block-paragraph">Resolverのキャッシュを削除した後、ClientからUnboundを経由して www.child.lab.test のAレコードを問い合わせた。結果は SERVFAIL となり、ANSWER SECTIONは0件だった。また、正常時に存在していた ad フラグも付与されていない。これにより、Parent DNSのDSレコードとChild KSKが不整合な状態では、UnboundがDNSSEC検証を正常に完了できないことを確認した。</p>



<h3 class="wp-block-heading">検証3：DSレコードを削除し、Insecureになることを確認する</h3>



<p class="wp-block-paragraph">本検証では、Parent DNSに登録されている child.lab.test のDSレコードを削除し、ParentからChildへのDNSSECの信頼の連鎖が存在しない状態を作成する。DSレコードが存在するもののChild DNSKEYと不整合だった検証2とは異なり、DSレコードが正しく存在しない場合に、UnboundがChildゾーンをどのように扱うかを確認する。</p>



<h4 class="wp-block-heading">Parent DNSからDSレコードを削除する</h4>



<p class="wp-block-paragraph">Parent DNS で作業。</p>



<pre class="wp-block-code"><code># Serialを変更
# 元ゾーンファイルのDSレコードを削除
$ sudo vim /etc/bind/db.lab.test
<code>$TTL 3600

@   IN  SOA ns dnsmaster (
        2026091201 ; Serial
        3600       ; Refresh
        900        ; Retry
        604800     ; Expire
        86400      ; Negative Cache TTL
)

    IN  NS  ns.lab.test.

ns  IN  A   192.168.56.10

child       IN NS ns.child
ns.child    IN A  192.168.56.20
; This is a key-signing key, keyid 25095, for lab.test.
; Created: 20260910122739 (Thu Sep 10 12:27:39 2026)
; Publish: 20260910122739 (Thu Sep 10 12:27:39 2026)
; Activate: 20260910122739 (Thu Sep 10 12:27:39 2026)
lab.test. IN DNSKEY 257 3 13 nzPV3+LMX633npZfI3Seu2cR8SrTegHIi1sCK2OtNTQyRZg/v6yVkRDl nmr52oumop7xFxsx6vcZk3emfTsFbQ==
; This is a zone-signing key, keyid 42600, for lab.test.
; Created: 20260910122712 (Thu Sep 10 12:27:12 2026)
; Publish: 20260910122712 (Thu Sep 10 12:27:12 2026)
; Activate: 20260910122712 (Thu Sep 10 12:27:12 2026)
lab.test. IN DNSKEY 256 3 13 XGx8XP7w7bqg8k9cBXoPvDLsZQFUOAuUbdr8Bd8ZSH25ip1Bq75BGFYO yZhxy0DNqEsEPPpDt2qHAW/kdlJs3g==</code></code></pre>



<h4 class="wp-block-heading">DS削除後のParentゾーンを再署名する</h4>



<pre class="wp-block-code"><code># ゾーンファイルを確認
$ sudo named-checkzone lab.test /etc/bind/db.lab.test

# Parentゾーンを再署名
$ cd /etc/bind/keys/lab.test
$ sudo dnssec-signzone \
  -S \
  -o lab.test \
  -f /etc/bind/db.lab.test.signed \
  /etc/bind/db.lab.test
Verifying the zone using the following algorithms:
- ECDSAP256SHA256
Zone fully signed:
Algorithm: ECDSAP256SHA256: KSKs: 1 active, 0 stand-by, 0 revoked
                            ZSKs: 1 active, 0 stand-by, 0 revoked
/etc/bind/db.lab.test.signed</code></pre>



<h4 class="wp-block-heading">BINDに再署名後のゾーンを読み込ませる</h4>



<pre class="wp-block-code"><code>$ sudo rndc reload lab.test
$ sudo rndc zonestatus lab.test
name: lab.test
type: primary
files: /etc/bind/db.lab.test.signed
<span class="swl-marker mark_orange">serial: 2026091201</span>
nodes: 4
last loaded: Sat, 12 Sep 2026 11:42:06 GMT
secure: yes
inline signing: no
key maintenance: none
next resign node: lab.test/DNSKEY
next resign time: Mon, 05 Oct 2026 10:42:06 GMT
dynamic: no
reconfigurable via modzone: no

# DSがANSWER SECTIONに返らないことと、DNSSECによる不在証明に関係する情報が返ってくることを確認
$ dig +dnssec +norecurse @192.168.56.10 child.lab.test DS

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; +dnssec +norecurse @192.168.56.10 child.lab.test DS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 10626
;; flags: qr aa ra; QUERY: 1, <span class="swl-marker mark_orange">ANSWER: 0</span>, AUTHORITY: 4, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
; COOKIE: 1a9ae6c7bc8bf2dc010000006aa53b4245473b3175ed38ac (good)
;; QUESTION SECTION:
;child.lab.test.                        IN      DS

;; AUTHORITY SECTION:
lab.test.               3600    IN      SOA     ns.lab.test. dnsmaster.lab.test. 2026091201 3600 900 604800 86400
lab.test.               3600    IN      RRSIG   SOA 13 2 3600 20261012104206 20260912104206 42600 lab.test. 3+/zAO/gAc+/0RLsZz5+9bxCTlKo9CM8It0vjtxFVgNTl89h//QS0bs7 O7JqjCRdIkMLGTxKMyoygiKlvMEq3A==
<span class="swl-marker mark_orange">child.lab.test.         3600    IN      NSEC    ns.lab.test. NS RRSIG NSEC</span>
child.lab.test.         3600    IN      RRSIG   NSEC 13 3 3600 20261012104206 20260912104206 42600 lab.test. JLf3igQqIgx0gh+uwOY/axOws/jSS+95NhlsvegrziN3Qn1bobeVLGcO iw66jM2zqD4ihBqS5IR4ga/reXh8/Q==

;; Query time: 0 msec
;; SERVER: 192.168.56.10#53(192.168.56.10) (UDP)
;; WHEN: Sat Sep 12 11:45:06 UTC 2026
;; MSG SIZE  rcvd: 361</code></pre>



<p class="wp-block-paragraph">NSECとそれに付いたRRSIGによって、「child.lab.test にはDSレコードが存在しない」ことがDNSSECで認証されている。</p>



<pre class="wp-block-code"><code>Unbound
   |
   | child.lab.test のDSは？
   v
Parent DNS
   |
   | DSは存在しない
   v
NSEC
「child.lab.testには
 NS / RRSIG / NSEC はあるが
 DSはない」
   |
   | Parent ZSK 42600によるRRSIG
   v
認証されたDSの不在</code></pre>



<h4 class="wp-block-heading">Client → Unbound で確認</h4>



<pre class="wp-block-code"><code># キャッシュ削除(Resolverで作業)
$ sudo unbound-control flush_zone lab.test

# Clientから確認
$ dig +dnssec @192.168.56.30 www.child.lab.test A

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; +dnssec @192.168.56.30 www.child.lab.test A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: <span class="swl-marker mark_orange">NOERROR</span>, id: 20363
;; flags: <span class="swl-marker mark_orange">qr rd ra</span>; QUERY: 1, ANSWER: <span class="swl-marker mark_orange">2</span>, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
;; QUESTION SECTION:
;www.child.lab.test.            IN      A

;; ANSWER SECTION:
www.child.lab.test.     3600    IN      A       192.168.56.100
www.child.lab.test.     3600    IN      RRSIG   A 13 4 3600 20261009122536 20260909122536 7661 child.lab.test. XX27GC+TFLVYuz+Jd8Ox7SyC5yxL1ifF+cuSmi+J8jcqgW8NQhR+Fi8s FaHbAEZuw691gEoZ22rXmWlCL5sbOQ==

;; Query time: 10 msec
;; SERVER: 192.168.56.30#53(192.168.56.30) (UDP)
;; WHEN: Sat Sep 12 11:54:26 UTC 2026
;; MSG SIZE  rcvd: 173

# ジャーナル確認　
$ sudo journalctl -u unbound --since "2 minutes ago" &gt; log
$ grep -Ei "DS|DNSKEY|secure|insecure|bogus|validate|NSEC|trust" log
Sep 12 11:54:17 resolver unbound&#91;1611]: &#91;1611:0] info: adding trusted key lab.test. DNSKEY IN
Sep 12 11:54:17 resolver unbound&#91;1611]: &#91;1611:0] info: validator operate: query . DNSKEY IN
Sep 12 11:54:17 resolver unbound&#91;1611]: &#91;1611:0] info: resolving . DNSKEY IN
Sep 12 11:54:17 resolver unbound&#91;1611]: &#91;1611:0] debug: request has exceeded the maximum number of sends with 33
Sep 12 11:54:17 resolver unbound&#91;1611]: &#91;1611:0] info: iterator operate: query . DNSKEY IN
Sep 12 11:54:17 resolver unbound&#91;1611]: &#91;1611:0] info: processQueryTargets: . DNSKEY IN
Sep 12 11:54:17 resolver unbound&#91;1611]: &#91;1611:0] info: validator operate: query . DNSKEY IN
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: prime trust anchor
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: validator operate: query lab.test. DNSKEY IN
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: resolving lab.test. DNSKEY IN
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: resolving (init part 2):  lab.test. DNSKEY IN
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: resolving (init part 3):  lab.test. DNSKEY IN
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: processQueryTargets: lab.test. DNSKEY IN
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: sending query: lab.test. DNSKEY IN
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: iterator operate: query lab.test. DNSKEY IN
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: response for lab.test. DNSKEY IN
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: finishing processing for lab.test. DNSKEY IN
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: validator operate: query lab.test. DNSKEY IN
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: <span class="swl-marker mark_orange">validate keys with anchor(DS): sec_status_secure</span>
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: <span class="swl-marker mark_orange">Successfully primed trust anchor lab.test. DNSKEY IN</span>
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: <span class="swl-marker mark_orange">NSEC RRset for the referral proved no DS.</span>
Sep 12 11:54:26 resolver unbound&#91;1611]: &#91;1611:0] info: <span class="swl-marker mark_orange">Verified that response is INSECURE</span></code></pre>



<p class="wp-block-paragraph">本検証の流れは下記。</p>



<pre class="wp-block-code"><code>Parent
  |
  | DSなし
  | NSEC + RRSIG NSECで不在を証明
  v
Unbound
  |
  | 「このChildはDNSSECの信頼の連鎖に接続されていない」
  v
Insecure
  |
  | 名前解決は継続
  v
A = 192.168.56.100 を返す
  |
  v
adフラグは付かない</code></pre>



<p class="wp-block-paragraph">ジャーナルから読み取れる挙動は下記。</p>



<pre class="wp-block-code"><code>validate keys with anchor(DS): sec_status_secure
    ↓
lab.test のTrust Anchorは正常

Successfully primed trust anchor
    ↓
Parent側の信頼の起点を正常に確立

NSEC RRset for the referral proved no DS.
    ↓
child.lab.test にDSが存在しないことをNSECで確認

Verified that response is INSECURE
    ↓
ChildゾーンをInsecureとして扱う</code></pre>



<h3 class="wp-block-heading">検証結果</h3>



<p class="wp-block-paragraph">Resolverのキャッシュを削除した後、ClientからUnboundを経由して www.child.lab.test のAレコードを問い合わせた。結果は NOERROR となり、Aレコード 192.168.56.100 が正常に返された。一方、正常時に存在していた ad フラグは付与されていない。Unboundのログでは、NSECによってDSレコードが存在しないことが確認され、INSECURE と判定されていた。これにより、Parent DNSにDSレコードが存在しない場合、Childゾーンは Bogus ではなく Insecure として扱われ、DNSSECによる検証済みとはならないものの、名前解決自体は正常に行われることを確認した。</p>



<h3 class="wp-block-heading">疑問に思ったこと</h3>



<p class="wp-block-paragraph">「DNSSECによる検証ができていないのに、名前解決を成功させてしまってよいのか？」という疑問を持ったので調べてみた。</p>



<h4 class="wp-block-heading">なぜDNSSECが設定されていなくても名前解決ができるのか</h4>



<p class="wp-block-paragraph">DNSSECは、DNSSECを利用していないドメインの名前解決を拒否する仕組みではない。<br>インターネット上にはDNSSECを利用していないドメインも存在するため、DNSSECによる信頼の連鎖が存在しないという理由だけで名前解決を拒否してしまうと、DNSSECを利用していないドメインを名前解決できなくなってしまう。</p>



<h4 class="wp-block-heading">攻撃者がDSレコードを削除してDNSSECを回避できるのではないか</h4>



<p class="wp-block-paragraph">攻撃者がDNS応答からDSレコードを単純に削除しただけでは、Insecure にすることはできない。<br>DNSSECでは、DSレコードが存在しない場合、NSEC とその RRSIG によって「DSレコードが存在しないこと」自体を認証できている。つまりUnboundは、単に「DSが返ってこなかったから Insecure」と判断したのではなく、ParentゾーンのDNSSEC署名によってDSの不在が認証されたことを確認したうえで Insecure と判定している。</p>



<h2 class="wp-block-heading">実務との関連</h2>



<p class="wp-block-paragraph">今回の検証はDNSSECに関する攻撃そのものを再現したものではなく、攻撃や設定ミスによって発生し得るDNSSECの異常状態を意図的に作り、その際の挙動を確認したものである。</p>



<h3 class="wp-block-heading">検証1：DNSデータの改ざん</h3>



<p class="wp-block-paragraph">検証1では、署名済みのAレコードを変更し、A RRsetとRRSIGの不整合を発生させた。<br>実環境では、DNSキャッシュポイズニングや通信経路上でのDNS応答改ざんなどによって、攻撃者が正規のDNSデータとは異なる情報を返そうとする状況が考えられる。<br>DNSSECでは、攻撃者が正しい秘密鍵を持っていなければ改ざん後のデータに対する有効なRRSIGを生成できない。そのため、検証リゾルバはRRsetとRRSIGの不整合を検知し、改ざんされたDNSデータを正当な応答として扱わない。<br>今回の検証では、この状態がUnboundの signature mismatch として確認でき、最終的に SERVFAIL となった。</p>



<pre class="wp-block-code"><code>DNSデータの改ざん
        ↓
RRsetとRRSIGが不一致
        ↓
DNSSEC検証失敗
        ↓
Bogus
        ↓
SERVFAIL</code></pre>



<h3 class="wp-block-heading">検証2：DNSSECの設定・鍵管理の不整合</h3>



<p class="wp-block-paragraph">検証2では、Parent DNSに登録されたDSレコードのdigestを変更し、Child KSKと対応しない状態を作成した。<br>実環境では、KSKロールオーバー時のDS更新ミスなどにより、Parent側のDSとChild側のDNSKEYが対応しなくなる可能性がある。<br>この状態では、DSレコード自体の署名検証には成功しても、DSとChild DNSKEYを結び付けることができない。そのため、ParentからChildへの信頼の連鎖を構築できず、DNSSEC検証は失敗する。<br>今回の検証では、Unboundのログから DS fail: digest is different および Could not establish a chain of trust を確認し、最終的に SERVFAIL となった。</p>



<pre class="wp-block-code"><code>DSとChild DNSKEYの不整合
        ↓
DSに対応するDNSKEYを確認できない
        ↓
信頼の連鎖を構築できない
        ↓
Bogus
        ↓
SERVFAIL</code></pre>



<h3 class="wp-block-heading">検証3：DSレコードが存在しない状態</h3>



<p class="wp-block-paragraph">検証3では、Parent DNSからChildのDSレコードを削除し、ParentからChildへのDNSSECの信頼の連鎖が存在しない状態を作成した。<br>検証2との重要な違いは、「存在するDSとDNSKEYが不整合」なのか、「そもそもDSが存在しない」のかという点にある。<br>DSが存在するにもかかわらず対応するDNSKEYを確認できない場合は Bogus となり、名前解決は SERVFAIL となる。一方、DSが存在しないことをNSECとRRSIGによって正当に確認できる場合、そのChildゾーンは Insecure として扱われ、DNSSECによる検証済みではないものの、名前解決自体は継続される。<br>実環境では、DNSSECを廃止してDSレコードを削除した場合や、レジストラ側でDSレコードが削除された場合などに、このような状態が発生し得る。</p>



<pre class="wp-block-code"><code>ParentにDSが存在しない
        ↓
NSEC + RRSIGによって
DSの不在を正当に確認
        ↓
DNSSECの信頼の連鎖なし
        ↓
Insecure
        ↓
名前解決は可能
ただしDNSSECによる真正性の保証はない</code></pre>



<p class="wp-block-paragraph">なお、第三者がDNS応答から単純にDSレコードを除去するだけで Insecure にできるわけではない。DSレコードが存在しないこと自体もNSECとRRSIGによって認証されるためである。ただし、本来DNSSECで保護されるべきドメインから正規のDSレコードが削除された場合は、名前解決が継続していてもDNSSECによる保護が失われるため、運用上は注意が必要となる。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">今回の検証では、DNSSECの正常な環境を意図的に破壊し、Unboundの挙動を確認した。AレコードとRRSIGが不整合な場合、およびParentのDSとChild DNSKEYが不整合な場合はBogusとなり、名前解決はSERVFAILとなった。一方、DSレコードが存在しないことをDNSSECによって正当に確認できる場合はInsecureとなり、DNSSECによる真正性は保証されないものの、名前解決自体は継続された。<br>今回の検証から、DNSSECでは単に「名前解決に成功するか、失敗するか」だけではなく、Secure、Bogus、Insecureの状態を区別し、信頼の連鎖のどの段階で問題が発生しているのかを確認することが重要だと分かった。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/dnssec-lab-testing/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DNSSEC検証 DNSSEC構築編</title>
		<link>https://cybermemo.blog/dnssec-lab-configuration</link>
					<comments>https://cybermemo.blog/dnssec-lab-configuration#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sat, 12 Sep 2026 13:12:39 +0000</pubDate>
				<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[検証]]></category>
		<category><![CDATA[BIND]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[DNSSEC]]></category>
		<category><![CDATA[Unbound]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=779</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2026/08/検証アイキャッチ-1024x768.png" class="webfeedsFeaturedVisual" /></p>はじめに 何をしたいか DNSSECの信頼の連鎖を実際に構築し、DNS応答がどのように署名・検証されるのかを確認する。また、DNSSECに関する設定や署名を意図的に破壊し、検証失敗時にフルリゾルバやクライアントからどのよ [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2026/08/検証アイキャッチ-1024x768.png" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">はじめに</h2>



<h3 class="wp-block-heading">何をしたいか</h3>



<p class="wp-block-paragraph">DNSSECの信頼の連鎖を実際に構築し、DNS応答がどのように署名・検証されるのかを確認する。また、DNSSECに関する設定や署名を意図的に破壊し、検証失敗時にフルリゾルバやクライアントからどのように見えるのかを確認する。<br>前回の「準備・DNS構築編」では、DNSSECを使用しない通常のDNS環境を構築した。<br>本記事では、この環境にDNSSECを導入し、信頼の連鎖を構築する。</p>



<p class="wp-block-paragraph">準備・DNS構築編　<a href="https://cybermemo.blog/dnssec-lab-setup">https://cybermemo.blog/dnssec-lab-setup</a><br>DNSSEC構築編　本記事<br>DNSSEC破壊・検証編　<a href="https://cybermemo.blog/dnssec-lab-testing">https://cybermemo.blog/dnssec-lab-testing</a></p>



<h3 class="wp-block-heading">本記事で構築する構成</h3>



<p class="wp-block-paragraph">前回構築したDNS環境にDNSSECを導入する。</p>



<pre class="wp-block-code"><code>              ┌─────────────┐
              │ Parent DNS  │　192.168.56.10/24
              │    BIND9    │　権威ゾーン: lab.test
              │             │　DNSKEY / RRSIG
              └──────┬──────┘
                     │
            child.lab.test を委任
              ＋ DSレコード
                     │
                     ▼
              ┌─────────────┐　192.168.56.20/24
              │  Child DNS  │　権威ゾーン: child.lab.test
              │    BIND9    │　DNSKEY / RRSIG
              │             │　└─ www.child.lab.test → 192.168.56.100
              └─────────────┘
                     ▲
                     │ DNS問い合わせ
                     │ ＋ DNSSEC署名情報
                     │
              ┌─────────────┐
              │  Resolver   │ 192.168.56.30/24
              │   Unbound   │ DNSSEC検証
              │             │ Trust Anchor: lab.test
              └──────┬──────┘
                     ▲
                     │ DNS問い合わせ
                     │
              ┌─────────────┐
              │   Client    │ 192.168.56.40/24
              └─────────────┘</code></pre>



<pre class="wp-block-code"><code>【DNSSECの信頼の連鎖】

Trust Anchor
（lab.test KSK / DNSKEY）
        │
        ▼
lab.test DNSKEY RRset
        │
        │ ParentのDSによってChild KSKを信頼
        ▼
child.lab.test DNSKEY RRset
        │
        │ Child ZSKの公開鍵でRRSIGを検証
        ▼
www.child.lab.test A</code></pre>



<h3 class="wp-block-heading">検証環境</h3>



<p class="wp-block-paragraph">仮想化ソフトウェア：Oracle VirtualBox<br>ゲストOS：Ubuntu Server 26.04.1 LTS（amd64）<br>権威DNS：BIND 9.20.24<br>フルリゾルバ：Unbound 1.24.2<br>DNS確認ツール：DiG 9.20.24<br>内部ネットワーク：192.168.56.0/24<br>検証ドメイン：lab.test / child.lab.test</p>



<h2 class="wp-block-heading">構築</h2>



<h3 class="wp-block-heading">ChildゾーンをDNSSEC署名</h3>



<p class="wp-block-paragraph">Child DNS で作業。</p>



<h4 class="wp-block-heading">鍵生成</h4>



<pre class="wp-block-code"><code># ゾーンファイルを確認
$ sudo cat /etc/bind/db.child.lab.test
<code>$TTL 3600

@   IN SOA ns dnsmaster (
        2026090401 ; Serial
        3600       ; Refresh
        900        ; Retry
        604800     ; Expire
        86400      ; Negative Cache TTL
)

    IN NS ns

ns  IN A 192.168.56.20
www IN A 192.168.56.100</code>

# DNSSEC鍵を置くディレクトリを作る
$ sudo mkdir -p /etc/bind/keys/child.lab.test

# ZSKを生成
$ cd /etc/bind/keys/child.lab.test
$ sudo dnssec-keygen -a ECDSAP256SHA256 -n ZONE child.lab.test
Generating key pair.
Kchild.lab.test.+013+07661

# KSKを生成
$ sudo dnssec-keygen -a ECDSAP256SHA256 -f KSK -n ZONE child.lab.test
Generating key pair.
Kchild.lab.test.+013+26145

# 生成ファイルを確認
$ sudo ls -l /etc/bind/keys/child.lab.test
total 16
-rw-r--r-- 1 root bind 347 Sep  9 12:59 Kchild.lab.test.+013+07661.key
-rw------- 1 root bind 187 Sep  9 12:59 Kchild.lab.test.+013+07661.private
-rw-r--r-- 1 root bind 347 Sep  9 13:00 Kchild.lab.test.+013+26145.key
-rw------- 1 root bind 187 Sep  9 13:00 Kchild.lab.test.+013+26145.private

# 公開鍵の中身を確認　
$ sudo cat Kchild.lab.test.+013+07661.key &amp;&amp; sudo cat Kchild.lab.test.+013+26145.key
; This is a zone-signing key, keyid 7661, for child.lab.test.
; Created: 20260909125923 (Wed Sep  9 12:59:23 2026)
; Publish: 20260909125923 (Wed Sep  9 12:59:23 2026)
; Activate: 20260909125923 (Wed Sep  9 12:59:23 2026)
child.lab.test. IN DNSKEY 256 3 13 of3bj/PGoJ9JAF2HN02sQ4xKhSjPBt8c0iLmok/IcnloBP0A+Wm+vqj6 ZM7v1/HXQmi6odv+eJ/+O4lfOMEkiQ==
; This is a key-signing key, keyid 26145, for child.lab.test.
; Created: 20260909130016 (Wed Sep  9 13:00:16 2026)
; Publish: 20260909130016 (Wed Sep  9 13:00:16 2026)
; Activate: 20260909130016 (Wed Sep  9 13:00:16 2026)
child.lab.test. IN DNSKEY 257 3 13 RfvhGg1akSrUMv7Ub87SsXXHUJt0NRWW7hUtG8rS0x6gLM9b8+vpx0A1 qNvm10S/hEEPaa9SAz/7Hrq87Rcyiw==</code></pre>



<h4 class="wp-block-heading">Childのゾーンファイルを署名</h4>



<pre class="wp-block-code"><code># ディレクトリ移動
$ cd /etc/bind

# バックアップ取得
$ sudo cp db.child.lab.test db.child.lab.test.bak

# 2つの.keyをゾーンファイルへ追加
$ sudo sh -c 'cat keys/child.lab.test/*.key >> db.child.lab.test'　　

# Serialを変更
$ sudo vim /etc/bind/db.child.lab.test　　
<code>$TTL 3600

@   IN SOA ns dnsmaster (
        2026090901 ; Serial
        3600       ; Refresh
        900        ; Retry
        604800     ; Expire
        86400      ; Negative Cache TTL
)

    IN NS ns

ns  IN A 192.168.56.20
www IN A 192.168.56.100
; This is a zone-signing key, keyid 7661, for child.lab.test.
; Created: 20260909125923 (Wed Sep  9 12:59:23 2026)
; Publish: 20260909125923 (Wed Sep  9 12:59:23 2026)
; Activate: 20260909125923 (Wed Sep  9 12:59:23 2026)
child.lab.test. IN DNSKEY 256 3 13 of3bj/PGoJ9JAF2HN02sQ4xKhSjPBt8c0iLmok/IcnloBP0A+Wm+vqj6 ZM7v1/HXQmi6odv+eJ/+O4lfOMEkiQ==
; This is a key-signing key, keyid 26145, for child.lab.test.
; Created: 20260909130016 (Wed Sep  9 13:00:16 2026)
; Publish: 20260909130016 (Wed Sep  9 13:00:16 2026)
; Activate: 20260909130016 (Wed Sep  9 13:00:16 2026)
child.lab.test. IN DNSKEY 257 3 13 RfvhGg1akSrUMv7Ub87SsXXHUJt0NRWW7hUtG8rS0x6gLM9b8+vpx0A1 qNvm10S/hEEPaa9SAz/7Hrq87Rcyiw==</code>

# 構文チェック
$ sudo named-checkzone child.lab.test /etc/bind/db.child.lab.test
zone child.lab.test/IN: loaded serial 2026090901
OK

# ディレクトリ移動
$ cd /etc/bind/keys/child.lab.test

# dnssec-signzoneで署名
$ sudo dnssec-signzone \　　
  -S \
  -o child.lab.test \
  -f /etc/bind/db.child.lab.test.signed \
  /etc/bind/db.child.lab.test
Verifying the zone using the following algorithms:
- ECDSAP256SHA256
Zone fully signed:
Algorithm: ECDSAP256SHA256: KSKs: 1 active, 0 stand-by, 0 revoked
                            ZSKs: 1 active, 0 stand-by, 0 revoked
/etc/bind/db.child.lab.test.signed

# 署名済みゾーンファイルが生成されたことを確認
$ sudo ls -l /etc/bind/db.child.lab.test*　　
-rw-r--r-- 1 root bind  947 Sep  9 13:22 /etc/bind/db.child.lab.test
-rw-r--r-- 1 root bind  253 Sep  9 13:18 /etc/bind/db.child.lab.test.bak
-rw-r--r-- 1 root bind 2726 Sep  9 13:25 /etc/bind/db.child.lab.test.signed

# 署名済みゾーンを確認
$ sudo cat /etc/bind/db.child.lab.test.signed
<code>; File written on Wed Sep  9 13:25:36 2026
; dnssec-signzone version 9.20.24-1ubuntu0.3-Ubuntu
child.lab.test.         3600    IN SOA  ns.child.lab.test. dnsmaster.child.lab.test. (
                                        2026090901 ; serial
                                        3600       ; refresh (1 hour)
                                        900        ; retry (15 minutes)
                                        604800     ; expire (1 week)
                                        86400      ; minimum (1 day)
                                        )
                        3600    RRSIG   SOA 13 3 3600 (
                                        20261009122536 20260909122536 7661 child.lab.test.
                                        lPLC99bWrcmgzGCGwL20o7A8yPGr/w7wMtIo
                                        9XVRflFmyorQ01L1PHOj1n/s6ZG3DwtYsgjE
                                        1Uklg/WEIQdbPA== )
                        3600    NS      ns.child.lab.test.
                        3600    RRSIG   NS 13 3 3600 (
                                        20261009122536 20260909122536 7661 child.lab.test.
                                        U2708D42QzU3kgqX0gcaoOLQD9H7pNVG8/IH
                                        VnrNK5InPpyeNCRyq5sSa1oxdXuVITovo+eB
                                        QSkKU/OAlGeM+Q== )
                        3600    NSEC    ns.child.lab.test. NS SOA RRSIG NSEC DNSKEY
                        3600    RRSIG   NSEC 13 3 3600 (
                                        20261009122536 20260909122536 7661 child.lab.test.
                                        Gt28Z9fQT56l0ONZa1YpEL7+22gH7RgxT178
                                        n5Zf3/4TH7UPSSx0lQE5nWpUb52A7+VlF5ix
                                        8K1v9MX31Psl/w== )
                        3600    DNSKEY  256 3 13 (
                                        of3bj/PGoJ9JAF2HN02sQ4xKhSjPBt8c0iLm
                                        ok/IcnloBP0A+Wm+vqj6ZM7v1/HXQmi6odv+
                                        eJ/+O4lfOMEkiQ==
                                        ) ; ZSK; alg = ECDSAP256SHA256 ; key id = 7661
                        3600    DNSKEY  257 3 13 (
                                        RfvhGg1akSrUMv7Ub87SsXXHUJt0NRWW7hUt
                                        G8rS0x6gLM9b8+vpx0A1qNvm10S/hEEPaa9S
                                        Az/7Hrq87Rcyiw==
                                        ) ; KSK; alg = ECDSAP256SHA256 ; key id = 26145
                        3600    RRSIG   DNSKEY 13 3 3600 (
                                        20261009122536 20260909122536 7661 child.lab.test.
                                        FgbLJ9v+yNnKLs6sMEWIk8smobeazyZoFiPm
                                        XA0HU4EAHnthv8olg7KmNGjgm/tcuPvUQgMs
                                        f7lK3BgevwukFQ== )
                        3600    RRSIG   DNSKEY 13 3 3600 (
                                        20261009122536 20260909122536 26145 child.lab.test.
                                        NYOgC1JsircR22X5nwPl1S+XfF4hhRlWBiEA
                                        MYhf0gKxJcupAUy1rMSj25VMcbvx0jurFW76
                                        VVjxFmMXOrfGIg== )
ns.child.lab.test.      3600    IN A    192.168.56.20
                        3600    RRSIG   A 13 4 3600 (
                                        20261009122536 20260909122536 7661 child.lab.test.
                                        f6r7LraRZm76e0HcFZAP1sxMXz+FdGdNHZ1I
                                        R/58BloWPWrIxYtVorV7Yj5jYDHkGqsiB10W
                                        FItH0NhA3S2+FA== )
                        3600    NSEC    www.child.lab.test. A RRSIG NSEC
                        3600    RRSIG   NSEC 13 4 3600 (
                                        20261009122536 20260909122536 7661 child.lab.test.
                                        nI9GreBE6XjqVVTljaicF804VAnZS53p0hpr
                                        TU4h7qMdLL2frKJF5nEtZr1hH803Tw5MT0F8
                                        jE6nCtQBDmfZhA== )
www.child.lab.test.     3600    IN A    192.168.56.100
                        3600    RRSIG   A 13 4 3600 (
                                        20261009122536 20260909122536 7661 child.lab.test.
                                        XX27GC+TFLVYuz+Jd8Ox7SyC5yxL1ifF+cuS
                                        mi+J8jcqgW8NQhR+Fi8sFaHbAEZuw691gEoZ
                                        22rXmWlCL5sbOQ== )
                        3600    NSEC    child.lab.test. A RRSIG NSEC
                        3600    RRSIG   NSEC 13 4 3600 (
                                        20261009122536 20260909122536 7661 child.lab.test.
                                        QHkt5+ujPGQ/3UTapTfDNMUzvzt6C9LdBVJL
                                        xv/isAyQWFphEK/pkbAmTIMDBLKIoBRMyb4i
                                        LUpi1qvRa0CplA== )</code></code></pre>



<h4 class="wp-block-heading">BINDが署名済みファイルを使うよう変更</h4>



<pre class="wp-block-code"><code># 署名済みファイルを読み込むよう設定変更
# db.child.lab.test → db.child.lab.test.signed
$ sudo vim /etc/bind/named.conf.local
<code>//
// Do any local configuration here
//

zone "child.lab.test" {
    type primary;
    file "/etc/bind/db.child.lab.test.signed";
};</code>

# 設定をチェックして再読み込み
$ sudo named-checkconf
$ sudo named-checkzone child.lab.test /etc/bind/db.child.lab.test.signed
zone child.lab.test/IN: loaded serial 2026090901 (DNSSEC signed)
OK
$ sudo rndc reconfig
$ sudo rndc zonestatus child.lab.test
$ systemctl status bind9
● named.service - BIND Domain Name Server
     Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; preset: enabled)
     Active: <span class="swl-marker mark_orange">active (running)</span> since Wed 2026-09-09 12:39:27 UTC; 1h 0min ago</code></pre>



<h4 class="wp-block-heading">DNSKEYを問い合わせる</h4>



<pre class="wp-block-code"><code>$ dig +dnssec @192.168.56.20 child.lab.test DNSKEY

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; +dnssec @192.168.56.20 child.lab.test DNSKEY
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 43976
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
; COOKIE: 69581b200025ce68010000006aa1633aa773dd222721ebe1 (good)
;; QUESTION SECTION:
;child.lab.test.                        IN      DNSKEY

;; ANSWER SECTION:　　# DNSKEY RRsetに対する署名が応答に含まれている
<span class="swl-marker mark_orange">child.lab.test.         3600    IN      DNSKEY  257 3 13 RfvhGg1akSrUMv7Ub87SsXXHUJt0NRWW7hUtG8rS0x6gLM9b8+vpx0A1 qNvm10S/hEEPaa9SAz/7Hrq87Rcyiw==
child.lab.test.         3600    IN      DNSKEY  256 3 13 of3bj/PGoJ9JAF2HN02sQ4xKhSjPBt8c0iLmok/IcnloBP0A+Wm+vqj6 ZM7v1/HXQmi6odv+eJ/+O4lfOMEkiQ==
child.lab.test.         3600    IN      RRSIG   DNSKEY 13 3 3600 20261009122536 20260909122536 7661 child.lab.test. FgbLJ9v+yNnKLs6sMEWIk8smobeazyZoFiPmXA0HU4EAHnthv8olg7Km NGjgm/tcuPvUQgMsf7lK3BgevwukFQ==
child.lab.test.         3600    IN      RRSIG   DNSKEY 13 3 3600 20261009122536 20260909122536 26145 child.lab.test. NYOgC1JsircR22X5nwPl1S+XfF4hhRlWBiEAMYhf0gKxJcupAUy1rMSj 25VMcbvx0jurFW76VVjxFmMXOrfGIg=</span>=

;; Query time: 0 msec
;; SERVER: 192.168.56.20#53(192.168.56.20) (UDP)
;; WHEN: Wed Sep 09 13:46:34 UTC 2026
;; MSG SIZE  rcvd: 451

$ dig +dnssec @192.168.56.20 www.child.lab.test A

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; +dnssec @192.168.56.20 www.child.lab.test A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 6047
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
; COOKIE: 2b33bf67976af0a4010000006aa1633f561edffaee841791 (good)
;; QUESTION SECTION:
;www.child.lab.test.            IN      A

;; ANSWER SECTION:　　# RRsetに対する署名が応答に含まれている
<span class="swl-marker mark_orange">www.child.lab.test.     3600    IN      A       192.168.56.100
www.child.lab.test.     3600    IN      RRSIG   A 13 4 3600 20261009122536 20260909122536 7661 child.lab.test. XX27GC+TFLVYuz+Jd8Ox7SyC5yxL1ifF+cuSmi+J8jcqgW8NQhR+Fi8s FaHbAEZuw691gEoZ22rXmWlCL5sbOQ==</span>

;; Query time: 0 msec
;; SERVER: 192.168.56.20#53(192.168.56.20) (UDP)
;; WHEN: Wed Sep 09 13:46:39 UTC 2026
;; MSG SIZE  rcvd: 201</code></pre>



<h3 class="wp-block-heading">Child DNSのKSKからDSレコードを生成し、Parent DNSに登録</h3>



<h4 class="wp-block-heading">Child DNSのKSKでDSレコードを生成</h4>



<pre class="wp-block-code"><code># 生成した鍵を確認
$ cd /etc/bind/keys/child.lab.test
$ ls -l
total 20
-rw-r--r-- 1 root bind 347 Sep  9 12:59 Kchild.lab.test.+013+07661.key
-rw------- 1 root bind 187 Sep  9 12:59 Kchild.lab.test.+013+07661.private
-rw-r--r-- 1 root bind 347 Sep  9 13:00 Kchild.lab.test.+013+26145.key
-rw------- 1 root bind 187 Sep  9 13:00 Kchild.lab.test.+013+26145.private
-rw-r--r-- 1 root bind 100 Sep  9 13:25 dsset-child.lab.test.

# KSKからDSレコードを生成
$ dnssec-dsfromkey -2 Kchild.lab.test.+013+26145.key
child.lab.test. IN DS 26145 13 2 C0F99483CDF9CE53B7EFBCE8607A73DCAA7B6FA728F24ECFEB01F6532742BF5D

# Parent DNSへDSを登録(Parent DNSで作業)
# Serialを変更、DSレコードを追記
$ sudo vim /etc/bind/db.lab.test
<code>$TTL 3600

@   IN  SOA ns dnsmaster (
        2026091001 ; Serial
        3600       ; Refresh
        900        ; Retry
        604800     ; Expire
        86400      ; Negative Cache TTL
)

    IN  NS  ns.lab.test.

ns  IN  A   192.168.56.10

child       IN NS ns.child
ns.child    IN A  192.168.56.20
child       IN DS 26145 13 2 C0F99483CDF9CE53B7EFBCE8607A73DCAA7B6FA728F24ECFEB01F6532742BF5D</code>

# 設定をチェックして再読み込み
$ sudo named-checkzone lab.test /etc/bind/db.lab.test
$ sudo rndc reload lab.test

# 設定が反映されているか確認
$ dig +norecurse @192.168.56.10 child.lab.test DS

; &lt;&lt;>> DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;>> +norecurse @192.168.56.10 child.lab.test DS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 51525
;; flags: qr aa ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 575f15af146df5dc010000006aa2a1275fb9a529e926c9cf (good)
;; QUESTION SECTION:
;child.lab.test.                        IN      DS

;; ANSWER SECTION:
<span class="swl-marker mark_orange">child.lab.test.         3600    IN      DS      26145 13 2 C0F99483CDF9CE53B7EFBCE8607A73DCAA7B6FA728F24ECFEB01F653 2742BF5D</span>

;; Query time: 0 msec
;; SERVER: 192.168.56.10#53(192.168.56.10) (UDP)
;; WHEN: Thu Sep 10 12:23:03 UTC 2026
;; MSG SIZE  rcvd: 119</code></pre>



<h3 class="wp-block-heading">Parent DNSをDNSSEC署名</h3>



<p class="wp-block-paragraph">Parent DNS で作業。</p>



<pre class="wp-block-code"><code># ディレクトリ作成
$ sudo mkdir -p /etc/bind/keys/lab.test
$ cd /etc/bind/keys/lab.test

# ParentのZSKを生成
$ sudo dnssec-keygen -a ECDSAP256SHA256 -n ZONE lab.test
Generating key pair.
Klab.test.+013+42600

# ParentのKSKを生成
$ sudo dnssec-keygen -a ECDSAP256SHA256 -f KSK -n ZONE lab.test
Generating key pair.
Klab.test.+013+25095

# 生成結果を確認
$ ls -l /etc/bind/keys/lab.test
total 16
-rw-r--r-- 1 root bind 335 Sep 10 12:27 Klab.test.+013+25095.key
-rw------- 1 root bind 187 Sep 10 12:27 Klab.test.+013+25095.private
-rw-r--r-- 1 root bind 336 Sep 10 12:27 Klab.test.+013+42600.key
-rw------- 1 root bind 187 Sep 10 12:27 Klab.test.+013+42600.private

# 公開鍵を確認
$ cat /etc/bind/keys/lab.test/*.key
; This is a key-signing key, keyid 25095, for lab.test.
; Created: 20260910122739 (Thu Sep 10 12:27:39 2026)
; Publish: 20260910122739 (Thu Sep 10 12:27:39 2026)
; Activate: 20260910122739 (Thu Sep 10 12:27:39 2026)
lab.test. IN DNSKEY 257 3 13 nzPV3+LMX633npZfI3Seu2cR8SrTegHIi1sCK2OtNTQyRZg/v6yVkRDl nmr52oumop7xFxsx6vcZk3emfTsFbQ==
; This is a zone-signing key, keyid 42600, for lab.test.
; Created: 20260910122712 (Thu Sep 10 12:27:12 2026)
; Publish: 20260910122712 (Thu Sep 10 12:27:12 2026)
; Activate: 20260910122712 (Thu Sep 10 12:27:12 2026)
lab.test. IN DNSKEY 256 3 13 XGx8XP7w7bqg8k9cBXoPvDLsZQFUOAuUbdr8Bd8ZSH25ip1Bq75BGFYO yZhxy0DNqEsEPPpDt2qHAW/kdlJs3g==

# ParentのDNSKEYをゾーンファイルへ追加
$ sudo sh -c 'cat keys/lab.test/*.key >> db.lab.test'

# Serialを変更
$ sudo vim /etc/bind/db.lab.test　　
<code>$TTL 3600

@   IN  SOA ns dnsmaster (
        2026091002 ; Serial
        3600       ; Refresh
        900        ; Retry
        604800     ; Expire
        86400      ; Negative Cache TTL
)

    IN  NS  ns.lab.test.

ns  IN  A   192.168.56.10

child       IN NS ns.child
ns.child    IN A  192.168.56.20
child       IN DS 26145 13 2 C0F99483CDF9CE53B7EFBCE8607A73DCAA7B6FA728F24ECFEB01F6532742BF5D
; This is a key-signing key, keyid 25095, for lab.test.
; Created: 20260910122739 (Thu Sep 10 12:27:39 2026)
; Publish: 20260910122739 (Thu Sep 10 12:27:39 2026)
; Activate: 20260910122739 (Thu Sep 10 12:27:39 2026)
lab.test. IN DNSKEY 257 3 13 nzPV3+LMX633npZfI3Seu2cR8SrTegHIi1sCK2OtNTQyRZg/v6yVkRDl nmr52oumop7xFxsx6vcZk3emfTsFbQ==
; This is a zone-signing key, keyid 42600, for lab.test.
; Created: 20260910122712 (Thu Sep 10 12:27:12 2026)
; Publish: 20260910122712 (Thu Sep 10 12:27:12 2026)
; Activate: 20260910122712 (Thu Sep 10 12:27:12 2026)
lab.test. IN DNSKEY 256 3 13 XGx8XP7w7bqg8k9cBXoPvDLsZQFUOAuUbdr8Bd8ZSH25ip1Bq75BGFYO yZhxy0DNqEsEPPpDt2qHAW/kdlJs3g==</code>

# 構文チェック
$ sudo named-checkzone lab.test /etc/bind/db.lab.test

# Parentゾーンを署名
$ cd /etc/bind/keys/lab.test
$ sudo dnssec-signzone \
  -S \
  -o lab.test \
  -f /etc/bind/db.lab.test.signed \
  /etc/bind/db.lab.test
Verifying the zone using the following algorithms:
- ECDSAP256SHA256
Zone fully signed:
Algorithm: ECDSAP256SHA256: KSKs: 1 active, 0 stand-by, 0 revoked
                            ZSKs: 1 active, 0 stand-by, 0 revoked
/etc/bind/db.lab.test.signed

# 署名済みファイルを読み込むよう設定変更
# db.lab.test → db.lab.test.signed
$ sudo vim /etc/bind/named.conf.local
<code>//
// Do any local configuration here
//

zone "lab.test" {
    type primary;
    file "/etc/bind/db.lab.test.signed";
};</code>

# 設定をチェックして再読み込み
$ sudo named-checkconf
$ sudo rndc reconfig

# 本当に署名済みゾーンを読んでいるか確認
$ sudo rndc zonestatus lab.test
name: lab.test
type: primary
<span class="swl-marker mark_orange">files: /etc/bind/db.lab.test.signed</span>
serial: 2026091002
nodes: 4
last loaded: Thu, 10 Sep 2026 12:32:37 GMT
secure: yes
inline signing: no
key maintenance: none
next resign node: lab.test/DNSKEY
next resign time: Sat, 03 Oct 2026 11:32:37 GMT
dynamic: no
reconfigurable via modzone: no

# ParentのDNSKEYを直接確認
$ dig +dnssec @192.168.56.10 lab.test DNSKEY

; &lt;&lt;>> DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;>> +dnssec @192.168.56.10 lab.test DNSKEY
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 61863
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
; COOKIE: 3ad54fc7b29e4940010000006aa2a4c8a84d54b456af230d (good)
;; QUESTION SECTION:
;lab.test.                      IN      DNSKEY

;; ANSWER SECTION:
<span class="swl-marker mark_orange">lab.test.               3600    IN      DNSKEY  256 3 13 XGx8XP7w7bqg8k9cBXoPvDLsZQFUOAuUbdr8Bd8ZSH25ip1Bq75BGFYO yZhxy0DNqEsEPPpDt2qHAW/kdlJs3g==
lab.test.               3600    IN      DNSKEY  257 3 13 nzPV3+LMX633npZfI3Seu2cR8SrTegHIi1sCK2OtNTQyRZg/v6yVkRDl nmr52oumop7xFxsx6vcZk3emfTsFbQ==
lab.test.               3600    IN      RRSIG   DNSKEY 13 2 3600 20261010113237 20260910113237 25095 lab.test. m/UN/LdqgXsjAQTzPkqY/72gzpJyLH5THJlrhrwhnXzvYPqZ29UIK7Dg yyR4y2kbghbxg2bsePGxUngUUoz4rw==
lab.test.               3600    IN      RRSIG   DNSKEY 13 2 3600 20261010113237 20260910113237 42600 lab.test. +c+NJo2m+DDpeUGVRfYZQxXKDe3MT/LfWspon14H8PTlJH+Z/JgH4XZG OIPaDr26IwXsqMt+lzPB809OeQ+SzA==</span>

;; Query time: 0 msec
;; SERVER: 192.168.56.10#53(192.168.56.10) (UDP)
;; WHEN: Thu Sep 10 12:38:32 UTC 2026
;; MSG SIZE  rcvd: 433

# ParentのDSを直接確認
$ dig +dnssec +norecurse @192.168.56.10 child.lab.test DS

; &lt;&lt;>> DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;>> +dnssec +norecurse @192.168.56.10 child.lab.test DS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 42626
;; flags: qr aa ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
; COOKIE: 5ab6af9666fe5062010000006aa2a50259f77941809ff655 (good)
;; QUESTION SECTION:
;child.lab.test.                        IN      DS

;; ANSWER SECTION:
<span class="swl-marker mark_orange">child.lab.test.         3600    IN      DS      26145 13 2 C0F99483CDF9CE53B7EFBCE8607A73DCAA7B6FA728F24ECFEB01F653 2742BF5D
child.lab.test.         3600    IN      RRSIG   DS 13 3 3600 20261010113237 20260910113237 42600 lab.test. nAmsL7wGWZzUk27uPO/aSFuwSOwC1oQPrbsvkuJbKjHgvh1QZ6EN4x0v CTTAopk9zi9kDC1d/c++aNfBZYwSOA==</span>

;; Query time: 0 msec
;; SERVER: 192.168.56.10#53(192.168.56.10) (UDP)
;; WHEN: Thu Sep 10 12:39:30 UTC 2026
;; MSG SIZE  rcvd: 223</code></pre>



<h3 class="wp-block-heading">Unboundに lab.test のTrust Anchorを設定して、DNSSEC検証を有効化</h3>



<p class="wp-block-paragraph">Resolver で作業。</p>



<h4 class="wp-block-heading">Trust Anchor用のUnbound設定ファイルを作成する</h4>



<pre class="wp-block-code"><code># 専用ファイルを作成
# lab.test のDNSKEYは最初から信頼してよい と設定
$ sudo vim /etc/unbound/unbound.conf.d/lab-test-trust-anchor.conf
<code>server:
    trust-anchor: "lab.test. IN DNSKEY 257 3 13 nzPV3+LMX633npZfI3Seu2cR8SrTegHIi1sCK2OtNTQyRZg/v6yVkRDl nmr52oumop7xFxsx6vcZk3emfTsFbQ=="</code>

# domain-insecure: "lab.test." を削除
$ sudo vim /etc/unbound/unbound.conf.d/dns-lab.conf
<code>server:
    interface: 192.168.56.30
    access-control: 192.168.56.0/24 allow

    local-zone: "test." transparent

stub-zone:
    name: "lab.test."
    stub-addr: 192.168.56.10</code>

# Unboundの設定をチェックし、再読み込み
$ sudo unbound-checkconf
$ sudo systemctl restart unbound
$ sudo systemctl status unbound
● unbound.service - Unbound DNS server
     Loaded: loaded (/usr/lib/systemd/system/unbound.service; enabled; preset: enabled)
     Active: <span class="swl-marker mark_orange">active (running)</span> since Thu 2026-09-10 12:53:24 UTC; 4s ago

# Resolver自身からDNSSEC検証
$ dig +dnssec @192.168.56.30 www.child.lab.test A

; &lt;&lt;>> DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;>> +dnssec @192.168.56.30 www.child.lab.test A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 41055
;; flags: qr rd ra <span class="swl-marker mark_orange">ad</span>; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1　　# ad = Authenticated Data(UnboundがDNSSEC検証に成功し、応答をSecureとして扱った)

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
;; QUESTION SECTION:
;www.child.lab.test.            IN      A

;; ANSWER SECTION:
www.child.lab.test.     3600    IN      A       192.168.56.100
<span class="swl-marker mark_orange">www.child.lab.test.     3600    IN      RRSIG   A 13 4 3600 20261009122536 20260909122536 7661 child.lab.test. XX27GC+TFLVYuz+Jd8Ox7SyC5yxL1ifF+cuSmi+J8jcqgW8NQhR+Fi8s FaHbAEZuw691gEoZ22rXmWlCL5sbOQ==</span>　　# ChildのZSK(7661)によって署名されている

;; Query time: 13 msec
;; SERVER: 192.168.56.30#53(192.168.56.30) (UDP)
;; WHEN: Thu Sep 10 12:53:57 UTC 2026
;; MSG SIZE  rcvd: 173</code></pre>



<h3 class="wp-block-heading">Client → Unboundまで含めて正常に動作することを確認</h3>



<p class="wp-block-paragraph">Client で作業。</p>



<pre class="wp-block-code"><code>$ dig +dnssec @192.168.56.30 www.child.lab.test A

; &lt;&lt;>> DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;>> +dnssec @192.168.56.30 www.child.lab.test A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 50729
;; flags: qr rd ra <span class="swl-marker mark_orange">ad</span>; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1　　# Authenticated Data

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
;; QUESTION SECTION:
;www.child.lab.test.            IN      A

;; ANSWER SECTION:
www.child.lab.test.     3334    IN      A       192.168.56.100
<span class="swl-marker mark_orange">www.child.lab.test.     3334    IN      RRSIG   A 13 4 3600 20261009122536 20260909122536 7661 child.lab.test. XX27GC+TFLVYuz+Jd8Ox7SyC5yxL1ifF+cuSmi+J8jcqgW8NQhR+Fi8s FaHbAEZuw691gEoZ22rXmWlCL5sbOQ==</span>

;; Query time: 3 msec
;; SERVER: 192.168.56.30#53(192.168.56.30) (UDP)
;; WHEN: Thu Sep 10 12:58:23 UTC 2026
;; MSG SIZE  rcvd: 173</code></pre>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">以上で、UnboundのTrust Anchorを起点として、Parent DNSの lab.test からChild DNSの child.lab.test、最終的に www.child.lab.test のAレコードまでDNSSECによる信頼の連鎖を構築できた。Unboundからの応答には ad フラグが付与され、DNSSEC検証に成功していることも確認できた。次回は、この正常な状態を基準として、署名やDSレコードを意図的に破壊し、DNSSEC検証がどのように失敗するかを確認する。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/dnssec-lab-configuration/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DNSSEC検証 準備・DNS構築編</title>
		<link>https://cybermemo.blog/dnssec-lab-setup</link>
					<comments>https://cybermemo.blog/dnssec-lab-setup#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sat, 12 Sep 2026 12:50:49 +0000</pubDate>
				<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[検証]]></category>
		<category><![CDATA[BIND]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[DNSSEC]]></category>
		<category><![CDATA[Unbound]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=737</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2026/08/検証アイキャッチ-1024x768.png" class="webfeedsFeaturedVisual" /></p>はじめに 何をしたいか DNSSECの信頼の連鎖を実際に構築し、DNS応答がどのように署名・検証されるのかを確認する。また、DNSSECに関する設定や署名を意図的に破壊し、検証失敗時にフルリゾルバやクライアントからどのよ [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2026/08/検証アイキャッチ-1024x768.png" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">はじめに</h2>



<h3 class="wp-block-heading">何をしたいか</h3>



<p class="wp-block-paragraph">DNSSECの信頼の連鎖を実際に構築し、DNS応答がどのように署名・検証されるのかを確認する。また、DNSSECに関する設定や署名を意図的に破壊し、検証失敗時にフルリゾルバやクライアントからどのように見えるのかを確認する。本記事では検証前の準備を記載。</p>



<p class="wp-block-paragraph">準備・DNS構築編　本記事<br>DNSSEC構築編　<a href="https://cybermemo.blog/dnssec-lab-configuration">https://cybermemo.blog/dnssec-lab-configuration</a><br>破壊・検証編　<a href="https://cybermemo.blog/dnssec-lab-testing">https://cybermemo.blog/dnssec-lab-testing</a></p>



<h3 class="wp-block-heading">本記事で構築する構成</h3>



<p class="wp-block-paragraph">下記の通り、本記事ではDNSSECを使わず、普通のDNS名前解決を成立させることを目的とする。</p>



<pre class="wp-block-code"><code>              ┌─────────────┐
              │ Parent DNS  │　192.168.56.10/24
              │    BIND9    │　権威ゾーン: lab.test
              └──────┬──────┘
                     │
            child.lab.test を委任
                     │
                     ▼
              ┌─────────────┐　192.168.56.20/24
              │  Child DNS  │　権威ゾーン: child.lab.test
              │    BIND9    │　　　　　　　└─ www.child.lab.test → 192.168.56.100
              └─────────────┘
                     ▲
                     │ DNS問い合わせ
                     │
              ┌─────────────┐
              │  Resolver   │ 192.168.56.30/24
              │   Unbound   │
              └──────┬──────┘
                     ▲
                     │ DNS問い合わせ
              ┌─────────────┐
              │   Client    │ 192.168.56.40/24
              └─────────────┘</code></pre>



<h3 class="wp-block-heading">検証環境</h3>



<p class="wp-block-paragraph">仮想化ソフトウェア：Oracle VirtualBox<br>ゲストOS：Ubuntu Server 26.04.1 LTS（amd64）<br>権威DNS：BIND 9.20.24<br>フルリゾルバ：Unbound 1.24.2<br>DNS確認ツール：DiG 9.20.24<br>内部ネットワーク：192.168.56.0/24<br>検証ドメイン：lab.test / child.lab.test</p>



<h2 class="wp-block-heading">構築</h2>



<h3 class="wp-block-heading">IP設定とシステムインストール</h3>



<h4 class="wp-block-heading">共通設定</h4>



<p class="wp-block-paragraph">IP設定</p>



<pre class="wp-block-code"><code># IP情報確認(一部結果を抜粋)
$ ip addr

3: enp0s8: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

#設定ファイルの確認
$ sudo cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:
      dhcp4: true
      dhcp6: true
      match:
        macaddress: mac
      set-name: enp0s3
  version: 2

#バックアップ
$ sudo cp /etc/netplan/00-installer-config.yaml \
/etc/netplan/00-installer-config.yaml.bak

#編集
$ sudo vim /etc/netplan/00-installer-config.yaml

# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:
      dhcp4: true
      dhcp6: true
      match:
        macaddress: mac
      set-name: enp0s3

<span class="swl-marker mark_orange">    enp0s8:
      dhcp4: false
      addresses:
        - 192.168.56.10(20,30,40)/24

  version: 2</span>

#構文チェック
$ sudo netplan generate

#接続チェック
$ sudo netplan try
Do you want to keep these settings?


Press ENTER before the timeout to accept the new configuration


Changes will revert in  xxx seconds
Configuration accepted.

#IP確認(一部結果を抜粋)
$ ip route
192.168.56.0/24 dev enp0s8 proto kernel scope link src 192.168.56.10</code></pre>



<h4 class="wp-block-heading">BIND（Parent DNS/Child DNS）のインストール</h4>



<p class="wp-block-paragraph">BINDと関連ツールのインストール</p>



<pre class="wp-block-code"><code># システムのパッケージリストを更新
$ sudo apt update

# システムのインストール
$ sudo apt install bind9 bind9-utils dnsutils

# BINDのバージョンを確認
$ named -v
BIND 9.20.24-1ubuntu0.3-Ubuntu (Stable Release) &lt;id:&gt;

# サービスの状態を確認
$ systemctl status bind9
● named.service - BIND Domain Name Server
     Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; preset: enabled)
     Active: <span class="swl-marker mark_orange">active (running)</span> since Wed 2026-09-02 13:32:41 UTC; 10min ago</code></pre>



<p class="is-style-icon_pen wp-block-paragraph">bind9 → DNSサーバー本体（named）<br>bind9-utils → BIND/DNSSEC管理用ツール<br>dnsutils → digなどのDNS調査ツール</p>



<h4 class="wp-block-heading">Unbound（Resolver）のインストール</h4>



<p class="wp-block-paragraph">フルリゾルバーのインストール</p>



<pre class="wp-block-code"><code># システムのパッケージリストを更新
$ sudo apt update
# システムのインストール
$ sudo apt install unbound dnsutils
# サービスの状態を確認
$ systemctl status unbound
● unbound.service - Unbound DNS server
     Loaded: loaded (/usr/lib/systemd/system/unbound.service; enabled; preset: enabled)
     <span class="swl-marker mark_orange">Active: active (running)</span> since Fri 2026-09-04 12:07:41 UTC; 1min 19s ago</code></pre>



<h4 class="wp-block-heading">dnsutils（Client）のインストール</h4>



<p class="wp-block-paragraph">DNS調査ツールのインストール</p>



<pre class="wp-block-code"><code># システムのパッケージリストを更新
$ sudo apt update
# システムのインストール
$ sudo apt install dnsutils
# バージョン確認
$ dig -v
DiG 9.20.24-1ubuntu0.3-Ubuntu</code></pre>



<h3 class="wp-block-heading">DNS設定</h3>



<h4 class="wp-block-heading">Parent DNS の基本設定</h4>



<pre class="wp-block-code"><code># BINDの設定ファイルを確認
$ ls -l /etc/bind/
total 20
-rw-r--r-- 1 xxxx yyyy 455 Jul 10 20:52 named.conf
-rw-r--r-- 1 xxxx yyyy  42 Jul 10 20:52 named.conf.local
-rw-r--r-- 1 xxxx yyyy  43 Jul 10 20:52 named.conf.options
-rw-r--r-- 1 xxxx yyyy 116 Jul 10 20:52 named.conf.root-hints
-rw-r----- 1 xxxx yyyy 100 Sep  2 13:32 rndc.key

# named.conf.local のバックアップ
sudo cp /etc/bind/named.conf.local /etc/bind/named.conf.local.bak

# ゾーンを定義
# 「lab.test について聞かれたら、/etc/bind/db.lab.test を見て答えます」という設定を記載
$ sudo vim /etc/bind/named.conf.local

<code>zone "lab.test" {
    type primary;
    file "/etc/bind/db.lab.test";
};</code>

# Parentのゾーンファイルを作成
$ sudo vim /etc/bind/db.lab.test

<code>$TTL 3600

@   IN  SOA ns dnsmaster (
        2026090401 ; Serial
        3600       ; Refresh
        900        ; Retry
        604800     ; Expire
        86400      ; Negative Cache TTL
)

    IN  NS  ns.lab.test.

ns  IN  A   192.168.56.10</code>

# BIND全体の設定チェック
$ sudo named-checkconf

# ゾーンファイルをチェック
$ sudo named-checkzone lab.test /etc/bind/db.lab.test
zone lab.test/IN: loaded serial 2026090401
OK

# BINDを再読み込み
$ sudo systemctl reload bind9

# サービスの状態を確認
$ systemctl status bind9
● named.service - BIND Domain Name Server
     Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; preset: enabled)
     Active: <span class="swl-marker mark_orange">active (running)</span> since Fri 2026-09-04 12:25:10 UTC; 41min ago

# Parent自身に直接問い合わせる
$ dig @192.168.56.10 lab.test SOA

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; @192.168.56.10 lab.test SOA
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, <span class="swl-marker mark_orange">status: NOERROR</span>, id: 12120　　# エラーなし
;; flags: qr <span class="swl-marker mark_orange">aa</span> rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1　　# aa = Authoritative Answer。権威回答であることを示す

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: a277f9c47bc5fcc9010000006a9ac27bfc5d5131662f9b64 (good)
;; QUESTION SECTION:
<span class="swl-marker mark_orange">;lab.test.                      IN      SOA</span>　　# lab.test.のSOAレコード要求

;; ANSWER SECTION:
<span class="swl-marker mark_orange">lab.test.               3600    IN      SOA     ns.lab.test. dnsmaster.lab.test. 2026090401 3600 900 604800 86400</span>　　# 設定したSOAレコードが反映されている

;; Query time: 0 msec
;; SERVER: 192.168.56.10#53(192.168.56.10) (UDP)
;; WHEN: Fri Sep 04 13:07:07 UTC 2026
;; MSG SIZE  rcvd: 114

$ dig @192.168.56.10 lab.test NS

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; @192.168.56.10 lab.test NS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 63569
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 0a6d1db6342fb2d1010000006a9ac29ddae1218c4b0305b2 (good)
;; QUESTION SECTION:
<span class="swl-marker mark_orange">;lab.test.                      IN      NS</span>　　# lab.test.のNSレコード要求

;; ANSWER SECTION:
<span class="swl-marker mark_orange">lab.test.               3600    IN      NS      ns.lab.test.</span>　　# 設定したNSレコードが反映されている

;; ADDITIONAL SECTION:
<span class="swl-marker mark_orange">ns.lab.test.            3600    IN      A       192.168.56.10</span>　　# 追加情報 → ちなみに ns.lab.test. のIPアドレスは 192.168.56.10

<span class="swl-marker mark_orange">;; Query time: 0 msec</span>　　# 同じVMから同じラボ内のDNSへ問い合わせているので非常に高速
<span class="swl-marker mark_orange">;; SERVER: 192.168.56.10#53(192.168.56.10) (UDP)</span>　　# 意図したParent BINDに問い合わせられている
;; WHEN: Fri Sep 04 13:07:41 UTC 2026
;; MSG SIZE  rcvd: 98</code></pre>



<h4 class="wp-block-heading">Child DNS の基本設定</h4>



<pre class="wp-block-code"><code># BINDの設定ファイルを確認
$ ls -l /etc/bind/
total 20
-rw-r--r-- 1 xxxx yyyy 455 Jul 10 20:52 named.conf
-rw-r--r-- 1 xxxx yyyy  42 Jul 10 20:52 named.conf.local
-rw-r--r-- 1 xxxx yyyy  43 Jul 10 20:52 named.conf.options
-rw-r--r-- 1 xxxx yyyy 116 Jul 10 20:52 named.conf.root-hints
-rw-r----- 1 xxxx yyyy 100 Sep  2 13:32 rndc.key

# named.conf.local のバックアップ
sudo cp /etc/bind/named.conf.local /etc/bind/named.conf.local.bak

# ゾーンを定義
# 「child.lab.test について聞かれたら、/etc/bind/db.child.lab.test を見て答えます」という設定を記載
$ sudo vim /etc/bind/named.conf.local

<code>zone "child.lab.test" {
    type primary;
    file "/etc/bind/db.child.lab.test";
};</code>

# Childのゾーンファイルを作成
$ sudo vim /etc/bind/db.child.lab.test

<code>$TTL 3600

@   IN SOA ns dnsmaster (
        2026090401 ; Serial
        3600       ; Refresh
        900        ; Retry
        604800     ; Expire
        86400      ; Negative Cache TTL
)

    IN NS ns

ns  IN A 192.168.56.20
www IN A 192.168.56.100</code>

# BIND全体の設定チェック
$ sudo named-checkconf

# ゾーンファイルをチェック
$ sudo named-checkzone child.lab.test /etc/bind/db.child.lab.test
zone child.lab.test/IN: loaded serial 2026090401
OK

# BINDを再読み込み
$ sudo systemctl reload bind9

# サービスの状態を確認
$ systemctl status bind9
● named.service - BIND Domain Name Server
     Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; preset: enabled)
     Active: <span class="swl-marker mark_orange">active (running)</span> since Fri 2026-09-04 12:25:13 UTC; 1h 15min ago

# Child自身に直接問い合わせる
$ dig @192.168.56.20 child.lab.test SOA

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; @192.168.56.20 child.lab.test SOA
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 45719
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 2235b8f90298a6ac010000006a9aca9e4d064bf9ef5ff1fb (good)
;; QUESTION SECTION:
;child.lab.test.                        IN      SOA

;; ANSWER SECTION:
<span class="swl-marker mark_orange">child.lab.test.         3600    IN      SOA     ns.child.lab.test. dnsmaster.child.lab.test. 2026090401 3600 900 604800 86400</span>　　# 設定したSOAレコードが反映されている

;; Query time: 0 msec
;; SERVER: 192.168.56.20#53(192.168.56.20) (UDP)
;; WHEN: Fri Sep 04 13:41:50 UTC 2026
;; MSG SIZE  rcvd: 120

$ dig @192.168.56.20 child.lab.test NS

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; @192.168.56.20 child.lab.test NS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 22244
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 18cc501e70a95b5a010000006a9acaad689bc4f2bd82ac21 (good)
;; QUESTION SECTION:
;child.lab.test.                        IN      NS

;; ANSWER SECTION:
<span class="swl-marker mark_orange">child.lab.test.         3600    IN      NS      ns.child.lab.test.</span>　　# 設定したNSレコードが反映されている

;; ADDITIONAL SECTION:
<span class="swl-marker mark_orange">ns.child.lab.test.      3600    IN      A       192.168.56.20</span>　　# 追加情報 → ちなみに ns.child.lab.test. のIPアドレスは 192.168.56.20

;; Query time: 0 msec
;; SERVER: 192.168.56.20#53(192.168.56.20) (UDP)
;; WHEN: Fri Sep 04 13:42:05 UTC 2026
;; MSG SIZE  rcvd: 104

<span class="swl-marker mark_orange">$ dig @192.168.56.20 www.child.lab.test A</span>　　# ここが ParentDNS と違う部分

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; @192.168.56.20 www.child.lab.test A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 38021
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 572e7d93946f04eb010000006a9acbc2c6834dc08c91a8ae (good)
;; QUESTION SECTION:
;www.child.lab.test.            IN      A

;; ANSWER SECTION:
<span class="swl-marker mark_orange">www.child.lab.test.     3600    IN      A       192.168.56.100</span>　　# 設定したwwwのAレコードが反映されている

;; Query time: 0 msec
;; SERVER: 192.168.56.20#53(192.168.56.20) (UDP)
;; WHEN: Fri Sep 04 13:46:42 UTC 2026
;; MSG SIZE  rcvd: 91</code></pre>



<h4 class="wp-block-heading">Parent DNS に child.lab.test の委任を設定</h4>



<pre class="wp-block-code"><code># ゾーンファイルをバックアップ
$ sudo cp /etc/bind/db.lab.test /etc/bind/db.lab.test.bak

$ sudo vim /etc/bind/db.lab.test        
<code>2026090402 ; Serial</code>　　　　　　　　# ゾーンファイルのシリアルを更新
<code>child       IN NS ns.child
ns.child    IN A  192.168.56.20</code>　　# ゾーンファイルの最下部に以下設定を追加

# BIND全体の設定チェック
$ sudo named-checkconf

# ゾーンファイルをチェック
$ sudo named-checkzone lab.test /etc/bind/db.lab.test
zone lab.test/IN: getaddrinfo(ns.child.lab.test) failed: Temporary failure in name resolution
zone lab.test/IN: loaded serial 202609040<span class="swl-marker mark_orange">2</span>
OK

# BINDを再読み込み
$ sudo systemctl reload bind9

# サービスの状態を確認
$ systemctl status bind9
● named.service - BIND Domain Name Server
     Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; preset: enabled)
     Active: <span class="swl-marker mark_orange">active (running)</span> since Fri 2026-09-04 12:25:10 UTC; 1h 40min ago

# Parent自身に直接問い合わせる(再帰問い合わせを要求する)　→　再帰処理では名前解決に失敗しSERVFAILとなった
dig @192.168.56.10 child.lab.test NS
; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; @192.168.56.10 child.lab.test NS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, <span class="swl-marker mark_orange">status: SERVFAIL</span>, id: 19522　　# SERVFAIL(サーバー側の異常で名前解決に失敗)
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: fe9a881e33cb98ad010000006a9ad0c464bcd0c3c80d2cfc (good)
;; QUESTION SECTION:
;child.lab.test.                        IN      NS

;; Query time: 3 msec
;; SERVER: 192.168.56.10#53(192.168.56.10) (UDP)
;; WHEN: Fri Sep 04 14:08:04 UTC 2026
;; MSG SIZE  rcvd: 71

# Parent自身に直接問い合わせる(再帰問い合わせを要求しない)
$ dig +norecurse @192.168.56.10 child.lab.test NS

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; +norecurse @192.168.56.10 child.lab.test NS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 27945
;; flags: <span class="swl-marker mark_orange">qr ra</span>; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 2　　## aa = Authoritative Answer のフラグなしなので、権威回答ではなく参照応答

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 79d7c1aedd81ea0e010000006a9ad0ba20d4d76f47b1c251 (good)
;; QUESTION SECTION:
;child.lab.test.                        IN      NS

;; AUTHORITY SECTION:　　# child.lab.test については ns.child.lab.test に聞いてください。と返答されている
<span class="swl-marker mark_orange">child.lab.test.         3600    IN      NS      ns.child.lab.test.</span>　　# 設定したNSレコードが反映されている

;; ADDITIONAL SECTION:
<span class="swl-marker mark_orange">ns.child.lab.test.      3600    IN      A       192.168.56.20</span>　　# 追加情報 → ちなみに ns.child.lab.test. のIPアドレスは 192.168.56.20(グルーレコード)

;; Query time: 5 msec
;; SERVER: 192.168.56.10#53(192.168.56.10) (UDP)
;; WHEN: Fri Sep 04 14:07:54 UTC 2026
;; MSG SIZE  rcvd: 104

$ dig +norecurse @192.168.56.10 www.child.lab.test A

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; +norecurse @192.168.56.10 www.child.lab.test A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 7879
;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: d24b4a0ee76a5063010000006a9ad5a7cc24a0022b2a437a (good)
;; QUESTION SECTION:
;www.child.lab.test.            IN      A

;; AUTHORITY SECTION:　　# child.lab.test については ns.child.lab.test に聞いてください。と返答されている
<span class="swl-marker mark_orange">child.lab.test.         3600    IN      NS      ns.child.lab.test.</span>　　# 設定したNSレコードが反映されている

;; ADDITIONAL SECTION:
<span class="swl-marker mark_orange">ns.child.lab.test.      3600    IN      A       192.168.56.20</span>　# 追加情報 → ちなみに ns.child.lab.test. のIPアドレスは 192.168.56.20(グルーレコード)。child.lab.test はChildDNSへ委任されているため、Parentは www.child.lab.test のAレコードを権威回答せず、委任先の情報を返す

;; Query time: 0 msec
;; SERVER: 192.168.56.10#53(192.168.56.10) (UDP)
;; WHEN: Fri Sep 04 14:28:55 UTC 2026
;; MSG SIZE  rcvd: 108</code></pre>



<h3 class="wp-block-heading">Resolver の設定</h3>



<pre class="wp-block-code"><code># 設定ファイルを確認
$ sudo cat /etc/unbound/unbound.conf
$ sudo find /etc/unbound -maxdepth 2 -type f -print

# ラボ用設定ファイルを新規作成
$ sudo vim /etc/unbound/unbound.conf.d/dns-lab.conf
<code>server:
    interface: 192.168.56.30
    access-control: 192.168.56.0/24 allow

    local-zone: "test." transparent
    domain-insecure: "lab.test."

stub-zone:
    name: "lab.test."
    stub-addr: 192.168.56.10</code>

# 構文チェック
$ sudo unbound-checkconf

# Unboundを再起動
$ sudo systemctl restart unbound

# サービスの状態を確認
$ systemctl status unbound
● unbound.service - Unbound DNS server
     Loaded: loaded (/usr/lib/systemd/system/unbound.service; enabled; preset: enabled)
     Active: <span class="swl-marker mark_orange">active (running)</span> since Tue 2026-09-08 13:27:42 UTC; 36s ago

$ dig @192.168.56.30 www.child.lab.test A

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; @192.168.56.30 www.child.lab.test A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 62746
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
<span class="swl-marker mark_orange">;www.child.lab.test.            IN      A</span>　　# www.child.lab.test のAレコードを問い合わせ

;; ANSWER SECTION:
<span class="swl-marker mark_orange">www.child.lab.test.     3600    IN      A       192.168.56.100</span>　　# 名前解決できている

;; Query time: 8 msec
;; SERVER: 192.168.56.30#53(192.168.56.30) (UDP)
;; WHEN: Tue Sep 08 13:36:29 UTC 2026
;; MSG SIZE  rcvd: 63</code></pre>



<h3 class="wp-block-heading">Client で名前解決ができるか確認</h3>



<pre class="wp-block-code"><code>$ dig @192.168.56.30 www.child.lab.test A

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; @192.168.56.30 www.child.lab.test A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 63459
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
<span class="swl-marker mark_orange">;www.child.lab.test.            IN      A</span>　　# www.child.lab.test のAレコードを問い合わせ

;; ANSWER SECTION:
<span class="swl-marker mark_orange">www.child.lab.test.     3187    IN      A       192.168.56.100</span>　　# 名前解決できている

;; Query time: 3 msec
;; SERVER: 192.168.56.30#53(192.168.56.30) (UDP)
;; WHEN: Tue Sep 08 13:43:22 UTC 2026
;; MSG SIZE  rcvd: 63</code></pre>



<h2 class="wp-block-heading">おまけ</h2>



<h3 class="wp-block-heading">SERVFAIL エラーの検証</h3>



<p class="wp-block-paragraph">「Parent DNS に child.lab.test の委任を設定」で +norecurse（再帰問い合わせを要求しない）をつけないとSERVFAIL（サーバー側の異常で名前解決に失敗）となる原因を調査した。</p>



<h4 class="wp-block-heading">検証</h4>



<p class="wp-block-paragraph">ターミナル1</p>



<pre class="wp-block-code"><code># パケットキャプチャ(Parent DNS)
~$ sudo tcpdump -ni any port 53
tcpdump: WARNING: any: That device doesn't support promiscuous mode
(Promiscuous mode not supported on the "any" device)
tcpdump: verbose output suppressed, use -v&#91;v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
12:12:22.481102 lo    In  IP 192.168.56.10.45482 &gt; 192.168.56.10.53: 40442 &#91;1au] NS? child.lab.test. (55)
12:12:22.481720 lo    In  IP 192.168.56.10.53 &gt; 192.168.56.10.45482: 40442 0/1/2 (104)
12:12:32.346678 lo    In  IP 192.168.56.10.37116 &gt; 192.168.56.10.53: 65160+ &#91;1au] NS? child.lab.test. (55)
12:12:32.347314 enp0s8 Out IP 192.168.56.10.33827 &gt; 192.168.56.20.53: 15920 &#91;1au] NS? child.lab.test. (55)
12:12:32.348661 enp0s8 In  IP 192.168.56.20.53 &gt; 192.168.56.10.33827: 15920* 1/0/2 NS ns.child.lab.test. (104)
12:12:32.350616 lo    In  IP 192.168.56.10.53 &gt; 192.168.56.10.37116: 65160 ServFail 0/0/1 (71)</code></pre>



<p class="wp-block-paragraph">ターミナル2</p>



<pre class="wp-block-code"><code>$ dig +norecurse @192.168.56.10 child.lab.test NS
$ dig @192.168.56.10 child.lab.test NS</code></pre>



<h4 class="wp-block-heading">検証結果</h4>



<p class="is-style-sticky_box wp-block-paragraph">+norecurse で問い合わせたとき</p>



<pre class="wp-block-code"><code>12:12:22.481102 lo    In  IP 192.168.56.10.45482 &gt; 192.168.56.10.53: 40442 &#91;1au] NS? child.lab.test. (55)</code></pre>



<p class="wp-block-paragraph">が 問い合わせ。</p>



<ul class="wp-block-list">
<li>Parent自身 → ParentのDNS(53番ポート)</li>



<li>「child.lab.test のNSを教えてください」</li>



<li>+norecurseなので「他のDNSへ問い合わせに行かなくていいです」</li>
</ul>



<pre class="wp-block-code"><code>12:12:22.481720 lo    In  IP 192.168.56.10.53 &gt; 192.168.56.10.45482: 40442 0/1/2 (104)</code></pre>



<p class="wp-block-paragraph">が回答。</p>



<ul class="wp-block-list">
<li>Parent DNS → Parent DNS(dig)</li>



<li>0/1/2 = ANSWER 0件 / AUTHORITY 1件 / ADDITIONAL 2件</li>
</ul>



<p class="wp-block-paragraph">この 0/1/2 は、以前 dig で見た、</p>



<pre class="wp-block-code"><code>ANSWER: 0
AUTHORITY: 1
ADDITIONAL: 2</code></pre>



<p class="wp-block-paragraph">と同じもの。</p>



<p class="wp-block-paragraph">このログから読み取れる全体の動きは下記。</p>



<pre class="wp-block-code"><code>dig
 │
 │「child.lab.testのNSは？」
 │「再帰しなくていいよ」
 ▼
Parent
 │
 │ 自分が持っている委任情報を見る
 │
 │「ns.child.lab.testに聞いて」
 ▼
dig</code></pre>



<p class="is-style-big_icon_point wp-block-paragraph">重要なのは、<strong>この通信にParent→Childの通信がないこと</strong>。<br>これが +norecurse の動き。</p>



<p class="is-style-sticky_box wp-block-paragraph">+norecurse なし</p>



<pre class="wp-block-code"><code>12:12:32.346678 lo    In  IP 192.168.56.10.37116 &gt; 192.168.56.10.53: 65160+ &#91;1au] NS? child.lab.test. (55)</code></pre>



<p class="wp-block-paragraph">が問い合わせ。</p>



<ul class="wp-block-list">
<li>Parent自身 → Parent DNS</li>



<li>「child.lab.test のNSを教えてください」</li>



<li>今回は再帰要求あり</li>
</ul>



<p class="is-style-big_icon_point wp-block-paragraph">+norecurse とよく似たログだが、65160+ の + がポイント。<br>tcpdumpのDNS表示では、この + はRD（Recursion Desired）が立っていることを示す。<br><br>※tcpdump 公式GitHubリポジトリを参照<br><a href="https://github.com/the-tcpdump-group/tcpdump/blob/master/print-domain.c" data-type="link" data-id="https://github.com/the-tcpdump-group/tcpdump/blob/master/print-domain.c">https://github.com/the-tcpdump-group/tcpdump/blob/master/print-domain.c</a><br><code>else {<br>/* this is a request */<br>ND_PRINT("%u%s%s%s", GET_BE_U_2(np-&gt;id),<br>ns_ops[DNS_OPCODE(flags)],<br>DNS_RD(flags) ? "+" : "",<br>DNS_CD(flags) ? "%" : "");</code></p>



<pre class="wp-block-code"><code>12:12:32.347314 enp0s8 Out IP 192.168.56.10.33827 &gt; 192.168.56.20.53: 15920 &#91;1au] NS? child.lab.test. (55)</code></pre>



<p class="wp-block-paragraph">が Child DNS への問い合わせ。</p>



<ul class="wp-block-list">
<li>Parent DNS → Child DNS</li>



<li>Parentが「child.lab.test のNSを教えてください」とChildへ問い合わせた</li>
</ul>



<pre class="wp-block-code"><code>12:12:32.348661 enp0s8 In  IP 192.168.56.20.53 &gt; 192.168.56.10.33827: 15920* 1/0/2 NS ns.child.lab.test. (104)</code></pre>



<p class="wp-block-paragraph">が Child DNS からの回答。</p>



<ul class="wp-block-list">
<li>Child DNS → Parent DNS</li>



<li>「child.lab.test のNSは ns.child.lab.test です」と回答</li>



<li>* はAA(Authoritative Answer)が立っていることを示す(上述のGitHubリポジトリを参照)</li>
</ul>



<pre class="wp-block-code"><code>12:12:32.350616 lo    In  IP 192.168.56.10.53 &gt; 192.168.56.10.37116: 65160 ServFail 0/0/1 (71)</code></pre>



<p class="wp-block-paragraph">が最終回答。</p>



<ul class="wp-block-list">
<li>Parent DNS → Parent DNS(dig)</li>



<li>なぜか最終的に「名前解決に失敗しました(SERVFAIL)」と回答</li>
</ul>



<p class="wp-block-paragraph">このログから読み取れる全体の動きは下記。</p>



<pre class="wp-block-code"><code>dig
 │
 │ child.lab.test NS?
 │ RD=1「必要なら代わりに調べて」
 ▼
Parent
 │
 │ 委任情報を確認
 │
 ▼
Child
 │
 │「NSはns.child.lab.testです」
 │ AA=1
 ▼
Parent
 │
 │ ここまでは成功
 │
 ▼
dig

SERVFAIL(?)</code></pre>



<p class="is-style-sticky_box wp-block-paragraph">tcpdump だけでは分からないので追加調査</p>



<pre class="wp-block-code"><code># ジャーナル確認
journalctl -n 20
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving 'test/DS/IN': 199.7.91.13#53
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving './NS/IN': 199.7.91.13#53
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving 'test/DS/IN': 192.203.230.10#53
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving './NS/IN': 198.97.190.53#53
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving 'test/DS/IN': 192.112.36.4#53
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving './NS/IN': 192.203.230.10#53
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving 'test/DS/IN': 192.36.148.17#53
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving './NS/IN': 192.112.36.4#53
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving 'test/DS/IN': 193.0.14.129#53
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving './NS/IN': 192.36.148.17#53
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving 'test/DS/IN': 170.247.170.2#53
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving './NS/IN': 193.0.14.129#53
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving 'test/DS/IN': 192.33.4.12#53
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving './NS/IN': 170.247.170.2#53
Sep 08 12:55:33 dns-parent named&#91;962]: network unreachable resolving './NS/IN': 192.33.4.12#53
Sep 08 12:55:33 dns-parent named&#91;962]: broken trust chain resolving 'child.lab.test/NS/IN': 192.168.56.20#53
Sep 08 12:55:33 dns-parent named&#91;962]: resolver priming query complete: failure</code></pre>



<ul class="wp-block-list">
<li>ルートDNSサーバーへの test/DS や ./NS の問い合わせが network unreachable となっている</li>



<li>broken trust chain resolving からDNSSECの信頼の連鎖を正常に検証できなかったことが判明</li>
</ul>



<p class="wp-block-paragraph">このログから読み取れる全体の動きは下記。</p>



<pre class="wp-block-code"><code>RD=1
 ↓
Parentが再帰処理開始
 ↓
自分の委任情報を利用
 ↓
192.168.56.20のChildへ問い合わせ
 ↓
Childが正常な権威回答
 ↓
Parentの再帰処理でDNSSEC検証を行おうとする
 ↓
test/DSなどを確認しようとする
 ↓
外部DNSへ到達できない
 ↓
broken trust chain
 ↓
SERVFAIL</code></pre>



<p class="is-style-sticky_box wp-block-paragraph">ParentでDNSSECバリデータを無効化</p>



<p class="wp-block-paragraph">SERVFAILの原因がDNSSEC validationにあるかを切り分けるため、Parent DNSのDNSSECバリデータを一時的に無効化して、同じ問い合わせを再度実行する。</p>



<pre class="wp-block-code"><code># 現在の設定を確認
$ sudo named-checkconf -p | grep -i dnssec-validation

# <em>バリデータ</em>を無効化
$ sudo vim /etc/bind/named.conf.options
options {
        <span class="swl-marker mark_orange">dnssec-validation no;</span>
        directory "/var/cache/bind";
};

# 設定を反映
$ sudo named-checkconf
$ sudo named-checkconf -p | grep -i dnssec-validation
        dnssec-validation no;
$ sudo systemctl restart bind9
$ sudo systemctl status bind9
● named.service - BIND Domain Name Server
     Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; preset: enabled)
     Active: <span class="swl-marker mark_orange">active (running)</span> since Mon 2026-09-14 05:13:14 UTC; 3s ago

# 応答確認
$ dig @192.168.56.10 child.lab.test NS

; &lt;&lt;&gt;&gt; DiG 9.20.24-1ubuntu0.3-Ubuntu &lt;&lt;&gt;&gt; @192.168.56.10 child.lab.test NS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: <span class="swl-marker mark_orange">NOERROR</span>, id: 30374
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: ebc0d93e19cce794010000006aa78836b8c315cc6e40ac14 (good)
;; QUESTION SECTION:
;child.lab.test.                        IN      NS

;; ANSWER SECTION:
child.lab.test.         2130    IN      NS      ns.child.lab.test.</code></pre>



<p class="wp-block-paragraph">ここまでの検証で分かるエラーまでの動きは下記。</p>



<pre class="wp-block-code"><code>Childから child.lab.test のNS応答を取得
        ↓
BINDのDNSSEC validationが有効
        ↓
この未署名応答を受け入れてよいか確認
        ↓
child.lab.test
        ↓
lab.test
        ↓
test
        ↓
「test にDSがあるか？」
        ↓
ルートサーバーへ test/DS を問い合わせ
        ↓
外部ネットワークなし
        ↓
network unreachable
        ↓
信頼状態を確定できない
        ↓
broken trust chain
        ↓
SERVFAIL</code></pre>



<h3 class="wp-block-heading">結論</h3>



<p class="wp-block-paragraph">Parent DNSではDNSSEC validationが有効だったので、再帰問い合わせ時にBINDはDNSSECの信頼状態を確認するため、ルートDNSへ test のDSレコードを問い合わせていた。<br>しかし、検証サーバーは外部ネットワークに接続していなかったため問い合わせに失敗し、DNSSECの信頼の連鎖を正常に検証できず、broken trust chain となってSERVFAILが返された。dnssec-validation no; として検証を無効化すると、同じ問い合わせは正常に名前解決できた。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">今回は、Parent DNS、Child DNS、Unbound、Clientを構築し、DNSSECを使用しない通常のDNS名前解決が正常に行えることを確認した。<br>次回は、この環境にDNSSECを導入し、Parent DNSとChild DNSの署名、DSレコードの登録、UnboundへのTrust Anchor設定を行い、DNSSECによる信頼の連鎖を構築する。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/dnssec-lab-setup/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ファイル名にRLOが使われていたらRecentのLNKファイルもRLO表記になるの？</title>
		<link>https://cybermemo.blog/rlo-recent-lnk</link>
					<comments>https://cybermemo.blog/rlo-recent-lnk#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sun, 16 Aug 2026 05:53:41 +0000</pubDate>
				<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[検証]]></category>
		<category><![CDATA[LNK]]></category>
		<category><![CDATA[RLO]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[ログ分析]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=678</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2026/08/検証アイキャッチ-1024x768.png" class="webfeedsFeaturedVisual" /></p>はじめに Microsoft Defender for Endpoint（MDE）でRLOに関連する検知が発生した際、RecentのLNKファイルにもRLOを含むファイル名がログ上で確認された事例があると聞き、今回の検証 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2026/08/検証アイキャッチ-1024x768.png" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">はじめに</h2>



<p class="wp-block-paragraph">Microsoft Defender for Endpoint（MDE）でRLOに関連する検知が発生した際、RecentのLNKファイルにもRLOを含むファイル名がログ上で確認された事例があると聞き、今回の検証を実施。</p>



<h2 class="wp-block-heading">検証の目的</h2>



<p class="wp-block-paragraph">セキュリティ製品上のログ分析において、RLOを含むファイル名やLNKファイル名がどのように表示される可能性があるのか確認したい。</p>



<h3 class="wp-block-heading">セキュリティ製品上でのログ分析における懸念事項</h3>



<p class="wp-block-paragraph">セキュリティ製品によって収集するログや表示するフィールドが異なるため、アラート上に表示されるファイル名がWindows上のどの情報を基にしているのか判断しにくい。</p>



<h3 class="wp-block-heading">懸念事項を解消するために検証をする</h3>



<p class="wp-block-paragraph">複数の条件で検証し、エクスプローラー上の表示、実際のUnicode文字列、LNKのメタデータがそれぞれどのように見えるか確認する。</p>



<h2 class="wp-block-heading">実行環境と使用ツール</h2>



<h3 class="wp-block-heading">実行環境</h3>



<p class="wp-block-paragraph">エディション：Windows 11 Home<br>バージョン：25H2<br>OSビルド：26200.9168</p>



<h3 class="wp-block-heading">使用ツール</h3>



<h4 class="wp-block-heading">LECmd</h4>



<p class="wp-block-paragraph">Windowsのショートカットファイルを解析するための無料のコマンドラインツール。</p>


<div class="swell-block-postLink">			<div class="p-blogCard -external -noimg" data-type="type3" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
										<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://ericzimmerman.github.io/" target="_blank" rel="noopener noreferrer">Home &#8211; Eric Zimmerman&#8217;s Tools</a>
						<span class="p-blogCard__excerpt">Eric Zimmerman&#8217;s Tools</span>					</div>
				</div>
			</div>
		</div>


<h2 class="wp-block-heading">前提知識</h2>



<h3 class="wp-block-heading">RLO（Right-to-Left Override）とは</h3>



<p class="wp-block-paragraph">Unicode制御文字の一種で、RLOを挿入した位置から文字の表示方向を右から左へ強制的に変更するために使用される。本来はアラビア語など右から左へ読む言語を含む双方向テキストを扱うための仕組みの一つだが、ファイル名の表示順を変化させることで拡張子偽装などに悪用されることがある。<br>対になる制御文字として、左から右方向に上書きするLRO（Left-to-Right Override / U+202D）がある。<br><br>例.)<br>通常の表示例<br>sample.txt<br>RLOによって表示順が反転した場合の例<br>txt.elpmas</p>



<h3 class="wp-block-heading">RLOがどのように悪用されるのか</h3>



<p class="wp-block-paragraph">文字列そのものを書き換えるのではなく、表示時の文字方向を上書きできるため、ファイル名の視覚的な偽装に悪用されることがある。</p>



<h4 class="wp-block-heading">例. batファイルをPDFに偽装</h4>



<ol class="wp-block-list">
<li>サンプルファイルを用意</li>
</ol>



<pre class="wp-block-code"><code>@echo off
echo ==============================
echo WARNING: TEST FILE EXECUTED
echo ==============================
echo.
echo This is an RLO test file.
echo.
pause</code></pre>



<p class="wp-block-paragraph">2. サンプルファイル名をRLOで「fdp.bat」とする</p>



<p class="wp-block-paragraph">　F2（名前を変更）→ 右クリック → Unicode制御文字の挿入 → RLOを選択</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="700" height="605" src="https://cybermemo.blog/wp-content/uploads/2026/08/batファイルをPDFに偽装.png" alt="batファイルをPDFに偽装.png" class="wp-image-679" style="aspect-ratio:1.1570714194127452;width:470px;height:auto" srcset="https://cybermemo.blog/wp-content/uploads/2026/08/batファイルをPDFに偽装.png 700w, https://cybermemo.blog/wp-content/uploads/2026/08/batファイルをPDFに偽装-300x259.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></figure>



<p class="wp-block-paragraph">　→ ファイル名「fdp.bat」と入力すると「tab.pdf」と表示される</p>



<figure class="wp-block-image size-full"><img decoding="async" width="653" height="80" src="https://cybermemo.blog/wp-content/uploads/2026/08/batファイルをPDFに偽装2.png" alt="「fdp.bat」" class="wp-image-680" srcset="https://cybermemo.blog/wp-content/uploads/2026/08/batファイルをPDFに偽装2.png 653w, https://cybermemo.blog/wp-content/uploads/2026/08/batファイルをPDFに偽装2-300x37.png 300w" sizes="(max-width: 653px) 100vw, 653px" /></figure>



<p class="wp-block-paragraph">3. 「tab.pdf」を実行すると、batファイルが起動する</p>



<figure class="wp-block-image size-full"><img decoding="async" width="448" height="148" src="https://cybermemo.blog/wp-content/uploads/2026/08/batファイルをPDFに偽装3.png" alt="実行結果" class="wp-image-682" srcset="https://cybermemo.blog/wp-content/uploads/2026/08/batファイルをPDFに偽装3.png 448w, https://cybermemo.blog/wp-content/uploads/2026/08/batファイルをPDFに偽装3-300x99.png 300w" sizes="(max-width: 448px) 100vw, 448px" /></figure>



<p class="wp-block-paragraph">4. 項番2の手順で簡単な偽装は完成。今回のサンプルではアイコンや種類を見ればbatファイルと気づけるが、実際の攻撃では他の手法と組み合わせて高度な偽装がされることがある。</p>



<p class="wp-block-paragraph">5. おまけ</p>



<p class="wp-block-paragraph">今回の検証では、少し時間差があったもののMicrosoft Defenderによってサンプルファイルが検知・検疫された。検証を行う際は、セキュリティ製品によって検知される可能性がある点にも注意。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="489" height="368" src="https://cybermemo.blog/wp-content/uploads/2026/08/Defenderで保護される-1.png" alt="Defender検知画面" class="wp-image-684" srcset="https://cybermemo.blog/wp-content/uploads/2026/08/Defenderで保護される-1.png 489w, https://cybermemo.blog/wp-content/uploads/2026/08/Defenderで保護される-1-300x226.png 300w" sizes="(max-width: 489px) 100vw, 489px" /></figure>



<h3 class="wp-block-heading">RecentのLNKファイル</h3>



<h4 class="wp-block-heading">Recentフォルダとは</h4>



<p class="wp-block-paragraph">ユーザーが最近開いたファイルやフォルダのショートカットを自動的に保存するシステムフォルダ。<br>フォルダパス：C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Recent<br>※C: は環境依存。</p>



<h4 class="wp-block-heading">LNKファイルとは</h4>



<p class="wp-block-paragraph">Windowsで使用されるショートカットファイル。リンク先のファイル本体を格納するのではなく、リンク先を特定・参照するための情報や各種メタデータを保持している。</p>



<h4 class="wp-block-heading">RecentのLNKファイル</h4>



<p class="wp-block-paragraph">ユーザーが最近開いたファイルやフォルダのショートカット。Windowsが自動的に作成し、「最近使った項目」や「クイックアクセス」などに表示させるための履歴として使われる。</p>



<h2 class="wp-block-heading">検証</h2>



<h3 class="wp-block-heading">ファイル名にRLOが含まれている場合のLNKファイル情報確認</h3>



<p class="wp-block-paragraph">1. テストファイル「xslx.tset」（RLO適用後の表示）を作成し、開いておく。</p>



<ol class="wp-block-list"></ol>



<ol class="wp-block-list"></ol>



<ol class="wp-block-list"></ol>



<p class="wp-block-paragraph">2. Recentフォルダへ移動し、テストエクセルのショートカットが作成されていることを確認。エクスプローラー上ではRLOによる表示順の変化がLNKファイル名にも引き継がれている。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="621" height="55" src="https://cybermemo.blog/wp-content/uploads/2026/08/テストエクセル.png" alt="xslx.tset" class="wp-image-685" srcset="https://cybermemo.blog/wp-content/uploads/2026/08/テストエクセル.png 621w, https://cybermemo.blog/wp-content/uploads/2026/08/テストエクセル-300x27.png 300w" sizes="(max-width: 621px) 100vw, 621px" /></figure>



<p class="wp-block-paragraph">3. PowerShellでLNKファイル名にRLOのコードポイントが入っているか確認。U+202E（RLOのコードポイント）が含まれているので、LNKファイル名のUnicode文字列にRLOが含まれていることをコマンド上からも確認できた。</p>



<pre class="wp-block-code"><code>&gt; $file = Get-ChildItem | Where-Object { $_.Extension -eq ".lnk" -and $_.Name -like "*test.xlsx*" } | Select-Object -First 1
&gt; $file.Name.ToCharArray() | ForEach-Object {
&gt;&gt;     "U+{0:X4}  {1}" -f &#91;int]$_, $_
&gt;&gt; }
<strong><span class="swl-marker mark_orange">U+202E</span></strong>  ‮
U+0074  t
U+0065  e
U+0073  s
U+0074  t
U+002E  .
U+0078  x
U+006C  l
U+0073  s
U+0078  x
U+002E  .
U+006C  l
U+006E  n
U+006B  k</code></pre>



<p class="wp-block-paragraph">4. LECmdでメタ情報確認。</p>



<p class="wp-block-paragraph">実行コード</p>



<pre class="wp-block-code"><code>LECmd.exe -f "E:\test.xlsx.lnk"</code></pre>



<p class="wp-block-paragraph">結果（一部抜粋）</p>



<pre class="wp-block-code"><code>    --------- Block 0 (Beef0004) ---------
    Long name: ?test.xlsx
    Created:     2026-08-15 09:34:06
    Last access: 2026-08-15 09:34:08
    MFT entry/sequence #: 463271/4 (0x711A7/0x4)</code></pre>



<p class="wp-block-paragraph">5. 項番4の結果から以下の情報が分かる。</p>



<p class="wp-block-paragraph">①Long name: ?test.xlsx について</p>



<p class="wp-block-paragraph">・「?」の部分がRLOに相当する位置と思われる。ただし、LECmdによる解析またはコンソールへの出力過程で「?」と表示されている可能性もあるため、この結果のみからLNK内部でU+202Eが「?」に置換されて保存されているとは判断できない。</p>



<p class="wp-block-paragraph">・RLOを挿入した位置は「?」と表示され、それ以降のファイル名は 「test.xlsx」 と論理順で確認できた。エクスプローラー上のRLOによる視覚的な表示とは異なる結果となった。</p>



<p class="wp-block-paragraph">②MFT entry/sequence #: 463271/4 (0x711A7/0x4)</p>



<p class="wp-block-paragraph">・今回は検証しないが、LECmdの解析結果からMFTエントリ番号とシーケンス番号を取得できているため、MFTECmdなどを用いて $MFT を解析し、対象ファイルのMFTレコードと照合することで、さらに調査を深掘りできそう。</p>



<h3 class="wp-block-heading">本文にRLOが含まれている場合のLNKファイル情報確認</h3>



<p class="wp-block-paragraph">1. テストファイル「test2.xlsx」を作成し、ファイル内にRLOを含む文字を入力。</p>



<ol class="wp-block-list"></ol>



<figure class="wp-block-image size-full"><img decoding="async" width="99" height="60" src="https://cybermemo.blog/wp-content/uploads/2026/08/テストエクセル2.png" alt="テストファイル「test2.xlsx」" class="wp-image-687"/></figure>



<p class="wp-block-paragraph">2. Recentフォルダへ移動し、テストエクセルのショートカットが作成されていることを確認。エクスプローラー上では通常の左から右の順序で表示されている。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="606" height="31" src="https://cybermemo.blog/wp-content/uploads/2026/08/テストエクセル3-1.png" alt="test2.xlsx" class="wp-image-693" srcset="https://cybermemo.blog/wp-content/uploads/2026/08/テストエクセル3-1.png 606w, https://cybermemo.blog/wp-content/uploads/2026/08/テストエクセル3-1-300x15.png 300w" sizes="(max-width: 606px) 100vw, 606px" /></figure>



<p class="wp-block-paragraph">3. PowerShellでLNKファイル名にRLOのコードポイントが入っていないことを確認。U+202E（RLOのコードポイント）が含まれていないので、LNKファイル名のUnicode文字列にRLOが含まれていないことをコマンド上からも確認できた。</p>



<pre class="wp-block-code"><code>&gt; $file = Get-ChildItem | Where-Object {
&gt;&gt;     $_.Extension -eq ".lnk" -and $_.Name -like "*test2.xlsx*"
&gt;&gt; } | Select-Object -First 1
&gt; $file.Name.ToCharArray() | ForEach-Object {
&gt;&gt;       "U+{0:X4}  {1}" -f &#91;int]$_, $_
&gt;&gt;   }
U+0074  t
U+0065  e
U+0073  s
U+0074  t
U+0032  2
U+002E  .
U+0078  x
U+006C  l
U+0073  s
U+0078  x
U+002E  .
U+006C  l
U+006E  n
U+006B  k</code></pre>



<p class="wp-block-paragraph">4. ファイル内の文字列にRLOが含まれていることを確認。</p>



<p class="wp-block-paragraph">4-1. test2.xlsx の拡張子を変更し、test2.zip とする。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="615" height="26" src="https://cybermemo.blog/wp-content/uploads/2026/08/zipへ変更.png" alt="zipへ変更" class="wp-image-690" srcset="https://cybermemo.blog/wp-content/uploads/2026/08/zipへ変更.png 615w, https://cybermemo.blog/wp-content/uploads/2026/08/zipへ変更-300x13.png 300w" sizes="(max-width: 615px) 100vw, 615px" /></figure>



<p class="wp-block-paragraph">4-2. zipファイルを展開し、test2\xl\sharedStrings.xml のコードを確認。ブログ上の表示では分かりにくいが、このコードの線を引いた部分にはRLOが含まれており、エディタ上でカーソルを移動させると文字方向の変化も確認できた。</p>



<pre class="wp-block-code"><code>&lt;sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="1" uniqueCount="1"&gt;
&lt;si&gt;
&lt;r&gt;
&lt;rPr&gt;
&lt;sz val="11"/&gt;
&lt;color theme="1"/&gt;
&lt;rFont val="Arial"/&gt;
&lt;family val="2"/&gt;
&lt;charset val="178"/&gt;
&lt;/rPr&gt;
<span class="swl-marker mark_orange"><strong>&lt;t&gt;‮&lt;/t&gt;</strong></span>
&lt;/r&gt;
&lt;r&gt;
&lt;rPr&gt;
&lt;sz val="11"/&gt;
&lt;color theme="1"/&gt;
&lt;rFont val="Calibri"/&gt;
&lt;family val="2"/&gt;
&lt;charset val="178"/&gt;
&lt;/rPr&gt;
&lt;t&gt;test.xlsx&lt;/t&gt;
&lt;/r&gt;
&lt;phoneticPr fontId="1"/&gt;
&lt;/si&gt;
&lt;/sst&gt;</code></pre>



<p class="wp-block-paragraph">4-3. PowerShellでも確認。Trueが返ってくるので、RLOが含まれている。</p>



<pre class="wp-block-code"><code>&gt; Get-ChildItem sharedStrings.xml
&gt; $text = Get-Content ".\sharedStrings.xml" -Raw -Encoding UTF8
&gt; $text.Contains(&#91;char]0x202E)
True</code></pre>



<p class="wp-block-paragraph">5. LECmdでメタ情報確認。</p>



<p class="wp-block-paragraph">実行コード</p>



<pre class="wp-block-code"><code>LECmd.exe -f "E:\test2.xlsx.lnk"</code></pre>



<p class="wp-block-paragraph">結果（一部抜粋）</p>



<pre class="wp-block-code"><code>    --------- Block 0 (Beef0004) ---------
    Long name: test2.xlsx
    Created:     2026-08-15 12:41:26
    Last access: 2026-08-15 12:41:26
    MFT entry/sequence #: 463313/4 (0x711D1/0x4)</code></pre>



<p class="wp-block-paragraph">6. 本文にRLOが含まれていても、Recentに生成されたLNKファイル名への影響は確認できなかった。また、LECmdのLong nameにもRLOに相当する表示は確認されなかった。</p>



<h3 class="wp-block-heading">ファイル名にRLOを含むファイルをコピー後、RLOを削除してリネームした場合のLNKファイル情報確認</h3>



<p class="wp-block-paragraph">1. ファイル名にRLOを含むファイル「xslx.tset」（RLO適用後の表示）をコピーし、「test3.xlsx」にリネーム後開いておく。</p>



<p class="wp-block-paragraph">2. Recentフォルダへ移動し、テストエクセルのショートカットが作成されていることを確認。エクスプローラー上では通常の左から右の順序で表示されている。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="602" height="21" src="https://cybermemo.blog/wp-content/uploads/2026/08/テストエクセル4.png" alt="test3.xlsx" class="wp-image-715" style="width:602px;height:auto" srcset="https://cybermemo.blog/wp-content/uploads/2026/08/テストエクセル4.png 602w, https://cybermemo.blog/wp-content/uploads/2026/08/テストエクセル4-300x10.png 300w" sizes="(max-width: 602px) 100vw, 602px" /></figure>



<p class="wp-block-paragraph">3. PowerShellでLNKファイル名にRLOのコードポイントが入っていないことを確認。U+202E（RLOのコードポイント）が含まれていないので、LNKファイル名のUnicode文字列にRLOが含まれていないことをコマンド上からも確認できた。</p>



<pre class="wp-block-code"><code>&gt; $file = Get-ChildItem | Where-Object {
&gt;&gt;      $_.Extension -eq ".lnk" -and $_.Name -like "*test3.xlsx*"
&gt;&gt;  } | Select-Object -First 1
&gt;  $file.Name.ToCharArray() | ForEach-Object {
&gt;&gt;        "U+{0:X4}  {1}" -f &#91;int]$_, $_
&gt;&gt;    }
U+0074  t
U+0065  e
U+0073  s
U+0074  t
U+0033  3
U+002E  .
U+0078  x
U+006C  l
U+0073  s
U+0078  x
U+002E  .
U+006C  l
U+006E  n
U+006B  k</code></pre>



<p class="wp-block-paragraph">4. LECmdでメタ情報確認。</p>



<p class="wp-block-paragraph">実行コード</p>



<pre class="wp-block-code"><code>LECmd.exe -f "E:\test3.xlsx.lnk"</code></pre>



<p class="wp-block-paragraph">結果（一部抜粋）</p>



<pre class="wp-block-code"><code>    --------- Block 0 (Beef0004) ---------
    Long name: test3.xlsx
    Created:     2026-08-16 04:01:58
    Last access: 2026-08-16 04:03:00
    MFT entry/sequence #: 463356/5 (0x711FC/0x5)</code></pre>



<p class="wp-block-paragraph">5. 項番3、4の結果から、RLOを含むファイルをコピーした後、ファイル名からRLOを削除してリネームした場合、今回生成されたLNKファイル名およびLECmdで確認したLong nameにはRLOの痕跡は確認できなかった。</p>



<h3 class="wp-block-heading">その他</h3>



<p class="wp-block-paragraph">ファイル名にRLOが含まれている場合、Windowsのショートカットエラーに表示されるファイル名にもRLOによる表示順の変化が反映されることを確認できた。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="427" height="228" src="https://cybermemo.blog/wp-content/uploads/2026/08/error-2.png" alt="ショートカットエラー" class="wp-image-697" srcset="https://cybermemo.blog/wp-content/uploads/2026/08/error-2.png 427w, https://cybermemo.blog/wp-content/uploads/2026/08/error-2-300x160.png 300w" sizes="(max-width: 427px) 100vw, 427px" /></figure>



<h2 class="wp-block-heading">検証結果</h2>



<p class="wp-block-paragraph">今回の検証では、「ファイル名にRLOを含めた場合」「Excelファイルの本文にのみRLOを含めた場合」「RLOを含むファイルをコピー後、ファイル名からRLOを削除した場合」の3パターンについて、Recentフォルダに生成されるLNKファイルを比較した。</p>



<figure class="wp-block-table is-style-regular"><table class="has-fixed-layout"><thead><tr><th>検証内容</th><th>ファイル名のRLO</th><th>本文のRLO</th><th>LNKファイル名のRLO</th><th>LECmdのLong name</th></tr></thead><tbody style="--tbody-th-color--bg:var(--color_main);--tbody-th-color--txt:var(--swl-text_color--white)"><tr><td>ファイル名にRLOを設定</td><td>あり</td><td>なし</td><td>あり</td><td>?test.xlsx</td></tr><tr><td>本文にRLOを設定</td><td>なし</td><td>あり</td><td>なし</td><td>test2.xlsx</td></tr><tr><td>ファイル名にRLOを含むファイルをコピー後、RLOを削除してリネームした場合</td><td>なし（コピー元はあり）</td><td>なし</td><td>なし</td><td>test3.xlsx</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ファイル名にRLO（U+202E）が含まれている場合、Recentフォルダに生成されたLNKファイル名にもU+202Eが含まれていることを確認できた。一方、本文にのみRLOを含めた場合や、RLOを含むファイルをコピーした後にRLOを削除してリネームしてから開いた場合には、生成されたLNKファイル名からU+202Eは確認されなかった。<br>以上から、今回の検証環境および検証した条件ではRecentに生成されたLNKファイル名のRLOは文書本文やコピー元の過去のファイル名に由来する挙動は確認されず、対象ファイルを開いた時点のファイル名が反映されている可能性が高いと考えられる。</p>



<h2 class="wp-block-heading">最後に</h2>



<p class="wp-block-paragraph">アラート分析の際にRLOを含むLNKファイル名が確認された場合や、?test.xlsx のようにファイル名に通常とは異なる記号が表示されている場合は、RLOなどのUnicode制御文字を利用したファイル名偽装の可能性も考慮して調査するのがよさそう。<br>MDEのログ上では、LNKファイル名にもRLOが含まれているように表示された事例があったようだが、セキュリティ製品によって取得するログや表示するフィールド、文字の表現方法などが異なる可能性があるため、アラート上の表示だけで判断せず、可能であれば実ファイル名のUnicodeコードポイントやLNKファイルの情報もあわせて確認したい。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/rlo-recent-lnk/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>『OSINT実践ガイド』紹介ツールまとめ</title>
		<link>https://cybermemo.blog/osint-practical-guide-tools</link>
					<comments>https://cybermemo.blog/osint-practical-guide-tools#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sun, 15 Feb 2026 11:05:31 +0000</pubDate>
				<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[OSINT]]></category>
		<category><![CDATA[SOC]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=643</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2026/02/『OSINT実践ガイド』紹介ツールまとめ_アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>はじめに 「サイバー攻撃から企業システムを守る！　OSINT実践ガイド」を読んだので、2章で紹介されていたツールのまとめ。 1章 OSINTの基礎2章 OSINT必携ツールの使い方3章 OSINT情報の可視化4章 グロー [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2026/02/『OSINT実践ガイド』紹介ツールまとめ_アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">はじめに</h2>



<p class="wp-block-paragraph">「サイバー攻撃から企業システムを守る！　OSINT実践ガイド」を読んだので、2章で紹介されていたツールのまとめ。<br><br>1章 OSINTの基礎<br>2章 OSINT必携ツールの使い方<br>3章 OSINT情報の可視化<br>4章 グローバルでのOSINT活用事例</p>


<div class="swell-block-postLink">			<div class="p-blogCard -external -noimg" data-type="type3" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">日経Linux</span>
										<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://info.nikkeibp.co.jp/media/LIN/atcl/books/110800040/" target="_blank" rel="noopener noreferrer">サイバー攻撃から企業システムを守る！　OSINT実践ガイド</a>
						<span class="p-blogCard__excerpt"></span>					</div>
				</div>
			</div>
		</div>


<h2 class="wp-block-heading">2章で紹介されていたツールまとめ</h2>



<p class="wp-block-paragraph">リンクが変わっていたり、廃止になっていたりしたので、後で見返しやすいように記録。<br>※2026年2月時点</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>ユースケース</td><td>サービス名</td><td>URL</td><td>用途<sup data-fn="9eea3cef-bbda-43a7-aeb5-4772c048d843" class="fn"><a href="#9eea3cef-bbda-43a7-aeb5-4772c048d843" id="9eea3cef-bbda-43a7-aeb5-4772c048d843-link">1</a></sup></td><td>備考</td></tr><tr><td rowspan="5">資産の外部公開状況を把握する</td><td>Shodan</td><td><a href="https://developer.shodan.io/" target="_blank" rel="noreferrer noopener">https://developer.shodan.io/</a></td><td>公開サーバー、サービス、IoTデバイス、OTデバイスなど幅広い検索エンジン</td><td>画像検索は有償に変更</td></tr><tr><td data-has-cell-bg="1" data-text-color="black"><span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg">&nbsp;</span>Binary Edge</td><td data-has-cell-bg="1" data-text-color="black"><a href="https://app.binaryedge.io">https://app.binaryedge.io</a><span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg">&nbsp;</span></td><td data-has-cell-bg="1" data-text-color="black"><span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg">&nbsp;</span>廃止</td><td data-has-cell-bg="1" data-text-color="black"><span data-icon-size="l" data-icon-type="bg" style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg">&nbsp;</span></td></tr><tr><td>Censys</td><td><a href="https://search.censys.io/" target="_blank" rel="noreferrer noopener">https://platform.censys.io/search</a></td><td>詳細な検索フィルターで検索範囲を絞り込んで検索できる</td><td>クエリの仕様変更あり<br><a href="https://platform.censys.io/home/examples">https://platform.censys.io/home/examples</a></td></tr><tr><td>ZoomEye</td><td><a href="https://www.zoomeye.ai/" target="_blank" rel="noreferrer noopener">https://www.zoomeye.ai/</a></td><td>中国企業が運営する検索エンジン</td><td>個人情報の登録が必要なので、個人学習の範囲では使わない</td></tr><tr><td>FOFA</td><td><a href="https://fofa.info/" target="_blank" rel="noreferrer noopener">https://fofa.info/</a></td><td>中国企業が運営する検索エンジン</td><td>個人学習の範囲では使わない</td></tr><tr><td rowspan="3">パスワードが漏洩していないか調査する</td><td>Have I Been Pwned</td><td><a href="https://haveibeenpwned.com/" target="_blank" rel="noreferrer noopener">https://haveibeenpwned.com/</a></td><td>パスワードや個人情報が漏洩していないか調べる</td><td></td></tr><tr><td>DeHashed</td><td><a href="https://dehashed.com/" target="_blank" rel="noreferrer noopener">https://dehashed.com/</a></td><td>パスワードや個人情報が漏洩していないか調べる</td><td></td></tr><tr><td>BugMeNot</td><td><a href="https://bugmenot.com/" target="_blank" rel="noreferrer noopener">https://bugmenot.com/</a></td><td>認証情報が誰かと共有されていないか調べる</td><td></td></tr><tr><td rowspan="5">マルウェア情報を調査する</td><td>VirusTotal</td><td><a href="https://www.virustotal.com/gui/home/upload" target="_blank" rel="noreferrer noopener">https://www.virustotal.com/gui/home/upload</a></td><td>Googleが提供するマルウェア対策用のオンラインスキャナー</td><td></td></tr><tr><td>ANY.RUN</td><td><a href="https://any.run/" target="_blank" rel="noreferrer noopener">https://any.run/</a></td><td>マルウェアを仮想環境で安全に実行する仕組みを提供する「サンドボックス」サービス</td><td>個人アカウントの登録は個別連絡をして審査が通った場合のみ可</td></tr><tr><td>Joe Sandbox</td><td><a href="https://www.joesandbox.com/#windows" target="_blank" rel="noreferrer noopener">https://www.joesandbox.com/#windows</a></td><td>ANY.RUNに類似するサンドボックス</td><td></td></tr><tr><td>HYBRID ANALYSIS</td><td><a href="https://hybrid-analysis.com/" target="_blank" rel="noreferrer noopener">https://hybrid-analysis.com/</a></td><td>VirusTotalに類似するオンラインスキャナー<br>VirusTotal、CrowdStrike Falcon、MetaDefender 3種類のスキャンサービスの結果をまとめて確認できる</td><td></td></tr><tr><td>Intezer</td><td><a href="https://intezer.com/" target="_blank" rel="noreferrer noopener">https://intezer.com/</a></td><td>ANY.RUNに類似するサンドボックス</td><td></td></tr><tr><td rowspan="6">Webサイトのレピュテーションを調査する</td><td>aguse</td><td><a href="https://www.aguse.jp/" target="_blank" rel="noreferrer noopener">https://www.aguse.jp/</a></td><td>Webブラウザへ代理アクセス、日本企業が運営</td><td></td></tr><tr><td>urlscan.io</td><td><a href="https://urlscan.io/" target="_blank" rel="noreferrer noopener">https://urlscan.io/</a></td><td>Webブラウザへ代理アクセス</td><td></td></tr><tr><td>urlquery</td><td><a href="https://urlquery.net/" target="_blank" rel="noreferrer noopener">https://urlquery.net/</a></td><td>Webブラウザへ代理アクセス</td><td>UI変更あり<br>List、Summary、Grid から選ぶ形式へ変更されている<br>ハッシュ値からURLを追跡できて便利</td></tr><tr><td>Sucuri SiteCheck</td><td><a href="https://sitecheck.sucuri.net/" target="_blank" rel="noreferrer noopener">https://sitecheck.sucuri.net/</a></td><td>Webサイトのレピュテーション<br>調査可能な内容は、マルウェア感染の可能性があるかどうかとブラックリストに載っているかどうかのみ</td><td></td></tr><tr><td>URLVoid</td><td><a href="https://www.urlvoid.com/" target="_blank" rel="noreferrer noopener">https://www.urlvoid.com/</a></td><td>Webサイトのレピュテーション<br>マルウェア検知特化</td><td></td></tr><tr><td>AbuseIPDB</td><td><a href="https://www.abuseipdb.com/" target="_blank" rel="noreferrer noopener">https://www.abuseipdb.com/</a></td><td>ドメイン名やIPアドレス、<strong>IPアドレスレンジ</strong>を指定してサイトが悪性か確認できる</td><td>レンジは/24まで、それ以上は不可</td></tr><tr><td rowspan="5">ゼロデイやエクスプロイトの有無を調査する</td><td>Zero-day Vulnerability Database</td><td><a href="https://www.zero-day.cz/database/" target="_blank" rel="noreferrer noopener">https://www.zero-day.cz/database/</a></td><td>「ソフトウェア種別」や「ベンダーごと」などの切り口でゼロデイ脆弱性を調べられる</td><td></td></tr><tr><td>Published Advisories</td><td><a href="https://www.zerodayinitiative.com/advisories/published/" target="_blank" rel="noreferrer noopener">https://www.zerodayinitiative.com/advisories/published/</a></td><td>トレンドマイクロの脆弱性情報提供サービス<br>Upcoming Advisoriesにはゼロデイ脆弱性の一覧が掲載されている</td><td></td></tr><tr><td>Exploit Database</td><td><a href="https://www.exploit-db.com/" target="_blank" rel="noreferrer noopener">https://www.exploit-db.com/</a></td><td>エクスプロイトの情報を集約したデータベース<br>集約されているエクスプロイトの総数は多くないので補助的に使うのがいい</td><td></td></tr><tr><td>Security home.eu</td><td><a href="https://www.securityhome.eu/" target="_blank" rel="noreferrer noopener">https://www.securityhome.eu/</a></td><td>セキュリティ関連情報を扱うWebサイト<br>「Exploits」ページには、比較的新しいエクスプロイト情報が掲載されている</td><td></td></tr><tr><td data-has-cell-bg="1" data-text-color="black"><span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg"> </span>Exploitalert</td><td data-has-cell-bg="1" data-text-color="black"><a href="https://www.exploitalert.com/browse-exploit.html">https://www.exploitalert.com/browse-exploit.html</a><span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg">&nbsp;</span></td><td data-has-cell-bg="1" data-text-color="black"><span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg">&nbsp;</span>廃止</td><td data-has-cell-bg="1" data-text-color="black"><span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg"> </span></td></tr><tr><td rowspan="3">Microsoft月齢セキュリティパッチについて情報収集する</td><td>Zero Day Initiative &#8211; Blog</td><td><a href="https://www.zerodayinitiative.com/blog" target="_blank" rel="noreferrer noopener">https://www.zerodayinitiative.com/blog</a></td><td>トレンドマイクロ運営の脆弱性発見コミュニティーサイト</td><td></td></tr><tr><td>Bleeping Computer</td><td><a href="https://www.bleepingcomputer.com/" target="_blank" rel="noreferrer noopener">https://www.bleepingcomputer.com/</a></td><td>コンピューター関連の情報発信サイト</td><td></td></tr><tr><td>SANS Internet Storm Center</td><td><a href="https://isc.sans.edu/" target="_blank" rel="noreferrer noopener">https://isc.sans.edu/</a></td><td>米SANS Internet が運営している政府や企業、各種団体に所属する人々に対するITセキュリティ教育を目的としたサイト</td><td></td></tr><tr><td rowspan="5">自社に関する脆弱性情報収集を収集する</td><td>NVD</td><td><a href="https://nvd.nist.gov/vuln/search" target="_blank" rel="noreferrer noopener">https://nvd.nist.gov/vuln/search</a></td><td>NISTが管理している脆弱性情報のデータベース</td><td>UI変更あり<br>Advanced→Platform Applicability →Applicability Statement から各項目を入力して検索</td></tr><tr><td>JVN iPedia</td><td><a href="https://jvndb.jvn.jp/" target="_blank" rel="noreferrer noopener">https://jvndb.jvn.jp/</a></td><td>日本国内向けの脆弱性対策情報ポータルサイト<br>JPCERTコーディネーションセンターとIPAの共同運営</td><td></td></tr><tr><td>Vulmon</td><td><a href="https://vulmon.com/" target="_blank" rel="noreferrer noopener">https://vulmon.com/</a></td><td>CVE番号、会社名、製品名で検索可能な脆弱性データベース<br>補助的利用推奨</td><td></td></tr><tr><td>Vulnerability Database</td><td><a href="https://www.cybersecurity-help.cz/" target="_blank" rel="noreferrer noopener">https://www.cybersecurity-help.cz/</a></td><td>脆弱性データベース閲覧サイト<br>エクスプロイトが公開されているかどうか、セキュリティパッチが提供されてるかどうかなども調べられる</td><td></td></tr><tr><td>Vumetric Cybersecurity Portal</td><td><a href="https://www.vumetric.com/" target="_blank" rel="noreferrer noopener">https://www.vumetric.com/</a></td><td>ダッシュボード形式で脆弱性情報を掲載しているポータルサイト</td><td></td></tr><tr><td rowspan="2">SSL/TLSのセキュリティ強度を確認する</td><td>SSL Server Test</td><td><a href="https://www.ssllabs.com/ssltest" target="_blank" rel="noreferrer noopener">https://www.ssllabs.com/ssltest</a></td><td>SSL/TLSのセキュリティ強度を調査できるサービス</td><td>アクティブスキャンサービス<br>許可のないサイトを無暗にスキャンするのは非推奨<br>スキャン結果をダッシュボードに表示させたくない場合は「Do not show the results on the boards」にチェック</td></tr><tr><td>Test TLS</td><td><a href="https://testtls.com/" target="_blank" rel="noreferrer noopener">https://testtls.com/</a></td><td>SSL/TLSを利用しているサーバーを調査できるサービス</td><td>アクティブスキャンサービス<br>許可のないサイトを無暗にスキャンするのは非推奨</td></tr><tr><td rowspan="2">失効したサーバー証明書の有無を確認する</td><td data-has-cell-bg="1" data-text-color="black"><span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg">&nbsp;</span>Entrust Certificate Search</td><td data-has-cell-bg="1" data-text-color="black"><a href="https://ui.ctsearch.entrust.com/ui/ctsearchui">https://ui.ctsearch.entrust.com/ui/ctsearchui<span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg">&nbsp;</span></a></td><td data-has-cell-bg="1" data-text-color="black"><span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg">&nbsp;</span>廃止</td><td data-has-cell-bg="1" data-text-color="black"><span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg">&nbsp;</span></td></tr><tr><td>Certificate Checker</td><td><a href="https://ssltools.godaddy.com/views/certChecker" target="_blank" rel="noreferrer noopener">https://ssltools.godaddy.com/views/certChecker</a></td><td>サーバー証明書の有効期間チェックやOCSPを利用した失効状態の確認、<br>SSL/TLS通信に関する脆弱性がサーバーに存在するかどうかの調査など</td><td></td></tr><tr><td rowspan="2">自己署名証明書(オレオレ証明書)の有無を調べる</td><td>SSL/TLS Certificate Test Tool</td><td><a href="https://network-tools.webwiz.net/ssl-certificate-checker.htm" target="_blank" rel="noreferrer noopener">https://network-tools.webwiz.net/ssl-certificate-checker.htm</a></td><td>自己署名証明書が使用されていないかどうかや、証明書の有効期間、<br>SSL/TLSプロトコルの状況(有効/無効)などを確認できるアクティブスキャン型のサービス</td><td>アクティブスキャンサービス<br>許可のないサイトを無暗にスキャンするのは非推奨</td></tr><tr><td>Self Signed Certificate Checker</td><td><a href="https://s4e.io/tools/self-signed-certificate-checker" target="_blank" rel="noreferrer noopener">https://s4e.io/tools/self-signed-certificate-checker</a></td><td>自己署名証明書が使用されていないかどうかを確認できるアクティブスキャン型のサービス</td><td>アクティブスキャンサービス<br>許可のないサイトを無暗にスキャンするのは非推奨</td></tr><tr><td rowspan="3">投稿写真から住所などを特定されないか調べる</td><td>Google画像検索</td><td><a href="https://images.google.com/" target="_blank" rel="noreferrer noopener">https://images.google.com/</a></td><td>画像ファイルをアップロードして検索すると、類似の画像を検索するとともに、それが何であるかを判定してくれる</td><td></td></tr><tr><td>Bing画像検索</td><td><a href="https://www.bing.com/" target="_blank" rel="noreferrer noopener">https://www.bing.com/</a></td><td>画像ファイルをアップロードして検索すると、類似の画像を検索するとともに、それが何であるかを判定してくれる</td><td></td></tr><tr><td>TinEye</td><td><a href="https://tineye.com/" target="_blank" rel="noreferrer noopener">https://tineye.com/</a></td><td>画像ファイルをアップロードして検索すると、類似の画像を検索するとともに、それが何であるかを判定してくれる</td><td></td></tr><tr><td rowspan="2">メールアドレス漏洩の有無を調べる</td><td>Hunter</td><td><a href="https://hunter.io/" target="_blank" rel="noreferrer noopener">https://hunter.io/</a></td><td>世の中に出回っているメールアドレスを多数収集していて、それらを検索できるサービス<br>命名規則も表示してくれる</td><td></td></tr><tr><td>Anymail Finder</td><td><a href="https://anymailfinder.com/" target="_blank" rel="noreferrer noopener">https://anymailfinder.com/</a></td><td>インターネット上のメールアドレスを収集し検索できるようにしているサービス</td><td></td></tr><tr><td rowspan="2">IPアドレスの使用場所を特定する</td><td>MaxMind</td><td><a href="https://www.maxmind.com/en/geoip-web-services-demo" target="_blank" rel="noreferrer noopener">https://www.maxmind.com/en/geoip-web-services-demo</a></td><td>IPアドレスから「経度・緯度」や「IPアドレスの正確さ(IPアドレスの観測地点から半径○○kmという距離」)などを調査できるサービス</td><td></td></tr><tr><td>eXTReMe-IP-Lookup.com</td><td><a href="https://extreme-ip-lookup.com/" target="_blank" rel="noreferrer noopener">https://extreme-ip-lookup.com/</a></td><td>IPアドレスから場所の特定ができるサービス<br>MaxMindよりは精度が高くない</td><td></td></tr><tr><td>WifiのSSIDが知れ渡っていないか調べる</td><td>WiGLE.net</td><td><a href="https://www.wigle.net/" target="_blank" rel="noreferrer noopener">https://www.wigle.net/</a></td><td>SSIDから場所を特定できるサービス</td><td></td></tr><tr><td rowspan="3">Exifデータの埋め込みをチェックする</td><td>EXIF Data Viewer Online</td><td><a href="https://linangdata.com/exif-reader/" target="_blank" rel="noreferrer noopener">https://linangdata.com/exif-reader/</a></td><td>Exifデータを確認できるオンラインサービス</td><td></td></tr><tr><td>exifdata</td><td><a href="https://www.exifdata.com/" target="_blank" rel="noreferrer noopener">https://www.exifdata.com/</a></td><td>Exifデータを確認できるオンラインサービス</td><td></td></tr><tr><td>EXIF確認君</td><td><a href="http://exif-check.org/" target="_blank" rel="noreferrer noopener">http://exif-check.org/</a></td><td>Exifデータを確認できるオンラインサービス</td><td></td></tr><tr><td rowspan="4">アーカイブやキャッシュを活用する</td><td data-has-cell-bg="1" data-text-color="black"><span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg">&nbsp;</span>Googleキャッシュ</td><td data-has-cell-bg="1" data-text-color="black"><span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg">&nbsp;</span>なし</td><td data-has-cell-bg="1" data-text-color="black"><span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg">&nbsp;</span>廃止</td><td data-has-cell-bg="1" data-text-color="black"><span style="--the-cell-bg: #b2b2b2" data-text-color="black" aria-hidden="true" class="swl-cell-bg">&nbsp;</span></td></tr><tr><td>Internet Archive</td><td><a href="https://archive.org/" target="_blank" rel="noreferrer noopener">https://web.archive.org/</a></td><td>インターネット上の各種コンテンツをアーカイブしているサイト</td><td></td></tr><tr><td>archive.today</td><td><a href="https://archive.md/" target="_blank" rel="noreferrer noopener">https://archive.md/</a></td><td>インターネット上の各種コンテンツをアーカイブしているサイト<br>URLを指定してアーカイブしてもらう機能も備えている</td><td></td></tr><tr><td>ウェブ魚拓</td><td><a href="https://megalodon.jp/" target="_blank" rel="noreferrer noopener">https://megalodon.jp/</a></td><td>インターネット上のWebサイトをアーカイブしているサイト</td><td></td></tr><tr><td rowspan="4">自社のIPアドレス(レンジ)を把握する</td><td>WhatisMyIPaddress.com</td><td><a href="https://whatismyipaddress.com/" target="_blank" rel="noreferrer noopener">https://whatismyipaddress.com/</a></td><td>インターネット側から見て自社の端末にどのようなIPアドレスが割り当てられているかを確認できるサービス</td><td></td></tr><tr><td>確認君+</td><td><a href="https://env.b4iine.net/" target="_blank" rel="noreferrer noopener">https://env.b4iine.net/</a></td><td>インターネット側から見て自社の端末にどのようなIPアドレスが割り当てられているかを確認できるサービス</td><td></td></tr><tr><td>ipinfo.io</td><td><a href="https://ipinfo.io/" target="_blank" rel="noreferrer noopener">https://ipinfo.io/</a></td><td>IPアドレスからホスト名や都市名、国名、IPアドレスレンジなどを確認できるサービス</td><td></td></tr><tr><td>IP WHOIS Lookup</td><td><a href="https://dnschecker.org/ip-whois-lookup.php" target="_blank" rel="noreferrer noopener">https://dnschecker.org/ip-whois-lookup.php</a></td><td>IPアドレスやドメイン名などの登録者に関する情報などを検索できる、いわゆる「whois」サービス</td><td></td></tr><tr><td rowspan="2">使用しているWebテクノロジーを把握する</td><td>BuiltWith</td><td><a href="https://builtwith.com/ja/" target="_blank" rel="noreferrer noopener">https://builtwith.com/ja/</a></td><td>Webサイトで使われているWebテクノロジーを確認できるサイト</td><td></td></tr><tr><td>Wappalyzer</td><td><a href="https://www.wappalyzer.com/" target="_blank" rel="noreferrer noopener">https://www.wappalyzer.com/</a></td><td>Webサイトで使われているWebテクノロジーを確認できるサイト</td><td></td></tr><tr><td rowspan="3">IPアドレスやドメイン名の利用履歴を調べる</td><td>SecurityTrails</td><td><a href="https://securitytrails.com/" target="_blank" rel="noreferrer noopener">https://securitytrails.com/</a></td><td>様々なOSINT調査に使える「OSINT便利サイト」</td><td></td></tr><tr><td>AbuseIPDB</td><td><a href="https://www.abuseipdb.com/" target="_blank" rel="noreferrer noopener">https://www.abuseipdb.com/</a></td><td>IPアドレスが過去に悪用されていたか確認できるサイト</td><td></td></tr><tr><td>DNS History</td><td><a href="https://dnshistory.org/" target="_blank" rel="noreferrer noopener">https://dnshistory.org/</a></td><td>IPアドレスの変更を含むDNSレコード変更履歴を確認できるサイト</td><td></td></tr><tr><td rowspan="2">送信ドメイン認証の対応状況をチェックする</td><td>EasyDMARK</td><td><a href="https://easydmarc.com/tools" target="_blank" rel="noreferrer noopener">https://easydmarc.com/tools</a></td><td>SPFやDKIM、DMARCの設定がされているかどうかを確認できるサイト</td><td></td></tr><tr><td>DKIM Record Checker</td><td><a href="https://www.mimecast.com/products/dmarc-analyzer/dkim-check/" target="_blank" rel="noreferrer noopener">https://www.mimecast.com/products/dmarc-analyzer/dkim-check/</a></td><td>主にDKIMの設定がされているかどうかを確認できるサイト</td><td>リンクが変更され、セレクターの入力必須化</td></tr><tr><td rowspan="3">IoC情報を入手してインシデントに備える</td><td>AlienVaultOpenThreatExchange</td><td><a href="https://otx.alienvault.com/" target="_blank" rel="noreferrer noopener">https://otx.alienvault.com/</a></td><td>各種IoC情報を検索できるサービス</td><td></td></tr><tr><td>ThreatMiner</td><td><a href="https://www.threatminer.org/" target="_blank" rel="noreferrer noopener">https://www.threatminer.org/</a></td><td>IPアドレスやドメイン名、ファイルハッシュ値、メールアドレスなどのIoC情報を検索できるサービス</td><td></td></tr><tr><td>ThreatFox IOC Database</td><td><a href="https://threatfox.abuse.ch/browse/" target="_blank" rel="noreferrer noopener">https://threatfox.abuse.ch/browse/</a></td><td>IoCを格納したデータベースサービスを提供するサイト</td><td></td></tr><tr><td rowspan="3">フィッシング関連情報を入手する</td><td>PhishTank</td><td><a href="https://www.phishtank.com/" target="_blank" rel="noreferrer noopener">https://www.phishtank.com/</a></td><td>フィッシング情報を集めたサイト</td><td></td></tr><tr><td>OpenPhish</td><td><a href="https://openphish.com/" target="_blank" rel="noreferrer noopener">https://openphish.com/</a></td><td>更新頻度の高いフィッシング情報が集められているサイト</td><td></td></tr><tr><td>isItPhishing</td><td><a href="https://www.isitphishing.org/" target="_blank" rel="noreferrer noopener">https://www.isitphishing.org/</a></td><td>URLを入力するだけでフィッシングに使われている疑いがあるサイトか判定してくれるサービス</td><td></td></tr></tbody></table></figure>


<ol class="wp-block-footnotes"><li id="9eea3cef-bbda-43a7-aeb5-4772c048d843">一部文面は「OSINT実践ガイド」より引用 <a href="#9eea3cef-bbda-43a7-aeb5-4772c048d843-link" aria-label="脚注参照1にジャンプ">↩︎</a></li></ol>


<h2 class="wp-block-heading">その他</h2>



<h3 class="wp-block-heading">所要時間</h3>



<p class="wp-block-paragraph">1～4章までを23時間48分で読了。<br>各サービスを実際に利用したり、規約の確認をしたり、メモを取ったりしながらだと時間がかかる。</p>



<h3 class="wp-block-heading">著作権について</h3>



<p class="wp-block-paragraph">本記事は「サイバー攻撃から企業システムを守る！ OSINT実践ガイド」を参考に、<br>紹介されているツールを整理したものです。<br><br>表中の「ユースケース」「サービス名」は書籍の目次構成に基づいています。<br>「用途」については書籍の表現を必要最小限の範囲で引用しています。<br>「備考」および「URL」は、2026年2月時点で筆者が確認・検証の上記載しています。<br><br>本記事は書籍の内容を代替するものではありません。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/osint-practical-guide-tools/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>外部結合ってどんな時に使うの？</title>
		<link>https://cybermemo.blog/when-to-use-outer-join</link>
					<comments>https://cybermemo.blog/when-to-use-outer-join#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sun, 14 Dec 2025 08:09:43 +0000</pubDate>
				<category><![CDATA[コマンド]]></category>
		<category><![CDATA[検証]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[データベース]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=584</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>はじめに SQLの勉強をしていて、外部結合をどんな時に使うのかイメージできなかったので調べてみた。 内部結合と外部結合の違い 内部結合（INNER JOIN） 両方のテーブルに 一致するデータがある行だけ 出す。「関係が [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">はじめに</h2>



<p class="wp-block-paragraph">SQLの勉強をしていて、外部結合をどんな時に使うのかイメージできなかったので調べてみた。</p>



<h2 class="wp-block-heading">内部結合と外部結合の違い</h2>



<h3 class="wp-block-heading">内部結合（INNER JOIN）</h3>



<p class="wp-block-paragraph">両方のテーブルに <strong>一致するデータがある行だけ</strong> 出す。<br>「関係が成立しているものだけ見たい」</p>



<h3 class="wp-block-heading">外部結合（OUTER JOIN）</h3>



<p class="wp-block-paragraph">一致しない行も <strong>欠けたまま（NULL）</strong>で出す。<br>「関係が成立していないものも把握したい」</p>



<p class="is-style-icon_pen wp-block-paragraph"><strong>”存在していない事実<strong>”</strong>を確認したいとき</strong>が外部結合の出番。</p>



<h2 class="wp-block-heading">サンプルデータを用意</h2>



<h3 class="wp-block-heading">シナリオ</h3>



<p class="wp-block-paragraph">登録だけして注文をしたことがない人を確認したい。</p>



<h3 class="wp-block-heading">usersテーブル</h3>



<p class="wp-block-paragraph">登録ユーザーが記録されたテーブル。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>user_id</th><th>name</th></tr></thead><tbody><tr><td>1</td><td>Sato</td></tr><tr><td>2</td><td>Suzuki</td></tr><tr><td>3</td><td>Tanaka</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">ordersテーブル</h3>



<p class="wp-block-paragraph">注文履歴が記録されたテーブル。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>order_id</th><th>user_id</th><th>amount</th></tr></thead><tbody><tr><td>101</td><td>1</td><td>3000</td></tr><tr><td>102</td><td>3</td><td>1500</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">外部結合でデータを抽出する</h2>



<h3 class="wp-block-heading">SQLで左外部結合</h3>



<pre class="wp-block-code"><code>SELECT
  u.user_id, u.name,
  o.order_id, o.order_date, o.amount
FROM users u
LEFT OUTER JOIN orders o
  ON u.user_id = o.user_id
ORDER BY u.user_id, o.order_id;</code></pre>



<h3 class="wp-block-heading">結果</h3>



<p class="wp-block-paragraph">Suzukiさんは ordersテーブル に対応するデータがないため、注文していないことが分かる。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>user_id</th><th>name</th><th>order_id</th><th>order_date</th><th>amount</th></tr></thead><tbody><tr><td>1</td><td>Sato</td><td>101</td><td>2025-12-06</td><td>3000</td></tr><tr><td data-has-cell-bg="1" data-text-color="black"><span class="swl-cell-bg has-swl-pale-01-background-color" data-text-color="black" aria-hidden="true"> </span>2</td><td data-has-cell-bg="1" data-text-color="black"><span class="swl-cell-bg has-swl-pale-01-background-color" data-text-color="black" aria-hidden="true"> </span>Suzuki</td><td data-has-cell-bg="1" data-text-color="black"><strong><span class="swl-cell-bg has-swl-pale-01-background-color" data-text-color="black" aria-hidden="true"> </span>NULL</strong></td><td data-has-cell-bg="1" data-text-color="black"><strong><span class="swl-cell-bg has-swl-pale-01-background-color" data-text-color="black" aria-hidden="true"> </span>NULL</strong></td><td data-has-cell-bg="1" data-text-color="black"><strong><span class="swl-cell-bg has-swl-pale-01-background-color" data-text-color="black" aria-hidden="true"> </span>NULL</strong></td></tr><tr><td>3</td><td>Tanaka</td><td>102</td><td>2025-12-07</td><td>1500</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">解説</h3>



<p class="wp-block-paragraph">左外部結合なので usersテーブル に ordersテーブル をくっつけている。<br>そのため、ordersテーブルに値がなくてもNULL表示される。<br>ordersテーブルの値がNULL = 注文をしたことがない人が分かる。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="476" height="309" src="https://cybermemo.blog/wp-content/uploads/2025/12/ベン図_左外部結合-1.jpg" alt="ベン図_左外部結合" class="wp-image-606" srcset="https://cybermemo.blog/wp-content/uploads/2025/12/ベン図_左外部結合-1.jpg 476w, https://cybermemo.blog/wp-content/uploads/2025/12/ベン図_左外部結合-1-300x195.jpg 300w" sizes="(max-width: 476px) 100vw, 476px" /></figure>



<h2 class="wp-block-heading">結論</h2>



<p class="wp-block-paragraph">外部結合は「ある／ない」を確認したいときに使える。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/when-to-use-outer-join/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQL構文メモ</title>
		<link>https://cybermemo.blog/mysql-sql-cheatsheet</link>
					<comments>https://cybermemo.blog/mysql-sql-cheatsheet#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sun, 14 Dec 2025 06:33:52 +0000</pubDate>
				<category><![CDATA[コマンド]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=582</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>はじめに 自分用のSQL構文メモ。MySQL用。 MySQLへのログイン データベース操作 データベース作成 データベース削除 データベース一覧確認 使用するデータベースの切り替え 現在使用中のデータベース確認 テーブル [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">はじめに</h2>



<p class="wp-block-paragraph">自分用のSQL構文メモ。<br>MySQL用。</p>



<h2 class="wp-block-heading">MySQLへのログイン</h2>



<pre class="wp-block-code"><code>mysql -u ユーザー名 -p</code></pre>



<h2 class="wp-block-heading">データベース操作</h2>



<h3 class="wp-block-heading">データベース作成</h3>



<pre class="wp-block-code"><code>CREATE DATABASE データベース名;</code></pre>



<h3 class="wp-block-heading">データベース削除</h3>



<pre class="wp-block-code"><code>DROP DATABASE データベース名;</code></pre>



<h3 class="wp-block-heading">データベース一覧確認</h3>



<pre class="wp-block-code"><code>SHOW DATABASES;</code></pre>



<h3 class="wp-block-heading">使用するデータベースの切り替え</h3>



<pre class="wp-block-code"><code>USE データベース名;</code></pre>



<h3 class="wp-block-heading">現在使用中のデータベース確認</h3>



<pre class="wp-block-code"><code>SELECT DATABASE();</code></pre>



<h2 class="wp-block-heading">テーブル操作</h2>



<h3 class="wp-block-heading">テーブル作成（基本）</h3>



<pre class="wp-block-code"><code>CREATE TABLE テーブル名 (
フィールド名1 データ型,
フィールド名2 データ型
);</code></pre>



<h3 class="wp-block-heading">プライマリーキー・AUTO_INCREMENT付きテーブル作成</h3>



<pre class="wp-block-code"><code>CREATE TABLE テーブル名 (
id INT AUTO_INCREMENT,
フィールド名 データ型,
PRIMARY KEY (id)
);</code></pre>



<h3 class="wp-block-heading">テーブル削除</h3>



<pre class="wp-block-code"><code>DROP TABLE テーブル名;</code></pre>



<h3 class="wp-block-heading">テーブル一覧確認</h3>



<pre class="wp-block-code"><code>SHOW TABLES;</code></pre>



<h3 class="wp-block-heading">テーブル定義確認</h3>



<pre class="wp-block-code"><code>SHOW FIELDS FROM テーブル名;</code></pre>



<h2 class="wp-block-heading">フィールド（カラム）操作</h2>



<h3 class="wp-block-heading">フィールド追加</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名 ADD 追加フィールド データ型 AFTER 既存フィールド;</code></pre>



<h3 class="wp-block-heading">フィールド削除</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名 DROP 削除対象フィールド;</code></pre>



<h3 class="wp-block-heading">フィールド名変更</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名 CHANGE 旧フィールド名 新フィールド名 データ型;</code></pre>



<h3 class="wp-block-heading">フィールドのデータ型変更</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名 MODIFY フィールド名 データ型;</code></pre>



<h3 class="wp-block-heading">NOT NULL 制約の設定</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名
MODIFY フィールド1 データ型 NOT NULL,
MODIFY フィールド2 データ型 NOT NULL;</code></pre>



<h3 class="wp-block-heading">デフォルト値の設定</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名
ALTER フィールド名 SET DEFAULT 'デフォルト値';</code></pre>



<h3 class="wp-block-heading">プライマリーキー設定</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名 ADD PRIMARY KEY (フィールド名);</code></pre>



<h3 class="wp-block-heading">外部キー制約設定</h3>



<pre class="wp-block-code"><code>ALTER TABLE テーブル名
ADD FOREIGN KEY (外部キー列)
REFERENCES 参照先テーブル (主キー列);</code></pre>



<h2 class="wp-block-heading">ユーザー・権限管理</h2>



<h3 class="wp-block-heading">ユーザー作成</h3>



<pre class="wp-block-code"><code>CREATE USER 'ユーザー名'@'localhost';</code></pre>



<h3 class="wp-block-heading">現在のユーザー確認</h3>



<pre class="wp-block-code"><code>SELECT USER();</code></pre>



<h3 class="wp-block-heading">パスワード設定・変更</h3>



<pre class="wp-block-code"><code>ALTER USER 'ユーザー名'@'localhost'
IDENTIFIED BY '新しいパスワード';</code></pre>



<h3 class="wp-block-heading">権限付与</h3>



<pre class="wp-block-code"><code>GRANT 権限 ON データベース名.* TO 'ユーザー名'@'localhost';</code></pre>



<h4 class="wp-block-heading">主要権限一覧</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>権限名</th><th>対象</th><th>できること</th><th>実務での主な用途</th><th>危険度</th></tr></thead><tbody><tr><td>SELECT</td><td>データ</td><td>データ参照のみ</td><td>参照専用、分析、レポート</td><td>低</td></tr><tr><td>INSERT</td><td>データ</td><td>レコード追加</td><td>登録処理、ログ保存</td><td>中</td></tr><tr><td>UPDATE</td><td>データ</td><td>レコード更新</td><td>ステータス・数量更新</td><td>中</td></tr><tr><td>DELETE</td><td>データ</td><td>レコード削除</td><td>物理削除が必要な処理</td><td>高</td></tr><tr><td>CREATE</td><td>構造</td><td>テーブル作成</td><td>開発作業</td><td>高</td></tr><tr><td>DROP</td><td>構造</td><td>テーブル削除</td><td>管理作業</td><td><strong>非常に高</strong></td></tr><tr><td>ALTER</td><td>構造</td><td>テーブル定義変更</td><td>カラム追加・変更</td><td><strong>非常に高</strong></td></tr><tr><td>INDEX</td><td>構造</td><td>インデックス作成・削除</td><td>パフォーマンス調整</td><td>中</td></tr><tr><td>REFERENCES</td><td>構造</td><td>外部キー制約作成</td><td>リレーション設計</td><td>中</td></tr><tr><td>ALL / ALL PRIVILEGES</td><td>全体</td><td>そのスコープ内の全権限</td><td>管理者・開発環境</td><td><strong>非常に高</strong></td></tr><tr><td>GRANT OPTION</td><td>権限</td><td>権限を他人に付与</td><td>DBA</td><td><strong>非常に高</strong></td></tr></tbody></table></figure>



<h2 class="wp-block-heading">データ操作</h2>



<h3 class="wp-block-heading">レコード追加</h3>



<pre class="wp-block-code"><code>INSERT INTO テーブル名 (フィールド1, フィールド2)
VALUES ('データ1', 'データ2');</code></pre>



<h3 class="wp-block-heading">レコード追加（全カラム指定）</h3>



<pre class="wp-block-code"><code>INSERT INTO テーブル名 VALUES ('データ1', 'データ2');</code></pre>



<h3 class="wp-block-heading">レコード更新</h3>



<pre class="wp-block-code"><code>UPDATE テーブル名
SET 更新方法<sup data-fn="8c6ba620-248a-45ad-b9b6-1dabe17cf914" class="fn"><a href="#8c6ba620-248a-45ad-b9b6-1dabe17cf914" id="8c6ba620-248a-45ad-b9b6-1dabe17cf914-link">1</a></sup>
WHERE 条件;</code></pre>



<h3 class="wp-block-heading">レコード削除</h3>



<pre class="wp-block-code"><code>DELETE FROM テーブル名 WHERE 条件;</code></pre>



<h2 class="wp-block-heading">SELECT文（検索）</h2>



<h3 class="wp-block-heading">全件取得</h3>



<pre class="wp-block-code"><code>SELECT * FROM テーブル名;</code></pre>



<h3 class="wp-block-heading">重複除外</h3>



<pre class="wp-block-code"><code>SELECT DISTINCT フィールド名 FROM テーブル名;</code></pre>



<h3 class="wp-block-heading">条件付き検索</h3>



<pre class="wp-block-code"><code>SELECT フィールド名
FROM テーブル名
WHERE フィールド名 比較演算子 '条件'
AND / OR / NOT フィールド名 比較演算子 '条件';</code></pre>



<h4 class="wp-block-heading">主要な比較演算子一覧</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>演算子</th><th>意味</th><th>使用例</th><th>実務での主な用途</th></tr></thead><tbody><tr><td><code>=</code></td><td>等しい</td><td><code>age = 30</code></td><td>完全一致検索（ID、コードなど）</td></tr><tr><td><code>!=</code><code>&lt;&gt;</code></td><td>等しくない</td><td><code>status != '削除'</code></td><td>特定値を除外</td></tr><tr><td><code>&gt;</code></td><td>より大きい</td><td><code>score &gt; 80</code></td><td>閾値超過の判定</td></tr><tr><td><code>&lt;</code></td><td>より小さい</td><td><code>price &lt; 1000</code></td><td>上限チェック</td></tr><tr><td><code>&gt;=</code></td><td>以上</td><td><code>created_at &gt;= '2025-01-01'</code></td><td>開始日以降</td></tr><tr><td><code>&lt;=</code></td><td>以下</td><td><code>pdate &lt;= CURDATE()</code></td><td>今日以前など</td></tr><tr><td><code>BETWEEN</code></td><td>範囲指定（含む）</td><td><code>age BETWEEN 20 AND 29</code></td><td>年齢・期間指定</td></tr><tr><td><code>IN</code></td><td>いずれかに一致</td><td><code>status IN ('未処理','保留')</code></td><td>OR条件の簡略化</td></tr><tr><td><code>NOT IN</code></td><td>いずれにも一致しない</td><td><code>id NOT IN (1,2,3)</code></td><td>除外リスト</td></tr><tr><td><code>LIKE</code></td><td>部分一致</td><td><code>name LIKE '%山田%'</code></td><td>あいまい検索</td></tr><tr><td><code>NOT LIKE</code></td><td>部分一致しない</td><td><code>name NOT LIKE '%テスト%'</code></td><td>不要データ除外</td></tr><tr><td><code>IS NULL</code></td><td>NULL判定</td><td><code>deleted_at IS NULL</code></td><td>未設定データ抽出</td></tr><tr><td><code>IS NOT NULL</code></td><td>NULLでない</td><td><code>memo IS NOT NULL</code></td><td>入力済み判定</td></tr><tr><td><code>EXISTS</code></td><td>存在確認</td><td><code>EXISTS (SELECT 1 …)</code></td><td>サブクエリ存在チェック</td></tr><tr><td><code>NOT EXISTS</code></td><td>存在しない</td><td><code>NOT EXISTS (SELECT 1 …)</code></td><td>未対応データ抽出</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">よく一緒に使う論理演算子</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>演算子</th><th>意味</th><th>使用例</th></tr></thead><tbody><tr><td><code>AND</code></td><td>両方満たす</td><td><code>age &gt;= 20 AND age &lt; 30</code></td></tr><tr><td><code>OR</code></td><td>どちらか満たす</td><td><code>role = 'admin' OR role = 'user'</code></td></tr><tr><td><code>NOT</code></td><td>否定</td><td><code>NOT status = '削除'</code></td></tr></tbody></table></figure>



<h3 class="wp-block-heading">並び替え</h3>



<pre class="wp-block-code"><code>SELECT フィールド名
FROM テーブル名
ORDER BY フィールド名 ASC / DESC;</code></pre>



<h3 class="wp-block-heading">件数制限</h3>



<pre class="wp-block-code"><code>SELECT フィールド名
FROM テーブル名
ORDER BY フィールド名
LIMIT 件数;</code></pre>



<h2 class="wp-block-heading">集計・グループ化</h2>



<h3 class="wp-block-heading">GROUP BY + 集計関数</h3>



<pre class="wp-block-code"><code>SELECT フィールド名, 集計関数
FROM テーブル名
GROUP BY フィールド名;</code></pre>



<h4 class="wp-block-heading">主要な集計関数一覧</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>集計関数</th><th>意味</th><th>使用例</th><th>実務での主な用途</th></tr></thead><tbody><tr><td><code>COUNT(*)</code></td><td>行数を数える（NULL含む）</td><td><code>COUNT(*)</code></td><td>件数集計、レコード数確認</td></tr><tr><td><code>COUNT(フィールド)</code></td><td>NULLを除いた件数</td><td><code>COUNT(score)</code></td><td>入力済み件数の把握</td></tr><tr><td><code>SUM(フィールド)</code></td><td>合計値</td><td><code>SUM(amount)</code></td><td>売上合計、数量合計</td></tr><tr><td><code>AVG(フィールド)</code></td><td>平均値</td><td><code>AVG(score)</code></td><td>平均点、平均金額</td></tr><tr><td><code>MIN(フィールド)</code></td><td>最小値</td><td><code>MIN(price)</code></td><td>最安値、最古日付</td></tr><tr><td><code>MAX(フィールド)</code></td><td>最大値</td><td><code>MAX(price)</code></td><td>最高値、最新日付</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">別名（エイリアス）</h3>



<pre class="wp-block-code"><code>SELECT フィールド名 AS 別名
FROM テーブル名;</code></pre>



<h2 class="wp-block-heading">JOIN（結合）</h2>



<h3 class="wp-block-heading">内部結合（INNER JOIN）</h3>



<pre class="wp-block-code"><code>SELECT t1.フィールド, t2.フィールド
FROM テーブル1 AS t1
INNER JOIN テーブル2 AS t2
ON 条件<sup data-fn="d14036d2-dfad-4ab0-afb3-e980869f2a60" class="fn"><a href="#d14036d2-dfad-4ab0-afb3-e980869f2a60" id="d14036d2-dfad-4ab0-afb3-e980869f2a60-link">2</a></sup></code></pre>



<h3 class="wp-block-heading">外部結合（LEFT / RIGHT JOIN）</h3>



<pre class="wp-block-code"><code>SELECT t1.フィールド, t2.フィールド
FROM テーブル1 AS t1
LEFT / RIGHT OUTER JOIN テーブル2 AS t2
ON 条件;</code></pre>



<h3 class="wp-block-heading">完全外部結合（FULL OUTER JOIN）</h3>



<p class="wp-block-paragraph">MySQLでは FULL OUTER JOIN は未対応</p>



<pre class="wp-block-code"><code>SELECT t1.フィールド, t2.フィールド
FROM テーブル1 AS t1
FULL OUTER JOIN テーブル2 AS t2
ON 条件;</code></pre>



<p class="wp-block-paragraph">MySQLでの代替方法（UNION）</p>



<pre class="wp-block-code"><code>SELECT t1.フィールド, t2.フィールド
FROM テーブル1 AS t1
LEFT JOIN テーブル2 AS t2
ON 条件
UNION
SELECT t1.フィールド, t2.フィールド
FROM テーブル1 AS t1
RIGHT JOIN テーブル2 AS t2
ON 条件;</code></pre>



<p class="wp-block-paragraph">※ UNION は重複行を除外する。重複を許可したい場合は UNION ALL を使用する。<br>※ WHERE 句で結合先テーブルの条件を指定すると、外部結合の意味が失われることがあるため注意。</p>



<h2 class="wp-block-heading">インデックス</h2>



<h3 class="wp-block-heading">インデックス作成</h3>



<pre class="wp-block-code"><code>CREATE INDEX インデックス名 ON テーブル名 (フィールド名);</code></pre>



<h3 class="wp-block-heading">インデックス削除</h3>



<pre class="wp-block-code"><code>DROP INDEX インデックス名 ON テーブル名;</code></pre>



<h3 class="wp-block-heading">インデックスの利用状況確認</h3>



<pre class="wp-block-code"><code>EXPLAIN SELECT 文;</code></pre>



<h2 class="wp-block-heading">トランザクション</h2>



<h3 class="wp-block-heading">トランザクション開始</h3>



<pre class="wp-block-code"><code>BEGIN;</code></pre>



<h3 class="wp-block-heading">確定</h3>



<pre class="wp-block-code"><code>COMMIT;</code></pre>



<h3 class="wp-block-heading">取り消し</h3>



<pre class="wp-block-code"><code>ROLLBACK;</code></pre>



<h2 class="wp-block-heading">SQLファイルの実行（データ展開）</h2>



<pre class="wp-block-code"><code>SOURCE ファイルパス;</code></pre>


<ol class="wp-block-footnotes"><li id="8c6ba620-248a-45ad-b9b6-1dabe17cf914">フィールド名 = フィールド名 + 1 など <a href="#8c6ba620-248a-45ad-b9b6-1dabe17cf914-link" aria-label="脚注参照1にジャンプ">↩︎</a></li><li id="d14036d2-dfad-4ab0-afb3-e980869f2a60">t1.フィールド = t2.フィールド など <a href="#d14036d2-dfad-4ab0-afb3-e980869f2a60-link" aria-label="脚注参照2にジャンプ">↩︎</a></li></ol>]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/mysql-sql-cheatsheet/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nmapでポートスキャンをしてみる</title>
		<link>https://cybermemo.blog/nmap-port-scan</link>
					<comments>https://cybermemo.blog/nmap-port-scan#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sun, 26 Oct 2025 07:50:12 +0000</pubDate>
				<category><![CDATA[TryHackMe]]></category>
		<category><![CDATA[コマンド]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[検証]]></category>
		<category><![CDATA[Nmap]]></category>
		<category><![CDATA[tshark]]></category>
		<category><![CDATA[Wireshark]]></category>
		<category><![CDATA[ポートスキャン]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=540</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>はじめに Nmapで実際にポートスキャンをしてみた。検証環境は TryHackMe の Nmap ルーム。 本記事の内容は教育目的のみに記載しています。実環境での悪用は犯罪行為です。必ず許可された演習環境でのみ実践してく [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">はじめに</h2>



<p class="wp-block-paragraph">Nmapで実際にポートスキャンをしてみた。<br>検証環境は TryHackMe の Nmap ルーム。</p>


<div class="swell-block-postLink">			<div class="p-blogCard -external -noimg" data-type="type3" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
										<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://tryhackme.com/room/furthernmap" target="_blank" rel="noopener noreferrer">Vercel Security Checkpoint</a>
						<span class="p-blogCard__excerpt"></span>					</div>
				</div>
			</div>
		</div>


<p class="is-style-icon_info wp-block-paragraph"><strong>本記事の内容は教育目的のみに記載しています。実環境での悪用は犯罪行為です。必ず許可された演習環境でのみ実践してください。</strong></p>



<h2 class="wp-block-heading">TCPスキャン</h2>



<p class="wp-block-paragraph">使用頻度上位 100 ポートのみ（&#8211;top-ports 100）、スキャン中の詳細を表示（-vv）、pingをスキップ（-Pn）して<br>TCPスキャン（-sT）。</p>



<pre class="wp-block-code"><code>$ sudo nmap -sT --top-ports 100 -vv -Pn target ip</code></pre>



<p class="wp-block-paragraph">openポートを発見。</p>



<pre class="wp-block-code"><code>Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-23 23:57 JST
Initiating Parallel DNS resolution of 1 host. at 23:57
Completed Parallel DNS resolution of 1 host. at 23:57, 0.00s elapsed
Initiating Connect Scan at 23:57
Scanning target ip &#91;100 ports]
Discovered open port 3389/tcp on target ip
Discovered open port 135/tcp on target ip
Discovered open port 80/tcp on target ip
Discovered open port 21/tcp on target ip
Discovered open port 53/tcp on target ip
Completed Connect Scan at 23:57, 7.02s elapsed (100 total ports)
Nmap scan report for target ip
Host is up, received user-set (0.37s latency).
Scanned at 2025-10-23 23:57:10 JST for 7s
Not shown: 95 filtered tcp ports (no-response)
PORT     STATE SERVICE       REASON
<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-swl-deep-01-color">21/tcp   open  ftp           syn-ack
53/tcp   open  domain        syn-ack
80/tcp   open  http          syn-ack
135/tcp  open  msrpc         syn-ack
3389/tcp open  ms-wbt-server syn-ack</mark></strong>

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 7.03 seconds</code></pre>



<p class="wp-block-paragraph">tshark でログを取っていたので確認してみる。</p>



<pre class="wp-block-code"><code># tshark の結果を sT_result.txt へ出力
$ sudo tshark -i tun0 > sT_result.txt 
Running as user "root" and group "root". This could be dangerous.
Capturing on 'tun0'
237 ^C</code></pre>



<pre class="wp-block-code"><code># cat で全体のログを確認
$ cat sT_result.txt             
    1 0.000000000   host ip → target ip TCP 60 34450 → 111 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    2 0.000013296   host ip → target ip TCP 60 47774 → 113 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    3 0.000018708   host ip → target ip TCP 60 38474 → 135 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    4 0.000025294   host ip → target ip TCP 60 55670 → 5900 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    5 0.000030624   host ip → target ip TCP 60 46124 → 25 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    6 0.000035786   host ip → target ip TCP 60 59490 → 554 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    7 0.000041544   host ip → target ip TCP 60 38960 → 3306 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    8 0.000048233   host ip → target ip TCP 60 57882 → 110 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
    9 0.000052118   host ip → target ip TCP 60 42396 → 3389 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
   10 0.000059820   host ip → target ip TCP 60 37896 → 8888 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245774735 TSecr=0 WS=128
   11 0.377319586 target ip → host ip   TCP 52 135 → 38474 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   12 0.377390839   host ip → target ip TCP 40 38474 → 135 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
   13 0.378715797   host ip → target ip TCP 40 38474 → 135 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0
   14 0.378932212   host ip → target ip TCP 60 47616 → 23 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245775114 TSecr=0 WS=128
   15 0.378957703   host ip → target ip TCP 60 43838 → 995 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245775114 TSecr=0 WS=128
   16 1.027607473   host ip → target ip TCP 60 &#91;TCP Retransmission] 37896 → 8888 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245775763 TSecr=0 WS=128
（省略）</code></pre>



<p class="wp-block-paragraph">ログを絞って確認。</p>



<pre class="wp-block-code"><code># SYN 以外のログで絞ってみる
$ cat sT_result.txt | grep -v -F "&#91;SYN]"
   11 0.377319586 target ip → host ip   TCP 52 135 → 38474 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   12 0.377390839   host ip → target ip TCP 40 38474 → 135 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
   13 0.378715797   host ip → target ip TCP 40 38474 → 135 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0
   28 2.268681269 target ip → host ip   TCP 52 135 → 38490 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   29 2.268724628   host ip → target ip TCP 40 38490 → 135 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
   30 2.268783378   host ip → target ip TCP 40 38490 → 135 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0
   61 3.272603426 target ip → host ip   TCP 52 21 → 43260 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   62 3.272698420   host ip → target ip TCP 40 43260 → 21 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
   63 3.273334678 target ip → host ip   TCP 52 53 → 58022 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   64 3.273357934   host ip → target ip TCP 40 58022 → 53 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
   65 3.273693028   host ip → target ip TCP 40 43260 → 21 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0
   66 3.274013386   host ip → target ip TCP 40 58022 → 53 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0
   77 3.274796974 target ip → host ip   TCP 52 80 → 49068 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   78 3.274865411   host ip → target ip TCP 40 49068 → 80 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
   79 3.274951087   host ip → target ip TCP 40 49068 → 80 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0
   84 3.387604406 target ip → host ip   TCP 52 3389 → 42396 &#91;SYN, ACK] Seq=0 Ack=1 Win=64000 Len=0 MSS=1288 WS=1 SACK_PERM
   85 3.387628199   host ip → target ip TCP 40 42396 → 3389 &#91;RST] Seq=1 Win=0 Len=0
  150 4.998246831 target ip → host ip   TCP 52 135 → 38502 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
  151 4.998329872   host ip → target ip TCP 40 38502 → 135 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
  152 4.998587904   host ip → target ip TCP 40 38502 → 135 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0
  232 6.277318520 target ip → host ip   TCP 52 3389 → 42398 &#91;SYN, ACK] Seq=0 Ack=1 Win=64000 Len=0 MSS=1288 WS=1 SACK_PERM
  233 6.277337412   host ip → target ip TCP 40 42398 → 3389 &#91;RST] Seq=1 Win=0 Len=0
  235 6.857444881 target ip → host ip   TCP 52 135 → 38504 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
  236 6.857524021   host ip → target ip TCP 40 38504 → 135 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
  237 6.858089282   host ip → target ip TCP 40 38504 → 135 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0

# SYN/ACK（open）で絞ってみる
$ cat sT_result.txt | grep -F "&#91;SYN, ACK]"
   11 0.377319586 target ip → host ip   TCP 52 135 → 38474 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   28 2.268681269 target ip → host ip   TCP 52 135 → 38490 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   61 3.272603426 target ip → host ip   TCP 52 21 → 43260 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   63 3.273334678 target ip → host ip   TCP 52 53 → 58022 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   77 3.274796974 target ip → host ip   TCP 52 80 → 49068 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   84 3.387604406 target ip → host ip   TCP 52 3389 → 42396 &#91;SYN, ACK] Seq=0 Ack=1 Win=64000 Len=0 MSS=1288 WS=1 SACK_PERM
  150 4.998246831 target ip → host ip   TCP 52 135 → 38502 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
  232 6.277318520 target ip → host ip   TCP 52 3389 → 42398 &#91;SYN, ACK] Seq=0 Ack=1 Win=64000 Len=0 MSS=1288 WS=1 SACK_PERM
  235 6.857444881 target ip → host ip   TCP 52 135 → 38504 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM

# openポートの確認
$ cat sT_result.txt | grep -F "&#91;SYN, ACK]" | awk '{print $8}' | sort -n -u
21
53
80
135
3389</code></pre>



<p class="wp-block-paragraph">SYN/ACK を返しているポートが open と判定されており、nmap のスキャン結果と tshark のログが一致していることが確認できた。</p>



<p class="wp-block-paragraph">最後に、awk を使って TCP ハンドシェイク（SYN → SYN/ACK → ACK）が実際に成立しているかを確認してみる。</p>



<pre class="wp-block-code"><code>$ awk '    
  # 行中の「&lt;num> → &lt;num>」を1組だけ抜き出す
  match($0, /&#91;&#91;:space:]](&#91;0-9]+)&#91;&#91;:space:]]*→&#91;&#91;:space:]]*(&#91;0-9]+)&#91;&#91;:space:]]/, m) {
    if (m&#91;1]==21 || m&#91;2]==21) print  
  }      
' sT_result.txt
   52 2.896504834   host ip → target ip TCP 60 43260 → 21 &#91;SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM TSval=245777632 TSecr=0 WS=128
   61 3.272603426 target ip → host ip   TCP 52 21 → 43260 &#91;SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1288 WS=256 SACK_PERM
   62 3.272698420   host ip → target ip TCP 40 43260 → 21 &#91;ACK] Seq=1 Ack=1 Win=64256 Len=0
   65 3.273693028   host ip → target ip TCP 40 43260 → 21 &#91;RST, ACK] Seq=1 Ack=1 Win=64256 Len=0</code></pre>



<p class="wp-block-paragraph">TCP ハンドシェイクが成立していることが分かる。</p>



<h2 class="wp-block-heading">SYNスキャン（ハーフオープンスキャン）</h2>



<p class="wp-block-paragraph">使用頻度上位 100 ポートのみ（&#8211;top-ports 100）、スキャン中の詳細を表示（-vv）、pingをスキップ（-Pn）して<br>SYNスキャン（-sS）。</p>



<pre class="wp-block-code"><code>$ sudo nmap -sS --top-ports 100 -vv -Pn target ip</code></pre>



<p class="wp-block-paragraph">openポートを発見。</p>



<pre class="wp-block-code"><code>Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-26 13:06 JST
Initiating Parallel DNS resolution of 1 host. at 13:06
Completed Parallel DNS resolution of 1 host. at 13:06, 0.00s elapsed
Initiating SYN Stealth Scan at 13:06
Scanning target ip &#91;100 ports]
Discovered open port 80/tcp on target ip
Discovered open port 21/tcp on target ip
Discovered open port 3389/tcp on target ip
Discovered open port 135/tcp on target ip
Discovered open port 53/tcp on target ip
Completed SYN Stealth Scan at 13:06, 6.14s elapsed (100 total ports)
Nmap scan report for target ip
Host is up, received user-set (0.34s latency).
Scanned at 2025-10-26 13:06:36 JST for 7s
Not shown: 95 filtered tcp ports (no-response)
PORT     STATE SERVICE       REASON
<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-swl-deep-01-color">21/tcp   open  ftp           syn-ack ttl 124
53/tcp   open  domain        syn-ack ttl 124
80/tcp   open  http          syn-ack ttl 124
135/tcp  open  msrpc         syn-ack ttl 124
3389/tcp open  ms-wbt-server syn-ack ttl 124</mark></strong>

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 6.20 seconds
           Raw packets sent: 197 (8.668KB) | Rcvd: 7 (308B)</code></pre>



<p class="wp-block-paragraph">今度は pcap でログを取ってみる。</p>



<pre class="wp-block-code"><code>$ sudo tshark -i tun0 -w /tmp/Ss_result.pcap                                 
Running as user "root" and group "root". This could be dangerous.
Capturing on 'tun0'
211 ^C</code></pre>



<pre class="wp-block-code"><code># tshark で全体のログを確認
$ sudo tshark -r Ss_result.pcap                     
Running as user "root" and group "root". This could be dangerous.
    1 0.000000000   host ip → target ip TCP 44 63626 → 993 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    2 0.000010601   host ip → target ip TCP 44 63626 → 445 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    3 0.000011875   host ip → target ip TCP 44 63626 → 110 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    4 0.000012902   host ip → target ip TCP 44 63626 → 23 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    5 0.000013856   host ip → target ip TCP 44 63626 → 111 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    6 0.000014615   host ip → target ip TCP 44 63626 → 80 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    7 0.000015329   host ip → target ip TCP 44 63626 → 3389 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    8 0.000016047   host ip → target ip TCP 44 63626 → 113 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
    9 0.000016757   host ip → target ip TCP 44 63626 → 21 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
   10 0.000017461   host ip → target ip TCP 44 63626 → 587 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
   11 0.338039856 target ip → host ip   TCP 44 80 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   12 0.338076236   host ip → target ip TCP 40 63626 → 80 &#91;RST] Seq=1 Win=0 Len=0
   13 0.338747181 target ip → host ip   TCP 44 21 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   14 0.338809373   host ip → target ip TCP 40 63626 → 21 &#91;RST] Seq=1 Win=0 Len=0
   15 0.339557912 target ip → host ip   TCP 44 3389 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64000 Len=0 MSS=1288
   16 0.339571791   host ip → target ip TCP 40 63626 → 3389 &#91;RST] Seq=1 Win=0 Len=0
(省略)</code></pre>



<p class="wp-block-paragraph">ログを絞って確認。</p>



<pre class="wp-block-code"><code># SYN 以外のログで絞ってみる
$ sudo tshark -r sS_result.pcap -Y "not (tcp.flags.syn==1 &amp;&amp; tcp.flags.ack==0)"
Running as user "root" and group "root". This could be dangerous.
   11 0.338039856 target ip8 → host ip   TCP 44 80 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   12 0.338076236   host ip → target ip8 TCP 40 63626 → 80 &#91;RST] Seq=1 Win=0 Len=0
   13 0.338747181 target ip8 → host ip   TCP 44 21 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   14 0.338809373   host ip → target ip8 TCP 40 63626 → 21 &#91;RST] Seq=1 Win=0 Len=0
   15 0.339557912 target ip8 → host ip   TCP 44 3389 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64000 Len=0 MSS=1288
   16 0.339571791   host ip → target ip8 TCP 40 63626 → 3389 &#91;RST] Seq=1 Win=0 Len=0
   23 0.677269837 target ip8 → host ip   TCP 44 135 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   24 0.677332313   host ip → target ip8 TCP 40 63626 → 135 &#91;RST] Seq=1 Win=0 Len=0
   55 3.165016037 target ip8 → host ip   TCP 44 53 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   56 3.165076706   host ip → target ip8 TCP 40 63626 → 53 &#91;RST] Seq=1 Win=0 Len=0
   57 3.165703655 target ip8 → host ip   TCP 44 80 → 63631 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   58 3.165753573   host ip → target ip8 TCP 40 63631 → 80 &#91;RST] Seq=1 Win=0 Len=0
  173 4.863356730 target ip8 → host ip   TCP 44 80 → 63633 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
  174 4.863426175   host ip → target ip8 TCP 40 63633 → 80 &#91;RST] Seq=1 Win=0 Len=0

# SYN/ACK（open）で絞ってみる
$ sudo tshark -r sS_result.pcap -Y "tcp.flags.syn==1 &amp;&amp; tcp.flags.ack==1"
Running as user "root" and group "root". This could be dangerous.
   11 0.338039856 target ip8 → host ip   TCP 44 80 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   13 0.338747181 target ip8 → host ip   TCP 44 21 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   15 0.339557912 target ip8 → host ip   TCP 44 3389 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64000 Len=0 MSS=1288
   23 0.677269837 target ip8 → host ip   TCP 44 135 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   55 3.165016037 target ip8 → host ip   TCP 44 53 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   57 3.165703655 target ip8 → host ip   TCP 44 80 → 63631 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
  173 4.863356730 target ip8 → host ip   TCP 44 80 → 63633 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288

# openポートの確認
$ sudo tshark -r sS_result.pcap -Y "tcp.flags.syn==1 &amp;&amp; tcp.flags.ack==1" -T fields -e tcp.srcport | sort -n -u
Running as user "root" and group "root". This could be dangerous.
21
53
80
135
3389</code></pre>



<p class="wp-block-paragraph">SYN/ACK を返しているポートが open になっているので、nmap の結果と tshark のログは一致している。</p>



<p class="wp-block-paragraph">ハーフオープンスキャン（SYN→SYN/ACK→RST）を本当にしているか確認してみる。</p>



<pre class="wp-block-code"><code>$ sudo tshark -r sS_result.pcap -Y "tcp.port == 21"                            
Running as user "root" and group "root". This could be dangerous.
    9 0.000016757   host ip → target ip TCP 44 63626 → 21 &#91;SYN] Seq=0 Win=1024 Len=0 MSS=1460
   13 0.338747181 target ip → host ip   TCP 44 21 → 63626 &#91;SYN, ACK] Seq=0 Ack=1 Win=64400 Len=0 MSS=1288
   14 0.338809373   host ip → target ip TCP 40 63626 → 21 &#91;RST] Seq=1 Win=0 Len=0</code></pre>



<p class="wp-block-paragraph">SYN/ACK に対して RST で切断しているため、ハーフオープンスキャンの挙動。</p>



<h2 class="wp-block-heading">UDPスキャン</h2>



<p class="wp-block-paragraph">使用頻度上位 100 ポートのみ（&#8211;top-ports 100）、スキャン中の詳細を表示（-vv）、pingをスキップ（-Pn）して<br>UDPスキャン（-sU）。</p>



<pre class="wp-block-code"><code>$ sudo nmap -sU --top-ports 100 -vv -Pn target ip</code></pre>



<p class="wp-block-paragraph">openポートを発見。</p>



<pre class="wp-block-code"><code>Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-26 14:03 JST
Initiating Parallel DNS resolution of 1 host. at 14:03
Completed Parallel DNS resolution of 1 host. at 14:03, 0.00s elapsed
Initiating UDP Scan at 14:03
Scanning target ip &#91;100 ports]
Discovered open port 53/udp on target ip
Completed UDP Scan at 14:03, 12.09s elapsed (100 total ports)
Nmap scan report for target ip
Host is up, received user-set (0.36s latency).
Scanned at 2025-10-26 14:03:17 JST for 11s
Not shown: 99 open|filtered udp ports (no-response)
PORT   STATE SERVICE REASON
<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-swl-deep-01-color">53/udp open  domain  udp-response ttl 124</mark></strong>

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 12.15 seconds
           Raw packets sent: 261 (16.044KB) | Rcvd: 4 (262B)</code></pre>



<p class="wp-block-paragraph">pcap でログを取ってみる。</p>



<pre class="wp-block-code"><code>$ sudo tshark -i tun0 -w /tmp/sU_result.pcap                                            
Running as user "root" and group "root". This could be dangerous.
Capturing on 'tun0'
273 ^C</code></pre>



<p class="wp-block-paragraph">今回は Wireshar でログを確認してみる。</p>



<pre class="wp-block-code"><code>$ sudo wireshark sU_result.pcap  </code></pre>



<p class="wp-block-paragraph">ip.src == target ip で応答のあったものだけ絞る。</p>



<pre class="wp-block-code"><code>ip.src == target ip &amp;&amp; not icmp</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="85" src="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark-1024x85.png" alt="Wireshark UDPスキャンの画像" class="wp-image-548" srcset="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark-1024x85.png 1024w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark-300x25.png 300w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark-768x64.png 768w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark-1536x128.png 1536w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark.png 1564w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">DNS のみ表示されたので、nmap の結果と一致。<br></p>



<h2 class="wp-block-heading">特殊スキャン（NULL／FIN／Xmas）</h2>



<p class="wp-block-paragraph">検証環境でopenポートが見つからなかったので、今回はフラグだけ確認。</p>



<h3 class="wp-block-heading">NULLスキャン</h3>



<pre class="wp-block-code"><code># NULLスキャン
$ sudo nmap -sN --top-ports 100 -vv -Pn target ip

Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-26 14:57 JST
Initiating Parallel DNS resolution of 1 host. at 14:57
Completed Parallel DNS resolution of 1 host. at 14:57, 0.00s elapsed
Initiating NULL Scan at 14:57
Scanning target ip &#91;100 ports]
Completed NULL Scan at 14:57, 21.11s elapsed (100 total ports)
Nmap scan report for target ip
Host is up, received user-set.
Scanned at 2025-10-26 14:57:12 JST for 22s
All 100 scanned ports on target ip are in ignored states.
Not shown: 100 open|filtered tcp ports (no-response)

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 21.15 seconds
           Raw packets sent: 200 (8.000KB) | Rcvd: 0 (0B)</code></pre>



<p class="wp-block-paragraph">フラグはすべて0。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="502" height="204" src="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_NULL.png" alt="Wireshark NULLスキャンのフラグ画像" class="wp-image-550" srcset="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_NULL.png 502w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_NULL-300x122.png 300w" sizes="(max-width: 502px) 100vw, 502px" /></figure>



<h3 class="wp-block-heading">FINスキャン</h3>



<pre class="wp-block-code"><code># FINスキャン
$ sudo nmap -sF --top-ports 100 -vv -Pn target ip

Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-26 14:52 JST
Initiating Parallel DNS resolution of 1 host. at 14:52
Completed Parallel DNS resolution of 1 host. at 14:52, 0.00s elapsed
Initiating FIN Scan at 14:52
Scanning target ip &#91;100 ports]
Completed FIN Scan at 14:52, 21.09s elapsed (100 total ports)
Nmap scan report for target ip
Host is up, received user-set.
Scanned at 2025-10-26 14:52:08 JST for 21s
All 100 scanned ports on target ip are in ignored states.
Not shown: 100 open|filtered tcp ports (no-response)

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 21.18 seconds
           Raw packets sent: 200 (8.000KB) | Rcvd: 0 (0B)</code></pre>



<p class="wp-block-paragraph">FIN = 1。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="510" height="193" src="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_FIN.png" alt="Wireshark FINスキャンのフラグ画像" class="wp-image-551" srcset="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_FIN.png 510w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_FIN-300x114.png 300w" sizes="(max-width: 510px) 100vw, 510px" /></figure>



<h3 class="wp-block-heading">Xmasスキャン</h3>



<pre class="wp-block-code"><code># Xmasスキャン
$ sudo nmap -sX --top-ports 100 -vv -Pn target ip

Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-26 14:52 JST
Initiating Parallel DNS resolution of 1 host. at 14:52
Completed Parallel DNS resolution of 1 host. at 14:52, 0.01s elapsed
Initiating XMAS Scan at 14:52
Scanning target ip &#91;100 ports]
Completed XMAS Scan at 14:53, 21.09s elapsed (100 total ports)
Nmap scan report for target ip
Host is up, received user-set.
Scanned at 2025-10-26 14:52:53 JST for 21s
All 100 scanned ports on target ip are in ignored states.
Not shown: 100 open|filtered tcp ports (no-response)

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 21.16 seconds
           Raw packets sent: 200 (8.000KB) | Rcvd: 0 (0B)</code></pre>



<p class="wp-block-paragraph">FIN = 1、PSH = 1、URG = 1。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="558" height="206" src="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_Xmas.png" alt="Wireshark Xmasスキャンのフラグ画像" class="wp-image-552" srcset="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_Xmas.png 558w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_Xmas-300x111.png 300w" sizes="(max-width: 558px) 100vw, 558px" /></figure>



<h2 class="wp-block-heading">おまけ</h2>



<p class="wp-block-paragraph">UDPスキャンでホストIPとターゲットIP以外に 239.255.255.250（SSDP<sup data-fn="674d942b-b510-49bd-81d1-861c1e2af7cc" class="fn"><a href="#674d942b-b510-49bd-81d1-861c1e2af7cc" id="674d942b-b510-49bd-81d1-861c1e2af7cc-link">1</a></sup>用マルチキャストアドレス）への通信を発見。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="870" height="69" src="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_SSDP.png" alt="Wireshark 239.255.255.250充ての画像" class="wp-image-554" srcset="https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_SSDP.png 870w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_SSDP-300x24.png 300w, https://cybermemo.blog/wp-content/uploads/2025/10/Wireshark_SSDP-768x61.png 768w" sizes="(max-width: 870px) 100vw, 870px" /></figure>



<p class="wp-block-paragraph">nmapはスキャン中に「このネットワーク内にUPnP<sup data-fn="01fd85ef-44fd-43bb-bb2c-5c1cd3b01ee1" class="fn"><a href="#01fd85ef-44fd-43bb-bb2c-5c1cd3b01ee1" id="01fd85ef-44fd-43bb-bb2c-5c1cd3b01ee1-link">2</a></sup>デバイスがいるか？」を自動的にチェックすることがあり、その時にこの宛先へ M-SEARCH * HTTP/1.1 パケットを送信するそう。</p>


<ol class="wp-block-footnotes"><li id="674d942b-b510-49bd-81d1-861c1e2af7cc">家庭内ネットワークなどで機器同士が自動的に見つけ合うための通信プロトコル。UPnPの一部として定義されており、主にUDPの1900番ポートを使う。 <a href="#674d942b-b510-49bd-81d1-861c1e2af7cc-link" aria-label="脚注参照1にジャンプ">↩︎</a></li><li id="01fd85ef-44fd-43bb-bb2c-5c1cd3b01ee1">Universal Plug and Play。家庭やオフィス内のネットワーク機器が自動的に見つけ合い、設定なしで通信できるようにする仕組み。 <a href="#01fd85ef-44fd-43bb-bb2c-5c1cd3b01ee1-link" aria-label="脚注参照2にジャンプ">↩︎</a></li></ol>]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/nmap-port-scan/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nmapの基礎</title>
		<link>https://cybermemo.blog/nmap-basics</link>
					<comments>https://cybermemo.blog/nmap-basics#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sun, 26 Oct 2025 07:05:12 +0000</pubDate>
				<category><![CDATA[コマンド]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[Nmap]]></category>
		<category><![CDATA[ポートスキャン]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=526</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>Nmapとは Nmap（Network Mapper）は、ネットワーク上の機器やサービスを調べるための最もポピュラーなツール。IPアドレスの“生死確認（ホストが生きているか）”から、どのポートでどんなサービスが動いている [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">Nmapとは</h2>



<p class="wp-block-paragraph">Nmap（Network Mapper）は、ネットワーク上の機器やサービスを調べるための最もポピュラーなツール。IPアドレスの“生死確認（ホストが生きているか）”から、どのポートでどんなサービスが動いているか、さらに一部の脆弱性の有無まで発見できる。</p>



<h2 class="wp-block-heading">スキャンの種類</h2>



<p class="wp-block-paragraph">実際にスキャンを実行した記事はこちら。</p>


<div class="swell-block-postLink">			<div class="p-blogCard -external" data-type="type3" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">セキュリティエンジニアの雑多ブロ&#8230;</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://cybermemo.blog/nmap-port-scan" target="_blank" rel="noopener noreferrer">Nmapでポートスキャンをしてみる | セキュリティエンジニアの雑多ブログ</a>
						<span class="p-blogCard__excerpt">はじめに Nmapで実際にポートスキャンをしてみた。検証環境は TryHackMe の Nmap ルーム。 本記事の内容は教育目的のみに記載しています。実環境での悪用は犯罪行為です。&#8230;</span>					</div>
				</div>
			</div>
		</div>


<h3 class="wp-block-heading">TCPスキャン</h3>



<p class="wp-block-paragraph">何をするか：TCP接続（SYN→SYN/ACK→ACK）を完了させる。<br>返ってくるもの：SYN/ACK（open）／RST（closed）／無応答（filtered）。<br>長所：確実で簡単（OS 標準の接続なので結果は信頼できる）。<br>短所：ログに残りやすく検出されやすい。<br>オプション：-sT</p>



<h3 class="wp-block-heading">SYNスキャン</h3>



<p class="wp-block-paragraph">何をするか：SYNを送り、SYN/ACKを受けたら自分はRSTで接続を切る（3ウェイを完了させない）。<br>返ってくるもの：SYN/ACK（open）、RST（closed）、無応答（filtered）。<br>長所：早くてステルス寄り（ログに残りにくい）。多くの場合デフォルトで使われる。<br>短所：root権限が必要。IDSに検出される可能性はある。<br>オプション：-sS</p>



<h3 class="wp-block-heading">UDPスキャン</h3>



<p class="wp-block-paragraph">何をするか：UDPパケットを送って応答（ICMP unreachable や UDP 応答）を待つ。<br>返ってくるもの：UDP応答（open|filtered判定）、ICMP Port Unreachable（closed）、無応答（open|filtered）。<br>長所：TCP以外のサービス（DNS, SNMP 等）を見つけられる。<br>短所：遅い（再送や ICMP 制限のため）、ファイアウォールやICMPレート制限で誤判定しやすい。<br>オプション：-sU</p>



<h3 class="wp-block-heading">NULLスキャン</h3>



<p class="wp-block-paragraph">何をするか：TCPフラグをすべて 0 にしたパケットを送る（SYN/ACK/FIN/… いずれも 0）。<br>返ってくるもの（一般）：<br>Linux/UNIX系：何も返さない（open）かRSTで返す（closed）など実装差がある。<br>Windows系：通常すべてのポートで RST を返す（これだと区別つかない）。<br>長所：一部のOSでステルスに振る舞う。<br>短所：実装依存で結果が解釈しづらい。ファイアウォールで無効化されることが多い。<br>オプション：-sN</p>



<h3 class="wp-block-heading">FINスキャン</h3>



<p class="wp-block-paragraph">何をするか：TCPの FIN フラグのみを立てたパケットを送る。<br>返ってくるもの：TCP 実装により、閉じているポートは RST を返し、開いているポートは無応答（特定OSでは）→ これで判別する。<br>長所：一部の環境で検出されにくい。<br>短所：Windows系は常に RST を返すため無意味。ファイアウォールでドロップされると判別不能。<br>オプション：-sF</p>



<h3 class="wp-block-heading">Xmasスキャン</h3>



<p class="wp-block-paragraph">何をするか：TCPの FIN, PSH, URG フラグを同時に立てた「派手な」パケットを送る（ツリーが光るから Xmas）。<br>返ってくるもの：FIN と同様、ある実装では無応答＝open、RST＝closed。<br>長所：NULL/FIN と同じく、一部OSでステルスに有効。<br>短所：同じく実装依存で不確実。Windowsでは通用しないことが多い。<br>オプション：-sX</p>



<h3 class="wp-block-heading">ICMPスキャン</h3>



<p class="wp-block-paragraph">何をするか：ICMP Echo Request（ping）や他のICMP型を使ってホストがオンラインかを調べる。<br>返ってくるもの：Echo Reply（Up）／無応答（Down or filtered）／ICMP unreachable（到達不可）など。<br>長所：ホストの存在確認が速く簡単。<br>短所：多くのホストやファイアウォールがICMPをブロックするため誤判定が起きやすい。ARP ping はローカルで有効。<br>オプション：-sn -PE（ICMP echo）、&#8211;disable-arp-ping 等で挙動調整</p>



<h2 class="wp-block-heading">TCPフラグ</h2>



<p class="wp-block-paragraph">フラグ、ビット、フラグの意味を記載。<br>ビット(値)は tshark のフィルターとかで結構使う。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>ビット(値)</th><th>フラグ</th><th>意味</th></tr></thead><tbody><tr><td>0 (0x01)</td><td>FIN</td><td>コネクション終了</td></tr><tr><td>1 (0x02)</td><td>SYN</td><td>コネクション開始要求</td></tr><tr><td>2 (0x04)</td><td>RST</td><td>リセット（接続拒否/異常終了）</td></tr><tr><td>3 (0x08)</td><td>PSH</td><td>受信側にデータを即座に渡す（push）</td></tr><tr><td>4 (0x10)</td><td>ACK</td><td>応答番号を有効にする（確認応答）</td></tr><tr><td>5 (0x20)</td><td>URG</td><td>緊急ポインタ有効（ほぼ使われない）</td></tr><tr><td>6 (0x40)</td><td>ECE</td><td>ECN related（輻輳制御）</td></tr><tr><td>7 (0x80)</td><td>CWR</td><td>ECN related（輻輳制御）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">視覚的ビット列図（よく見る組み合わせ）</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>フラグ</th><th>ビット</th><th class="has-text-align-left" data-align="left">値</th></tr></thead><tbody><tr><td>FIN</td><td>0000 0001</td><td class="has-text-align-left" data-align="left">0x01</td></tr><tr><td>SYN</td><td>0000 0010</td><td class="has-text-align-left" data-align="left">0x02</td></tr><tr><td>RST</td><td>0000 0100</td><td class="has-text-align-left" data-align="left">0x04</td></tr><tr><td>PSH</td><td>0000 1000</td><td class="has-text-align-left" data-align="left">0x08</td></tr><tr><td>ACK</td><td>0001 0000</td><td class="has-text-align-left" data-align="left">0x10</td></tr><tr><td>URG</td><td>0010 0000</td><td class="has-text-align-left" data-align="left">0x20</td></tr><tr><td>ECE</td><td>0100 0000</td><td class="has-text-align-left" data-align="left">0x40</td></tr><tr><td>CWR</td><td>1000 0000</td><td class="has-text-align-left" data-align="left">0x80</td></tr><tr><td>SYN+ACK</td><td>0001 0010</td><td class="has-text-align-left" data-align="left">0x12</td></tr><tr><td>FIN+ACK</td><td>0001 0001</td><td class="has-text-align-left" data-align="left">0x11</td></tr><tr><td>SYN only</td><td>0000 0010</td><td class="has-text-align-left" data-align="left">0x02</td></tr><tr><td>RST only </td><td>0000 0100</td><td class="has-text-align-left" data-align="left">0x04</td></tr><tr><td>Xmas scan (FIN+PSH+URG)</td><td>0000 1001 + 0000 0001 <br>+ 0010 0000 = 0010 1001</td><td class="has-text-align-left" data-align="left">0x29</td></tr><tr><td>NULL scan</td><td>0000 0000</td><td class="has-text-align-left" data-align="left">0x00</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">代表的なオプション</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>オプション</th><th>何をするか（短く）</th><th>使い方の例</th><th>備考</th></tr></thead><tbody><tr><td><code>-sS</code></td><td>SYNスキャン</td><td><code>sudo nmap -sS -p1-1000 10.0.0.5</code></td><td>速くて一般的。root権限推奨。</td></tr><tr><td><code>-sT</code></td><td>TCPスキャン</td><td><code>nmap -sT -p22,80 10.0.0.5</code></td><td>root不要だがログに残りやすい。</td></tr><tr><td><code>-sU</code></td><td>UDPスキャン</td><td><code>sudo nmap -sU --top-ports 20 10.0.0.5</code></td><td>非常に遅い。<code>--top-ports</code> 推奨。</td></tr><tr><td><code>-p</code></td><td>ポート指定（単一／範囲／複数）</td><td><code>-p80,443</code> <code>-p1-65535</code></td><td>明示的にポートを限定。</td></tr><tr><td><code>-Pn</code></td><td>ホスト発見をスキップ（ping無視）</td><td><code>sudo nmap -sS -p1-1000 -Pn 10.0.0.5</code></td><td>Pingがブロックされた環境で必須。</td></tr><tr><td><code>-sn</code></td><td>ホスト発見のみ（ポートスキャンしない）</td><td><code>sudo nmap -sn 10.0.0.0/24</code></td><td>ping sweep 用。</td></tr><tr><td><code>-sV</code></td><td>サービス／バージョン検出</td><td><code>sudo nmap -sS -sV -p80,22 10.0.0.5</code></td><td>サービス名・バージョン推定。</td></tr><tr><td><code>-O</code></td><td>OS 推定</td><td><code>sudo nmap -O 10.0.0.5</code></td><td>root権限が必要な場合あり。誤判定もある。</td></tr><tr><td><code>-A</code></td><td>総合検出（sV + O + script 等）</td><td><code>sudo nmap -A 10.0.0.5</code></td><td>強力だが騒がしい（検出されやすい）。</td></tr><tr><td><code>--script</code></td><td>NSE スクリプト実行</td><td><code>sudo nmap --script=vuln -p445 10.0.0.5</code></td><td>カテゴリ指定や複数指定が可能。</td></tr><tr><td><code>--script-args</code></td><td>スクリプトへ引数を渡す</td><td><code>--script http-put --script-args http-put.url='/dav',http-put.file=./f</code></td><td>スクリプト固有の引数。</td></tr><tr><td><code>-oN</code> / <code>-oG</code> / <code>-oX</code> / <code>-oA</code></td><td>出力保存（通常/Grep/XML/全形式）</td><td><code>-oA scan1</code></td><td><code>-oA</code> で N,G,X を一括出力。</td></tr><tr><td><code>-v</code> / <code>-vv</code></td><td>冗長（詳細）出力</td><td><code>sudo nmap -sS -p1-1000 -Pn -vv 10.0.0.5</code></td><td>進捗や reason が見やすくなる。</td></tr><tr><td><code>--reason</code></td><td>各判定の理由を表示</td><td><code>sudo nmap --reason -p80 10.0.0.5</code></td><td><code>no-response</code> / <code>syn-ack</code> 等を表示。</td></tr><tr><td><code>-T0</code> &#8230; <code>-T5</code></td><td>タイミングテンプレート（速度）</td><td><code>-T4</code>（速め）</td><td>高速ほどノイズ大・検出されやすい。</td></tr><tr><td><code>--stats-every</code></td><td>定期的な進捗表示</td><td><code>--stats-every 10s</code></td><td>長時間スキャン時に便利。</td></tr><tr><td><code>-F</code></td><td>fast（/etc/services に基づく上位ポート）</td><td><code>sudo nmap -F 10.0.0.5</code></td><td>手早くスキャンしたいとき。</td></tr><tr><td><code>--top-ports</code></td><td>使用頻度上位 N ポートのみ</td><td><code>sudo nmap --top-ports 100 10.0.0.5</code></td><td>UDPスキャン時に特に有用。</td></tr><tr><td><code>--open</code></td><td>open のポートだけ表示</td><td><code>sudo nmap -sS -p1-1000 --open 10.0.0.5</code></td><td>出力ノイズを減らす。</td></tr><tr><td><code>-sN</code> / <code>-sF</code> / <code>-sX</code></td><td>NULL / FIN / Xmas スキャン</td><td><code>sudo nmap -sN -p1-1000 10.0.0.5</code></td><td>OS依存（Windowsでは効果薄）。</td></tr><tr><td><code>-6</code></td><td>IPv6 スキャン</td><td><code>sudo nmap -6 -sS -p80 fd00::1</code></td><td>IPv6 ネットワーク用。</td></tr><tr><td><code>-oG -</code></td><td>grep しやすい stdout 出力</td><td><code>sudo nmap -oG - -p1-1000 10.0.0.5</code></td><td>パイプで <code>grep</code> に加工しやすい。</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">最後に</h2>



<p class="wp-block-paragraph">色々まとめたけど <a href="https://nmap.org/man/ja/index.html" data-type="link" data-id="https://nmap.org/man/ja/index.html">リファレンスガイド</a> を見るのが正確で早い。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/nmap-basics/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Chrome DevTools による簡易調査メモ</title>
		<link>https://cybermemo.blog/chrome-devtools-overview</link>
					<comments>https://cybermemo.blog/chrome-devtools-overview#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sat, 18 Oct 2025 09:51:47 +0000</pubDate>
				<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[web-security]]></category>
		<category><![CDATA[ログ分析]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=497</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/Chrome-DevTools-簡易調査_アイキャッチ-1-1024x683.jpg" class="webfeedsFeaturedVisual" /></p>はじめに 不審サイトの調査などで Chrome DevTools をよく使うので自分用メモ。ここでは概要をつかむための簡単な解説だけ。詳細はいずれ別記事で書けたら書く。 DevTools とは DevTools（デブツー [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/Chrome-DevTools-簡易調査_アイキャッチ-1-1024x683.jpg" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">はじめに</h2>



<p class="wp-block-paragraph">不審サイトの調査などで Chrome DevTools をよく使うので自分用メモ。<br>ここでは概要をつかむための簡単な解説だけ。詳細はいずれ別記事で書けたら書く。</p>



<h2 class="wp-block-heading">DevTools とは</h2>



<p class="wp-block-paragraph">DevTools（デブツールズ）は、Webブラウザに標準搭載されている「開発者向けツール」。<br>画面上の要素を調べてデザイン崩れを修正したり、ネットワーク通信を確認して読み込みエラーを特定したり、<br>コンソールでエラーメッセージやログを確認したりできる。<br>名前の通り、本来は開発者向けツールだがセキュリティ調査でも補助ツールとして使われる。<br><br>今回は Chrome に搭載されている DevTools の機能を解説。</p>



<h2 class="wp-block-heading">DevTools の概要</h2>



<h3 class="wp-block-heading">DevTools の開き方</h3>



<p class="wp-block-paragraph">Macの場合<br>Cmd + option + I<br><br>Windowsの場合<br>Ctrl + Shift + C もしくは F12</p>



<p class="wp-block-paragraph">DevTools 画面例</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="544" height="663" src="https://cybermemo.blog/wp-content/uploads/2025/10/DevTools-の開き方-1.png" alt="DevTools" class="wp-image-502" style="width:347px;height:auto" srcset="https://cybermemo.blog/wp-content/uploads/2025/10/DevTools-の開き方-1.png 544w, https://cybermemo.blog/wp-content/uploads/2025/10/DevTools-の開き方-1-246x300.png 246w" sizes="(max-width: 544px) 100vw, 544px" /></figure>



<h3 class="wp-block-heading">DevTools のパネルメニュー</h3>



<p class="wp-block-paragraph">セキュリティの観点で各パネルをどのように利用するか記載。</p>



<h4 class="wp-block-heading">Elements（エレメンツ）</h4>



<p class="wp-block-paragraph">用途：Webページの構造（HTML）やクライアント側のDOM要素<sup data-fn="0d177dac-0798-40bc-91b9-fd7f9c962937" class="fn"><a href="#0d177dac-0798-40bc-91b9-fd7f9c962937" id="0d177dac-0798-40bc-91b9-fd7f9c962937-link">1</a></sup>を確認。<br><br>使用例：<br>悪意あるスクリプト（例：&lt;script&gt;タグ内のXSSペイロード）をページ内で検出できる。<br>inputフォームの属性（maxlengthやrequiredなど）を確認してクライアントサイド検証の甘さを見抜く。<br>非表示（display:none）の要素や、意図的に隠されたトークン値などもDOM上で確認可能。</p>



<h4 class="wp-block-heading">Console（コンソール）</h4>



<p class="wp-block-paragraph">用途：ブラウザで発生しているJavaScriptエラー・警告の確認。<br><br>使用例：<br>脆弱なスクリプト読み込み（HTTP通信など）が警告として出る。<br>エラー文から内部APIのエンドポイントや認証処理の構造が推測できる場合もある。<br>XSSテスト時にペイロードが実行されているか確認するのにも使える。</p>



<h4 class="wp-block-heading">Sources（ソース）</h4>



<p class="wp-block-paragraph">用途：JavaScriptやCSS、画像ファイルの確認。<br><br>使用例：<br>公開されている .js ファイルから機密ロジックやAPIキーのハードコーディング<sup data-fn="6fd2bd1f-44cc-4125-8fc1-faa433a28694" class="fn"><a href="#6fd2bd1f-44cc-4125-8fc1-faa433a28694" id="6fd2bd1f-44cc-4125-8fc1-faa433a28694-link">2</a></sup>を発見できる。<br>JSのマップファイル（.map）が残っていると難読化されたコードを簡単に復元できる。<br>コメント内に内部仕様やURLが書かれていないか確認できる。</p>



<h4 class="wp-block-heading">Network（ネットワーク）</h4>



<p class="wp-block-paragraph">用途：Webページがやり取りしている通信（HTTPリクエスト・レスポンス）を確認。<br><br>使用例：<br>HTTPヘッダー（Cookie, Authorization, CSP, CORSなど）を確認できる。<br>CookieのSecure / HttpOnly / SameSite 属性の設定をチェック。<br>API通信のレスポンスを観察して、過剰情報漏えい（PII<sup data-fn="1b11e591-98e9-4503-88cf-994c32c45d48" class="fn"><a href="#1b11e591-98e9-4503-88cf-994c32c45d48" id="1b11e591-98e9-4503-88cf-994c32c45d48-link">3</a></sup>や内部ID）がないか確認できる。</p>



<h4 class="wp-block-heading">Performance（パフォーマンス）</h4>



<p class="wp-block-paragraph">用途：処理や描画のタイミングを計測し、スクリプト挙動を把握。（Webページが“どんなタイミング”で“何をしているか”を記録して、時間軸で見える化するツール）<br><br>使用例：<br>攻撃者が仕込んだマルウェアスクリプトや追跡コードが異常にCPUを消費していないかを確認できる。<br>通常とは異なるタイミングで外部通信が発生していないかを監視可能。</p>



<h4 class="wp-block-heading">Memory（メモリ）</h4>



<p class="wp-block-paragraph">用途：Webアプリの動作中に使われるメモリの状態を分析。<br><br>使用例：<br>クライアント側で扱っているデータが、不要に保持・漏洩していないか確認できる。<br>セッション情報やトークンがメモリ上に残り続けていないかを調査。</p>



<h4 class="wp-block-heading">Application（アプリケーション）</h4>



<p class="wp-block-paragraph">用途：ブラウザに保存されたデータ（Cookie、LocalStorageなど）を確認。<br><br>使用例：<br>LocalStorageやSessionStorageにアクセストークンや個人情報が保存されていないか確認。<br>Cookie設定（Secure / HttpOnly / SameSite）を確認して脆弱な設定を検出。<br>キャッシュデータやService Workerの構成から、古いリソースが残っていないか確認。</p>



<h4 class="wp-block-heading">Privacy and Security（プライバシーとセキュリティ）</h4>



<p class="wp-block-paragraph">用途：通信の安全性と証明書状態を確認。<br><br>使用例：<br>SSL/TLS証明書の有効期限・暗号スイートを確認。<br>Mixed Content（HTTPSページ内でHTTPリソースを読み込む危険な構成）があるか検出。<br>Cookieの追跡情報やセキュリティポリシーの確認にも使える。</p>



<h4 class="wp-block-heading">Lighthouse（ライトハウス）</h4>



<p class="wp-block-paragraph">用途：Webサイト全体を自動診断（パフォーマンス・セキュリティ・アクセシビリティなど）。<br><br>使用例：<br>HTTPSが有効か、セキュリティヘッダー（CSP、X-Frame-Optionsなど）が設定されているか自動チェック。<br>セキュリティ的な改善ポイントをレポート形式で提示してくれる。</p>



<h4 class="wp-block-heading">Recorder（レコーダー）</h4>



<p class="wp-block-paragraph">用途：操作の記録・再生（Webアプリの自動テスト）。<br><br>使用例：<br>CSRFテストなどで再現性を保つための操作手順を自動記録できる。<br>ペネトレーションテスト時に攻撃パターンを再生・再現する用途でも使われる。　&#8230;かも。（ChatGPTに聞いたけど、本当にそのような使い方がされているのか調べきれなかった。）</p>


<ol class="wp-block-footnotes"><li id="0d177dac-0798-40bc-91b9-fd7f9c962937">DOM（ブラウザがHTMLを解析して作るページの構造モデル）内の1つ1つの部品（例：div, p, inputなど）。 <a href="#0d177dac-0798-40bc-91b9-fd7f9c962937-link" aria-label="脚注参照1にジャンプ">↩︎</a></li><li id="6fd2bd1f-44cc-4125-8fc1-faa433a28694">設定や機密情報をプログラムの中に直接書いてしまうこと。 <a href="#6fd2bd1f-44cc-4125-8fc1-faa433a28694-link" aria-label="脚注参照2にジャンプ">↩︎</a></li><li id="1b11e591-98e9-4503-88cf-994c32c45d48">個人情報。 <a href="#1b11e591-98e9-4503-88cf-994c32c45d48-link" aria-label="脚注参照3にジャンプ">↩︎</a></li></ol>


<h2 class="wp-block-heading">最後に</h2>



<p class="wp-block-paragraph">簡易調査で限られた機能しか使っていなかったので、まとめ用に調べてみると思っていたよりもできることが多そう。もう少し使いこなせるようになりたい。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/chrome-devtools-overview/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
