複数のメンバーでwebコンテンツを編集する場合は、複数のアカウントでwebディレクトリにログインしてコンテンツをアップロードしたり、編集したいケースがあります。そんな場合は各ユーザアカウントをweb編集用グループに所属させて、webディレクトリにグループから書き込み可能な権限を付与して運用するケースが多いと思います。
さて、各ユーザをchrootさせたいとなった場合は工夫が必要になります。なぜなら、OpenSSHのサブシステムであるSFTPサーバ機能に備わっているchrootオプションを利用する場合は、chroot対象とするディレクトリが「rootユーザからのみ書き込みできる」必要があるためです。
上記の対策としてシンボリックリンクを活用することもできますが、現実的ではありません。なぜならば、chrootディレクトリより上位ディレクトリ(※)にあるディレクトリはシンボリックリンクとして利用できないためです。例えば/home/user01にchrootした場合は/var/www/htmlに対してはリンクを作成できません。
※相対パスが上位を経由するディレクトリも含む
そこでmountコマンドのオプションであるbindオプションを利用します。bindオプションを利用すると既にマウントされているディレクトリ内同士を再マウントできます。シンボリックリンクのようにinodeの参照してリンクするわけではないので、chroot環境でも関係なくリマウントが可能です。
★mount bindオプションのman抜粋
Since Linux 2.4.0 it is possible to remount part of the file
hierarchy somewhere else. The call is
mount --bind olddir newdir
or shortoption
mount -B olddir newdir
or fstab entry is:
/olddir /newdir none bind
After this call the same contents is accessible in two places.
One can also remount a single file (on a single file).
This call attaches only (part of) a single filesystem, not possi-
ble submounts. The entire file hierarchy including submounts is
attached a second place using
mount --rbind olddir newdir
or shortoption
mount -R olddir newdir
Note that the filesystem mount options will remain the same as
those on the original mount point, and cannot be changed by pass-
ing the -o option along with --bind/--rbind. The mount options
can be changed by a separate remount command, for example:
mount --bind olddir newdir
[root@tagutagu01 /]# ll /var/www/ | grep html
drwxrwxr-x. 2 root web-team 4096 Apr 22 07:23 html
[root@tagutagu01 ~]# useradd sftp-user
[root@tagutagu01 ~]# passwd sftp-user
Changing password for user sftp-user.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@tagutagu01 ~]# usermod -g web-team sftp-user
[root@tagutagu01 ~]# id sftp-user
uid=501(sftp-user) gid=502(web-team) groups=502(web-team)
[root@tagutagu01 ~]# id sftp-user
uid=501(sftp-user) gid=502(web-team) groups=502(web-team)
[root@tagutagu01 ~]# mkdir -p /home/chroot/sftp-user/html
[root@tagutagu01 /]# ll /home | grep chroot
drwxr-xr-x 3 root root 4096 Apr 22 06:29 chroot
[root@tagutagu01 ~]# ll /home/chroot | grep sftp
drwxr-xr-x 3 root root 4096 Apr 22 06:29 sftp-user
[root@tagutagu01 ~]# vi /etc/ssh/sshd_config
(末尾に追記)
#SFTP only setting
Match User sftp-user
ChrootDirectory /home/chroot/sftp-user
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
(デフォルトのsubsystemをコメントアウト)
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
※いらないと記載のあるブログがあるが、設定しないと下記が出力されできなかった。うーんなぜ?
[root@tagutagu01 ~]# sftp sftp-user@localhost
Connecting to localhost... sftp-user@localhost's password:
subsystem request failed on channel 0
Couldn't read packet: Connection reset by peer
[root@tagutagu01 ~]# /usr/sbin/sshd -t
[root@tagutagu01 ~]# /etc/init.d/sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
[root@tagutagu01 ~]# mount -B /var/www/html /home/chroot/sftp-user/html
※アンマウントする場合は以下を実行
umount /home/chroot/sftp-user/html
[root@tagutagu01 ~]# cat /proc/mounts | grep sftp
/dev/mapper/vg_tagutagu01-lv_root /home/chroot/sftp-user/html ext4 rw,relatime,barrier=1,data=ordered 0 0
[root@tagutagu01 ~]# vi /etc/fstab
var/www/html /home/chroot/sftp-user/html none bind 0 0
[root@rproxy ~]# ssh sftp-user@10.24.96.211
sftp-user@10.24.96.211's password:
This service allows sftp connections only.
Connection to 10.24.96.211 closed.
[root@rproxy ~]# sftp sftp-user@10.24.96.211
Connecting to 10.24.96.211...
sftp-user@10.24.96.211's password:
sftp>
sftp> pwd
Remote working directory: /
sftp> ls -l
drwxrwxr-x 2 0 502 4096 Apr 21 22:23 html
sftp> cd html
sftp> pwd
Remote working directory: /html
sftp> put index.html
Uploading index.html to /html/index.html
index.html 100% 5 0.0KB/s 00:00
※chrootされていないユーザから作成されていることを確認
[root@tagutagu01 /]# ll /var/www/html/
total 4
-rw-r--r-- 1 sftp-user web-team 5 Apr 22 07:23 index.html
以上です。
Copyright © 2021 たぐたぐ.com. All rights reserved.