だいぶ久しぶりに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>