自宅にDeep Securityの検証環境を作ってみた

はじめに

Trend Micro Deep Securityについて学習するため,自宅の仮想環境にDeep Securityの検証環境を構築しました.

Deep Securityには,管理サーバとなるDeep Security Manager(以下,DSM)と,保護対象のサーバ上で動作するDeep Security Agent(以下,DSA)があります.

製品の概要を読むだけでも,

  • DSMからAgentを管理する
  • Agentをサーバへインストールする
  • FirewallやIntrusion Preventionなどの機能を利用する

といった大まかな構成は理解できます.

しかし,

「Agentをインストールしたあと,どのようにDSMへ登録されるのか」

「DSMとDSAは実際にどの経路で通信しているのか」

「AgentがOnlineになるとは,具体的にどういう状態なのか」

「保護対象サーバへ攻撃・スキャン通信を送る場合,どのような検証環境を作ればよいのか」

といった部分は,実際に環境を作ってみないとなかなかイメージできませんでした.

そこで今回は,DSM,DSA,Kali Linuxをそれぞれ用意し,Deep Securityの基本的な管理構成を自宅環境で再現してみることにしました.

最終的には,DSM上でDSAを

Managed (Online)

として管理できるところまで確認しています.

また,構築途中では,

Agentは正常に起動している
    ↓
DSMへのTCP通信もできる
    ↓
それでもDSMではManaged (Offline)

という問題にも遭遇しました.

最終的には名前解決が原因だと分かりましたが,このトラブルを調査したことで,DSMとDSAの通信やHeartbeatの仕組みについても理解を深めることができました.

この記事では,単純なインストール手順だけではなく,

  • なぜこのような構成にしたのか
  • DSMとDSAはそれぞれ何をしているのか
  • 管理通信と検証用通信をどのように分離したのか
  • AgentのOnline/Offlineは何によって決まるのか
  • 構築中にどのような問題が発生したのか

という点を中心にまとめます.

今回の検証でやりたかったこと

今回の一番の目的は,Deep Securityの構成を実際に動かして理解することです.

特に確認したかったのは,DSMとDSAの関係です.

Deep Securityでは,保護対象のサーバすべてをDSM自身が直接保護するわけではありません.

保護対象となるサーバにはDSAを導入し,DSMからそれらのAgentを管理する構成になります.

イメージとしては,

┌──────────────────────┐
│ Deep Security Manager │
│        DSM             │
│                        │
│ ・Agentの管理           │
│ ・設定の管理            │
│ ・状態の確認            │
│ ・イベントの確認        │
└──────────┬───────────┘
           │
           │ 管理通信
           │
┌──────────▼───────────┐
│    Target Server       │
│                        │
│ Deep Security Agent    │
│        DSA             │
└───────────────────────┘

という関係です.

そこで今回は,DSMとDSAをあえて別々の仮想マシンに構築しました.

さらに,保護対象のTargetへ外部から検証用の通信を送るため,Kali Linuxも用意しました.

最終的には,

Kali Linux
    │
    │ スキャンなどの検証通信
    ▼
Target
  └─ Deep Security Agent
            │
            │ 管理通信
            ▼
   Deep Security Manager

という環境を作ることを目標としました.

検証環境

今回用意した仮想マシンは3台です.

マシン OS アーキテクチャ 役割
DSM RHEL 9.8 x86_64 Deep Securityの管理サーバ
Target RHEL 9.8 ARM64 DSAを導入する保護対象サーバ
Kali Linux Kali Linux ARM64 Targetへの検証用通信を発生させるマシン

少し特殊なのは,これらが同じ仮想化基盤上に存在していない点です.

DSMはUbuntuマシン上のKVM/libvirtで動作させています.

一方,TargetとKali LinuxはMac mini上のVMware Fusionで動作させています.

構成としては次のようになります.

DSMとDSAを単純に同一の仮想ネットワークへ置くのではなく,物理的にも仮想化基盤的にも異なる環境に配置しています.

そのため,今回の構築ではDeep Securityそのものだけでなく,

  • KVM/libvirt
  • VMware Fusion
  • 仮想ネットワーク
  • ルーティング
  • 名前解決

についても考える必要がありました.

DSMの役割

Deep Security Managerは,Deep Security環境全体を管理する中心的なコンポーネントです.

今回の環境では,RHEL 9.8の仮想マシンにDSMを構築しました.

また,DSMが利用するデータベースとしてPostgreSQLも使用しています.

DSMを構築するとWebブラウザから管理画面へアクセスでき,

  • Computers
  • Policies
  • Events & Reports
  • Administration

などからAgentや各種設定を管理できます.

今回特に使用したのが Computers です.

ここにはDSMの管理対象となったコンピュータが表示され,Agentの状態についても確認できます.

たとえば,

Managed (Online)

であれば,AgentがDSMの管理下にあり,管理通信が正常に行われている状態です.

一方,今回途中で発生した,

Managed (Offline)

では,Agent自体は登録されているものの,DSMとの継続的な通信に問題が発生していました.

単にAgentをインストールできたかどうかだけではなく,DSMから管理できる状態になっているかを見ることが重要になります.

DSAの役割

Deep Security Agentは,保護対象となるサーバにインストールします.

今回はRHEL 9.8 ARM64をTargetとして用意し,ARM64版のDSAをインストールしました.

今回使用したTargetがARM64であるため,DSMからAgentのインストーラを取得する際にも,対応するプラットフォームを確認しました.

DSMには複数のプラットフォーム向けAgentが用意されているため,

Red Hat Enterprise 9 (64-bit Arm)

