GNU/Linux >> Linux の 問題 >  >> Linux

chrootを使用した後、SFTPユーザーをバインドマウントします

この記事は、管理者または開発者を対象としています。

RedHat®EnterpriseLinux®(RHEL®)およびCentOS®6(OpenSSHは4.9p1以降)サーバーでchroot操作が実行されたSecure File Transfer Protocol(SFTP)ユーザーをバインドマウントすると、次の条件が発生します。

  • ユーザーはSFTPのみを使用でき、Secure Shell(SSH)を介した完全なシェルアクセスはありません。
  • ユーザーはホームディレクトリに投獄されており、ホームディレクトリから抜け出す方法はありません。
  • ユーザーの観点からは、ユーザーのホームディレクトリはサーバー上にあります。
  • このバインドマウントは、Webコンテンツをアップロードまたは編集する目的で、1つ(または複数)のApache®ドキュメントルートまたは他のディレクトリへの書き込みアクセスが必要になる可能性がある開発者に必要になることがよくあります。

この記事では、chroot操作を使用してユーザーのホームディレクトリを設定し、アクセスが必要な外部(ドキュメントルート)ディレクトリのホームディレクトリ内にバインドマウントを作成する方法について説明します。バインドマウントは、chrootディレクトリ外のデータへのアクセスをユーザーに許可する唯一の方法です。 chrootdirectoryの外部にあるデータへのシンボリックリンク(symlink)を使用することはできません(たとえば、ln -s /home/user/http /var/www/http )。 chroot操作の後、ファイルシステムはchrootディレクトリ外のデータを認識しません。この知識の欠如はシンボリックリンクを壊します。別の方法として、ドキュメントのルートディレクトリをユーザーのホームディレクトリに移動してから、元の場所にシンボリックリンクすることができます(たとえば、ln -s /var/www/html /home/user1/html

SSHデーモン(SSHD)は、chroot操作の構成でいくつかの動的変数を提供します。

  • %u :ログインしているユーザーのユーザー名
  • %h :ログインしているユーザーの$ HOME

SSHDは、アクセス許可を設定する方法について非常に厳密です。これらの制限の1つは、ユーザーがchrootディレクトリのトップレベルに書き込めないことです。次の設定など、chrootディレクトリに適切なトップレベルを選択する必要があります。

  • ChrootDirectoryを%hに設定します :ユーザーはホームパスに書き込むことができません。書き込み可能なサブフォルダー(アップロードなど)、または書き込み可能な別の場所へのバインドマウント(/var/www/htmlなど)が必要です。 。
  • ChrootDirectoryを/home/chrootに設定します :ユーザーはホームパスに書き込むことができますが、chrootディレクトリの最上位は、chroot jailではなく、ファイルシステムのアクセス許可で保護されています。

最初のオプションは、ファイルシステムのアクセス許可に依存する代わりに、chrootディレクトリを使用してセキュリティを保証します.2番目のオプションは、ホームディレクトリへの書き込みを許可しますが、chrootディレクトリは他のユーザーと共有され、ファイルシステムのアクセス許可のみが情報の開示を停止します。適切なオプションはニーズによって異なります。

chrootされた操作の後にSFTPユーザーをバインドマウントします

次の手順を使用して、ユーザーをバインドマウントします。

  1. 投獄する必要のあるユーザーをホームディレクトリに割り当てるグループを作成します。

    # groupadd sftponly
    
  2. ユーザーを作成します。シェルを/bin/falseに設定します 上で作成したグループにユーザーを割り当てます:

    # mkdir -p /home/chroot/$NEWUSER
    # useradd -d /$NEWUSER -s /bin/false -G sftponly $NEWUSER    # Note: homedir is relative to the chroot
    # pass}wd $NEWUSER
    
  3. /etc/ssh/sshd_configを更新します ファイル:

    1. 次の行をコメントアウトします:

       Subsystem       sftp    /usr/libexec/openssh/sftp-server
      
    2. ファイルの最後に次の行を追加します。

       Subsystem     sftp   internal-sftp
       Match Group sftponly
       ChrootDirectory /home/chroot   # OR     ChrootDirectory %h
       X11Forwarding no
       AllowTCPForwarding no
       ForceCommand internal-sftp
      
    3. 構成をテストしてから、SSHDをリロードします:

       # sshd -t
       # service sshd reload
      
chroot操作の後にユーザーのホームディレクトリを設定します
  1. ChrootDirectoryが/home/chrootの場合 、次のコマンドを実行します:

     # chmod 711 /home/chroot            # This prevents chrooted users from seeing other chrooted users' homedirs
     # chmod 755 /home/chroot/$NEWUSER
     # chown $NEWUSER:sftponly /home/chroot/$NEWUSER
    
  2. ChrootDirectoryが%hの場合 、次のコマンドを実行します:

     # chown root:root /home/chroot/$NEWUSER
    

バインドマウントを、chrootディレクトリ外の任意のパスに作成します。ユーザーはアクセスする必要があります

  1. 次の行を/etc/fstabに追加します ファイル:

     /var/www/html   /home/chroot/$NEWUSER/www        none    bind    0 0`
    
  2. ディレクトリをマウントします:

     # mkdir /home/chroot/$NEWUSER/www
     # mount /home/chroot/$NEWUSER/www
    
更新権限

ユーザーがアクセスするディレクトリのファイルシステムのアクセス許可を更新します。現在読み取り/書き込みアクセス権を持っている他のユーザーを考慮して、誤ってアクセス許可を削除しないようにしてください。この手順は、ユーザーの所有権の変更、グループの所有権または権限の変更、ファイルアクセス制御リスト(FACL)の追加など、いくつかの異なる方法で完了することができます。

次の例は、FACLを追加するためのコマンドを示しています。

     # setfacl -Rm u:$NEWUSER:rwX /home/chroot/$NEWUSER/www/
     # setfacl -Rm d:u:$NEWUSER:rwX /home/chroot/$NEWUSER/www/
潜在的な問題

次の問題が発生する可能性があります。

ディレクトリのアクセス許可

ディレクトリのアクセス許可により、次の問題が発生する可能性があります。

  • SFTPの組み込みchroot関数は、アクセス許可に関して非常に厳密です。アクセス許可が十分に安全でない場合、ログインしようとすると次のエラーが発生します。

        root@ftp01[ ~ ]# sftp $NEWUSER@localhost
        Connecting to localhost...
        chroottest@localhost's password:
        Write failed: Broken pipe
        Couldn't read packet: Connection reset by peer
    
  • ログインはできるかもしれませんが、ファイルをアップロードすることはできません。この場合、次のエラーが発生します:

        sftp> put test
        Uploading test to /$NEWUSER/test
        Couldn't get handle: Permission denied
        In both cases the problem is directory permissions.  Here's what a known-good directory structure looks like:
        root@ftp01[ ~ ]# ls -ld / /home /home/chroot /home/chroot/$NEWUSERdrwxr-xr-x. 28 root     root     4096 Aug 22 10:31 /
        drwxr-xr-x. 18 root     root     4096 Oct 10 10:49 /home
        drwx--x--x   3 root     root     4096 Oct 10 10:49 /home/chroot
        drwxr-xr-x   3 $NEWUSER $NEWUSER 4096 Oct 10 11:40 /home/chroot/$NEWUSER
        root@ftp01[ ~ ]#
    

SCPが機能しない

このタイプのユーザーはSFTPでのみ機能し、他のプロトコル(たとえば、リモートシェル(RSH)、セキュアコンテインプロテクト(SCP)、またはファイル転送プロトコル(FTP))では機能しません。


Linux
  1. DebianJessieでSSHFSを使用してリモートディレクトリをマウントする

  2. Ssh – Ssh / scp / sftpユーザーをディレクトリに制限しますか?

  3. Rbindマウント後の再帰的なUmount?

  1. Cpスイッチを使用して特定の日付の後に変更されたファイルをコピーしますか?

  2. sftp を使用してファイルを安全に転送する方法 (例を含む)

  3. v2.25.2 以降のマウントのバインド マウント ソース パスを表示するには

  1. scp のような sftp の使用

  2. ユーザー空間の別の場所 (mount --bind など) にディレクトリをバインドできる Linux vfs ツールはありますか?

  3. リンク解除後にファイルをバインドマウントすると、ENOENT で失敗するのはなぜですか?