web-dev-qa-db-ja.com

sftpユーザーアカウントをセットアップし、1つのフォルダーへの読み取り/書き込みアクセスを制限する

特定の1つのフォルダーのみへの読み取り/書き込みアクセス権を持つUbuntuサーバーにsftpユーザーアカウントを作成したいと思います。このユーザーに、sftpを介してサーバーからファイルを転送する権限を持たせたいです。私のサーバーはDigital Oceanでホストされています。

私は このチュートリアル に従っていましたが、Digital Oceanで私が望んでいることを正確に行えるように見えますが、Step 4で行き詰まりました。

ステップ4は、次のコマンドを試すことを示しています。

ssh sammyfiles@localhost

結果は次のようになります。

Error message
This service allows sftp connections only.
Connection to localhost closed.

代わりに私の結果は次のとおりです。

packet_write_wait: Connection to 207.154.238.143 port 22: Broken pipe
Connection closed

次に、これを実行するよう指示します。これは明らかに動作するはずです。

sftp sammyfiles@localhost

結果は次のようになります。

SFTP Prompt
Connected to localhost.
sftp>

しかし、代わりに私は得る:

forge@BitCloud:~$ sftp misjah@localhost
misjah@localhost's password: 
packet_write_wait: Connection to 127.0.0.1 port 22: Broken pipe
Couldn't read packet: Connection reset by peer

外部からこの新しく作成されたユーザーでsftpしたい場合、同じメッセージが表示されます。

prmbair:~ primozrome$ sftp [email protected]
[email protected]'s password: 
packet_write_wait: Connection to 207.154.238.143 port 22: Broken pipe
Connection closed
prmbair:~ primozrome$ 

何が間違っていますか?

コメントから更新:sshd_config-ChrootDirectory行に問題があるようです。 ChrootDirectory %hを使用すると、ユーザーのホームディレクトリへのsftpは機能しますが、ChrootDirectory /home/user/uploads(1つのフォルダーのみに制限する)を使用すると:

packet_write_wait: Connection to 127.0.0.1 port 22: Broken pipe. 
Couldn't read packet: Connection reset by peer. 

何か案が?

1
Primoz Rome

から https://man.openbsd.org/sshd_config

ChrootDirectory認証後にchroot(2)するディレクトリのパス名を指定します。セッションの起動時に、sshd(8)は、パス名のすべてのコンポーネントが、他のユーザーまたはグループが書き込みできないルート所有ディレクトリであることを確認します。

私は同じ問題を抱えていましたが、解決策はユーザーの家のディレクトリを使用しないようにすることでした。なぜなら、/ home/userディレクトリはrootによって所有されるべきではなく、代わりに例えば/ var/sftp/uploads。ここで、/ var/sftp /はルートが所有し、/ var/sftp/uploadsはsftpユーザーが所有しています。その後、アップロードでsftpユーザーをchrootできます。

ChrootDirectory /var/sftp

/ etc/ssh/sshd_config

1
Wail