mcpField
L
LogCarverGuard

LogCarverGuard

ローカル
github.comセキュリティ12 日前に更新

LogCarverGuard について

LogCarverGuardは、コーディングエージェントによるSQL Serverへのアクセスを制御するMCPプロキシです。T-SQLを解析して指定された危険な文を遮断し、SQLログインの権限でクエリを実行して、実行・遮断の記録を監査ログに残します。

主な機能

  1. 01単一のMCPツールでSQLを実行
  2. 02T-SQLを解析して危険な文を遮断
  3. 03呼び出し元のSQLログイン権限を適用
  4. 04読み取り専用モードと管理者許可リスト
  5. 05SQLite監査ログに操作を記録

活用シーン

  1. 01コーディングエージェントに本番SQL Serverの参照を許可
  2. 02エージェントのSQL操作を読み取り専用に制限
  3. 03実行・遮断された文の監査記録を保存

MCP 対応

MCPクライアントに`execute_sql`ツールを提供します。ローカルstdioモードと、APIキーで保護された中央HTTPプロキシに対応します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ
パッケージ
nugetLogCarverGuard.Local0.1.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

LogCarverGuard

English | 繁體中文

AI コーディングエージェント(Claude Code、Cursor、…)が、実際の認証情報を渡されたり、自由に操作したりすることなく、本番環境の SQL Server を読み書きできるようにするMCP プロキシです。すべてのステートメントは呼び出し元自身の SQL ログインと権限で実行され、危険なステートメントはデータベースに届く前にブロックされ、すべて監査ログに記録されます。

ステータス: 初期段階(v0.1)。

できること

