インターネット上のすべてのSFTP/Chrootチュートリアルを実行したが、探しているものが見つからなかったように感じます(または、少なくとも、正しい結果が得られなかった)。これが私の詳細です:
それでおしまい。簡単そうですね。それでも、私が見た例のほとんどは、すべてのSFTPユーザーを単一の共有ディレクトリにロックすること、またはユーザーを/ home/USERディレクトリ(Webサービスでは機能しない)に「投獄」することを要求することに関するものです。私はそれを望んでいません。
これは、Ubuntu16.04の新しいAWSEC-2インスタンスで行っています。
私が試した2つのアプローチは無駄でした:
ユーザーのHOMEを/ var/www/html/USERに設定し、ChrootがユーザーをHOMEにジェイルします。何らかの理由で、これは機能していないようです。その結果、SFTPは接続を拒否するだけです。
ユーザーの標準のHOMEディレクトリを設定し(たとえば、adduserを使用)、ユーザーのWebディレクトリを作成し、ChrootがそれらをWebディレクトリにジェイルします。何日も試したにもかかわらず、これを機能させることができませんでした。SFTPアカウントは依然としてHOMEディレクトリにトンネリングされており、Chroot刑務所によって拒否されることがよくあります。
結局起こったことは、ユーザーがあまりにも多くの自由を持っているか、完全にロックアウトされているかのどちらかです。ユーザーが正しいディレクトリしか見ることができず、編集できる状況に陥ったことは一度もありません。そのディレクトリのすべてのchown設定(user:user、user:sftp、root:rootなど)と権限設定を試しましたが、効果がなかったようです。私はここで明白または深い何かを見逃しています。
いくつかの追加の詳細—これが私の試みの1つです。
/ etc/ssh/sshd_configの関連部分は次のとおりです。
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory %h
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
これは、ほとんどのガイドがあなたがすべきだと言っていることと一致します。
新しいユーザーを作成します。
adduser --disabled-password -gecos "" --ingroup sftp --Shell /usr/sbin/nologin --home /var/www/html/testuser testuser
それは言う:
Adding user `testuser' ...
Adding new user `testuser' (1001) with group `sftp' ...
Creating home directory `/var/www/html/testuser' ...
Copying files from `/etc/skel' ...
そして、passwdでパスワードを渡します。
次に、ログインしようとします。
sftp testuser@myserver
testuser@myserver's password:
packet_write_wait: Connection to myserver_ip: Broken pipe
Connection closed
これはChrootjail設定によるものと思われ、他の明らかなサーバー設定とは関係ありません。 ChrootDirectoryをコメントアウトすると、正常に接続されます。
sftp testuser@myserver
testuser@myserver's password:
Connected to myserver.
sftp> pwd
Remote working directory: /var/www/html/testuser
しかし、私はそうします。sftpユーザーは自分のディレクトリを終了して、サーバー全体をさまよい、好きなことをすることができます。良くない!
設定もしてみました
ChrootDirectory /var/www/html/%u
そして、それは私が見ることができるものを何も変更しません(以前と同じ「壊れたパイプ」エラー)。 (はい、変更を加えるたびにsshサーバーを再起動しています。)
ユーザーフォルダの現在の設定は次のとおりです。
drwxr-xr-x 4 testuser sftp 4096 Aug 29 15:00 testuser
Chrootが機能するためには、いくつかの指示があります。
chown root:root /var/www/html/testuser
しかし、ChrootDirectoryを設定すると、「パイプの破損」エラーが発生します。権限を777に変更しても、それは変わりません。 (/ var/www/htmlはroot:rootが所有し、/ var/www /および/ var /も同様です)
/ etc/ssh/sshd_configで試した他のこと:
サブシステムsftp/usr/lib/openssh/sftp-serverに変更し、ForceCommand internal-sftpをコメントアウトします(認識できる変更はありません)
UsePAMをコメントアウトするはい(誰かがこれが役に立ったと報告しましたが、sftpサーバーがすべての接続をすぐに拒否するようにします-「リモートホストによって閉じられました」)
OK、ようやく動作しました。私が間違っていたことがいくつかありました、そして明らかにそれを何度も何度も試みたのでいくつかの設定を台無しにしたので、私はただインスタンスをホースで止めて最初から始めました。
主な問題は、Chrootされたディレクトリを書き込み可能なディレクトリにできないことだと思われます。したがって、メインのWebディレクトリにすることはできません。私はこれをすべて間違って考えていて、メインのApacheディレクトリからユーザーアカウントを作成しようとしていました。そうではありません。標準のユーザーディレクトリ(/ home/jimmy)にユーザーアカウントを作成し、そのディレクトリ内にwww(またはpublic_htmlなど)フォルダーを作成し、ユーザーディレクトリ自体(この場合は/)を作成します。 rootが所有するhome/jimmy /)を作成し、jimmyとChrootedグループが所有する書き込み可能なディレクトリ(/ home/jimmy/www)を作成します(上記の例では「sftp」など)。次に、ChrootDirectoryを%h(この場合は/ home/jimmy)に設定します。ジミーはディレクトリ/ home/jimmy /内では何もできませんが、ファイルを/ home/jimmy/wwwに置くことはできます。これを使用可能にするには、 Apacheのuserdir を設定し、それらのwwwフォルダーをユーザーフォルダーとして使用するように指示します。
今それは動作します!