だいぶ久しぶりにsftpの設定をすることがあったので、自分用にまとめておく。 セオリーというか、一般的に行われている設定と同様にchrootをし、かつsftpのみ実行可能なユーザとする。 わざわざsftpに制限するユーザを作るので、ログインは鍵認証のみに制限する。 まず、以下のコマンドでユーザ(ここではsftpユーザ)の作成をしておく。

useradd sftp # -dでホームディレクトリを任意のディレクトリ
mkdir ~sftp/.ssh # .sshディレクトリを作成

ログイン元の公開鍵が/tmp/publicとして置いてあると仮定して、以下のように公開鍵設定をする。 設定完了後、とりあえず今の時点で鍵認証でsshログインが行える事を確認すると良いだろう。

cat /tmp/public >> ~sftp/.ssh/authorized_keys
chown -R sftp. ~sftp/.ssh
chmod 700 ~sftp/.ssh
chmod 600 ~sftp/.ssh/*

「/etc/ssh/sshd_config」を編集し、接続ユーザがsftpだった場合のみ、以下の条件の設定をする。 なお、Matchで設定できる条件はユーザの他グループや接続ネットワークなどを指定できるので、設定したい環境に応じて記述してやると良いだろう。

  • 実行可能プログラムのsftpへの制限
  • Chrootで、接続ユーザから見たルートディレクトリを指定したディレクトリとする(ホームディレクトリを指定する場合は「\~」)
# 標準のsftpサーバからinternal-sftpに変更する
#Subsystem       sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp

# 接続ユーザがsftpだった場合、chrootの設定と実行プログラムとしてsftpの指定
Match User sftp
    ChrootDirectory ~
    ForceCommand internal-sftp

なお、この時chrootを設定するディレクトリは、所有者・グループがroot:root、権限は755にする必要が有るので注意。 これができてないと、鍵認証で接続ができた直後に切断されてしまう。

設定完了後、sshdを再起動する。 再起動後、sftpで接続できること、sshでの接続ができないこと、Chrootがされていることを確認する。

blacknon@BS-PUB-DEVELOP:~$ ssh sftp@BS-PUB-CENT7-01
Could not chdir to home directory /home/sftp: No such file or directory
This service allows sftp connections only.
Connection to BS-PUB-CENT7-01 closed.
blacknon@BS-PUB-DEVELOP:~$ sftp sftp@BS-PUB-CENT7-01
Connected to BS-PUB-CENT7-01.
sftp> pwd
Remote working directory: /
sftp> ls -la
drwxr-xr-x    3 0        0              90 May 29 22:33 .
drwxr-xr-x    3 0        0              90 May 29 22:33 ..
-rw-------    1 1000     1000            5 May 29 22:33 .bash_history
-rw-r--r--    1 1000     1000           18 Dec  6 23:19 .bash_logout
-rw-r--r--    1 1000     1000          193 Dec  6 23:19 .bash_profile
-rw-r--r--    1 1000     1000          231 Dec  6 23:19 .bashrc
drwx------    2 1000     1000           28 May 29 22:31 .ssh
sftp>