AI agent --(MCP, API key)--> LogCarverGuard proxy --(EXECUTE AS the caller's own login)--> SQL Server
  • ツールは execute_sql の1つだけです。 読み取りも書き込みもこれを通じて行います。SELECT は行を返します(先頭の100行を表示し、残りの件数も示します)。書き込みは実行され、監査ログに記録されます。
  • 許可する操作は、キーワードの照合ではなく実際の T-SQL パーサーが判定します。 そのため、コメントや文字列内に偽のキーワードがあっても何も起きません。
  • AI がデータベースのパスワードを見ることはありません。 プロキシはサービスログインを1つ保持します。各ユーザーには、それぞれの SQL ログインに紐づく API キーが割り当てられます。プロキシはそのログインになりすますため、既存の GRANT/DENY によって実行できる操作が引き続き決まります。
  • サービスログインに sysadmin 権限は必要ありません。 各ユーザーのログインに対する IMPERSONATE 権限と、接続先データベースに接続するためのデータベースユーザーが必要です。ホストテストでは、sysadmin ではないサービスアカウントを通じて SELECT、UPDATE、権限拒否となる DELETE を実行します。
  • データ変更は、プロキシが管理するトランザクション内で実行されます。 INSERT/UPDATE/DELETE を含むバッチは、いずれかのステートメントが失敗すると全体がロールバックされます。DDL(ALTER TABLE…)、TRUNCATE、EXEC はそのまま実行され、バッチの一部としてロールバックされることはありません。呼び出し元からの BEGIN TRAN/COMMIT/ROLLBACK はブロックされます。
  • ローカル SQLite ファイルに監査ログを記録します。 誰が、いつ、どの SQL を実行し、ブロックされたか実行されたかを記録します。実行されたステートメントはコミット後に記録されます。SQL Server が拒否したステートメント(権限拒否など)や、不正なキーを使ったリクエストは記録されません。
常にブロックされる操作

DROP TABLE、DROP DATABASE、RESTORE DATABASE/RESTORE LOG、ALTER DATABASE … SET、sp_executesql、xp_cmdshell、変数または文字列による動的な EXEC、ID の切り替え(REVERT、EXECUTE AS、SETUSER)、権限の変更(GRANT、DENY、REVOKE)、呼び出し元が管理するトランザクション(BEGIN TRAN、COMMIT、ROLLBACK、SAVE TRANSACTION)。

管理者が許可リストに登録しない限りブロックされる操作

TRUNCATE TABLE、ALTER TABLE … DROP COLUMN、名前を指定したストアドプロシージャの EXEC(INSERT … EXEC を含む)。許可リストのエントリは schema.name 形式で記述します。データベース名またはサーバー名を指定したステートメント(OtherDb.dbo.T、[srv].db.dbo.P)が照合されることはありません。

このリストは意図的に限定しています。「AI が問題を起こす可能性のあるすべて」を対象にしているわけではありません。DROP INDEX、sp_rename、BACKUP DATABASE、リンクサーバーの OPENQUERY は特別に処理されず、実際のログインに実行権限があれば実行されます。実際のセキュリティ境界は SQL ログイン自身の権限です。 そのため、各 API キーには許容できる範囲で最小権限のアカウントを割り当て、sysadmin や db_owner は決して使わないでください。

ローカルモード

AI ツールが stdio 経由で起動し、ご自身のマシン上で実行されます。サーバー、Docker、API キーは不要です。設定は環境変数のみから読み込まれます(appsettings.json やコマンドラインからは読み込まれません)。Windows で統合認証を使用してテスト済みです。

dotnet tool install -g LogCarverGuard.Local
claude mcp add logcarverguard --env LOGCARVERGUARD_CONNECTION_STRING="Server=localhost;Database=MyDb;Integrated Security=true;TrustServerCertificate=true" -- logcarverguard

または、dnx 経由でインストールせずに実行できます(コマンドの末尾に -- dotnet dnx LogCarverGuard.Local --yes を付けてください)。

変数用途デフォルト
LOGCARVERGUARD_CONNECTION_STRING(または _FILE)ステートメントの実行に使用するログイン必須
LOGCARVERGUARD_READ_ONLYtrue にするとクエリのみ許可されますfalse
LOGCARVERGUARD_AUDIT_DB_PATH監査ログの SQLite ファイルローカルアプリケーションデータフォルダー内の LogCarverGuard/audit.db
LOGCARVERGUARD_TRUNCATE_ALLOWLIST、LOGCARVERGUARD_EXEC_WHITELIST、LOGCARVERGUARD_ALTER_DROP_COLUMN_ALLOWLIST中央サービスと同じ許可リスト空(すべてブロック)

読み取り専用モードでは、SELECT(INTO を含まないもの)に加えて、SET、DECLARE、PRINT が許可されます。それ以外はすべて、理由とともにブロックされます。許可リストにある場合でも EXEC はブロックされ、NEXT VALUE FOR や、別のサーバーで書き込みを実行できるリモートまたはファイルソースの OPENQUERY、OPENROWSET、OPENDATASOURCE もブロックされます。読み取り専用モードで防げないものは、副作用のある CLR 関数または拡張ストアドプロシージャ関数を呼び出す SELECT、長時間実行されるクエリや高負荷のクエリ、ロックです。また、ログインには必要な権限だけを付与してください。このガードは第 1 層ではなく、第 2 層です。

ローカルモードとは何か、何ではないか。 エージェントが誤って破壊的な操作を行うのを防ぐためのガードレールです。セキュリティ境界ではありません。

  • 接続文字列、つまり認証情報は、ご自身のマシンと AI ツールの設定内にあります。シェルコマンドの実行やその設定の読み取りが可能なエージェントは、このプロキシを迂回して SQL Server に直接接続できます。
  • すべてのステートメントは、接続文字列に指定された 1 つのログインとして実行されます。個人ごとの ID はなく、監査ログにはオペレーティングシステムのユーザー名が記録され、ローカルファイルに保存されます。
  • 実際の境界が必要な場合は、以下の中央サービスを使用してください。SQL Server が接続を受け付けるのはプロキシからのみで、各ユーザーにはそれぞれのログインがあります。

中央サービスのインストール

Docker を搭載した Linux ホストと、TCP/IP および混合モード認証が有効な SQL Server が必要です。

  1. サービスログインを作成し、各ユーザー自身のログインを偽装できるようにします。

    CREATE LOGIN logcarverguard_svc WITH PASSWORD = '…';
    GRANT IMPERSONATE ON LOGIN::[alice_sql_login] TO logcarverguard_svc;
    

対象データベースで、サービスログイン用のデータベースユーザーと各ユーザーのログイン用のデータベースユーザーを作成し、各ユーザーに通常の権限を付与します。プロキシが権限を拡大することはありません。

CREATE USER logcarverguard_svc FOR LOGIN logcarverguard_svc;
CREATE USER alice_sql_login FOR LOGIN alice_sql_login;
GRANT SELECT, UPDATE ON dbo.Orders TO alice_sql_login;
  1. クローンして設定

    git clone https://github.com/caiderek/LogCarverGuard
    cd LogCarverGuard
    

docker-compose.yml を編集し、LOGCARVERGUARD_SQLSERVER_CONNECTION_STRING を設定します。本番環境では、シークレットファイルをマウントし、LOGCARVERGUARD_SQLSERVER_CONNECTION_STRING_FILE を使用することを推奨します。

  1. 起動

    docker compose up -d --build
    docker compose logs -f
    
  2. API キーを発行します(--login にはサービスログインではなく、ユーザー自身の SQL ログインを指定します)。キーは一度だけ表示されます。

    docker compose exec logcarverguard dotnet cli/LogCarverGuard.Cli.dll \
      issue-key --owner alice --login alice_sql_login
    
  3. MCP クライアントの接続先を http://<host>:8080/ に設定し、ヘッダー X-LogCarverGuard-Key にキーを指定します。

その他のキー関連コマンド:list-keys(キー自体は表示されません)と revoke-key --id <n>。

設定

すべての設定は環境変数で行います。環境変数は appsettings.json より優先されます。

変数用途デフォルト
LOGCARVERGUARD_SQLSERVER_CONNECTION_STRING(または _FILE)プロキシのサービスログイン必須
LOGCARVERGUARD_AUDIT_DB_PATH監査ログの SQLite ファイルlogcarverguard-audit.db
LOGCARVERGUARD_APIKEYS_DB_PATHAPI キーの SQLite ファイルlogcarverguard-apikeys.db
LOGCARVERGUARD_TRUNCATE_ALLOWLISTTRUNCATE を許可するテーブル空(すべてブロック)
LOGCARVERGUARD_EXEC_WHITELISTEXEC を許可するストアドプロシージャ空(すべてブロック)
LOGCARVERGUARD_ALTER_DROP_COLUMN_ALLOWLISTDROP COLUMN を許可するテーブル空(すべてブロック)
LOGCARVERGUARD_ALLOWED_CLIENT_IPS接続を許可する IP アドレス/CIDR 範囲。キーより先に確認されます空(制限なし)
LOGCARVERGUARD_TRUSTED_PROXIESX-Forwarded-For の設定を信頼するピア(リバースプロキシ経由の場合のみ)空(ヘッダーは読み取られません)
ASPNETCORE_URLSリッスンアドレスデプロイ環境に依存

接続文字列の Initial Catalog を、エージェントが操作するデータベースに設定してください。

本番環境のセキュリティ強化

  • 本番環境では TrustServerCertificate=true を設定したままにしないでください。 サンプルの接続文字列では利便性のために指定しています。これは SQL Server の証明書の検証を無効にするため、信頼できる証明書をインストールして、この設定を削除してください。
  • TLS を使用してください。 キーは HTTP ヘッダーで送信されます。平文の HTTP では盗聴される可能性があり、キーを入手した人はそのキーに紐づくすべての SQL アクセス権を得ます。TLS を終端するリバースプロキシを前段に配置してください。compose ファイルがデフォルトで 127.0.0.1 にバインドするのはそのためです。
  • ホストのファイアウォールに加えて、LOGCARVERGUARD_ALLOWED_CLIENT_IPS で接続元を制限してください。リバースプロキシ経由の場合は、LOGCARVERGUARD_TRUSTED_PROXIES も設定してください。設定しないと、すべてのリクエストがプロキシから来たように見えます。
  • /data ボリュームをバックアップしてください。監査ログとキーのハッシュが保存されています。
  • .NET ランタイムと MCP SDK を最新の状態に保ってください。

既知の制限

  • SQL Server のみ対応しています。中央サービスは Linux(Docker)上で動作します。ローカルモードは統合認証を使用して Windows でテストされています。
  • この MCP 接続経由で送信された SQL のみを制御します。エージェントがほかのツール(ファイル、API、クラウドコンソール)を利用できる場合、このプロキシではそれらを確認したり停止したりできません。
  • API キーは単一の静的シークレットです。mTLS、デバイスバインディング、有効期間の短いトークンには対応していません。
  • 読み取り時のマスキングはありません。アカウントに機密データを SELECT する権限があれば、エージェントもそのデータを読み取れます。
  • SQL Server 自身のエラーテキストは、そのまま呼び出し元に返されます。データベース、オブジェクト、ログイン名が示される場合があります。また、OPENROWSET/OPENQUERY などの機能はブロックされないため、十分な権限を持つキーを所持するエージェントは、それらを使って SQL Server がアクセスできる範囲を調べられます。
  • SELECT の結果はメモリに最大 1000 行まで保持されます(最初の 100 行を表示し、実際の件数を報告します)。
  • 監査ログは SQLite ファイルとして直接読み取ります。これを閲覧する MCP ツールはありません。

ビルドとテスト

dotnet build
dotnet test

統合テストには、ローカルの SQL Server と sysadmin 権限を持つ Windows ログインが必要です。テストでは独自の LogCarverGuard_* データベースとログインを作成、削除します。

関連プロジェクト

LogCarver(無料、MIT)は、SQL Server のトランザクションログから削除された行を読み取ります。LogCarver.Mcp は、MCP 経由で AI アシスタントから利用できるようにします。

ライセンス

MIT。詳細は LICENSE を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。