私は現在、ログインに秘密鍵を使用してWORKING SFTPログインしており、ユーザーはホームディレクトリにchrootされています。
目標:ユーザーのchrootを保持しますが、パスやcdを特定の場所に指定しなくても、相対chrootディレクトリへの書き込みアクセスを許可します。
つまり、sftpユーザーがログインしたときに、ファイルをアップロードするために別のパスにcdする必要はありません。
(chrootの設計により)chrootディレクトリが完全なroot所有権を必要とするため、これが可能かどうかはわかりません。
/ etc/passwd:内
sftpuser:x:1006:1006:,,,:/home/sftpuser:/bin/false
ユーザーのログインpubkeyは次の場所にあります
/home/sftpuser/.ssh/authorized_keys
sshd_confgのChrootルール:
Match User sftpuser
ChrootDirectory /home/sftpuser
ForceCommand internal-sftp
AllowTCPForwarding no
X11Forwarding no
ホームディレクトリの権限:
# ls -l /home/ |grep sftpuser
drwxr-xr-x 5 root root 4096 May 4 11:24 sftpuser
# ls -l /home/sftpuser/
total 4
drwxrw-r-x 3 sftpuser sftpuser 4096 May 4 11:23 sftp_share
現在のワークフローの例:
Connected to sftp.example.com.
sftp> ls
sftp_share
sftp> put testfile.txt
Uploading testfile.txt to /testfile.txt
remote open("/testfile.txt"): Permission denied
sftp> cd sftp_share
sftp> put testfile.txt
Uploading testfile.txt to /sftp_share/testfile.txt
testfile.txt
必要なワークフロー:
Connected to sftp.example.com.
sftp> put testfile.txt
Uploading testfile.txt to /testfile.txt
testfile.txt
最初にchdirする必要なしに、デフォルトディレクトリへのアップロード(put)を許可する方法はありますか?
これらのディレクトリを自由に移動できる柔軟性があります。たとえば、sftpのchrootディレクトリは、ユーザーのホームディレクトリにある必要はありません。ユーザーのホームディレクトリを変更することもできます(ただし、ユーザーは、authorized_keysを使用してログインできる必要があります)。
注:多くのSFTPクライアントを理解しています。コマンドラインのSFTPクライアントでは、ログイン時に相対パスを定義できます。これはこの質問の範囲外です。この構成はサーバー側で行い、クライアントは単にログインするだけで済みます。
こんにちは@emmdeeシンプルでニースのトリックがあることに気づくのに永遠にかかりました。 rootを、sFTPを実行する親フォルダーの所有者にし、forceコマンドを使用して、特定のユーザーにCHROOTディレクトリ内の特定のDIRをロードするように指示するだけです。
/home/sftpuser
を書き込み可能なディレクトリにしたい場合は、rootを/home
ディレクトリの所有者にしてから、そのユーザーまたはグループのランディングディレクトリとして/sftpuser
を強制的に実行する必要があります。 。
/etc/ssh/sshd_conf
は次のようになります。
Match User sftpuser
ChrootDirectory /home
ForceCommand internal-sftp -d /sftpuser
AllowTCPForwarding no
X11Forwarding no
これが完了したら、前述のように適切な権限を付与する必要があります。ルートは親(chroot)ディレクトリ/home
を所有し、ユーザーはファイナル(-d)ディレクトリ/sftpuser
を所有する必要があります。私はあなたがsftpusersと呼ばれるsFTP usersグループを持っていると仮定します。次のコマンドからグループを省略するか、代わりに最初の(rootおよびsftpusers2番目)。継承のためにコマンドラインで-Rを使用しているため、次のように、ユーザー所有権の前にルート所有権から開始する必要があります。
Sudo chown -R root:sftpusers /home
次に、ユーザーに対して実行できます:
Sudo chown -R sftpuser:sftpusers /home/sftpuser
これが必要かどうかはわかりませんが、sshdサービスをいつでも再起動して、すべての設定が再度読み込まれるようにすることができます。
Sudo systemctl restart sshd.service
これはうまくいけば魅力のように機能するはずですが、私は同様の問題を抱えていて、解決策はほとんどの時間、私を目で見ていました。
乾杯!
私はそれが数年前だったことを知っていますが、この投稿は私にそこに行く道の98%を得ました。長い間探してみました。
ユーザーにchrootを実行させ、書き込み権限を持つユーザーを自分のディレクトリに自動的に移動させるために、アフリカの馬鹿が提案した方法を使用し、ルートユーザーとftpグループが所有する元のchrootディレクトリも作成しました。
しかし、私がそれらをそのフォルダに保持し、他のユーザーのフォルダを参照できないようにするための鍵は、フォルダをchmod 710 (rwx--x---)
にして、ftpグループが内部で実行できるようにすることでした。 -sftp -d /%u(つまり、ユーザーのサブディレクトリにcdします)して、cd ..
上位ディレクトリに移動します。root以外は誰も読み取れないため、失敗します。
drwx--x--- 6 root sftpusers uarch 6 Feb 19 15:34 ./
drwxr-xr-x 5 root root uarch 5 Feb 4 09:13 ../
drwxrwx--- 3 anotheruser anotheruser uarch 3 Feb 24 15:34 anotheruser/
drwxrwx--- 3 ftpuser ftpuser uarch 12 Feb 25 10:55 ftpuser/
これが他の誰かにも役立つことを願っています。