に対応するAgentを使用しています.

Agentをインストールしただけでは,まだDSMの管理下には入りません.

インストール後にDSMに対するActivationを行うことで,AgentをDSMへ登録します.

大まかな流れは,

DSAをインストール
      │
      ▼
ds_agentサービス起動
      │
      ▼
DSMへActivation
      │
      ▼
DSMへコンピュータとして登録
      │
      ▼
DSM・DSA間で管理通信
      │
      ▼
Managed (Online)

となります.

今回実際に構築したことで,「Agentのインストール」と「DSMへの登録」は別の処理であることが分かりやすくなりました.

DSMとDSAの通信

DSMとDSAの構築で重要だったのが,両者の通信です.

AgentをDSMへ登録したあとも,DSMとDSAは継続的に通信します.

その中で重要になるものの1つがHeartbeatです.

HeartbeatによってAgentとDSMの間で定期的な通信が行われ,Agentの状態などがDSMへ伝えられます.

そのため,

ds_agentが起動している

ことと,

DSMでManaged (Online)になっている

ことは,同じ意味ではありません.

Agentプロセスが正常に動作していても,DSMとの管理通信が失敗していれば,DSM側ではOfflineになる可能性があります.

今回まさにこの状態を経験しました.

Kali Linux用の検証ネットワーク

今回は管理環境だけでなく,将来的にDeep Securityの保護機能を試せるようにKali Linuxも用意しました.

Kali LinuxからTargetへ,

  • ポートスキャン
  • サービスの列挙
  • 各種検証用トラフィック

などを送信できるようにします.

ただし,普段使用しているLANへ検証用トラフィックを流したくないため,Kali LinuxとTargetの間にはVMware Fusionのプライベートネットワークを用意しました.

┌──────────────────┐
│    Kali Linux     │
│  172.16.130.10    │
└────────┬─────────┘
         │
         │ VMware Private Network
         │ 172.16.130.0/24
         │
┌────────▼─────────┐
│      Target       │
│  172.16.130.20    │
│       DSA         │
└──────────────────┘

Targetには,

  • DSMとの通信などに利用する管理側のインタフェース
  • Kali Linuxとの通信に利用する検証側のインタフェース

の2つを持たせています.

これによって,

管理通信
Target ─────────→ DSM

と,

検証通信
Kali ───────────→ Target

を分けて考えることができます.

トラブルが発生した際にも,「DSMとの管理通信がおかしいのか」「KaliとTarget間の検証ネットワークがおかしいのか」を切り分けやすくなります.

AgentのActivation

TargetへDSAをインストールしたあとは,DSMに対してActivationを行いました.

Activationによって,DSMはそのAgentを自身の管理対象として登録します.

Activationが成功するとDSMの Computers に対象が登録され,DSMからAgentの状態を確認できるようになります.

今回もActivation自体は正常に成功しました.

ところが,しばらくするとDSM上で,

Managed (Offline)

となりました.

ここから今回一番時間を使ったトラブルシューティングが始まりました.

Agentは動いているのにManaged (Offline)

最初に確認したのはTarget上のAgentです.

ds_agent のサービスそのものは正常に動作していました.

さらにTargetからDSMが待ち受けているポートへのTCP接続も可能でした.

つまり,

Agent停止

でも,

Target → DSMへの経路がない

でもありませんでした.

そこでAgentのログを確認しました.

すると,Heartbeatの際にAgentが,

https://dsm:4120/

へ接続しようとしていることが分かりました.

そして,その直後には,

getaddrinfo

による名前解決エラーが記録されていました.

つまり,問題はネットワーク到達性ではなく,

dsm

というホスト名をTargetが名前解決できないことでした.

なぜActivationは成功したのか

ここが今回特に興味深かったポイントです.

ActivationではDSMのIPアドレスを直接指定していました.

そのため,

Target
   │
   │ 192.168.122.82
   ▼
  DSM

という通信ができればActivationは成功します.

しかし,Activation後のAgentはDSMから受け取った設定に従って,

dsm:4120

を接続先として使用していました.

その結果,

Activation
    │
    │ IPアドレスを直接指定
    ▼
   成功

    ↓

Heartbeat
    │
    │ 「dsm」を名前解決
    ▼
   失敗

という状態になっていました.

そのため,

Agentの登録には成功する
      ↓
DSMのComputersにも表示される
      ↓
しかしHeartbeatに失敗する
      ↓
Managed (Offline)

という,一見すると少し分かりにくい状態になっていました.

名前解決を修正

原因が分かったため,Target側で dsm がDSMのIPアドレスへ解決されるようにしました.

今回のような小規模な検証環境では,Targetのhosts設定で,

dsm → 192.168.122.82

となるようにしています.

これによってAgentは,

https://dsm:4120/

への接続時にDSMのIPアドレスを取得できるようになりました.

その後,再度DSMとの通信を発生させると,DSMのComputers画面で,

Managed (Online)

になることを確認できました.

今回のトラブルから分かったこと

今回のトラブルで重要だったのは,

IPアドレスで通信できることと,アプリケーションが実際に使用するホスト名で通信できることは別

という点です.

たとえば,

ping 192.168.122.82

や,

192.168.122.82:4120へのTCP接続

が成功していたとしても,Agentが実際には,

dsm:4120

を使用しているのであれば,dsm の名前解決ができなければ通信できません.

今回の場合,

ネットワーク到達性:OK
TCP 4120:OK
ds_agent:Running
Activation:OK
名前解決:NG
Heartbeat:NG
DSM表示:Offline

