| Implementation

脱・高額MDM:中小企業が『Fleet』で実現する、コストゼロからのデバイス管理情報の可視化

「正直、誰がどのPCを使っているのか、Excelの管理台帳を見ても信用できないんですよね」

多くの中小企業の現場で、管理者が漏らす悲鳴です。入社時に新品のラップトップを渡し、テプラで管理番号を貼り、Excelに入力する。そこまでは完璧です。しかし、半年も経てばどうでしょう? 退職者のPCが誰かに引き継がれ、メモリが増設され、勝手なフリーソフトがインストールされ、いつの間にかOSのUpdateは止まっている。管理台帳と現実は乖離(かいり)し、もはや「誰も本当のことは知らない」状態に陥ります。

「なら、IntuneやJamfを入れればいいじゃないか」

教科書的な正論ですが、ライセンスコストの壁は厚い。特に、まだ利益構造が安定していないスタートアップや、コスト意識のシビアな中小企業にとって、月額数百円×人数のランニングコストはずしりと重くのしかかります。Active Directoryを立てるほどでもない、でもExcel管理は限界。そんな「管理の狭間」にいる企業にこそ推奨したいのが、 Open Source Software (OSS) である『Fleet』の活用です。

今回は、Facebook(現Meta)が開発した強力なエンドポイント監視ツール「osquery」をベースにし、企業のPC群をまるでSQLデータベースのように検索・管理できる『Fleet』の導入と活用について解説します。コストをかけずに、「今、そこにあるリスク」を可視化する技術を手に入れましょう。

1. そもそも、なぜ「管理台帳」は腐るのか:Pull型管理の限界

従来のIT資産管理が破綻する理由は単純です。「人間が手動で更新しているから」です。 構成変更のたびにExcelを開いて更新する几帳面なエンジニアは、ユニコーン並みに希少です。必要なのは、PC自身に「今、お前の状態はどうなっているんだ?」と問いかけ、答えさせる仕組みです。

ここで登場するのが osquery です。 osqueryは、OS(Windows, macOS, Linux)の内部状態を、リレーショナルデータベースのテーブルとして表現するツールです。例えば、現在起動しているプロセスを知りたければ、以下のようなSQLを叩くだけです。

SELECT pid, name, path FROM processes LIMIT 5;

魔法のようですが、これがosqueryの正体です。プロセス、ユーザー、ネットワーク接続、Dockerコンテナ、USBデバイスなど、ありとあらゆる情報がテーブル化されています。 そして、このosqueryを数百、数千台のPCに配備し、中央から一括でクエリを投げ、結果を収集・可視化する管理サーバーが Fleet です。

Fleetを使うことで、以下のことが可能になります。

  • リアルタイムなインベントリ収集: 全PCのOSバージョン、CPU、メモリ、ディスク使用量を自動収集。
  • 脆弱性のあるアプリの特定: 「古いバージョンのChromeを使っているPCはどれだ?」を数秒で特定。
  • セキュリティ衛生管理(Hygiene): ディスク暗号化(BitLocker/FileVault)が無効になっている危険な端末のあぶり出し。

これだけの機能が、OSS版(Fleet Free)であればライセンス料ゼロで手に入ります。サーバーのホスティング費用だけで実現可能です。

2. 実践:Docker ComposeによるFleetサーバーの構築

それでは、実際にFleetを構築してみましょう。 今回は、検証や小規模導入ですぐに使えるよう、Docker Composeを用いた構成を紹介します。

前提条件:

  • DockerおよびDocker ComposeがインストールされたLinuxサーバー(Ubuntuなど)
  • 独自ドメイン(Let’s Encrypt等でSSL化することを強く推奨しますが、ここではローカルテスト用に簡略化します)

ディレクトリ構成と準備

fleet-deploy/
├── docker-compose.yml
└── .env

docker-compose.yml

以下のYAMLファイルを作成します。Fleet本体に加え、バックエンドのデータベースとしてMySQL、キャッシュや非同期処理用にRedisが必要です。OSS運用においては、データの永続化設定が命です。

version: '3'

