web-dev-qa-db-ja.com

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

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

63
DrStalker

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

45
Anonymous

私はこれにかなり遅れていますが、sshキーを使用して、許可されている正確なコマンドを〜/ .ssh/authorized_keysファイルで指定できます。

no-port-forwarding、no-pty、command = "scp source target" ssh-dss ...

ターゲットでps toを使用して、正しいコマンド設定を設定する必要がある場合があります。

PS:「-v」を指定してtest 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

このコマンドの機能:

  • 詳細情報を表示します(optionnal-vはコマンドとauthorized_keysファイルの両方から削除できます)
  • Path/to/dataの内容を再帰的にコピーします。 (optionnal:再帰的なコピーを作成しない場合は、コマンドファイルとauthorized_keysファイルの両方から-rを削除できます)
  • ポート2222を使用してサーバーに接続します(optionnal:コマンドから-P 2222を削除できます)
  • IDファイルを使用して接続を自動化します(optionnal-i .ssh/id_rsa_key_fileを削除できます
  • path/to/dataのコンテンツが/path/to/directory/with/accessible/content/にコピーされます

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

39
Action Jack

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

Subsystem sftp internal-sftp

Match group sftponly
         ForceCommand internal-sftp

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

31

Scponlyの使用をお勧めします。

これは制限されたシェルであり、ユーザーは、サーバーと同じようにSCPファイルを実行できますが、実際にはログインできません。ソフトウェアの情報とソースコードのダウンロードを利用できます here およびpre-コンパイルされたRPMパッケージは EPEL YUMリポジトリ から入手できます。

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

7
syn-

MySecureShellを使用してこれを行います。他の制限も設定できます。

https://github.com/mysecureshell/mysecureshell

接続をSFTP/SCPのみに制限します。シェルアクセスなし。

6
J.Zimmerman

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

3
Ian Ellis

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

2
Zypher

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

2
Phil

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

1
pts

これは最も優雅な解決策ではありませんが、このようなものをユーザーの.bashrcに投げることができます

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

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

ユーザーがおそらく新しい.bashrcをscpする可能性があると思います。これにより、これは最良のソリューションではありませんが、迅速でダーティなソリューションの場合、これは機能します

0
jizaymes