特定の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.
何か案が?
から 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