この記事は、管理者または開発者を対象としています。
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ユーザーをバインドマウントします
次の手順を使用して、ユーザーをバインドマウントします。
-
投獄する必要のあるユーザーをホームディレクトリに割り当てるグループを作成します。
# groupadd sftponly
-
ユーザーを作成します。シェルを
/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
-
/etc/ssh/sshd_config
を更新します ファイル:-
次の行をコメントアウトします:
Subsystem sftp /usr/libexec/openssh/sftp-server
-
ファイルの最後に次の行を追加します。
Subsystem sftp internal-sftp Match Group sftponly ChrootDirectory /home/chroot # OR ChrootDirectory %h X11Forwarding no AllowTCPForwarding no ForceCommand internal-sftp
-
構成をテストしてから、SSHDをリロードします:
# sshd -t # service sshd reload
-
-
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
-
ChrootDirectoryが
%h
の場合 、次のコマンドを実行します:# chown root:root /home/chroot/$NEWUSER
バインドマウントを、chrootディレクトリ外の任意のパスに作成します。ユーザーはアクセスする必要があります
-
次の行を
/etc/fstab
に追加します ファイル:/var/www/html /home/chroot/$NEWUSER/www none bind 0 0`
-
ディレクトリをマウントします:
# 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))では機能しません。