という状態でした.

名前解決を修正したことで,

ネットワーク到達性:OK
TCP 4120:OK
ds_agent:Running
Activation:OK
名前解決:OK
Heartbeat:OK
DSM表示:Online

となりました.

AgentがOfflineになった場合,サービスの起動状態だけを見るのではなく,

  1. Agentサービスが動いているか
  2. DSMへのネットワーク経路が存在するか
  3. 必要なTCPポートへ接続できるか
  4. AgentがDSMをどのホスト名で認識しているか
  5. そのホスト名をTargetから名前解決できるか
  6. AgentのログにHeartbeatのエラーがないか

という順番で確認すると,原因を切り分けやすいと感じました.

DSMで確認できたもの

AgentがOnlineになったあとは,DSMの管理画面からAgentの状態を確認できました.

Computers では,登録されたコンピュータとAgentのOnline/Offline状態を確認できます.

また,Events & Reports のSystem Eventsでは,

  • AgentのActivation
  • コンピュータの登録
  • Policyの送信
  • Agent関連の管理イベント

などを確認できました.

ここまでで,

Agentをインストールする
      ↓
DSMへ登録する
      ↓
DSMと継続的に通信する
      ↓
DSMから状態を確認する

というDeep Securityの基本的な管理の流れを実際に確認することができました.

FirewallとIntrusion Preventionについて

当初はここからさらに,Kali LinuxからTargetへポートスキャンなどの通信を送り,

Kali
  │
  │ 検証通信
  ▼
Target + DSA
  │
  │ Firewall / IPS
  ▼
DSM
  ├─ Firewall Events
  └─ Intrusion Prevention Events

という流れでイベントを確認する予定でした.

しかし,今回のDSMでは,

Firewall and Intrusion Prevention
Not Licensed

となっていました.

そのため,FirewallおよびIntrusion Preventionを利用した検知・防御については今回の検証範囲から外しました.

Kali LinuxとTargetの間のネットワーク自体は構築できているため,Target上でパケットキャプチャを行えばKaliから送信した通信そのものを確認することはできます.

ただし,それはDeep SecurityのFirewall/IPSによるイベント検知とは別です.

今回の構築で,

「AgentをDSMで管理できること」と「Deep Securityの各保護機能を利用できること」は別

であることも確認できました.

今回構築できたところ

最終的に,今回の検証では次のところまで確認できました.

  • RHEL 9.8へのDeep Security Managerの構築
  • PostgreSQLとの連携
  • KVM/libvirt上でのDSM運用
  • ARM64版RHELへのDeep Security Agent導入
  • DSMからARM64用Agentパッケージの取得
  • Agentサービスの起動
  • DSMへのAgent Activation
  • DSMのComputersへのTarget登録
  • DSM・DSA間の管理通信
  • Heartbeatの確認
  • Managed (Offline)からManaged (Online)への復旧
  • Agentログを利用したトラブルシューティング
  • DSM接続先の名前解決問題の特定
  • DSMのSystem Eventsの確認
  • Kali LinuxとTarget間のプライベートネットワーク構築

当初はFirewallやIPSの検証に目が向いていましたが,実際に構築してみると,その前段階にあるDSMとDSAの管理通信についても多くのことを確認できました.

構築してみて分かったこと

今回一番大きかったのは,Deep Securityの構成を「製品名」ではなく「通信」として考えられるようになったことです.

構築前は,

DSM = 管理画面
DSA = Agent

程度の理解でした.

実際に構築してみると,

DSM
 ↑
 │ Activation
 │ Heartbeat
 │ 管理通信
 │
DSA
 ↑
 │
 │ 保護対象への通信
 │
Network

という関係になっていることが分かります.

また,仮想化基盤をまたいで構築したことで,単純にソフトウェアをインストールするだけではなく,

  • IPアドレス
  • ルーティング
  • TCPポート
  • NAT
  • 名前解決
  • Agentが認識しているManagerのアドレス

といったネットワーク側の要素についても意識する必要がありました.

特に今回の「IPアドレスではDSMへ到達できるのに,AgentはOffline」という問題は,疎通確認だけで問題なしと判断してはいけないことを改めて確認できる事例でした.

おわりに

今回は,自宅の仮想環境にTrend Micro Deep Securityの検証環境を構築しました.

DSMをUbuntu上のKVM/libvirt,DSAをMac mini上のVMware Fusionという異なる環境に配置し,DSMへのAgent登録から継続的な管理通信まで確認しました.

途中ではAgentが Managed (Offline) になる問題が発生しましたが,Agentログを確認することでDSMのホスト名を名前解決できていないことを特定し,最終的には Managed (Online) まで持っていくことができました.

今回の構築を通して,

DSMを構築する
    ↓
DSAをTargetへ導入する
    ↓
AgentをActivationする
    ↓
DSMの管理下へ登録する
    ↓
Heartbeatを含む管理通信を確立する
    ↓
DSMからAgentの状態を確認する

というDeep Securityの基本的な流れを一通り確認できました.

FirewallとIntrusion Preventionについてはライセンスの関係で今回検証できませんでしたが,それらの機能を試すための前段となる管理環境と検証ネットワークは構築できました.

実際に環境を作ってみることで,ドキュメントを読むだけでは見えにくかったDSM・DSA間の通信や,名前解決を含めたネットワーク設計の重要性を理解するよい機会になりました.

DIVER OSINT CTF 2026 Writeup

はじめに

今回は ハッカーかずの部屋 のかずさんにお誘いをいただき参加しました.
結果は....なんと2位!! 惜しい,あと少しだった.
(pinjaに近づいた..だと..)

