概要
SSH-Frontière概要
課題
Linuxサーバーにおいて、SSHサービスアカウント(CIランナー、AIエージェント、メンテナンススクリプト)は通常、ログインシェルとして/bin/bashを使用しています。これにはいくつかの問題があります:
- 制御なし:SSHクライアントはあらゆるコマンドを実行できる
- 監査証跡なし:実行されたコマンドが構造化された形式でログに記録されない
- 粒度なし:ステータスの読み取りだけが必要なスクリプトが、デプロイスクリプトと同じ権限を持つ
従来のソリューション(authorized_keysのcommand=、bashラッパースクリプト、SSH踏み台サーバー)にはそれぞれ限界があります:脆弱、監査が困難、またはニーズに対して過大。
SSH-Frontièreが行うこと
SSH-Frontièreは置換ログインシェルです。sshdとシステムコマンドの間に位置します:
SSHクライアント
|
v
sshd(鍵認証)
|
v
ssh-frontiere(ログインシェル)
|
├── TOML設定に対してコマンドを検証
├── アクセスレベルを確認(read / ops / admin)
├── 許可されたコマンドを実行
└── 構造化JSONで結果を返却
各SSH接続は新しいssh-frontiereプロセスを作成し、以下を行います:
- バナーとサーバー機能を表示
- クライアントヘッダを読み取り(認証、セッションモード)
- コマンドを読み取り(
ドメイン アクション [引数]、プレーンテキスト) - TOMLホワイトリストに対して検証
- 許可された場合は実行、そうでなければ拒否
- JSONレスポンスを返して終了
プログラムは同期的かつ一時的です:デーモンなし、サービスなし、永続的な状態なし。
SSH-Frontièreが行わないこと
- SSH踏み台サーバーではない:プロキシなし、他のサーバーへの接続中継なし
- 鍵管理ツールではない:SSH鍵の管理は
authorized_keysとsshdに委ねる - シェルではない:コマンド解釈なし、パイプなし、リダイレクトなし、対話機能なし
- デーモンではない:各接続ごとに実行して終了
具体的なユースケース
CI/CD自動化
Forgejo Actionsランナーが、SSH経由でアプリケーションをデプロイする場合:
# ランナーがSSH経由でコマンドを送信
{
echo "forgejo deploy version=stable"
echo "."
} | ssh forge-runner@server
SSH-Frontièreは、ランナーがadminレベルを持っていること、deployアクションがforgejoドメインに存在すること、version=stable引数が許可された値であることを確認した上で、設定されたデプロイスクリプトを実行します。
AIエージェント
Claude Codeエージェントが、制限された権限でサーバーを操作する場合:
# エージェントが利用可能なコマンドを発見
{ echo "list"; echo "."; } | ssh agent-ia@server
# エージェントが特定のアクションを実行
{ echo "infra healthcheck"; echo "."; } | ssh agent-ia@server
エージェントは、設定されたreadレベルのアクションにのみアクセスできます。helpとlistコマンドにより、利用可能なアクションとそのパラメータを発見できます — ネイティブに解析可能なJSON形式です。
自動メンテナンス
cronスクリプトがSSH経由でバックアップを実行する場合:
# 夜間バックアップ
{ echo "forgejo backup-config"; echo "."; } | ssh backup@server
# デプロイ後の通知
{ echo 'notify send message="Deployment complete"'; echo "."; } | ssh notify@server
通知
Slack、Olvid、メールなどの通知を標準的なSSH-Frontièreアクションとしてトリガーする場合:
{ echo 'notify slack channel=ops message="Build OK"'; echo "."; } | ssh notify@server
なぜSSH-Frontièreを選ぶのか
…authorized_keysのbashスクリプトではなく?
authorized_keysのcommand=オプションはコマンドの強制を可能にしますが:
- 鍵ごとにスクリプト1つ — 粒度なし
- 引数の検証なし
- アクセスレベルなし
- 構造化ログなし
- bashスクリプトに脆弱性が含まれる可能性(インジェクション、グロビング)
SSH-Frontièreは宣言的設定、RBAC、JSONログ、インジェクションを排除する文法パーサーを提供します。
…SSH踏み台サーバー(Teleport、Boundary)ではなく?
SSH踏み台サーバーは人間のサーバーアクセスを管理するために設計されています:
- デプロイと保守が重い
- サービスアカウントには過大
- 脅威モデルが異なる(対話ユーザー対自動スクリプト)
SSH-Frontièreはサービスアカウントのために設計された軽量コンポーネント(約1 MB)です:対話セッションなし、プロキシなし、コマンド検証のみ。
…sudo単体ではなく?
sudoは権限昇格を制御しますが:
- SSHクライアントが要求できる内容を制御しない
- 構造化プロトコルなし(JSON入出力なし)
- SSHコマンドレベルの統合ログなし
SSH-Frontièreとsudoは補完的です:SSH-Frontièreは受信コマンドを検証し、sudoはシステム権限を制御します。これは多層防御の第2層と第3層です。
プロダクトの価値
SSH-Frontièreは、SSHサービスアクセスに宣言的ガバナンスをもたらします:
-
すべてが1つのTOMLファイルに集約:ドメイン、アクション、引数、アクセスレベル。スクリプトに分散したロジックなし。
-
即座のデプロイ:設定全体が1つのTOMLファイルに集約されているため、新しいバージョンのデプロイは容易です。各SSH接続は設定を再読み込みする新しいプロセスを作成します — 変更は現在のセッション終了時、または新しいクライアントに対しては即座に反映されます。
-
デフォルトでゼロトラスト:明示的に設定されていないものは実行されません。シェルなし、インジェクション不可能。
-
監査可能:すべての試行(許可または拒否)が、タイムスタンプ、コマンド、引数、レベル、結果を含む構造化JSONでログに記録されます。
-
LLM対応:AIエージェントは
help/listで利用可能なアクションを発見し、構造化JSONプロトコルで対話できます — フリーテキストの解析は不要です。 -
ヨーロッパ発のオープンソース:EUPL-1.2ライセンス、フランスで開発、プロプライエタリエコシステムへの依存なし。