シンプルな制限付きscp

シンプルな制限付きscp

SCPを使用して読み取り可能な一種のリポジトリを設定する必要があります。クライアントユーザーは他のものを見ることができます/破損/実行することはできません。

最後まで読んだSSH/SCP/SFTPユーザーを特定のディレクトリに制限する同様に、rssh、scponly、およびchrootに基づく方法もよく知られています。また、SFTPを無視します。

理想的には、真のchrootベースのアプローチのために何もインストールしたり、ライブラリなどをコピーしたくありません。だから私は次のようなシェルスクリプトを思いついた。

#!/bin/sh

echo "$(date) $*" >> /tmp/scpwrap.log

# Allow only plain SCP get, neither -r nor -v etc
if [ "${1}" = "-c" ] && expr "${2}" : '^scp -f ' >/dev/null
then
  shift

  files=$(echo $1 | sed 's/scp -f //')
  echo "SCPing ${files}" >> /tmp/scpwrap.log

  # However, permit multiple files (e.g. /tmp/x*)
  for f in ${files}
  do
   if [ ! -O "${f}" -o -w "${f}" ]
   then
     echo "Can only get read-only files owned by $(whoami)." >&2
     ls -l "${f}" >> /tmp/scpwrap.log
     exit 1
   fi
  done

  echo "Executing $*" >> /tmp/scpwrap.log
  exec $*
fi

[ "${1}" = "-c" ] && shift
echo "Executing $* not permitted." >&2
exit 1

それから:

# useradd -m -s /tmp/scpwrap.sh scpwrap

これで、リポジトリの内容を ~scpwrap にコピーして正しい所有権/権限を付与すれば、次のことを許可するのに十分です。

client$ scp 'scpwrap@reposerver:repo/bla*' /tmp

あまりにも単純に見えますが...問題や改善点はありますか?とても感謝しています!

答え1

懸念:セキュリティシェルスクリプトを作成する方法がわからないようです。あなたのコードは明らかに壊れています。二重引用符がありません。、どちら単なる機能的なバグではなく、セキュリティのバグです。

本当にセキュリティを維持したい場合は、自分で書かないでください。セキュリティエンジニアとして、私は既存のソリューションがすでに存在しているため、自分で作成したソリューションを完全に拒否します。一見すると壊れたように見えなくても、これを行います。 rsshやscponlyなどのツールを使用してください。これをインストールすることは、独自のスクリプトを書くよりも作業量が少なく安全です。

関連情報