そして,今回はAIエージェントを使うことが多かった.
そのため,AIエージェントのみで解いた問題はAIなしで解き直してWriteupを書くことにする.

misc

nui

問題文

写真のぬいぐるみは,いつ,どのような機材で撮影されたものか答えよ.
2020年11月23日にCanon PowerShot SX70 HSで撮影されたものであれば,Flagは
Diver26{20201123_Canon PowerShot SX70 HS} となる.

問題では,星や月が描かれた帽子をかぶったぬいぐるみの写真が提示されていた.

求める情報は,次の2点である.

  • 撮影日
  • 撮影機材

フラグは,次の形式になる.

Diver26{YYYYMMDD_機材名}

まず,配布された画像をexiftoolで確認した.

$ exiftool nui.jpg

結果は次のとおりだった.

ExifTool Version Number         : 13.55
File Name                       : nui.jpg
Directory                       : .
File Size                       : 614 kB
File Modification Date/Time     : 2026:07:25 12:17:28+09:00
File Access Date/Time           : 2026:07:25 12:19:13+09:00
File Inode Change Date/Time     : 2026:07:25 12:19:12+09:00
File Permissions                : -rw-r--r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
Image Width                     : 1588
Image Height                    : 2097
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 1588x2097
Megapixels                      : 3.3

画像サイズなどは確認できたが,撮影日時やカメラ名といったEXIF情報は残っていなかった.

$ file nui.jpg
nui.jpg: JPEG image data, baseline, precision 8, 1588x2097, components 3

このため,配布画像そのものから直接,撮影日時や撮影機材を取得することはできない.

画像検索などから,出典を探す.

このぬいぐるみはNASAの「アルテミスⅡ」ミッションに関連するマスコットであることが分かった.

NASAのブログ記事では,このぬいぐるみが「Rise」という名称で紹介されている.

記事内で使用されている画像のURLは,次のとおりである.

https://www.nasa.gov/wp-content/uploads/2026/03/nasa-artemis-ii-zgi.jpg

画像URLには,次の文字列が含まれている.

/wp-content/uploads/

wp-contentは,WordPressで使用される標準的なディレクトリ名である.

つまり,NASAのWebサイトはWordPressを利用しており,WordPress REST APIから画像のメディア情報を取得できる可能性がある.

WordPress REST APIのメディア用エンドポイントは,通常,次の形式で利用できる.

https://example.com/wp-json/wp/v2/media

NASAの場合は,次のURLになる.

https://www.nasa.gov/wp-json/wp/v2/media

メディアを検索するため,画像ファイル名の一部であるnasa-artemis-ii-zgiを指定した.

https://www.nasa.gov/wp-json/wp/v2/media?search=nasa-artemis-ii-zgi

APIへアクセスすると,画像に関するJSONデータが返ってきた.

JSON内のsource_urlには,調査対象の画像URLが記録されている.

{
  "source_url": "https://www.nasa.gov/wp-content/uploads/2026/03/nasa-artemis-ii-zgi.jpg"
}

さらに,media_details内には画像サイズが保存されていた.

{
  "media_details": {
    "width": 1588,
    "height": 2097
  }
}

これは,配布画像の解像度と一致する.

配布画像:1588×2097
NASA画像:1588×2097

WordPressは,画像がアップロードされた際に,EXIFなどから抽出した情報をデータベースへ保存することがある.

この情報は,REST APIの次の階層に格納されている.

media_details
└── image_meta

NASAのAPIでは,次の情報が確認できた.

{
  "image_meta": {
    "aperture": "2.2",
    "camera": "Galaxy S23 Ultra",
    "created_timestamp": "1769611708",
    "focal_length": "2.2",
    "iso": "125",
    "shutter_speed": "0.016666666666667"
  }
}

主な項目は次のとおりである.

項目 値 意味
camera Galaxy S23 Ultra 撮影機材
created_timestamp 1769611708 撮影日時のUnixタイムスタンプ
aperture 2.2 絞り値
focal_length 2.2 焦点距離
iso 125 ISO感度
shutter_speed 0.016666... シャッター速度

配布画像からはEXIFが削除されていたが,WordPressのデータベース側には,アップロード時に読み取られたimage_metaが残っていた.

Unixタイムスタンプを日時に変換する.

created_timestampの値は,次のとおりである.

1769611708

これはUnixタイムスタンプなので,日時へ変換する.

LinuxやmacOSでは,次のように確認できる.

date -u -r 1769611708

変換結果は,次のとおりである.

2026年 1月28日 水曜日 14時48分28秒 UTC

問題で求められているのは日付のみなので,撮影日は次のようになる.

2026年 1月28日

image_metaのcameraには,次の値が記録されていた.

Galaxy S23 Ultra

したがって,撮影機材はSamsungのスマートフォンであるGalaxy S23 Ultraと判断できる.

撮影日は2026年1月28日,撮影機材はGalaxy S23 Ultraである.

日付をYYYYMMDD形式へ変換すると,次のようになる.

20260128

したがって,フラグは次のとおりである.

Diver26{20260128_Galaxy S23 Ultra}


introduction

owner

問題文

この車両を保有している国家を英語で答えよ。 例えば日本の場合、flagは Diver26{Japan} となる。

画像にあるナンバープレートについて調べる

pai-r.com

これは外交官やその関係者が使用する「青ナンバー」と呼ばれるものだった.

また,このようにも書いてあった.

