openssh SFTPの chroot 設定方法

複数ユーザ間での特定ディレクトリ・ファイルの共用

複数のメンバーでwebコンテンツを編集する場合は、複数のアカウントでwebディレクトリにログインしてコンテンツをアップロードしたり、編集したいケースがあります。そんな場合は各ユーザアカウントをweb編集用グループに所属させて、webディレクトリにグループから書き込み可能な権限を付与して運用するケースが多いと思います。

OpenSSHのSFTP chrootが面倒くさい理由

さて、各ユーザを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

 

SFTP chroot環境作成の流れ

1.対象ディレクトリ(コンテンツを置きたい場所)の権限を確認

[root@tagutagu01 /]# ll /var/www/ | grep html
drwxrwxr-x. 2 root web-team 4096 Apr 22 07:23 html

 

2.SFTP用ユーザを作成・パスワード設定・所属グループ編集

[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)

 

3.ディレクトリ編集用の権限を設定

[root@tagutagu01 ~]# id sftp-user
uid=501(sftp-user) gid=502(web-team) groups=502(web-team)

 

4.Chroot用のディレクトリを作成

[root@tagutagu01 ~]# mkdir -p /home/chroot/sftp-user/html

 

5.rootユーザのみに書き込み権限が付与されていることを確認する。

[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

 

6.sshd.configファイルを編集

[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

 

7.設定の読み込み

 

[root@tagutagu01 ~]# /usr/sbin/sshd -t
[root@tagutagu01 ~]# /etc/init.d/sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]

 

8.バインドマウントを実行

[root@tagutagu01 ~]# mount -B /var/www/html /home/chroot/sftp-user/html
※アンマウントする場合は以下を実行

umount /home/chroot/sftp-user/html

 

9.マウントされていることを確認

[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

 

10.起動時に自動マウントが行われるようにfstabに記載

[root@tagutagu01 ~]# vi /etc/fstab
var/www/html /home/chroot/sftp-user/html none bind 0 0

 

11.SSH接続できないことを確認

[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.

 

12.SFTP接続できることを確認

[root@rproxy ~]# sftp sftp-user@10.24.96.211
Connecting to 10.24.96.211...
sftp-user@10.24.96.211's password:
sftp>

 

13.Chrootされていることを確認

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

 

14.ファイル作成確認

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.