制限付きコマンド(ForcedCommand)
ForcedCommandは、SSHアクセス時に特定のコマンドだけを実行させる仕組みです。~/.ssh/authorized_keys
で各公開鍵に対して設定できます。
- 目的
- 利用制限: ユーザーが許可されたコマンド以外を実行できないようにする。
- 自動化と安全性の両立: スクリプトやタスク実行用のアクセスを制限する。
- 監視の強化: 特定の操作だけを許可し、予期しない操作を防止。
- ファイル転送専用アカウント:
scp
やrsync
のみに限定したアカウントを作成可能。
SSH鍵認証+ForcedCommandの組み合わせ
この組み合わせを使うと、以下のような具体的なユースケースで効果を発揮します:
-
バックアップスクリプト
- サーバー間で自動バックアップを行う際、バックアップ専用アカウントを作成し、
rsync
やscp
のみに限定。 - 認証に鍵を使うことでセキュリティを確保。
- サーバー間で自動バックアップを行う際、バックアップ専用アカウントを作成し、
-
限定的なアクセス権限
- 外部のユーザーやスクリプトが特定のタスク(例: ログ収集、アプリ再起動)を実行する際、許可されたコマンドだけを実行させる。
-
Gitリポジトリのホスティング
- Gitサーバー(例: Gitolite)でリポジトリ操作(
git-receive-pack
やgit-upload-pack
)のみに限定。
- Gitサーバー(例: Gitolite)でリポジトリ操作(
-
特定のアプリケーションの操作
- 管理者が指定したアプリケーションのみ操作可能にし、その他のコマンドをブロック。
設定例
以下は、特定のSSH鍵に対してrsync
コマンドだけを許可する例です:
~/.ssh/authorized_keys
内で、この鍵を使用した場合、ユーザーはrsync
のみ実行可能です。
コマンドライン引数として渡す
ForcedCommandを利用していても、SSH接続時に変数をコマンドライン引数として渡すことが可能です。
例
- Authorized Keys設定:
- 接続時にコマンド引数を渡す:
-
スクリプトで引数を参照:
/path/to/script.sh
の内容:#!/bin/bash echo "Argument 1: $1" echo "Argument 2: $2"
注意点:
- 引数として渡されたデータはForcedCommand内で安全に処理する必要があります。
- 接続文字列の引数が長すぎると実行時にエラーが発生する可能性があるため、注意してください。
特定のパラメータファイルを利用する
SSH接続前に、変数を相手先サーバー上のファイルに保存しておき、ForcedCommand内でそのファイルを参照する方法です。
手順
-
変数を事前にSCPなどでサーバーに送信:
echo "MY_VAR=value1" | ssh user@example.com "cat > /tmp/env_vars"
-
ForcedCommandスクリプトで変数を読み込む: /path/to/script.sh:
#!/bin/bash source /tmp/env_vars echo "MY_VAR is $MY_VAR"
コメント