OpenSSH

chrootされたsftp専用ユーザを作るメモ

More than 1 year has passed since last update.

必要になったので実は初めて設定してみた。その際に、やりかたをぐぐりながら参考にしたサイト情報が結構余分な設定があったりなんだりしたので、自分用にまとめ直し。


sftp専用ユーザはユーザ名のprefixを決めておくと楽


  • 設定が以下のように設定一つにまとめられるのと、

  • 後で/homeを見たときに一目で こいつらはsftp専用ユーザだな と分かるので。


/etc/ssh/sshd_config

Match User sftp-*

ChrootDirectory ~
ForceCommand internal-sftp

まぁ、個別指定やGroupによるMatchとかにしときゃいいんだけどね。今回の僕の案件ではこれが楽だったってだけの話です。


Subsystem sftpについて

ぐぐってるとよく、以下のように設定を書き換えましょう、て説明してるとこがあるけど、どうせMatchの中のForceCommandでinternal-sftpって指定してるので、全体設定側の書き換えは不要。


/etc/ssh/sshd_config

#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させようとすると以下のようなエラーをみることになるので気をつける。


/var/log/secure

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="" を書いておけばよい。


~/.ssh/authorized_keys

command="internal-sftp" ssh-rsa AAAAXXXXX user@example.jp


または、


~/.ssh/authorized_keys

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コネクションが維持されて感じ悪いので。

ただしコマンド版の方がプロセス分離されてる分セキュリティ的にはより堅牢なのかもしれない。