Shellguard について
ShellGuard は、LLM エージェントがリモートの Linux ホストに SSH で接続し、読み取り専用のシェル操作を行えるようにする MCP サーバーです。すべてのコマンドを実行前に解析し、デフォルト拒否の許可リストで検証します。拒否されたコマンドにはエージェント向けの代替案を返します。本番・ステージング・開発環境の障害調査を行う運用担当者や開発者に適しています。
主な機能
- 01リモート Linux ホストへの SSH 接続
- 02コマンドの解析・許可リスト検証・引数の再クォート
- 03デフォルト拒否の読み取り専用コマンドポリシー
- 04拒否されたコマンドへの実用的な代替案の提示
- 05ネイティブ版とシステム版の 2 つの SSH モード
- 06リモートホストへの rg・jq・yq の任意の配備
活用シーン
- 01AI アシスタントによる本番サーバーのログ確認
- 02ステージングや開発環境での読み取り専用診断
- 03ターミナル出力を手作業で貼り付けずに行うリモートの障害調査
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
ShellGuard
ターミナルの出力を AI にコピー&ペーストするのはやめましょう。LLM に SSH でログインさせて、サーバーの中を調べさせましょう。
ShellGuard は、LLM エージェントに SSH 経由でリモートサーバーへの制御された bash アクセスを提供する MCP サーバーです。AI を本番環境、ステージング環境、開発環境のサーバーに接続し、手を動かすことなく、診断の実行、ログの確認、データベースへのクエリ、トラブルシューティングを行えます。
ShellGuard は、Fawdy のチームが開発したオープンソースのセキュリティレイヤーです。平易な英語で根本原因を分析する、Fawdy の AI 搭載 Linux サーバー調査ツールを支えています。
ShellGuard は、MCP 対応の AI エージェントと組み合わせて単体で使用することも、Fawdy で包括的な調査機能を試すこともできます。
ShellGuard を選ぶ理由
AI エージェントは強力ですが、本番サーバーへの制限のないシェルアクセスを許可するのは危険です。ShellGuard は、コマンドレベルで読み取り専用アクセスを徹底することで、この問題を解決します。すべてのコマンドを解析し、許可リストに照らして検証したうえで、再構成してから実行します。エージェントが破壊的な操作を試みると、ShellGuard がそれをブロックし、代わりに何をすべきかをエージェントに伝えます。
コマンドは、厳選された監視・診断ツールに制限されています。破壊的な操作は、LLM が自力で修正して調査を続けられるよう、実行に役立つ提案とともにブロックされます。
wget -r->"再帰的なダウンロードは許可されていません"tail -f->"追跡モードはタイムアウトまで終了しません。直近の行を確認するには tail -n 100 を使用してください。"sed->"ストリーム編集ではファイルを変更できるため、読み取り専用アクセスのみ許可されます。検索には grep を使用してください。"$HOME/file->"変数展開は行われません。絶対パスを使用してください。"
クイックスタート
インストール
brew install fawdyinc/tap/shellguard
または、最新のバイナリをダウンロードします。
curl -fsSL https://raw.githubusercontent.com/fawdyinc/shellguard/main/install.sh | sh
または、Go を使用します。
go install github.com/fawdyinc/shellguard/cmd/shellguard@latest
MCP クライアントで設定する
ShellGuard は引数不要の stdio MCP サーバーとして起動します。お好みの MCP クライアントに追加してください。
Cursor
次の場所に移動します:Settings -> Cursor Settings -> MCP -> Add new global MCP server
または、以下を ~/.cursor/mcp.json ファイルに貼り付けます。プロジェクトフォルダーに .cursor/mcp.json を作成して、プロジェクトごとにインストールすることもできます。詳しくは、Cursor MCP のドキュメントをご覧ください。
{
"mcpServers": {
"shellguard": {
"command": "shellguard"
}
}
}
Claude Desktop
以下を Claude Desktop の設定ファイルに追加します。詳しくは、Claude Desktop MCP のドキュメントをご覧ください。
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"shellguard": {
"command": "shellguard"
}
}
}
Claude Code
以下のコマンドを実行します。詳しくは、Claude Code MCP のドキュメントをご覧ください。
claude mcp add shellguard -- shellguard
OpenCode
以下を OpenCode の設定ファイルに追加します。詳しくは、OpenCode MCP のドキュメントをご覧ください。
{
"mcp": {
"shellguard": {
"type": "local",
"command": ["shellguard"],
"enabled": true
}
}
}
VS Code / GitHub Copilot
以下を VS Code の settings.json または .vscode/mcp.json に追加します。詳しくは、VS Code MCP のドキュメントをご覧ください。
ユーザー設定(settings.json)
{
"mcp": {
"servers": {
"shellguard": {
"type": "stdio",
"command": "shellguard"
}
}
}
}
ワークスペース設定(.vscode/mcp.json)
{
"servers": {
"shellguard": {
"type": "stdio",
"command": "shellguard"
}
}
}
Zed
以下を Zed の設定ファイル(~/.config/zed/settings.json)に追加します。詳しくは、Zed MCP のドキュメントをご覧ください。
{
"context_servers": {
"shellguard": {
"command": {
"path": "shellguard",
"args": []
}
}
}
}
Roo Code
次の場所に移動します:Roo Code Settings -> MCP Servers -> Edit MCP Settings
または、以下を Roo Code の MCP 設定ファイルに追加します。詳しくは、Roo Code MCP のドキュメントをご覧ください。
{
"mcpServers": {
"shellguard": {
"command": "shellguard"
}
}
}
ShellGuard は LLM に 6 つのツールを公開します。
| ツール | 説明 |
|---|---|
connect | リモートホストへの SSH 接続を確立します |
execute | 検証済みのシェルコマンドをリモートホストで実行します |
disconnect | SSH 接続を閉じます |
sleep | 診断チェックの間に待機します(最大 15 秒) |
provision | 診断ツール(rg、jq、yq)をリモートホストにデプロイします |
download_file | SFTP 経由でリモートホストからファイルをダウンロードします(上限 50MB) |
provision、download_file、sleep は、disabled_tools 設定オプションまたは SHELLGUARD_DISABLED_TOOLS 環境変数で無効にできます。
LLM はサーバーに接続してコマンドを実行し、その出力を読み取ります。コンテキストを切り替えることなく、手動で行う場合と同じワークフローを実行できます。
仕組み
すべてのコマンドはリモートホストに届く前に、次のパイプラインを通ります。
- 解析 — bash を AST に解析します。シェルのトリック(セミコロン、リダイレクト、コマンド置換など)は構文レベルで拒否されます。
- 検証 — コマンド、フラグ、引数を、厳選されたコマンドの許可リスト(明示的な拒否リストも含む)と照合します。デフォルトでは拒否されます。
- 再構築 — インジェクションを防ぐため、引数を再度引用符で囲みます。
- 実行 — コマンドを SSH 経由で実行し、コマンドごとのタイムアウトと出力の切り捨てを適用します。
詳細については、ARCHITECTURE.md を参照してください。
SSH 設定
認証
ShellGuard は次の順序で認証方式を試し、最初に成功した方式で停止します。
| 優先順位 | 方式 | ソース | 失敗時 |
|---|---|---|---|
| 1 | 明示的な鍵 | connect の identity_file パラメーター | 致命的 — 接続は直ちに失敗します |
| 2 | ssh-agent | SSH_AUTH_SOCK Unix ソケット | 無視 — スキップされます |
| 3 | デフォルトの鍵 | ~/.ssh/id_ed25519、id_ecdsa、id_rsa | 無視 — スキップされます |
パスフレーズで保護された鍵は、デフォルトの鍵の検出時に無視されます。パスフレーズで保護された鍵を identity_file で指定すると、接続は失敗します。まず、次のようにして鍵をエージェントに追加してください。ssh-add ~/.ssh/my_key
SSH モード
ShellGuard は 2 つの SSH モードに対応しています。
| モード | 説明 |
|---|---|
native | (デフォルト) Go 組み込みの SSH ライブラリを使用します。~/.ssh/config から HostName、User、Port、IdentityFile を読み込みます。軽量で、外部依存関係はありません。 |
system | ローカルの ssh バイナリを使用します。ProxyJump、ProxyCommand、Match ブロックなど、すべての OpenSSH 機能を含む ~/.ssh/config の完全なサポートを提供します。ssh のインストールが必要です。 |
踏み台ホスト経由で接続する場合、ProxyJump を使用する場合、または SSH 設定の Match ブロックに依存する場合は、system モードを有効にしてください。
ssh:
mode: system
export SHELLGUARD_SSH_MODE=system
mode が system に設定されていても ssh バイナリが見つからない場合、ShellGuard は警告をログに記録し、native モードにフォールバックします。
Native モードの制限事項: Match ディレクティブ、ProxyJump、ProxyCommand、ForwardAgent には対応していません。インフラストラクチャでこれらの機能が必要な場合は、system モードを使用してください。
System モードに関する注意事項:
- ホスト鍵の検証はすべて OpenSSH が処理します。
host_key_checkingとknown_hosts_fileの設定は native モードでのみ適用されます。 - 接続は OpenSSH の
ControlMasterを使用して多重化されるため、ホストごとの最初の接続でのみ SSH ハンドシェイクのコストが発生します。
ホスト鍵の検証
ShellGuard は ~/.ssh/known_hosts を使用して SSH ホスト鍵を検証します。利用できるモードは 3 つです。
| モード | 動作 |
|---|---|
accept-new | (デフォルト) 初回接続時に信頼します。不明なホストは受け入れられ、known_hosts に書き込まれます。鍵の変更は拒否されます。 |
strict | ホスト鍵がすでに known_hosts に存在することを必須とします。不明なホストは拒否されます。 |
off | ホスト鍵の検証を完全に無効にします。 |
ホスト鍵が変更された場合は、known_hosts ファイルから古いエントリを削除してください。
設定
設定は YAML 設定ファイルまたは環境変数で指定できます。環境変数が優先されます。
設定ファイルの場所: $XDG_CONFIG_HOME/shellguard/config.yaml(デフォルト:~/.config/shellguard/config.yaml)
ssh:
mode: "native" # native | system
connect_timeout: "10s" # default 10s
retries: 2 # default 2
retry_backoff: "250ms" # default 250ms
host_key_checking: "accept-new" # accept-new | strict | off (native mode only)
known_hosts_file: "~/.ssh/known_hosts" # native mode only
| YAML フィールド | 環境変数 | デフォルト | 説明 |
|---|---|---|---|
ssh.mode | SHELLGUARD_SSH_MODE | native | SSH モード:native(組み込み)または system(ローカルの ssh バイナリを使用) |
ssh.connect_timeout | SHELLGUARD_SSH_CONNECT_TIMEOUT | 10s | TCP および SSH ハンドシェイクのタイムアウト |
ssh.retries | SHELLGUARD_SSH_RETRIES | 2 | 接続/実行の再試行回数 |
ssh.retry_backoff | SHELLGUARD_SSH_RETRY_BACKOFF | 250ms | 基本バックオフ(指数関数的:backoff * 2^attempt) |
ssh.host_key_checking | SHELLGUARD_SSH_HOST_KEY_CHECKING | accept-new | ホスト鍵の検証モード(native モードのみ) |
ssh.known_hosts_file | SHELLGUARD_SSH_KNOWN_HOSTS_FILE | ~/.ssh/known_hosts | known_hosts ファイルのパス(native モードのみ) |
ツールキットのプロビジョニング
リモートサーバーに、必要なツールが常に揃っているとは限りません。connect 時に、ShellGuard は rg、jq、yq の有無を確認します。不足しているツールがある場合、LLM は provision を呼び出してデプロイできます。
| ツール | バージョン | アーキテクチャ |
|---|---|---|
rg(ripgrep) | 14.1.1 | x86_64, aarch64 |
jq | 1.7.1 | x86_64, aarch64 |
yq | 4.52.2 | x86_64, aarch64 |
バイナリは SHA-256 検証を行いながら GitHub Releases からダウンロードされ、ローカルにキャッシュされた後、リモートホストの ~/.shellguard/bin/ にデプロイされます。
ライブラリの使用
ShellGuard は Go ライブラリとして使用できます。
package main
import (
"context"
"log/slog"
"os"
"github.com/fawdyinc/shellguard"
)
func main() {
ctx := context.Background()
logger := slog.New(slog.NewTextHandler(os.Stderr, nil))
err := shellguard.RunStdio(ctx, shellguard.Config{Logger: logger})
if err != nil {
os.Exit(1)
}
}
高度な使い方については、以下のカスタム設定とカスタム実行バックエンドのセクションを参照してください。
カスタム設定
import (
"github.com/fawdyinc/shellguard"
"github.com/fawdyinc/shellguard/manifest"
"github.com/fawdyinc/shellguard/server"
)
manifests, _ := manifest.LoadEmbedded()
// Add or remove commands as needed
core, err := shellguard.New(shellguard.Config{
Manifests: manifests, // Custom registry (nil = embedded defaults)
Executor: myCustomExecutor, // Custom backend (nil = SSH)
Name: "my-server", // MCP server name
Version: "1.0.0", // MCP server version
})
カスタム実行バックエンド
SSH 以外のバックエンドを使用するには、server.Executor インターフェースを実装してください。
type Executor interface {
Connect(ctx context.Context, params ssh.ConnectionParams) error
Execute(ctx context.Context, host, command string, timeout time.Duration) (ssh.ExecResult, error)
ExecuteRaw(ctx context.Context, host, command string, timeout time.Duration) (ssh.ExecResult, error)
SFTPSession(host string) (ssh.SFTPClient, error)
Disconnect(host string) error
}
テスト
make test # Run all tests
make test-race # Run with race detector
make lint # Run go vet
プロジェクト構成
shellguard/
shellguard.go # Top-level constructor (New, RunStdio)
cmd/shellguard/ # CLI entrypoint
server/ # MCP server core, tool registration, Executor interface
parser/ # Shell AST parser (mvdan.cc/sh/v3)
validator/ # Command/flag/SQL validation engine
manifest/ # YAML command registry (embed.FS)
manifests/ # allowed command manifests
manifests/denied/ # denied command manifests
ssh/ # SSH manager, ShellQuote, ReconstructCommand
output/ # Output truncation (64KB cap)
toolkit/ # Diagnostic tool provisioning (rg, jq, yq)
すべての機能を試す
ShellGuard 単体でも優れていますが、平易な英語による根本原因レポート付きのインシデント調査を自動化したい場合は、Fawdyをご覧ください。Fawdy は ShellGuard 経由で Linux サーバーに接続し、インシデントを自動で調査します。セットアップは 10 分です。
ライセンス
Apache License 2.0 です。詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。