Difyの安全を守る「Trivy」とは?
DifyをローカルやVPSで運用する際、最も気をつけるべきことの一つが「セキュリティ」です。古いバージョンのイメージを使い続けたり、設定ミスを放置したりすることは、情報漏洩や不正アクセスのリスクに繋がります。
そこで推奨されるのが、オープンソースの脆弱性診断ツール「Trivy(トリビィ)」です。Trivyを使用することで、DifyのDockerイメージや設定ファイルに潜むリスクを簡単に可視化できます。
Trivyで検出できる3つのリスク
Trivyは主に以下の3つの観点からシステムをスキャンします。
- 既知の脆弱性(CVE) OSパッケージ(Alpine, Debian等)や、言語依存のライブラリ(Pythonのpip, Node.jsのnpm等)に含まれる既知の脆弱性を検知します。
- 設定ミス(Misconfiguration) DockerやKubernetesの設定ファイル(IaC)において、特権モードでの実行や不要なポート開放など、セキュリティベストプラクティスに反する設定を指摘します。
- シークレット情報の露出 AWSアクセスキーやGitHubトークンなど、コード内に誤ってハードコーディングされた機密情報を検出します。
2. コンテナ運用への影響
- 停止中でもスキャン可能: Trivyの大きなメリットは、Dockerコンテナが止まった状態でもイメージやファイルをチェックできる点です。
- ネットワーク: データベース更新のために外部通信を行いますが、これは通常のOSアップデートと同じ安全な通信です。
3. 注意点:Trivyで「できないこと」
Trivyはあくまで「設計図(イメージ)や設定ファイルに既知の弱点がないか」を調べるツールです。
- 動的な侵入検知は不可: 「今まさに攻撃者が通信している」といったリアルタイムの監視は Netdata や
ssコマンドの役割です。 - 潜伏済みのマルウェア:
mine.shのような不正ファイルが混入している場合、ファイルシステムスキャン (trivy fs) で検知できる可能性はありますが、すでに実行されてしまっている不正プロセスを止める力はありません。
4. Trivyを実行して解る事
Difyの特定のバージョンが持つ「既知の脆弱性」を突いた以下の内容を検知可能です。
- 現在使っているDifyのイメージに「修正必須」の脆弱性があるかどうかが判明します。
- 「バージョンアップ」をする際に、どのバージョンまで上げれば安全かが明確になります。
Trivyのインストール手順
Ubuntuサーバー(VPS等)へのインストール手順は以下の通りです。
# 必要なパッケージのインストール
sudo apt-get update
sudo apt-get install -y wget apt-transport-https gnupg lsb-release
# 1. 鍵を格納するディレクトリを作成(すでにあれば無視されます)
sudo mkdir -p /etc/apt/keyrings
# 2. 正しい引数でリポジトリの鍵をダウンロードして保存
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sudo sh -s -- -b /usr/local/bin
# 3. バージョン確認
trivy version
#バージョンが表示されれば正常にインストールされています。
実践:Difyの脆弱性をスキャンする
インストールが完了したら、実際にDifyの環境をスキャンしてみましょう。
Difyは稼働中でもスキャン可能です。
1. 設定ファイルの診断(Configスキャン)
まずは docker-compose.yaml などの設定ファイルに不備がないか確認します。
# Difyのdockerディレクトリを指定してスキャン
trivy config ~/dify/docker/
チェックポイント: 結果に Severity: CRITICAL(致命的)や HIGH(高)が表示された場合、ポート設定や権限設定を見直す必要があります。
実行時に「Fatal error」エラーが発生した時の対処方法
trivy を実行すると「Fatal error」が発生する事があります。
2025-12-28T08:23:39+09:00 INFO [misconfig] Misconfiguration scanning is enabled
2025-12-28T08:29:58+09:00 WARN Provide a higher timeout value, see https://trivy.dev/docs/v0.68/guide/references/troubleshooting#timeout
2025-12-28T08:29:58+09:00 FATAL Fatal error run error: fs scan error: scan error: scan failed: failed analysis: post analysis error: post analysis error: dockerfile scan error: scan config error: context deadline exceeded
これは、スキャン結果がエラーという訳ではなく、処理時間のタイムアウトです。その場合は、オプションを指定する事で制限時間を延ばすことが可能です。
#以下は制限時間を5分(通常より長め)に設定して再試行
trivy config --timeout 5m ~/difyai/docker/
2. コンテナイメージの診断(Imageスキャン)
次に、Difyの主要コンテナである「Web(フロントエンド)」と「API(バックエンド)」のイメージ自体をスキャンします。
# Webコンテナの脆弱性診断
trivy image langgenius/dify-web:latest
APIコンテナの脆弱性診断
trivy image langgenius/dify-api:latest
実行すると、以下のようにライブラリごとの脆弱性リストが表示されます。
python:3.6-alpine (alpine 3.15.0)
=================================
Total: 23 (UNKNOWN: 0, LOW: 0, MEDIUM: 2, HIGH: 11, CRITICAL: 10)
┌──────────────┬────────────────┬──────────┬───────────────────┬───────────────┬────────────────────────────────────────────────────────────┐
│ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────────┤
│ busybox │ CVE-2022-28391 │ CRITICAL │ 1.34.1-r3 │ 1.34.1-r5 │ busybox: remote attackers may execute arbitrary code if │
│ │ │ │ │ │ netstat is used │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-28391 │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────────┤
│ expat │ CVE-2022-22822 │ CRITICAL │ 2.4.1-r0 │ 2.4.3-r0 │ expat: Integer overflow in addBinding in xmlparse.c │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-22822 │
│ ├────────────────┤ │ │ ├────────────────────────────────────────────────────────────┤
│ │ CVE-2022-22823 │ │ │ │ expat: Integer overflow in build_model in xmlparse.c │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-22823 │
│ ├────────────────┤ │ │ ├────────────────────────────────────────────────────────────┤
│ │ CVE-2022-22824 │ │ │ │ expat: Integer overflow in defineAttribute in xmlparse.c │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-22824 │
│ ├────────────────┤ │ ├───────────────┼────────────────────────────────────────────────────────────┤
│ │ CVE-2022-23852 │ │ │ 2.4.4-r0 │ expat: Integer overflow in function XML_GetBuffer │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-23852 │
│ ├────────────────┤ │ │ ├────────────────────────────────────────────────────────────┤
│ │ CVE-2022-23990 │ │ │ │ expat: integer overflow in the doProlog function │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-23990 │
├──────────────┼────────────────┼──────────┼───────────────────┼───────────────┼────────────────────────────────────────────────────────────┤
(以下省略)
Python (python-pkg)
===================
Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)
もし Fixed Version(修正バージョン)が提示されている脆弱性が見つかった場合、Dify自体のバージョンアップを行うことで解消される可能性があります。
運用自動化:全イメージの一括スキャン
Difyは複数のコンテナ(Redis, PostgreSQL, Weaviateなど)で構成されています。これらを1つずつ手動でチェックするのは手間がかかるため、スクリプトを使って一括スキャンする方法を紹介します。
一括スキャン用スクリプトの作成
以下の内容で scan.sh というファイルを作成します。このスクリプトは、現在マシンにあるDockerイメージをリストアップし、順次Trivyでスキャンして結果をファイルに出力します。
#!/bin/bash
現在のDockerイメージ一覧を取得
IMAGES=$(docker images --format '{{.Repository}}:{{.Tag}}')
日付ディレクトリの作成
DATE=(date+RESULTD
IR="./trivy result/{DATE}" mkdir -p ${RESULT_DIR}
echo "スキャンを開始します..."
for img in ${IMAGES}; do
イメージ名からファイル名に使用できない文字を置換
FILENAME=$(echo ${img} | sed 's////g' | sed 's/://g')
echo "Scanning: ${img}"
# タイムアウトを10分に設定してスキャン実行
# 深刻度がHIGH, CRITICALのものに絞って出力する場合の例
trivy image --severity HIGH,CRITICAL --timeout 10m ${img} > "${RESULT_DIR}/${FILENAME}.txt"
done
echo "スキャン完了。結果は ${RESULT_DIR} に保存されました。"
スキャン用スクリプト作成
一部のコンテナを対象とする
LIST="`docker images --format '{{.Repository}}:{{.Tag}}' '<コンテナ名>/*' | sed -e 's/[\r\n]\+//g'`"
export CON_LIST="${LIST//$'\n'/ }"
printenv | grep CON_LIST
全てのコンテナを対象とする
LIST="`docker images --format '{{.Repository}}:{{.Tag}}' | sed -e 's/[\r\n]\+//g'`"
export CON_LIST="${LIST//$'\n'/ }"
printenv | grep CON_LIST
vi scan.sh
#!/bin/sh
LENGTH=`echo $CON_LIST | tr ' ' '\n' | wc -l`
d=`date +%Y%m%d`
mkdir -p /app/trivy_result/${d}
if [ "$1" = "-j" -o "$1" = "--json" ]; then
for i in `seq $LENGTH`
do
ELEMENT=`echo $CON_LIST | cut -d ' ' -f $i`
trivy image --timeout 10m -f json $ELEMENT > app/trivy_result/${d}/${ELEMENT##*/}.json
done
else
for i in `seq $LENGTH`
do
ELEMENT=`echo $CON_LIST | cut -d ' ' -f $i`
trivy image --timeout 10m $ELEMENT > app/trivy_result/${d}/${ELEMENT##*/}.txt
done
fi
スクリプトの実行
作成したスクリプトに実行権限を与えて実行します。
chmod +x scan.sh ./scan.sh
これにより、trivy_result/YYYYMMDD/ フォルダ内に、イメージごとの診断レポートがテキストファイルとして保存されます。これを定期的に確認することで、運用中のDify環境を安全に保つことができます。
スキャン実行
以下のコマンドを実行してスキャンを実行する。 結果は、コマンドを実行したディレクトリの./trivy_result/yyyymmddに出力される
docker run -v /var/run/docker.sock:/var/run/docker.sock \
-v /tmp/Caches:/root/.cache/ \ # 脆弱性DB等キャッシュ保存先
-v $PWD:/app \ # scan.shをマウントする
-e CON_LIST \ # 検査対象のコンテナ一覧を環境変数として渡す
--entrypoint "" \
aquasec/trivy sh -c "app/scan.sh"
例 結果をTable形式で出力
docker run -v /var/run/docker.sock:/var/run/docker.sock \
-v /tmp/Caches:/root/.cache/ \
-v $PWD:/app \
-e CON_LIST \
--entrypoint "" \
aquasec/trivy sh -c "app/scan.sh"
例 結果をJson形式で出力
docker run -v /var/run/docker.sock:/var/run/docker.sock \
-v /tmp/Caches:/root/.cache/ \
-v $PWD:/app \
-e CON_LIST \
--entrypoint "" \
aquasec/trivy sh -c "app/scan.sh -j"
まとめ
Trivyは、コンテナを停止させることなく、低負荷でセキュリティチェックを行える非常に有用なツールです。
- Configスキャンで設定ミスを防ぐ
- Imageスキャンで古いライブラリの脆弱性を発見する
- 定期的なスキャンで新たな脅威に備える
Difyをビジネスで利用する場合は、これらのセキュリティ対策を運用フローに組み込むことを強く推奨します。
【推奨】業務システム化に有効なアイテム
生成AIを学ぶ



システム化のパートナー



VPSサーバの選定





コメント