「外」と記載の後にナンバーがくるプレートは大使館職員の公用車です。このナンバープレートは、大使館職員の公務に使われる車両であることを表しており、都市部や大使館周辺で見かけることが多いナンバープレートです。

外交官ナンバーには国によって異なる「国番号」があるらしい.
国番号は,ナンバープレートに記載されている最初の2桁〜3桁を見れば、どこの国の車両かがわかるようになっている.(01 ~ 165) なので,「国番号」を調べる.

問題の画像の「04」がどの国か確かめる.

arakawa.world-tls.com

No. 国名 国名 備考
01 Afganistan アフガニスタン
02 Algeria アルジェリア 外0201:メルセデスベンツS
03 Argentina アルゼンチン 外0301:BMW5
04 Australia オーストラリア 外0401:レクサスLS
(以前)アウディA8
05 Austria オ-ストリア 外0501:BMW5

この記事を見ると「04」はオーストラリアであることがわかる.

flagの国名は英語で答えるので,Diver26{Australia}

momo

問題文

2026年4月に航空機の写真を撮影していたが、機体記号を写し忘れてしまった。写真が示す航空機の機体記号を調べて答えよ。 もし機体記号が JA380A であれば、Flagは Diver26{JA380A} となる。

機体を検索すると以下の情報があった

https://flyteam.jp/photo/4369388

項目 内容
撮影日 2025/06/14
撮影場所 新千歳空港 - New Chitose Airport [CTS/RJCC]
航空会社 ピーチ - Peach [MM/APJ]
機材・機種 Airbus A320 Airbus A320-214
機体記号 JA823P
製造番号(cn) 8646

よってDiver26{JA823P}

lion

問題文

Website: https://www.sarayanews.com/article/602549
この記事に添付されている写真で、道路を歩くライオンの後ろに映っている建物には、電話番号を記した大きな広告が掲載されている。 この広告に記載される電話番号を、ハイフン・空白なしで答えよ(国番号なども不要)。 たとえば広告に掲載されている番号がXX-YYYY-ZZZZである場合、flagはDiver26{XXYYYYZZZZ}となる。

まずは,記事の写真を見てみる.

記事の中では,「コロナ禍の2020にロシアに500頭のライオンが放たれた」というフェイクニュースが出回ったとして取り上げられている.

この画像をGoogle検索にかけてみると,同様のロシアの記事の他に熊本地震のフェイクニュースでも使われた画像であることがわかった.

www.asahi.com

さらに,その画像元の場所を特定した記事も見つかった.

withnews.jp

なんと,南アフリカのヨハネスブルクだった.

さらに,その撮影した道路が「JORISSEN ST」というところだった.

Googleマップで検索してストリートビューで探す.

あった.

※ 問題の都合上,Writeupには電話番号を書くことができないので,自分自身で確かめてほしい.

まとめ

今回は,DIVER OSINT CTF 2026に参加し,チームで2位という結果を残すことができた. 優勝まであと一歩だったことは悔しいが,難しい問題をチームで協力しながら解いていく時間はとても楽しかった.

今回はAIエージェントを利用して解いた問題も多かった. AIによって調査の速度は大きく向上した一方で,提示された情報が正しいかを確認し,最終的な根拠を自分で集める作業は必要である.

OSINTでは,一つの検索方法で情報が見つからなくても,画像,メタデータ,Web API,地図,過去記事など,視点を変えることで手掛かりが見つかることがある. 今回も,検索タブを大量に開きながら,さまざまな方向から調査する楽しさを改めて感じることができた.

運営の皆さま,チームメンバーの皆さま,ありがとうございました.

次回こそは,1位を取りたい.

sudo-rsのpwfeedbackをUbuntu 26.04で検証してみた

はじめに

Ubuntu26.04を使い始めて数ヶ月,ずっと気になっていたことがある.
それは,パスワード入力時に*が表示されることである.

Ubuntu24.04を使っているときはそんなことなかった.
なぜ急にこのような変更になったのか調査してみた.

環境

$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 26.04 LTS"
NAME="Ubuntu"
VERSION_ID="26.04"
VERSION="26.04 LTS (Resolute Raccoon)"
VERSION_CODENAME=resolute
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=resolute
LOGO=ubuntu-logo

$ uname -a
Linux ubuntu26 7.0.0-27-generic #27-Ubuntu SMP PREEMPT_DYNAMIC Thu Jun 18 19:13:49 UTC 2026 x86_64 GNU/Linux

なぜパスワード入力時に「*」が表示されるようになったのか

調査したところ,Ubuntu Japanese Teamの Ubuntu Weekly Topics(2026-03-06) でこの変更について紹介されていた.

従来のUnix/Linuxでは,sudo実行時のパスワード入力は何も表示しないことが一般的である.

例えば,次のようにsudoを実行すると,

sudo apt update
[sudo] password for takara:

パスワードを入力しても,画面上には何も表示されない.

これは,

  • パスワードの文字数を知られないようにする
  • 周囲から入力状況を推測されにくくする

というセキュリティ上の理由から,長年採用されてきた仕様である.

しかし,CLIに慣れていないユーザーからすると,

「入力できていないのでは?」

と勘違いしてしまうことも少なくなかった.

GUIのログイン画面やWebサイトでは,パスワード入力時に「********」のようなマスク表示が行われることが一般的であるため,CLIとの違いに戸惑うユーザーも多かったようだ.

そこでUbuntu 26.04では,新しく採用されたsudo-rsの挙動に合わせ,パスワード入力時に「*」を表示するよう変更された.

入力した文字数だけ「*」が表示されるため,ユーザーは入力できていることを視覚的に確認できるようになった.

