制限付きコマンド

制限付きコマンド(ForcedCommand)

ForcedCommandは、SSHアクセス時に特定のコマンドだけを実行させる仕組みです。~/.ssh/authorized_keysで各公開鍵に対して設定できます。

  • 目的
    • 利用制限: ユーザーが許可されたコマンド以外を実行できないようにする。
    • 自動化と安全性の両立: スクリプトやタスク実行用のアクセスを制限する。
    • 監視の強化: 特定の操作だけを許可し、予期しない操作を防止。
    • ファイル転送専用アカウント: scprsyncのみに限定したアカウントを作成可能。

SSH鍵認証+ForcedCommandの組み合わせ

この組み合わせを使うと、以下のような具体的なユースケースで効果を発揮します:

  1. バックアップスクリプト

    • サーバー間で自動バックアップを行う際、バックアップ専用アカウントを作成し、rsyncscpのみに限定。
    • 認証に鍵を使うことでセキュリティを確保。
  2. 限定的なアクセス権限

    • 外部のユーザーやスクリプトが特定のタスク(例: ログ収集、アプリ再起動)を実行する際、許可されたコマンドだけを実行させる。
  3. Gitリポジトリのホスティング

    • Gitサーバー(例: Gitolite)でリポジトリ操作(git-receive-packgit-upload-pack)のみに限定。
  4. 特定のアプリケーションの操作

    • 管理者が指定したアプリケーションのみ操作可能にし、その他のコマンドをブロック。

設定例

以下は、特定のSSH鍵に対してrsyncコマンドだけを許可する例です:

command="rsync --server -logDt . /backup/" ssh-rsa AAAAB3... your_user_key

~/.ssh/authorized_keys内で、この鍵を使用した場合、ユーザーはrsyncのみ実行可能です。

 

コマンドライン引数として渡す

ForcedCommandを利用していても、SSH接続時に変数をコマンドライン引数として渡すことが可能です。

  1. Authorized Keys設定:

    command="/path/to/script.sh" ssh-rsa AAAAB3... user_key
  2. 接続時にコマンド引数を渡す:

    ssh user@example.com "arg1=foo arg2=bar"
  3. スクリプトで引数を参照: /path/to/script.shの内容:

    #!/bin/bash
    echo "Argument 1: $1"
    echo "Argument 2: $2"

注意点:

  • 引数として渡されたデータはForcedCommand内で安全に処理する必要があります。
  • 接続文字列の引数が長すぎると実行時にエラーが発生する可能性があるため、注意してください。

 

特定のパラメータファイルを利用する

SSH接続前に、変数を相手先サーバー上のファイルに保存しておき、ForcedCommand内でそのファイルを参照する方法です。

手順

  1. 変数を事前にSCPなどでサーバーに送信:

    echo "MY_VAR=value1" | ssh user@example.com "cat > /tmp/env_vars"
  2. ForcedCommandスクリプトで変数を読み込む: /path/to/script.sh:

    #!/bin/bash
    source /tmp/env_vars
    echo "MY_VAR is $MY_VAR"

コメント