chrootを使用するSSHは、「sftp」、「rsync」(両方)でのみ機能しますか?

chrootを使用するSSHは、「sftp」、「rsync」(両方)でのみ機能しますか?

私のUbuntuサーバーには2人のユーザーと共有フォルダがあります。

  1. writer書き込み権限を持つユーザーです/var/shared。 SSHキーを使用してリモートでこのフォルダ内のファイルを定期的に変更するアプリケーション。

  2. ユーザーはreader自分の許可なしに取得できるSSHキーを使用して複数のクライアントで使用されるため、このシェルで使用できるコマンドを制限する必要があります。

質問:

sftpプロトコルとrsyncプロトコルのみを使用できるように、ユーザーがアクセスできるコマンドを制限する必要があります(、、、、...readerなどの標準コマンドはありません)。ディレクトリのみを読み取ることができ、ルートパスである必要があります。たとえば、ディレクトリを入力する必要はなく、すでにsftpまたはrsyncにあります。mkdirlstop/var/sharedcd/

usermod -sこの動作を実行しているユーザーに適用できるようにシェルスクリプトをどのように作成しますか?readerサンプルが見つかりません。ルートが同じようにwriter「刑務所」のままにするにはどうすればよいですか?/var/share

メモ:

  1. 私は試しsshd_configMatch指示しましたForceCommand internal-sftpChrootDirectoryこれを行うには、ChrootDirectoryルートが所有する必要があり、書き込みが不可能(755以下)でサポートされていませんrsync

  2. これを試しましたが、rsshログインしたユーザーのホームディレクトリ以外のディレクトリでは機能しません。したがって、異なる権限を持つユーザーを同じディレクトリにルートすることはできません。

  3. command=".." ssh-rsa....ファイルで使用しようとしましたが、authorized_keys必要な動作を有効にする方法がわかりません。rrsyncスクリプトのrsyncドキュメントを確認しました。この方法にはchroot必要な機能はありません。

少なくともそのような殻のサンプルを私に与えることができますか?スクリプトでこれを達成できますか?

BashとC ++(必要な場合)を歓迎します。出力ldd /bin/bash

linux-vdso.so.1 =>  (0x00007fff7e9d1000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f79dfd8b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f79dfb87000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f79df7bd000)
/lib64/ld-linux-x86-64.so.2 (0x000055bd0767c000)

答え1

まず、rootが所有している必要がChrootDirectoryあり、他のユーザーは書き込めません。したがって、/var/sharedあなたの場合には価値がありませんChrootDirectory

ルートとしてのみ書き込むことができ、/var/sharedLinuxバインドマウントまたはある種のシンボリックリンク回避策を介してアクセスできるディレクトリを作成することをお勧めします。

sftpまたは、制限する必要がある場合は、rsyncssh公開鍵を介して実行される「ラッパー」の助けを借りてサーバーの環境変数を確認する必要があります。この公開鍵には、SSH_ORIGINAL_COMMANDユーザーが認証された後に入力され、クライアントが実行する操作が含まれています。接続情報は次のとおりです。確立された。内部的にあるので、セッションに対してのみIIRCになるので、変数は空になります。サーバーで認証されたユーザーとして実行してください。ForceCommandcommandsftpsftp-serverrsyncrsyncsshssh datedateSSH_ORIGINAL_COMMAND

これはラッパーの始まりです。

#!/usr/bin/env bash

set -eu
set -o pipefail

[[ -z "${SSH_ORIGINAL_COMMAND:-}" ]] && exit 1

case "${SSH_ORIGINAL_COMMAND}" in
    "/usr/libexec/openssh/sftp-server")
        exec /usr/libexec/openssh/sftp-server
        ;;
    "rsync --server"*)
        exec ${SSH_ORIGINAL_COMMAND}
        ;;
    *)
        exit 1
        ;;
esac

ご覧のとおり、ssh -vサーバーが実行するコマンドに関する情報を提供します。したがって、/tmpラッパーの他の項目も変更できます。

$ rsync -a -e "ssh -v" bin localhost:/tmp/ 2>&1 | grep '^debug.*Sending command:'
debug1: Sending command: rsync --server -logDtpre.iLsfxC . /tmp/

関連情報