sftpで任意のディレクトリのみをユーザーがアクセスできるようにする(Linux)

July 6, 2025 6:51

手順

コマンドは全て root ユーザーで実行すること

1. ユーザーの作成とパスワードの設定

useradd [ユーザー名]
passwd  [ユーザー名]

例)
useradd sftp_user
passwd sftp_user

2. sftpログイン後のディレクトリ作成と権限の設定

ユーザーのホームディレクトリにログイン後にルートとなるフォルダ(home_dir)を作成する。
ChrootDirectory (後述)を使用してこのフォルダをルートにするが、そのためには以下の条件を満たすことが必要。

  • /home/[ユーザー名] の所有者が root である
  • /home/[ユーザー名]/home_dir の所有者が root であり、かつ権限設定が 755
chown root:root /home/[ユーザー名]
mkdir /home/[ユーザー名]/home_dir
chown root:root /home/[ユーザー名]/home_dir
chmod 755 /home/[ユーザー名]/home_dir

例)
chown root:root /home/sftp_user
mkdir /home/sftp_user/home_dir
chown root:root /home/sftp_user/home_dir
chmod 755 /home/sftp_user/home_dir

3. sshd の設定変更と sshd の再起動

vi /etc/ssh/sshd_config

#以下の記述を追加
Match User [ユーザー名]
    ChrootDirectory /home/[ユーザー名]/home_dir
    ForceCommand internal-sftp
    PasswordAuthentication yes

例)
Match User sftp_user
    ChrootDirectory /home/test_user/home_dir
    ForceCommand internal-sftp
    PasswordAuthentication yes

/usr/sbin/sshd -t
service sshd restart

4. sftpのログイン確認

例)Windows のコマンドプロンプトから接続

>sftp test_user@[サーバー名]
test_user@[サーバー名]'s password:
Connected to [サーバー名].
sftp> pwd
Remote working directory: /
sftp> dir
sftp>
  • pwd で表示されるカレントディレクトリは「/」(実際は /home/sftp_user/home_dir)
  • dir では何も表示されない(ファイルが無いため)

このフォルダにはファイルをアップロードすることは出来ない(所有者が root で、権限が755のため)

sftp> put sample.txt
Uploading sample.txt to /sample.txt
remote open("/sample.txt"): Permission denied

アップロードさせたい場合はユーザーが書込み可能なフォルダを更に作成する。
(/home/[ユーザー名]/home_dir の権限を 755 以外に変更するとログインできなくなるため、権限変更はNG)

mkdir /home/test_user/home_dir/data_dir
chown test_user:test_user /home/test_user/home_dir/data_dir

5. サーバー上の任意のディレクトリを sftp のルートフォルダにマウントする

  • マウント用のディレクトリを作成
  • mount --bind でディレクトリをマウント
mkdir /home/[ユーザー名]/home_dir/mount_root
mount --bind [サーバー上の任意のフォルダ] /home/[ユーザー名]/home_dir/mount_root

例)
mkdir /home/test_user/home_dir/mount_root
mount --bind /datadrive/root /home/test_user/home_dir/mount_root

sftp ユーザーから見えるディレクトリ階層

/
+  mount_root

実際のディレクトリ階層

/
+  etc
+  home
+  datadrive
    + root  <-- sftp ユーザーからは /mount_root として見える
・・・

6. sftpユーザーの所属グループ変更(任意)

マウントしたディレクトリの権限設定によっては読み書きが出来ない場合がある。
必要に応じて、sftpユーザーの所属グループの変更(サブグループの追加)等を行う。

ユーザー情報の確認

id test_user
uid=1003(test_user) gid=1004(test_user) groups=1004(test_user)

グループの変更(usermod -g [グループ名] [ユーザー名])

usermod -g MT_gs_Server_bbs10 test_user
id test_user
uid=1003(test_user) gid=1000(MT_gs_Server_bbs10) groups=1000(MT_gs_Server_bbs10)

サブグループを追加(usermod -aG [グループ名] [ユーザー名])

usermod -aG MT_gs_Server_bbs10 test_user
id test_user
uid=1003(test_user) gid=1004(test_user) groups=1004(test_user),1000(MT_gs_Server_bbs10)

参考

sftpでユーザがアクセスできるディレクトリを制限する
chrootの設定でハマった話
SFTPでのchroot設定について
Linuxでユーザーをグループに追加するコマンドのmemo