設定で元の挙動に戻せるのか

「*」が表示されるようになったとはいえ,従来どおり何も表示しない挙動に戻したい場合もある.

Ubuntuではsudoersの設定を変更することで切り替えられるため,実際に試してみた.

まず,/etc/sudoers.d配下に設定ファイルを作成する.

sudo visudo -f /etc/sudoers.d/disable-pwfeedback

ファイルには次の1行を記述する.

Defaults !pwfeedback

作成後,内容を確認する.

sudo cat /etc/sudoers.d/disable-pwfeedback
Defaults !pwfeedback

さらに,sudoers.dが読み込まれる設定になっていることも確認した.

sudo grep -n includedir /etc/sudoers
57:@includedir /etc/sudoers.d

構文チェックも問題なく通過した.

sudo visudo -c
/etc/sudoers: parsed OK

ここまでを見る限り,設定ファイルは正常に読み込まれているように見える.

ドキュメントを調べてみると…

ここで気になったのが,pwfeedbackのデフォルト設定である.

sudoers-rs のマニュアルを確認すると,

This flag is off by default.

と記載されている.

つまり,マニュアル上ではデフォルトで無効という説明になっている。

一方で,Ubuntu Community Hubには

Sudo-rs enables pwfeedback by default for Resolute Raccoon

という記事が公開されており,Ubuntu 26.04ではpwfeedbackをデフォルトで有効にする方針が説明されている.

つまり,

  • sudoers-rsの一般的なマニュアル
  • Ubuntu 26.04で実際に採用されている設定

では説明が一致していないことが分かった.

Ubuntuがディストリビューション独自の方針としてデフォルト設定を変更していると考えられる.

おわりに

今回は,「Ubuntu 26.04でなぜパスワード入力時に*が表示されるようになったのか」を調べてみた.

最初は単純な仕様変更だと思っていたが,調査を進めると,

  • Ubuntu Weekly Topics
  • sudoers-rsのマニュアル
  • Ubuntu Community Hub

で説明に違いがあることが分かり,非常に興味深かった.

ニュース記事だけでなく,公式ドキュメントや実際の設定まで確認してみることで,Ubuntu独自の変更点をより深く理解できる良い機会となった.

GitHub Actionsを調べていたら,GitHub Docsのテンプレート変数が画像に表示されていた話

GitHub Actionsの料金体系について調べていたところ,少し不思議な現象に遭遇しました.

参考にしていた記事はこちらです.

GitHub Actionsの無料枠を確認するために料金表を見ていたところ,表の一部が次のように表示されていました.

{% data variables.product.prodname_free_user %}

最初は「文字化けかな?」と思いましたが,引用元であるGitHub Docsを確認すると,この部分は本来 GitHub Free と表示される箇所でした.

なぜこのような表示になるのか

この文字列は,GitHub Docsで利用されているテンプレート変数です.

{% data variables.product.prodname_free_user %}

このような記述は,GitHub Docsのビルド時に

GitHub Free

へ自動的に置き換えられます.

つまり,公開されているWebページには本来存在しない文字列です.

では,なぜ画像の中に表示されたのか

今回の現象は,画像や表を生成する際にテンプレートが正しく展開されなかったことが原因だと考えられます.

特にSVGやHTMLから画像を自動生成している場合,

{% data variables.product.prodname_free_user %}

が

GitHub Free

へ変換される前の状態で画像化されてしまうと,ブラウザはその文字列をそのまま描画します.

つまり,

GitHub Free

ではなく,

{% data variables.product.prodname_free_user %}

というテンプレート記法自体が画像として表示されてしまうわけです.

このようなことは珍しくない

GitHub DocsではLiquidというテンプレートエンジンが利用されています.

Liquidだけではなく,

  • Jekyll
  • Jinja2
  • Handlebars
  • Mustache

などのテンプレートエンジンを利用するWebサイトでも,同様の「テンプレートが展開されずに公開されてしまう」ケースは時々見られます.

普段何気なく見ているWebサイトでも,こうした"裏側"がふと見えてしまうことがあるのは面白いですね.

おわりに

今回はGitHub Actionsの料金を調べている途中で,GitHub Docsのテンプレート変数がそのまま表示されるという珍しい現象を見つけました.

普段は完成したページしか目にしませんが,こうした表示から,ドキュメントがテンプレートエンジンや自動ビルドによって生成されていることが分かります.

このような「ちょっとした違和感」から技術的な仕組みを調べてみると,新しい発見があるかもしれません.

ネットワーク構成とIP残留トラブルの記録(Ubuntu 26 / Mac mini環境)

1. ネットワーク構成概要

本環境は以下のようなシンプルな家庭内LAN構成になっている.

  • ルータ:192.168.3.1
  • Mac mini(有線接続):192.168.3.10
  • Ubuntu 26 Laptop(無線接続):192.168.3.200

また,ネットワークトポロジは以下の通りである.

  • Mac mini → 有線LANでルータ接続
  • Ubuntu → Wi-Fiでルータ接続
  • ルータ配下で同一セグメント(192.168.3.0/24)

いいですね.コマンド結果を入れると「再現性のある技術記事」になるのでかなり強くなります. さっきの内容にそのまま埋め込める形で,ログ付きMarkdown版を作り直します.


2. Ubuntu側のセキュリティ設定(UFW)

SSHはLAN内のみに制限している.

$ sudo ufw status
text id="ufw_output"
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       192.168.3.0/24

3. 発生した問題:IPアドレスの重複

本来は固定IPのみの想定だったが,以下の状態になった.

