> For the complete documentation index, see [llms.txt](https://docs.maiagent.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.maiagent.ai/tech/maiagent-tech-ja/advanced-genai-tech/icap-content-validation.md).

# ICAP コンテンツ検証連携

> 本ドキュメントでは、MaiAgent プラットフォームが ICAP (Internet Content Adaptation Protocol) プロトコルを連携させ、ユーザーがアップロードするファイルや対話コンテンツに対するセキュリティスキャンと検証を実現し、マルウェアや不適切なコンテンツを防止する仕組みについて説明します。

## 1. ICAP とは？

ICAP (Internet Content Adaptation Protocol) は、ウイルススキャン、コンテンツフィルタリング、情報漏洩防止などの処理のために、コンテンツを外部サービスへ転送するための軽量なプロトコルです。

### 1.1 ICAP の中心的な価値

| 検討の観点        | コンテンツ検証なしの場合                        | ICAP コンテンツ検証ありの場合                |
| ------------ | ----------------------------------- | -------------------------------- |
| **セキュリティ**   | ユーザーがマルウェアや不適切なコンテンツをアップロードする可能性がある | 悪意のあるファイルやコンテンツを自動的にスキャンしてブロックする |
| **コンプライアンス** | 企業のセキュリティポリシー要件への準拠が困難              | 企業レベルのウイルス対策および DLP ソリューションを連携   |
| **柔軟性**      | コンテンツ検出ロジックを自社で開発する必要がある            | 標準プロトコルを用いて専門的なサードパーティサービスを連携    |
| **保守性**      | ウイルス定義や検出ルールを継続的に更新する必要がある          | 専門ベンダーが検出エンジンの保守を担当              |

### 1.2 一般的な活用シーン

* **ファイルアップロードのセキュリティ**: ナレッジベースへアップロードする文書を、事前にウイルススキャンする
* **対話コンテンツのフィルタリング**: 対話の中に不適切な発言や機密情報が含まれていないか検出する
* **情報漏洩防止 (DLP)**: 機密情報を含むファイルのアップロードを防ぐ
* **コンプライアンスチェック**: コンテンツが GDPR、HIPAA などの法令要件に準拠していることを確認する

***

## 2. MaiAgent ICAP 連携アーキテクチャ

```mermaid
flowchart TB
    subgraph Client["クライアント"]
        User["ユーザー"]
        WebChat["WebChat インターフェース"]
    end
    
    subgraph MaiAgent["MaiAgent プラットフォーム"]
        API["Upload API"]
        Queue["処理キュー"]
        ICAP_Client["ICAP クライアント"]
        DB[("データベース")]
        Storage[("ファイルストレージ")]
    end
    
    subgraph ICAP_Service["ICAP サービス"]
        Scanner["ウイルス対策エンジン"]
        DLP["DLP エンジン"]
        Filter["コンテンツフィルター"]
    end
    
    User -- "ファイルをアップロード" --> WebChat
    WebChat -- "HTTP POST" --> API
    API --> Queue
    Queue --> ICAP_Client
    
    ICAP_Client <-. "ICAP REQMOD" .-> Scanner
    ICAP_Client <-. "ICAP RESPMOD" .-> DLP
    ICAP_Client <-. "ICAP OPTIONS" .-> Filter
    
    ICAP_Client -- "検証通過" --> Storage
    ICAP_Client -- "結果を記録" --> DB
    
    ICAP_Client -. "検証失敗<br/>イベント送信" .-> WebChat
    WebChat -. "エラー表示" .-> User
```

### 2.1 中心コンポーネントの説明

* **ICAP クライアント**: MaiAgent に組み込まれた ICAP プロトコルの実装で、ICAP サーバーとの通信を担当します
* **ICAP サーバー**: Symantec、McAfee、Trend Micro のウイルス対策ゲートウェイなど、サードパーティのコンテンツスキャンサービスです
* **処理キュー**: ファイルのアップロードとスキャンタスクを非同期で処理し、ユーザー操作のブロッキングを回避します
* **スキャン記録**: ファイルハッシュ、スキャン時刻、結果などの情報を含む、すべてのスキャン結果を保存します

### 2.2 ICAP リクエストフロー

```mermaid
sequenceDiagram
    participant User as ユーザー
    participant WebChat as WebChat
    participant MaiAgent as MaiAgent API
    participant ICAP as ICAP サーバー
    participant Storage as ファイルストレージ
    
    User->>WebChat: ファイルをアップロード
    WebChat->>MaiAgent: POST /upload
    MaiAgent->>MaiAgent: ファイル ID を生成
    
    Note over MaiAgent,ICAP: ICAP REQMOD リクエスト
    MaiAgent->>ICAP: REQMOD /scan HTTP/1.1<br/>Encapsulated: req-hdr=0, req-body=...
    ICAP->>ICAP: ファイル内容をスキャン
    
    alt ファイルが安全
        ICAP-->>MaiAgent: 200 OK (ファイル通過)
        MaiAgent->>Storage: ファイルを保存
        Storage-->>MaiAgent: 保存成功
        MaiAgent-->>WebChat: 200 OK {fileId: ...}
        WebChat-->>User: アップロード成功
    else ファイルに問題あり
        ICAP-->>MaiAgent: 403 Forbidden (ウイルス/違反コンテンツ)
        MaiAgent->>WebChat: Socket.IO: ICAP_BLOCKED イベント
        WebChat-->>User: エラーメッセージを表示
        MaiAgent->>MaiAgent: スキャン失敗を記録
    else ICAP サーバーエラー
        ICAP-->>MaiAgent: 500 Internal Server Error
        MaiAgent->>WebChat: Socket.IO: ICAP_ERROR イベント
        WebChat-->>User: システムエラー、しばらくしてから再試行してください
        MaiAgent->>MaiAgent: エラーログを記録
    end
```

***

## 3. ICAP プロトコル実装の詳細

### 3.1 ICAP リクエスト形式

MaiAgent は REQMOD (Request Modification) モードを使用して、ファイルを ICAP サーバーへ送信します:

```http
REQMOD icap://icap-server.example.com/scan ICAP/1.0
Host: icap-server.example.com
Encapsulated: req-hdr=0, req-body=147
Allow: 204

POST /upload HTTP/1.1
Host: maiagent.ai
Content-Type: application/octet-stream
Content-Length: 1024

400
[Binary file content in chunked encoding]
0
```

**主要フィールドの説明**:

* **REQMOD**: リクエスト修正モード。コンテンツを保存する前にチェックを行うために使用します
* **Encapsulated**: HTTP リクエストのカプセル化形式を記述します
* **Allow: 204**: コンテンツを修正する必要がない場合、ICAP サーバーが 204 を直接返してよいことを伝えます
* **Chunked Encoding**: チャンク転送エンコーディングを使用してファイル内容を送信します

### 3.2 チャンク転送エンコーディング (Chunked Transfer Encoding)

MaiAgent は HTTP チャンク転送エンコーディングを正しく実装しています:

```
チャンク転送形式:
<データサイズ（16進数）>\r\n
<データ内容>\r\n
...
0\r\n\r\n  (終了マーカー)
```

**なぜ正しいチャンクエンコーディングが必要なのか？**

* ICAP プロトコルでは、リクエストおよびレスポンスのボディを HTTP チャンク転送エンコーディングで送信することが求められます
* エンコーディング形式が誤っていると、ICAP サーバーがファイル内容を正しく解析できなくなります
* MaiAgent はチャンクサイズの16進数表記を修正し、ICAP 標準との互換性を確保しています

### 3.3 ICAP レスポンスの処理

ICAP サーバーは以下のレスポンスを返す可能性があります:

| ステータスコード               | 意味                     | MaiAgent の処理方法                       |
| ---------------------- | ---------------------- | ------------------------------------ |
| **200 OK**             | コンテンツが検査または修正された       | 修正後のコンテンツ（ある場合）を受け入れ、ファイルを保存         |
| **204 No Content**     | コンテンツの修正は不要            | 元のファイルをそのまま保存                        |
| **403 Forbidden**      | コンテンツが禁止された（ウイルスを含むなど） | 保存を拒否し、クライアントへ ICAP\_BLOCKED イベントを送信 |
| **500 Internal Error** | ICAP サーバーエラー           | エラーを記録し、クライアントへ ICAP\_ERROR イベントを送信  |

***

## 4. WebChat 連携

ICAP スキャンが完了すると、システムはスキャン結果をリアルタイムでユーザーに通知します:

* **ファイルがブロックされた場合**: ファイルが拒否された理由（ウイルスが検出されたなど）を説明する、わかりやすいエラーメッセージを表示します
* **システムエラーの場合**: しばらくしてから再試行するようユーザーに促し、エラーログを記録します

### ユーザー体験の最適化

* **リアルタイムなフィードバック**: ファイルのアップロード後、すぐに「スキャン中」のステータスを表示します
* **進捗表示**: 大容量ファイルのアップロード時には進捗バーを表示します
* **わかりやすいエラーメッセージ**: ファイルが拒否された理由を、平易な言葉で説明します
* **再試行の仕組み**: 一時的なエラーの場合は、再アップロードの選択肢を提供します

***

## 5. スキャン記録の管理

### 5.1 記録の保存

MaiAgent はすべての ICAP スキャンの詳細な記録を保存します:

各スキャン記録には以下の情報が含まれます:

| フィールド     | 説明                                |
| --------- | --------------------------------- |
| ファイル識別子   | スキャン対象ファイルの一意な識別子                 |
| ファイル名     | 元のファイル名                           |
| ファイルハッシュ値 | SHA-256 ハッシュ。ファイルの完全性を確認するために使用   |
| スキャン結果    | PASS（通過）、BLOCKED（ブロック）、ERROR（エラー） |
| スキャン理由    | ファイルがブロックされた際の具体的な理由を記録           |
| ICAP サーバー | スキャンを実行した ICAP サーバーのアドレス          |
| スキャン時刻    | スキャンが実行された時刻のタイムスタンプ              |
| ユーザー/組織   | スキャンを実行したユーザーと所属組織                |

### 5.2 期限切れ記録のクリーンアップ

MaiAgent は自動クリーンアップの仕組みを実装しており、期限切れのスキャン記録を定期的に削除します:

システムはバックグラウンドのスケジュールタスクを通じて、保持期限を超えたスキャン記録を自動的にクリーンアップします。

**クリーンアップ方針**:

* **保持期限**: デフォルトでは90日間のスキャン記録を保持します
* **実行頻度**: 週に1回クリーンアップタスクを実行します
* **監査のための保持**: ウイルスの検出など重要なセキュリティイベントは、より長い保持期限を設定できます

***

## 6. 設定とデプロイ

### 6.1 ICAP サーバーの設定

管理者は MaiAgent の管理画面で ICAP サーバー情報を設定する必要があります:

管理者は管理画面で以下の ICAP パラメータを設定できます:

| 設定項目          | 説明                               |
| ------------- | -------------------------------- |
| ICAP サーバーアドレス | ICAP サービスへの接続 URL                |
| タイムアウト時間      | スキャンのタイムアウト秒数                    |
| 再試行回数と間隔      | スキャン失敗時の再試行方針                    |
| スキャン範囲        | ファイルアップロードおよび/または対話コンテンツのスキャンを選択 |
| ファイルサイズ制限     | このサイズを超えるファイルはスキャンしない            |
| 拡張子ホワイトリスト    | スキャン不要のファイルタイプを指定                |

### 6.2 対応している ICAP サービス

MaiAgent は以下の主要な ICAP サービスに対応しています:

* **Symantec Protection Engine**: 企業レベルのウイルス対策とコンテンツフィルタリング
* **McAfee Web Gateway**: ゲートウェイレベルのコンテンツスキャン
* **Trend Micro IWSVA**: 統合型 Web セキュリティとコンテンツスキャン
* **Kaspersky Scan Engine**: Kaspersky の ICAP スキャンエンジン
* **ClamAV (c-icap 経由)**: オープンソースのウイルス対策ソリューション

### 6.3 パフォーマンスに関する考慮事項

システムのパフォーマンスを確保するため、以下を推奨します:

* **非同期スキャン**: 大容量ファイルはバックグラウンドタスクでスキャンし、アップロードレスポンスをブロックしない
* **キャッシュの仕組み**: 同一ファイル（同一ハッシュ値）のスキャン結果をキャッシュする
* **ICAP コネクションプール**: ICAP サーバーとの持続的な接続を維持し、接続のオーバーヘッドを削減する
* **負荷分散**: 複数の ICAP サーバーインスタンスを使用してスキャン負荷を分散する

***

## 7. MaiAgent ICAP 連携の技術的な強み

### 7.1 セキュリティ面の強み

* **多層防御**: ファイルを保存する前にスキャンを行い、悪意のあるコンテンツを防ぎます
* **リアルタイムなブロック**: 脅威を検出すると即座にブロックし、システム内に保存しません
* **専門的なエンジン**: 業界をリードするウイルス対策エンジンと DLP エンジンを連携します
* **完全な記録**: すべてのスキャン活動を詳細に記録し、セキュリティ監査を容易にします

### 7.2 コンプライアンス面の強み

* **標準プロトコル**: 業界標準の ICAP プロトコルを使用し、既存の企業セキュリティ設備との連携が容易です
* **監査証跡**: 完全なスキャン記録がコンプライアンス要件を満たします
* **柔軟な設定**: 業界ごとのコンプライアンス要件に応じてスキャン方針を調整できます
* **データ保護**: DLP エンジンに対応し、機密データの漏洩を防止します

### 7.3 運用面の強み

* **疎結合アーキテクチャ**: ICAP スキャンロジックとアプリケーションが疎結合のため、保守が容易です
* **水平スケーリング**: ICAP サーバーを容易に増設し、より多くのスキャンリクエストを処理できます
* **統合管理**: 企業は既存の ICAP インフラを活用し、すべてのアプリケーションのコンテンツスキャンを統合管理できます
* **詳細なログ**: 完全なスキャンログにより、問題の切り分けとパフォーマンスの最適化が容易になります

***

## 8. 関連ドキュメント

* [AI セキュリティ防御の仕組み](/tech/maiagent-tech-ja/advanced-genai-tech/guardrails.md) - MaiAgent の多層的なセキュリティ防御戦略について
* [ファイルアップロードとナレッジベース管理](https://docs.maiagent.ai/km/km-basic-settings)

### 参考リンク

* [ICAP RFC 3507](https://datatracker.ietf.org/doc/html/rfc3507)
* [Chunked Transfer Encoding (RFC 7230)](https://datatracker.ietf.org/doc/html/rfc7230#section-4.1)
* [Open ICAP Forum](https://www.icap-forum.org/)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.maiagent.ai/tech/maiagent-tech-ja/advanced-genai-tech/icap-content-validation.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