services:
  mysql:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_DATABASE: fleet
      MYSQL_USER: fleet
      MYSQL_PASSWORD: fleet_password
      MYSQL_ROOT_PASSWORD: root_password
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - fleet-net

  redis:
    image: redis:6
    restart: always
    networks:
      - fleet-net

  fleet:
    image: fleetdm/fleet:v4.44.0 # 安定稼働のためにバージョン固定を推奨
    restart: always
    ports:
      - "8080:8080"
    environment:
      FLEET_MYSQL_USERNAME: fleet
      FLEET_MYSQL_PASSWORD: fleet_password
      FLEET_MYSQL_DATABASE: fleet
      FLEET_MYSQL_ADDRESS: mysql:3306
      FLEET_REDIS_ADDRESS: redis:6379
      FLEET_SERVER_TLS: "false" # 本番環境ではSSL証明書を設定しtrueにすること
      # SSL証明書を使用する場合は以下を有効化
      # FLEET_SERVER_Private_KEY: /path/to/private.key
      # FLEET_SERVER_CERTIFICATE: /path/to/certificate.crt
    depends_on:
      - mysql
      - redis
    command: ["fleet", "serve"]
    networks:
      - fleet-net

  # 初回DBマイグレーション用(一度実行して完了したら停止してOK)
  fleet-migration:
    image: fleetdm/fleet:v4.44.0
    environment:
      FLEET_MYSQL_USERNAME: fleet
      FLEET_MYSQL_PASSWORD: fleet_password
      FLEET_MYSQL_DATABASE: fleet
      FLEET_MYSQL_ADDRESS: mysql:3306
    depends_on:
      - mysql
    command: ["fleet", "prepare", "--no-prompt=true"]
    networks:
      - fleet-net

volumes:
  mysql_data:

networks:
  fleet-net:
    driver: bridge

起動手順

# 1. コンテナの起動
docker compose up -d

# 2. ログを確認して起動完了を待つ(マイグレーション完了まで数分待つ場合があります)
docker compose logs -f fleet

起動後、ブラウザで http://<サーバーIP>:8080 にアクセスすると、Fleetの初期セットアップ画面が表示されます。管理者(Admin)アカウントを作成し、Organization名を入力・設定すればサーバー側の準備完了です。

3. エージェントの配布:どうやってPCに入れるか?

サーバーが立っただけでは意味がありません。管理対象のPC(Host)にエージェントである fleetd をインストールする必要があります。ここが多くの管理者がつまずくポイントですが、Fleetは非常に親切なインストーラー作成機能を持っています。

CLIツール fleetctl の活用

Web UIからもデバイス追加は可能ですが、運用を考えるとCLIツールである fleetctl を使いこなすのが近道です。

  1. fleetctlのインストール (Macなら brew install fleetctl)

  2. ログイン:

    fleetctl login --address https://your-fleet-server.com --email [email protected]
    
  3. インストーラーの生成: これが最強の機能です。サーバー接続情報やEnrollment Secret(登録用共通鍵)が埋め込まれたネイティブパッケージを生成できます。

    # macOS用pkgの生成
    fleetctl package --type=pkg --fleet-url=https://your-fleet-server.com --enroll-secret=<取得したSecret>
    
    # Windows用msiの生成
    fleetctl package --type=msi --fleet-url=https://your-fleet-server.com --enroll-secret=<取得したSecret>
    

配布戦略

中小企業における現実的な配布方法は以下の2つです。

  • Active Directoryがある場合: Group Policy (GPO) を使って、生成した .msi をログオン時に自動インストールさせます。ユーザーの手を煩わせることはありません。
  • フルリモート/ADなし(ユーザー管理者権限なし)の場合: ここが一番の難所です。ユーザーにインストーラーを送っても、権限不足で実行できません(また、セキュリティの観点からユーザーに管理者権限を与えるべきではありません)。以下のいずれかの「泥臭い」対応が必要です。
    • 既存端末: Zoomのリモート制御機能やTeamViewerなどを使い、IT担当者が遠隔から接続し、自身の管理者パスワードを入力してインストールします。
    • 新規端末: PC配布前のキッティング(初期セットアップ)工程で必ずインストールしてから出荷するフローを徹底します。

一度インストールされれば、fleetd はバックグラウンドで静かに動作し、定期的にサーバーへ「Configの更新はないか?」「新しいクエリはあるか?」を確認しに行きます。

4. 「見えないリスク」を暴く:キラークエリ集

Fleetの真骨頂は「Query」です。エンジニアが知りたい「あの情報」をSQLで引っこ抜く。個人的によく使う、 中小企業のセキュリティ監査に直結するクエリを紹介します。

これらは単発で実行(Live Query)することもできますし、“Schedule” に登録して「1時間に1回チェックし、変化があったらSlackに通知」といった運用も可能です。

ケース1:ディスク暗号化されていないPCを探す

紛失盗難時の情報漏洩リスクに直結する、ディスク暗号化(BitLocker/FileVault)の状態チェックです。

Windows (BitLocker) & macOS (FileVault) 共通対応クエリ

SELECT
  CASE
    WHEN encrypted = 1 THEN 'Encrypted'
    ELSE 'Not Encrypted'
  END AS status
FROM disk_encryption;

これを実行し status = 'Not Encrypted' が返ってきた端末は、即座に回収対象です。管理台帳に「暗号化済み」と書いてあっても、実機がOFFなら意味がありません。

ケース2:勝手にUSBメモリを使っている端末を特定する

情報の持ち出し経路として依然多いUSBストレージ。接続履歴を確認します。

SELECT
  time,
  model,
  vendor,
  serial
