🐕

Gemini CLIのサンドボックス機能の紹介

に公開

はじめに

Gemini CLIのセキュリティリスクを最小限に抑えながら、実際の開発現場で使うにはどうすればよいか考えた時に、サンドボックス機能というものがあるらしいので、簡単にまとめていく。

Gemini CLIとは?

Googleが開発した大規模言語モデル「Gemini」の能力を、PCのターミナル(コマンドラインインターフェース)から直接利用できるようにしたオープンソースのツールのことです。

サンドボックス機能とは?

AIが安全にコードやファイル操作を実行するための隔離環境です。
これにより、意図しない挙動や誤操作によるシステムの損傷を防ぎ、安心してAIに作業を任せられます。
特に、コードの生成や修正、ファイルの整理といった、システムに直接影響を与える可能性のあるタスクを扱う際に不可欠な機能です。

なぜサンドボックスが必要なのか?

AIに「不要なファイルを削除して」と指示したとします。
もしAIが「不要」という概念を誤って解釈した場合、重要なソースコードや設定ファイル、さらにはシステムファイルまで削除してしまうリスクがあります。

サンドボックス機能は、このようなリスクからシステムを守ります。
gemini -sのように -s または --sandbox フラグを付けてコマンドを実行すると、Gemini CLIの動作は厳格なルールの下で制限されます。
これにより、AIが意図しない挙動をしても被害は最小限に抑えられます。

サンドボックスが守ってくれる主な対象

ファイルシステム

現在のプロジェクトディレクトリ内でのみファイル操作が許可されます。
ホームディレクトリの重要な設定ファイル(例: ~/.ssh/, ~/.gitconfig)やドキュメントフォルダなど、指定された場所以外への書き込みはブロックされます。

ネットワーク

意図しない外部通信を防ぐため、ネットワークアクセスを完全に遮断したり、特定のプロキシ経由のみを許可したりといった制御が可能です。

プロセス

サンドボックス内の操作は、ホストOSから隔離された環境で実行されます。これにより、システム全体に影響を及ぼすような危険なコマンドの実行が制限されます。

サンドボックスの基本的な使い方

起動方法

geminiコマンドに-sまたは--sandboxフラグを付けます。

# -s フラグでサンドボックスを有効化
gemini -s -p "このコードのエラーを修正して"

# --sandbox でも同様
gemini --sandbox -p "README.mdを生成して"

これだけで、Gemini CLIのファイル操作やコマンド実行といった全てのツール呼び出しが、保護されたサンドボックス環境内で実行されるようになります。

環境に応じた自動検出

Gemini CLIは、環境を自動で検知して最適なサンドボックス方式を選択します。

macOSとコンテナベース、2つの方式

サンドボックスには、主に2つの方式があります。

1.macOS Seatbelt (sandbox-exec)

macOSに標準搭載されているカーネルレベルのセキュリティ機能を利用します。
Appleの公式アプリ(SafariやMailなど)の保護にも使われている技術で、高速に動作するのが特徴です。

2.コンテナベース (Docker/Podman)

macOS以外のOSや、より厳格な隔離が必要な環境で利用されます。
コンテナ技術(Docker/Podman)を使うことで、ホストOSから完全に隔離された環境を提供します。
これにより、プラットフォームに依存せず、高いセキュリティと一貫した動作を確保できます。

項目 macOS Seatbelt コンテナベース
対応OS macOSのみ Windows, macOS, Linux
隔離レベル プロセスレベル 完全なシステムレベル(コンテナ)
オーバーヘッド 非常に軽量で高速 比較的大きい
ユースケース 日常的な開発、素早いコマンド実行 環境差異をなくしたい、より厳格な隔離が必要な場合

サンドボックス環境を使うデメリット

  • インターネット接続の制限
    サンドボックス環境はセキュリティ上の理由から、インターネットに接続できない。
    そのため、外部APIへのアクセスや、pipコマンドで新しいライブラリをダウンロードするような処理が実行できません。

  • リソースの制限
    サンドボックスは、実行時間やメモリ使用量に制限があるため、長時間の処理や、大量のメモリを消費するタスクは実行できない。

まとめ

メリット・デメリットはあるものの、Gemini CLIのサンドボックス機能を使うことで、AIが意図しない危険な操作を防ぐことができるので、実際の開発現場ではこの機能は必須だと思った!

EMP Tech Blog

Discussion