SCPを許可するが、SSHを使用した実際のログインは許可しない


62

Linuxボックス(この場合はCentos 5.2)でユーザーを設定してscpを使用してファイルを取得できるが、実際にはSSHを使用してサーバーにログインできないようにする方法はありますか?


ログインシェルを/ bin / falseに設定しようとしましたが、scpの動作が完全に停止します。
DrStalker

回答:


44

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を使用してユーザーを自宅に収容したい場合もありますが、それは別の話です。)


それは素晴らしいです-私もしばらくの間このようなものを探していました
ウォーレン

6
rsshの背後にあるアイデアは素晴らしいですが、iirc rsshはプログラミング用語でのセキュリティの奇跡ではありませんでした。上の簡単なGoogleの私は...と快適私より多くの結果が得られます「rsshには、エクスプロイト」は
wzzrd

7
SCPONLY多かれ少なかれ同じものだけでなく、明らかあまり悪用しやすいです:sublimation.org/scponly/wiki/index.php/Main_Page
フランソワ・Feugeas

scponlyはgithubに移動したようです。昇華リンクが切れています。github.com/scponly/scponly/wiki
spazm

38

私はこれにかなり遅れていますが、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ファイルの両方から削除できます)
  • path / to / dataのコンテンツを再帰的にコピーします。(オプション-r再帰的なコピーを作成したくない場合は、commandファイルとauthorized_keysファイルの両方から削除できます)
  • ポート2222を使用してサーバーに接続します(オプション-P 2222コマンドから削除できます)
  • 接続を自動化するためにIDファイルを使用します(オプション:削除できます-i .ssh/id_rsa_key_file
  • のコンテンツpath/to/dataはにコピーされます/path/to/directory/with/accessible/content/

ファイルのコピー(または複数)をサーバーからクライアントに作成するには、ここで説明するようにこれを処理するシェルスクリプトを作成する必要があります。


1
ユーザーがauthorized_keysファイルをスキャンするのを停止するにはどうすればよいですか?ユーザー自身が所有しないように制限できますか?
ダン

1
@Dan-authorized_keysファイルに読み取り専用のアクセス権を設定できる必要があります。chmod 400 ~/.ssh/authorized_keys
ロジャーデュック

また、~/.bashrc(およびBashが実行するその他の)すべてを~/.ssh/rc読み取り専用にする必要があります。ただし、悪意のあるユーザーがrsyncまたはsftpにアクセスできる場合でも~/.bashrc、新しいユーザーを削除してアップロードできます。保護するのは難しいので、この方法にはお勧めしません(command="...")。
PTS

31

私はパーティーに少し遅れていますが、ForceCommandOpenSSH のディレクティブをご覧になることをお勧めします。

Subsystem sftp internal-sftp

Match group sftponly
         ForceCommand internal-sftp

確かに、これはSCPではなくSFTPですが、制限されたシェルよりも安全に同じ目標に到達します。さらに、必要に応じてユーザーをchrootできます。


2
マッチセクションの後にchrootDirectory %handを追加してAllowTcpForwarding no、sftponlyユーザーにホームへのchrootを強制します。一致はssh構成の最後のセクションである必要があり、その後のオプションは一致したユーザーのみのオプションであることに注意してください
-higuita

4
ForceCommand internal-sftp -u 0077 -d /uploaddirアップロードディレクトリにumaskを強制することで、さらに強化できます。「ChrootDirectory」と連携して、非常に制御された分離されたアップロード環境を作成します。おまけ:デフォルトのディレクトリとumask 、機能させる場合ForceCommandは、Subsystemディレクティブではなくに設定する必要あります。
マーチン14

これを説明する長い記事は、下盛ですdebian-administration.org/article/590/...
koppor

7

scponlyを使用することをお勧めします。

これは制限されたシェルであり、ユーザーはサーバーへのSCPファイルのように聞こえますが、実際にはログインできません。ソフトウェアの情報とソースコードのダウンロードはここから入手でき、コンパイル済みのRPMパッケージはEPEL YUMリポジトリ

インストールしたら、アクセスを制限する各ユーザーアカウントを、新しくインストールされた制限付きシェルを使用するように構成する必要があります。これは、/ etc / passwdを使用して手動で行うか、次のコマンドを使用できます。 usermod -s /usr/bin/scponly USERNAME


2番目にこれ。 scponlyまさにこの目的のために設計されています。
ユタジャーヘッド

1
scponlyは死んでいるようです。debianはpackages.debian.org/search?keywords=scponlyを削除したようで、githubコードも死んでいます。フォローアップの議論:serverfault.com/questions/726519/...
koppor


3

パーティーに非常に遅れましたが、gitユーザーのシェルを/ usr / bin / git-shellに設定するだけです。対話型ログインを許可しない制限付きのシェルです。「su -s / bin / bash git」またはgitユーザー名を使用して、ユーザーを引き続きsuにすることができます。


2

ログインするのではなく、ファイルをscpできるようにしたいだけのユーザーのために、セキュアFTPサーバーでscponlyと呼ばれるpsudoシェルを使用します。


2

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ファイルを保護する必要があると思いますが、私の目的は、まったく新しいユーザーを作成することなく、バックアップに使用できるパスワードなしのキーを持ち、キーをシェルに与えないことでした(わかりました、簡単に)


3
これはかなりクールですが、scpを実行するコマンドを発行し、その後スクリプトを実行することで破壊できると思います!
-davidgo

@davidgo、その脆弱性に対処するかもしれませんExecで$ SSH_ORIGINAL_COMMANDを付加SCPを仮定し、rsyncは自身が複数のプログラムを実行しようとしません(その場合には、これはそれを破る)
フィル・

また、ユーザー用に~/.ssh/authorized_keys~/.bashrc(およびBashが実行する他のすべて)および~/.ssh/rc読み取り専用を作成する必要があります。ただし、悪意のあるユーザーがrsyncまたはsftpにアクセスできる場合でも~/.bashrc、新しいユーザーを削除してアップロードできます。保護するのは難しいので、この方法にはお勧めしません(command="...")。
PTS

1
@pts rcファイルとそれらを含むdirsの両方を、ユーザー(nobody?)以外のユーザーが所有し、ユーザーが書き込みできないようにすることができます。しかし、この時点では、rsshのような専用のものを使用する方が適切です。うわー、これが私の答えだと気付いた!古いよ!ハハ!
フィル

scp -S ...およびrsync -e ...により、ユーザーが任意のコマンドを実行できることを忘れないでください。したがって、実行する前に$ SSH_ORIGINAL_COMMANDの引数を確認する必要があります。詳細はこちら:exploit-db.com/exploits/24795
pts

1

ユーザーのログインシェルを制限のあるものに変更します。これにより、ユーザーはscpsftp-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含まれ、任意のコマンドを実行することができますので、と。


0

それは最も優雅なソリューションではありませんが、このようなものをユーザーに投げることができます.bashrc

if [ "$TERM"  != "dumb" ]; then
  exit
fi

SCPユーザーは「ダム」のTERMを取得し、他のユーザーは通常vt100を取得することがわかりました。

ユーザーはおそらく新しい.bashrcをscpできると思いますが、これはこれが最良のソリューションではありませんが、迅速で汚れたソリューションのために、これは動作します


1
この提案されたソリューションに対して強くお勧めします。悪意のあるユーザーが簡単に回避することはできません(別のユーザーをアップロードするなど~/.bashrc)。また、OpenSSHの新しいバージョンがTERM変数を異なる方法で設定したり、一部のsshd構成設定がに影響を与えたりする可能性があるという意味でも不安定TERMです。
PTS

1
えっ… ssh -o SetEnv TERM=dumb yourserver bash
ulidtko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.