FROM usb_devices
WHERE
  removable = 1;

「うちはUSB禁止です」と言っている会社のPCから、私物のUSBメモリ使用履歴がボロボロ出てくるのは"あるある"です。ログという証拠があれば、感情論ではなく事実ベースで指導ができます。

ケース3:危険なChrome拡張機能の洗い出し

最近の脅威トレンドとして、ブラウザ拡張機能を悪用した情報窃取が増えています。

SELECT
  name,
  version,
  description,
  identifier
FROM chrome_extensions;

業務に関係のないゲーム系の拡張機能や、怪しげなVPN拡張を入れているユーザーを特定し、ホワイトリスト運用への移行を検討する材料にします。

ケース4:リッスンしているポートの確認(バックドア検知)

本来開いているはずのないポートが開いていないか? 不審な通信待ち受けプロセスがないか?

SELECT
  l.port,
  l.protocol,
  p.name,
  p.path,
  p.cmdline
FROM listening_ports l
JOIN processes p ON l.pid = p.pid
WHERE l.port NOT IN (80, 443, 22) -- 既知の安全なポートを除外
  AND l.address != '127.0.0.1';

これにより、意図しないWebサーバーがローカルで立ち上がっていたり、RAT(Remote Access Trojan)の兆候を早期に発見できる可能性があります。

ケース5:ローカル管理者権限を持っているユーザーの特定

セキュリティ事故の多くは、一般ユーザーが管理者権限(Administrator/sudoers)を持っていることに起因します。

-- macOSの場合
SELECT * FROM users WHERE gid = 80; -- admin group
-- Windowsの場合
SELECT * FROM users WHERE gid LIKE '%S-1-5-32-544%'; -- Administrators

「開発に必要だから」といって一時的に渡した管理者権限が、そのまま放置されていないか確認しましょう。

5. 運用のアドバイス:小さく始めて、事実を突きつける

いきなり全社展開しようとすると、ユーザー部門から「監視されているようで気持ち悪い」という反発を招くことがあります。まずはIT部門内のPCや、情シスが管理しやすい開発部門から導入を始めましょう。

そして、経営層に予算申請をする際は、Fleetで取得したデータをグラフ化して見せるのが最も効果的です。 「現在、社内PCの30%でOSのパッチが当たっておらず、15%でアンチウイルスが無効化されています。これが『現状』です。これを放置するリスクと、対策コスト、どちらを取りますか?」

事実は、最大の説得材料です。

Intuneなどの有償MDMは、デバイスを「制御(Control)」することに長けています(パスワードポリシーの強制や、ワイプなど)。一方、Fleetは「可視化(Visibility)」に特化しています。 予算がないなら、まずは「制御」を諦めてでも「可視化」を優先すべきです。見えていない敵とは戦えませんが、見えている敵なら、最悪手動で対処が可能だからです。

6. まとめ

「何も知らない」ことが最大のリスクです。 高額なツールを導入できないことを、セキュリティ対策を放棄する言い訳にしてはいけません。Fleet/osqueryという強力な武器を使えば、コストをかけずに、商用製品と同等、あるいはそれ以上の深さでPCの内部を監査できます。

まずは手元のDocker環境でFleetを立ち上げ、自分自身のPCに対してクエリを投げてみてください。あなたのPCの中で動いている「見えないプロセス」が可視化された瞬間、これまでのExcel管理がいかに頼りなかったかを痛感するはずです。

そこから、本当のIT資産管理が始まります。


AIへの確認用プロンプト

この記事の内容を踏まえ、自社の環境に適したMDM選定やFleetの導入可否を検討するために、以下のプロンプトをAI(ChatGPTやClaudeなど)に入力して相談してみてください。

あなたは中小企業のITインフラ構築とセキュリティに精通したシニアエンジニアです。
現在、私の会社ではPC(Windows 50台、Mac 10台)の管理をExcel台帳による手動管理で行っており、実態との乖離やセキュリティリスク(OS更新漏れ、紛失時の暗号化有無不明など)が懸念されています。

予算が限られているため、Microsoft Intuneなどの高機能商用MDMの導入はハードルが高いのですが、記事で紹介されていたOSSの「Fleet (osquery)」の導入を検討しています。

以下の点についてアドバイスをください。

1. 現状の規模(計60台)でFleetを自前運用する場合の、サーバーリソース(AWS/Azure上のスペック目安)と運用工数の懸念点は何ですか?
2. 商用MDM(Intune等)と比較して、Fleetでは「できないこと(特にデバイスのロックやワイプ機能など)」による致命的なデメリットはありますか?
3. まずスモールスタートで検証するための、Docker Composeを用いた具体的な環境構築手順のチェックリストを作成してください。

回答は、技術的な専門用語を使いつつも、非エンジニアの経営層にも説明できるようなロジックを含めてください。