chroot sftpユーザーの "client_loop:切断を送信:壊れたパイプ"、パスワードが正しいですか?

chroot sftpユーザーの "client_loop:切断を送信:壊れたパイプ"、パスワードが正しいですか?

私はsftp用のchrootを設定し、チュートリアルの組み合わせを使用しました(ソース1ソース2)次の構成で終了します/etc/ssh/sshd_config

Match Group sftpusers
      ForceCommand internal-sftp
      ChrootDirectory /var/sftp/
      PermitTunnel no
      AllowAgentForwarding no
      AllowTcpForwarding no
      X11Forwarding no

sftpデフォルトフォルダ/var/sftpとユーザーは次のように作成されます。

groupadd sftpusers

adduser myuser01
mkdir -p /var/sftp/myuser01
usermod -a -G sftpusers myuser01
chown myuser01:myuser01 /var/sftp/myuser01
systemctl restart sshd

/var/sftpログインしようとすると、ログインの仕組みを示すこのフォルダが表示されます。

ユーザーがそのフォルダにあることを望むので、その行の下/var/sftp/<userid>に次の設定を設定してみました。sshd_configMatch Group

ChrootDirectory /var/sftp/%u

client_loop: send disconnect: Broken pipeこれにより、ログイン時にエラーが発生します。ssh_configマニュアルページによると、変数は次のように許可されなければなりません。

ChrootDirectory は %%、%h、%u タグを受け入れます。

どんなアイデアがありますか?

環境:

  • オペレーティングシステム:Ubuntu 18.04.4 LTS
  • sshd: OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n 2017年12月7日

答え1

chown myuser01:myuser01 /var/sftp/myuser01
...
ChrootDirectory /var/sftp/%u

OpenSSH SSHサーバーChroot ディレクトリディレクティブでは、chrootディレクトリとその親ディレクトリをルートが所有する必要があります。

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

これはテストしていませんでしたが、考える関連ユーザーの行を含むchroot環境でファイルを生成すると、/etc/passwdsshdはその行のhomeフィールドをchroot環境内のユーザーのホームディレクトリとして扱います。これが機能したら、それを使用してchrootディレクトリではなく作業ディレクトリからユーザーセッションを開始できます。

答え2

あなたの例では、他のユーザーが所有して書き込むことはできませ/var/sftp/var/sftp/usero1root

お客様の問題は、次の場合に発生する可能性が高くなります。

chown myuser01:myuser01 /var/sftp/myuser01

root:root代わりにchmod 755

sudo mkdir /var/sftp
sudo mkdir /var/sftp/myuser01
sudo chown -R root:root /var/sftp
chmod -R 755 /var/sftp

ユーザーディレクトリはroot:root他の人が所有しており、書き込みできないため、ユーザーはsshd Internal-sftpを介してディレクトリとchrootにログインできる必要があります。

ForceCommand internal-sftp
ChrootDirectory /var/sftp/

したがって、それらを1つにまとめます。

sudo groupadd sftpusers

sudo mkdir /var/sftp
sudo mkdir /var/sftp/myuser01
sudo chown -R root:root /var/sftp
chmod -R 755 /var/sftp

sudo adduser -h /var/sftp/myuser01 myuser01
sudo usermod -a -G sftpusers myuser01

あなたのものを編集し、/etc/ssh/sshd_config最後にこれを追加します。

Match Group sftpusers
      ForceCommand internal-sftp
      ChrootDirectory /var/sftp/%u
      PermitTunnel no
      AllowAgentForwarding no
      AllowTcpForwarding no
      X11Forwarding no

その後、sshdを保存して再起動します。

systemctl restart sshd

私の問題は、これは、ユーザー「myuser01」が自分のプライマリディレクトリへの書き込みアクセス権を持っていないことを意味することです。したがって、私の場合は悪くありません。実際にwwwディレクトリを持つには「myuser01」が必要です。アクセスが必要です。この問題を解決しました

sudo mkdir /var/sftp/myuser01/www/
sudo chown myuser01:myuser01 /var/sftp/myuser01/www/

(ここで命名規則に従うように名前が変更されました)

これは、そのユーザー用のSFTP chroot刑務所を作成したい場合に機能します。 SFTPのみを使用できますが、使用するコマンドとライブラリの完全なchrootを構築する必要はありません。それ以外の場合は、必要なコマンドを適切なbinディレクトリに追加し、必要なライブラリをそのディレクトリに追加し、ローカルコピーと必要な/libグループ/etc/passwd/etc/groupユーザーエントリがあると仮定します(まだテストしていません)。 SFTP chroot刑務所のみが必要です)

答え3

ChrootDirectoryには、ユーザーセッションをサポートするために必要なファイルとディレクトリが含まれている必要があります。対話型セッションの場合、少なくともシェル(通常はsh(1))とnull(4)、zero(4)、stdin(4)、stdout(4)、stderr(4)、ttyなどのデフォルトの/ devノードが必要ですします。 (4)デバイス。 SFTP を使用するファイル転送セッションの場合、インプロセス SFTP サーバーを使用する場合、追加の環境設定は必要ありません。ただし、一部のオペレーティングシステムでは、ロギングを使用するセッションでchrootディレクトリに/ dev / logが必要になる場合があります(詳細はsftp-server(8)を参照)。

答え4

次は私のために働いた。以下は単なる例です。

  • 次のように行を編集/etc/ssh/sshd_config、変更、およびアクティブにします。
    Subsystem sftp internal-sftp
    
  • 次に、ファイルの最後に移動します(すでに存在する場合は変更)。 SFTPのデフォルトフォルダは次のとおりです。/home/sftp
    Match Group sftpusers
        ChrootDirectory /home/sftp
        ForceCommand internal-sftp
        X11Forwarding no
        AllowTcpForwarding no
    
  • ファイルを保存し、SSHサービスを再起動します。
    systemctl restart sshd
    

次に、次のコマンドを実行します。sftpuser私たちのユーザーになるので、sftpusers今後は

  • SFTP用の新しいユーザーを作成して追加するだけですsftpusers
    useradd -d /home/sftp -s /bin/false -g users -G sftpusers sftpuser
    
  • パスワードを設定してくださいsftpuser
    passwd sftpuser
    
  • 次の行を実行します。
    chown root:root /home/sftp
    #rights for group & others chmod go+rx /home/sftp
    mkdir /home/sftp/{upload,download}
    chown sftpuser:users /home/sftp/{upload,download}
    chown sftpuser:sftpusers /home/sftp/{upload,download}
    

これで、すべてのリモートサーバーまたはSFTPクライアントでSFTPを認証できます。

sftp [email protected]

関連情報