web-dev-qa-db-ja.com

Chroot SFTP-ユーザーが現在の(chroot)ディレクトリに書き込むことができる

私は現在、ログインに秘密鍵を使用して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クライアントでは、ログイン時に相対パスを定義できます。これはこの質問の範囲外です。この構成はサーバー側で行い、クライアントは単にログインするだけで済みます。

2
emmdee

こんにちは@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

これはうまくいけば魅力のように機能するはずですが、私は同様の問題を抱えていて、解決策はほとんどの時間、私を目で見ていました。

乾杯!

5
African Idiot

私はそれが数年前だったことを知っていますが、この投稿は私にそこに行く道の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/

これが他の誰かにも役立つことを願っています。

1
Joe