回答:
rsshシェル(http://pizzashack.org/rssh/)は、まさにこの目的のために設計されています。
RHEL / CentOS 5.2にはrsshのパッケージが含まれていないので、RPMを入手するにはこちらをご覧ください:http ://dag.wieers.com/rpm/packages/rssh/
これを使用するには、次のように新しいユーザーのシェルとして設定します。
useradd -m -d /home/scpuser1 -s /usr/bin/rssh scpuser1
passwd scpuser1
..または、次のような既存のシェルのシェルを変更します。
chsh -s /usr/bin/rssh scpuser1
..編集/etc/rssh.conf
して、rsshシェルを構成します。特にallowscp
、すべてのrsshユーザーに対してSCPアクセスを有効にするには、コメントを外します。
(また、chrootを使用してユーザーを自宅に収容したい場合もありますが、それは別の話です。)
私はこれにかなり遅れていますが、sshキーを使用して、〜/ .ssh / authorized_keysファイルで許可されている正確なコマンドを指定できます
no-port-forwarding、no-pty、command = "scp source target" ssh-dss ...
正しいコマンド設定を設定するには、ターゲットでpsを使用する必要がある場合があります。
PS:「-v」を指定してテストscpコマンドを実行すると、次のように表示されます。
debug1: Sending command: scp -v -t myfile.txt
「-t」は文書化されていないscpオプションであり、遠端のプログラムで使用されることに注意してください。これにより、authorized_keysに何を入れる必要があるかがわかります。
編集:このStackOverflowの質問に は、いくつかのリンクを含む詳細情報があります。
これはbackup_user
、サーバー側で名前が付けられたユーザー向けの実際の例です。
~backup_user/.ssh/authorized_keys
サーバー側のコンテンツ(さらにセキュリティ制限があります):
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="scp -v -r -d -t ~/CONTENT" ssh-rsa AAAAMYRSAKEY...
〜backup_user /に、コンテンツにアクセスできるディレクトリにリンクするリンクを作成します。
$ ln -s /path/to/directory/with/accessible/content ~backup_user/CONTENT
これで、クライアント側から次のコマンドが機能するはずです。
scp -v -r -P 2222 -i .ssh/id_rsa_key_file path/to/data backup_user@SERVER:~/CONTENT
このコマンドの機能:
-v
コマンドとauthorized_keysファイルの両方から削除できます)-r
再帰的なコピーを作成したくない場合は、commandファイルとauthorized_keysファイルの両方から削除できます)-P 2222
コマンドから削除できます)-i .ssh/id_rsa_key_file
path/to/data
はにコピーされます/path/to/directory/with/accessible/content/
ファイルのコピー(または複数)をサーバーからクライアントに作成するには、ここで説明するようにこれを処理するシェルスクリプトを作成する必要があります。
chmod 400 ~/.ssh/authorized_keys
。
~/.bashrc
(およびBashが実行するその他の)すべてを~/.ssh/rc
読み取り専用にする必要があります。ただし、悪意のあるユーザーがrsyncまたはsftpにアクセスできる場合でも~/.bashrc
、新しいユーザーを削除してアップロードできます。保護するのは難しいので、この方法にはお勧めしません(command="..."
)。
私はパーティーに少し遅れていますが、ForceCommand
OpenSSH のディレクティブをご覧になることをお勧めします。
Subsystem sftp internal-sftp
Match group sftponly
ForceCommand internal-sftp
確かに、これはSCPではなくSFTPですが、制限されたシェルよりも安全に同じ目標に到達します。さらに、必要に応じてユーザーをchrootできます。
chrootDirectory %h
andを追加してAllowTcpForwarding no
、sftponlyユーザーにホームへのchrootを強制します。一致はssh構成の最後のセクションである必要があり、その後のオプションは一致したユーザーのみのオプションであることに注意してください
ForceCommand internal-sftp -u 0077 -d /uploaddir
アップロードディレクトリにumaskを強制することで、さらに強化できます。「ChrootDirectory」と連携して、非常に制御された分離されたアップロード環境を作成します。おまけ:デフォルトのディレクトリとumask は、機能させる場合ForceCommand
は、Subsystem
ディレクティブではなくに設定する必要があります。
scponlyを使用することをお勧めします。
これは制限されたシェルであり、ユーザーはサーバーへのSCPファイルのように聞こえますが、実際にはログインできません。ソフトウェアの情報とソースコードのダウンロードはここから入手でき、コンパイル済みのRPMパッケージはEPEL YUMリポジトリ。
インストールしたら、アクセスを制限する各ユーザーアカウントを、新しくインストールされた制限付きシェルを使用するように構成する必要があります。これは、/ etc / passwdを使用して手動で行うか、次のコマンドを使用できます。 usermod -s /usr/bin/scponly USERNAME
scponly
まさにこの目的のために設計されています。
MySecureShellを使用してこれを行います。他の制限も設定できます。
https://github.com/mysecureshell/mysecureshell
接続をSFTP / SCPのみに制限します。シェルアクセスなし。
authorized_keysファイルのcommand = "..."機能を使用するのが良い方法であることがわかりました。(このページで私に提案された)
実行するコマンドは、scp(およびrsync)で始まる引数をテストするコマンドです。
次に、authorized_keysファイルを示します。
# authorized_keys
command="/usr/local/bin/remote-cmd.sh" ssh-rsa.....== user@pewpew
remote-cmd.shの内容は次のとおりです。
#!/bin/bash
# /usr/local/bin/remote-cmd.sh
case $SSH_ORIGINAL_COMMAND in
'scp'*)
$SSH_ORIGINAL_COMMAND
;;
'rsync'*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Access Denied"
;;
esac
おそらくまだユーザーのauthorized_keysファイルを保護する必要があると思いますが、私の目的は、まったく新しいユーザーを作成することなく、バックアップに使用できるパスワードなしのキーを持ち、キーをシェルに与えないことでした(わかりました、簡単に)
~/.ssh/authorized_keys
、~/.bashrc
(およびBashが実行する他のすべて)および~/.ssh/rc
読み取り専用を作成する必要があります。ただし、悪意のあるユーザーがrsyncまたはsftpにアクセスできる場合でも~/.bashrc
、新しいユーザーを削除してアップロードできます。保護するのは難しいので、この方法にはお勧めしません(command="..."
)。
ユーザーのログインシェルを制限のあるものに変更します。これにより、ユーザーはscp、sftp-serverおよびrsyncのみを実行でき、安全でない引数が許可されていないことも確認します(例:scp -S ...およびrsync -e .. 。は安全ではありません。こちらをご覧ください:http : //exploit-db.com/exploits/24795)。このような制限付きログインシェルの例:
これらのいずれかをchrootまたは別の制限された環境(Linuxのnsjailなど)で実行して、ネットワークアクセスを無効にし、どのディレクトリを読み書きできるかを(ホワイトリストに登録して)簡単に制御できます。
私は使用することはお勧めしませんcommand="..."
で~/.ssh/authorized_keys
あるため(のような慎重な追加の保護なしに、chmod -R u-w ~
悪意のあるユーザーが、新しいバージョンをアップロードすることができ、ユーザの場合)~/.ssh/authorized_keys
、~/.ssh/rc
または~/.bashrc
含まれ、任意のコマンドを実行することができますので、と。
それは最も優雅なソリューションではありませんが、このようなものをユーザーに投げることができます.bashrc
if [ "$TERM" != "dumb" ]; then
exit
fi
SCPユーザーは「ダム」のTERMを取得し、他のユーザーは通常vt100を取得することがわかりました。
ユーザーはおそらく新しい.bashrcをscpできると思いますが、これはこれが最良のソリューションではありませんが、迅速で汚れたソリューションのために、これは動作します
~/.bashrc
)。また、OpenSSHの新しいバージョンがTERM
変数を異なる方法で設定したり、一部のsshd構成設定がに影響を与えたりする可能性があるという意味でも不安定TERM
です。
ssh -o SetEnv TERM=dumb yourserver bash
?