LogCarverGuard について
LogCarverGuardは、コーディングエージェントによるSQL Serverへのアクセスを制御するMCPプロキシです。T-SQLを解析して指定された危険な文を遮断し、SQLログインの権限でクエリを実行して、実行・遮断の記録を監査ログに残します。
主な機能
- 01単一のMCPツールでSQLを実行
- 02T-SQLを解析して危険な文を遮断
- 03呼び出し元のSQLログイン権限を適用
- 04読み取り専用モードと管理者許可リスト
- 05SQLite監査ログに操作を記録
活用シーン
- 01コーディングエージェントに本番SQL Serverの参照を許可
- 02エージェントのSQL操作を読み取り専用に制限
- 03実行・遮断された文の監査記録を保存
MCP 対応
MCPクライアントに`execute_sql`ツールを提供します。ローカルstdioモードと、APIキーで保護された中央HTTPプロキシに対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
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_ONLY | true にするとクエリのみ許可されます | 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 が必要です。
-
サービスログインを作成し、各ユーザー自身のログインを偽装できるようにします。
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;
-
クローンして設定
git clone https://github.com/caiderek/LogCarverGuard cd LogCarverGuard
docker-compose.yml を編集し、LOGCARVERGUARD_SQLSERVER_CONNECTION_STRING を設定します。本番環境では、シークレットファイルをマウントし、LOGCARVERGUARD_SQLSERVER_CONNECTION_STRING_FILE を使用することを推奨します。
-
起動
docker compose up -d --build docker compose logs -f -
API キーを発行します(
--loginにはサービスログインではなく、ユーザー自身の SQL ログインを指定します)。キーは一度だけ表示されます。docker compose exec logcarverguard dotnet cli/LogCarverGuard.Cli.dll \ issue-key --owner alice --login alice_sql_login -
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_PATH | API キーの SQLite ファイル | logcarverguard-apikeys.db |
LOGCARVERGUARD_TRUNCATE_ALLOWLIST | TRUNCATE を許可するテーブル | 空(すべてブロック) |
LOGCARVERGUARD_EXEC_WHITELIST | EXEC を許可するストアドプロシージャ | 空(すべてブロック) |
LOGCARVERGUARD_ALTER_DROP_COLUMN_ALLOWLIST | DROP COLUMN を許可するテーブル | 空(すべてブロック) |
LOGCARVERGUARD_ALLOWED_CLIENT_IPS | 接続を許可する IP アドレス/CIDR 範囲。キーより先に確認されます | 空(制限なし) |
LOGCARVERGUARD_TRUSTED_PROXIES | X-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 を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。