必要になったので実は初めて設定してみた。その際に、やりかたをぐぐりながら参考にしたサイト情報が結構余分な設定があったりなんだりしたので、自分用にまとめ直し。
sftp専用ユーザはユーザ名のprefixを決めておくと楽
- 設定が以下のように設定一つにまとめられるのと、
- 後で/homeを見たときに一目で こいつらはsftp専用ユーザだな と分かるので。
Match User sftp-*
ChrootDirectory ~
ForceCommand internal-sftp
まぁ、個別指定やGroupによるMatchとかにしときゃいいんだけどね。今回の僕の案件ではこれが楽だったってだけの話です。
Subsystem sftpについて
ぐぐってるとよく、以下のように設定を書き換えましょう、て説明してるとこがあるけど、どうせMatchの中のForceCommandでinternal-sftpって指定してるので、全体設定側の書き換えは不要。
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
# ↑この書き換えはsshd_configのMatch内で上書き設定してる限りにおいて不要
chrootしたいときにsftp-serverじゃなくinternal-sftpを使う理由は簡単で、chrootした環境ではsftp-serverコマンドが存在しないから。sshdのinternal-sftpはその回避策の為のもの、だと思う。
ChrootDirectory先のディレクトリ自体はroot所有にしておく
ユーザ所有のディレクトリにChrootさせようとすると以下のようなエラーをみることになるので気をつける。
sshd[24348]: fatal: bad ownership or modes for chroot directory "/home/sftp-test"
最終的に以下のようなパーミッションとディレクトリ構成が出来ることになる。
drwxr-xr-x 4 root root 4096 Jun 10 13:49 /home/sftp-user1/
drwxr-xr-x 2 sftp-user1 sftp-user1 4096 Jun 10 13:06 /home/sftp-user1/upload_here
drwx------ 2 sftp-user1 sftp-user1 4096 Jun 10 12:55 /home/sftp-user1/.ssh
-rw------- 1 sftp-user1 sftp-user1 749 Jun 10 12:50 /home/sftp-user1/.ssh/authorized_keys
Chrootが不要な場合sftp専用ユーザを作りたいときは
単に公開鍵に対して command=""
を書いておけばよい。
command="internal-sftp" ssh-rsa AAAAXXXXX user@example.jp
または、
command="/usr/libexec/openssh/sftp-server" ssh-rsa AAAAXXXXX user@example.jp
これらはどっちでも動くけど個人的には internal-sftp を使う方が好み。
なぜなら internal-sftp は間違えてsshでつないでしまった際に This service allows sftp connections only.
て教えてくれて接続を切ってくれる親切設計だから。これが sftp-server だと何も言わずに無言でsshコネクションが維持されて感じ悪いので。
ただしコマンド版の方がプロセス分離されてる分セキュリティ的にはより堅牢なのかもしれない。