私のUbuntuサーバーには2人のユーザーと共有フォルダがあります。
writer
書き込み権限を持つユーザーです/var/shared
。 SSHキーを使用してリモートでこのフォルダ内のファイルを定期的に変更するアプリケーション。ユーザーは
reader
自分の許可なしに取得できるSSHキーを使用して複数のクライアントで使用されるため、このシェルで使用できるコマンドを制限する必要があります。
質問:
sftpプロトコルとrsyncプロトコルのみを使用できるように、ユーザーがアクセスできるコマンドを制限する必要があります(、、、、...reader
などの標準コマンドはありません)。ディレクトリのみを読み取ることができ、ルートパスである必要があります。たとえば、ディレクトリを入力する必要はなく、すでにsftpまたはrsyncにあります。mkdir
ls
top
/var/shared
cd
/
usermod -s
この動作を実行しているユーザーに適用できるようにシェルスクリプトをどのように作成しますか?reader
サンプルが見つかりません。ルートが同じようにwriter
「刑務所」のままにするにはどうすればよいですか?/var/share
メモ:
私は試し
sshd_config
てMatch
指示しましたForceCommand internal-sftp
。ChrootDirectory
これを行うには、ChrootDirectory
ルートが所有する必要があり、書き込みが不可能(755以下)でサポートされていませんrsync
。これを試しましたが、
rssh
ログインしたユーザーのホームディレクトリ以外のディレクトリでは機能しません。したがって、異なる権限を持つユーザーを同じディレクトリにルートすることはできません。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/shared
Linuxバインドマウントまたはある種のシンボリックリンク回避策を介してアクセスできるディレクトリを作成することをお勧めします。
sftp
または、制限する必要がある場合は、rsync
ssh公開鍵を介して実行される「ラッパー」の助けを借りてサーバーの環境変数を確認する必要があります。この公開鍵には、SSH_ORIGINAL_COMMAND
ユーザーが認証された後に入力され、クライアントが実行する操作が含まれています。接続情報は次のとおりです。確立された。内部的にあるので、セッションに対してのみIIRCになるので、変数は空になります。サーバーで認証されたユーザーとして実行してください。ForceCommand
command
sftp
sftp-server
rsync
rsync
ssh
ssh date
date
SSH_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/