192.168.3.200  (static)
192.168.3.4    (dynamic)

4. インターフェース状態確認

実行コマンド

$ ip a show dev wlp0s20f3

出力(抜粋)

inet 192.168.3.200/24 brd 192.168.3.255 scope global noprefixroute
inet 192.168.3.4/24 metric 1024 brd 192.168.3.255 scope global secondary dynamic

👉 static + dynamic が同居している状態


5. DHCPプロセスの確認(予想は外れ)

dhclient確認

$ ps aux | grep dhclient
text id="dhclient_output"
takara  2500  0.0  0.0  6716  2636 pts/0 S+  18:22 grep --color=auto dhclient

👉 DHCPクライアントは存在しない


6. systemd-networkdの動作確認

実行コマンド

$ systemctl status systemd-networkd
text id="networkd_log"
DHCPv4 address 192.168.3.4/24 acquired from 192.168.3.1
Lost carrier
DHCP lease lost
Connected WiFi access point
DHCPv4 address 192.168.3.4/24 acquired from 192.168.3.1

👉 DHCPを実行しているのは systemd-networkd


7. ネットワークスタック状態確認

実行コマンド

$ networkctl status wlp0s20f3

抜粋

Address: 192.168.3.4 (DHCPv4 via 192.168.3.1)
         192.168.3.200
Gateway: 192.168.3.1
DHCPv4 address 192.168.3.4/24 acquired from 192.168.3.1

👉 DHCPと静的IPが混在


8. 再現テスト:IP削除が効かない

実行コマンド

$ sudo ip addr flush dev wlp0s20f3
ip a show dev wlp0s20f3

結果

inet 192.168.3.4/24 (再出現)
inet 192.168.3.200/24 (維持)

👉 flush後に即復活


9. 原因

本問題の本質は以下である:

systemd-networkdとNetworkManagerの二重管理

状態

コンポーネント 役割
NetworkManager Wi-Fi接続管理
systemd-networkd DHCP実行

👉 DHCPが二重化しIPが重複


10. 解決方法

systemd-networkd停止

$ sudo systemctl stop systemd-networkd
$ sudo systemctl disable systemd-networkd
$ sudo systemctl mask systemd-networkd

NetworkManager再起動

$ sudo systemctl restart NetworkManager

IPリセット

$ sudo ip addr flush dev wlp0s20f3

11. まとめ

今回の問題は単純なIP設定ミスではなく,

Linuxにおけるネットワーク管理デーモンの競合問題

であった.

特にUbuntuではデフォルトで複数のネットワーク管理系が存在するため,明示的に整理しないとDHCPやIP付与が重複する可能性がある.


12. 学び

  • IPは原因ではなく結果
  • DHCPは見えない場所で動く場合がある
  • systemd-networkdは裏で勝手にDHCPを実行することがある
  • ip a だけでは真の原因は分からない

3か月 Daily AlpacaHack を続けてみた感想

「CTFをもっと習慣化したい」と思い,3か月ほど Daily AlpacaHack を続けてみた.

※途中できない日もあったが...ww

これまでCTFは,時間がある日(土日)にやることが多かった. ただ,それだとプライベートな時間が奪われてしまうし,1週間の期間が空いてしまう.

しかし,Daily AlpacaHack は毎日1問だけ出題される形式なので,「とりあえず1問だけ見る」がやりやすい. 問題の難易度も比較的取り組みやすく,仕事に行く前や寝る前にやったりと続けやすい.

最初は「毎日やって意味あるのか?」と思っていたが,3か月続けてみると,思った以上に得るものが多かった.


“毎日1問” がかなりちょうどいい

一番大きかったのは,CTFへの心理的ハードルが下がったことだった.

長時間のCTFは,

  • 「時間がある日にやろう」
  • 「環境を整えてからやろう」
  • 「まとまった時間が必要」

となりがちで,気づくと数週間触っていないこともある.

一方で Daily AlpacaHack は,

  • 問題を開く
  • とりあえず動かす
  • 少し調べる

までのハードルがかなり低い.

解けなくても,「今日はここまで調べた」で終われる. この軽さが継続しやすかった.

特に,毎日問題を見る習慣がついたことで, いろんなタイプの問題に触れることができ,抵抗感がかなり減った.


“解けない”ことへの耐性がついた

3か月やっていて,一番変わったのはここかもしれない.

最初の頃は,

解けない = 実力不足

という感覚がかなり強かった.

でも Daily形式だと,毎日問題が来るので,1問に何日も執着し続けることがない. 解けなければ,翌日にWriteupを読んで次へ進む流れになる.

これがかなり良かった.

特にCTFは,

  • 解法を知っているか
  • 典型パターンを見たことがあるか

で解ける問題がかなり多い.

つまり,「解けなかった問題」も経験値になる.

以前は「Writeupを見るのは負け」という感覚も少しあったが,今は

“解法パターンを増やすための勉強”

として見るようになった.


得意・苦手がかなり見えた

続けていると,自分の得意・苦手がかなり分かる.

例えば自分の場合,

  • Cryptoはかなり好き
  • Webも発想がハマると楽しい
  • Revはアセンブリを追い続ける作業があまり得意ではない

という傾向が見えてきた.

特にCryptoは,

数学的に整理する Pythonで試す 条件を一つずつ確認する

みたいな流れが自分に合っていて,解けた時の納得感も大きい.

Webも,

リクエストを変えてみる レスポンスを見る 想定外の挙動を探す

という試行錯誤が楽しかった.

一方でRevは,長時間アセンブリを読み続ける問題だとかなり集中力を使う. もちろん解けた時は面白いが,「ひたすら逆方向に追い続ける」タイプの問題は,自分には少し重く感じた.

こういう「どこで楽しいと感じるか」「どこで疲れるか」を把握できたのは,毎日少しずつ触る形式だったからだと思う.


AIとの距離感も変わった

最近は,CTFでAIを使うこともかなり増えた.

ただ,3か月やって感じたのは,

AIは “答えを出す機械” というより “壁打ち相手”

として使うのがかなり良い,ということだった.

例えば,

  • エラー原因の整理
  • exploitが動かない理由
  • Crypto数式の確認
  • gdb/lldbの使い方
  • Pythonコードの雛形作成

などではかなり助けられた.

一方で,問題文を丸ごと投げて解いてもらうだけだと,後で似た問題が来た時に何も残らない感覚もあった.

結局,

  • 自分で悩む
  • AIで整理する
  • Writeupで理解する

くらいのバランスがちょうど良かった.


印象に残っていること

3か月続けていて面白かったのは,

「昨日の自分なら解けなかった問題」が少しずつ減ることだった.

毎日少しずつ触ることで,

「とりあえず試してみるか」

ができるようになった.

これはかなり大きい変化だったと思う.


おわりに

3か月続けても,まだ解けない問題は普通に多い.

Writeupを見ても理解に時間がかかることもある.

ただ,以前より

  • 問題を開く抵抗感
  • ツールを触る抵抗感
  • 分からない問題への抵抗感

はかなり減った.

CTFは「一気に強くなる」というより,

  • 典型を知る
  • 手を動かす
  • 慣れる

の積み重ねが大きい分野だと思う.

その意味で,毎日1問という形式はかなり相性が良かった.

これからも,無理に全部解こうとするより,

「毎日少しでも触る」

を続けていきたい.

最近のPC環境を紹介します

はじめに

最近,作業環境をかなり整えたので,現在使っているPC周辺機器を紹介します.

以前はノートPC中心の環境だったのですが,「家でも快適に作業できる環境を作りたい」と思い,少しずつデスク環境を強化していきました.

実際に整えてみると,画面の広さや入力デバイスの違いだけでも快適さがかなり変わり,「環境を整えるのは大事だな」と実感しています.

今回は,そんな最近のデスク環境を紹介します.


PC

Mac mini M4

メインPCは Mac mini M4 を使用しています.

最初に箱を開けたとき,「小さっ」と思いました. 本当にコンパクトで,最初は「これで性能大丈夫なのか?」と少し不安になるレベルです.

しかし実際に使ってみるとかなり快適で,

  • ブラウザを大量に開く
  • ターミナルを並べる
  • エディタを開く
  • 動画を見る

といった普段の作業では全く困りません.

以前はノートPC中心だったので,

  • 排熱
  • ファン音
  • 机の狭さ

などが気になることもありましたが,Mac mini にしてからかなりスッキリしました.

が.......

机の奥行きが48cmと小さく,後述するモニターに圧迫されております.


モニター

Xiaomi 34インチ 湾曲モニター(3440 × 1440)

今回の環境変更で,一番インパクトが大きかったのがこのモニターです.

34インチのウルトラワイドにした理由は,24~27インチのモニターを2つ

みたいな使い方ができます.

以前はウィンドウを切り替えながら作業していましたが,今は「全部並べる」ができるようになりました.

最初は「横長すぎるのでは?」と思っていましたが,数日で慣れました. むしろ普通のモニターに戻れなくなりそうです.

また,湾曲モニターなので視線移動も自然で,長時間使っていても意外と疲れにくいです.


キーボード

MelGeek O2 ワイヤレスメカニカルキーボード(US配列 75%)

US配列の75%キーボードを使用しています.

詳しくはこちらを見てください

h-takara.hatenablog.com

最近は Karabiner を使ってキーバインドを調整しながら,自分好みに育てています.


マウス

Logicool M575 トラックボール

マウスは,トラックボールを使っています.

最初はかなり戸惑いましたが,慣れるとかなり快適です.

特に,

  • マウスを動かすスペースが不要
  • 手首の移動が少ない
  • 長時間操作が楽

という点が便利です.

今では普通のマウスに戻ると,「こんなに腕を動かしていたのか…」と感じます.


ヘッドセット

Logicool G321 LIGHTSPEED

ワイヤレスのゲーミングヘッドセットです.

軽量なので長時間付けていても疲れにくく,

  • ビデオ通話
  • 作業用BGM
  • 動画視聴

などで使っています.

特にワイヤレス化の快適さはかなり大きく,ケーブルがないだけで机周りのストレスが減りました.

「立ち上がるたびにケーブルが引っかかる問題」が消えたのは大きいです.


カメラ

Brio 100

ビデオ通話用に使用しています.

普段そこまで高画質を求めているわけではないのですが,ノートPCだと内蔵カメラがありますが,それよりは映像が安定していて便利です.(そりゃそう)


使ってみた感想

今回,デスク環境をまとめて整えたことで,かなり作業効率が変わりそうだと感じています.

特に,

  • 34インチ 湾曲モニター
  • Mac mini M4
  • US配列キーボード
  • トラックボール

このあたりは,単なる機材変更というより「作業スタイルそのもの」が変わる感覚がありました.

また,「環境を整えると作業したくなる」というのも実感しています.

今後は,

  • デスク
  • モニターアーム
  • オーディオ周り
  • 配線整理

などもさらに整えていきたいです.

まだまだ“完成形”ではないですが,少しずつ理想の作業環境に近づけていこうと思います.