制限付きSFTPの設定

特定のディレクトリにだけアクセスできるSFTPを設定したく、いろいろ試してみていろいろとつまづいたりしたのでそれのメモ。環境はCentOS 6.5です。

前提

  • SFTP用ユーザが追加されている
  • SFTP用ユーザのグループが追加されている
  • SFTP用ユーザの鍵が設定されている
  • SFTP用ユーザの名前はusername
  • 公開するディレクトリは/var/www/username

前提はこんなもんかな?

エラーログの出力先の確認

ログイン失敗や権限がなくて実行出来なかった場合などのエラーは/var/log/secureに出力されるようなので、うまく行かなかった場合はここを見ると良いかも。

エラーメッセージを検索すると結構いろいろ出てくるので、それで大抵は解決できると思う。

SSHの設定

/etc/ssh/sshd_configを編集します。

-Subsystem  sftp    /usr/libexec/openssh/sftp-server
+#Subsystem sftp    /usr/libexec/openssh/sftp-server
+Subsystem  sftp    internal-sftp

この箇所は、後で書くところで指定するから変更する必要ないよ、と書かれている情報もあったのだけれど修正しないとだめだったので変更をしています。

Match User username
    ForceCommand internal-sftp
    ChrootDirectory /var/www

これでSFTPをしたときは/var/wwwに行くようになるはず。

パーミッション等の設定

ChrootDirectoryに指定されたディレクトリは、適切な所有者やパーミッションが指定されていないと正常に動作できないので設定をします。これがわかるまで苦労した……

最初に/var/wwwの設定をします。

# cd /var
# chown root:root ./www
# chmod 0755 ./www

所有者とグループをrootにします。それと、パーミッションを755(drwxr-xr-x)にします。

# cd ./www
# mkdir ./username
# chown username:username ./username
# chmod 0755 ./username

その下のディレクトリの/var/www/usernameも同じようにそのSFTP用ユーザの権限とパーミッションに。

SSHの再起動

# service sshd restart

あとは最初にしたsshd_configの設定を反映させるためにSSHを再起動する。

ログイン

試しにログインしてみる。

$ sftp -P port -i key username@ipaddr
Connected to ipaddr.
sftp>

となると思う。あとは普通にファイルを置いたりディレクトリを作ったり出来るはず。

ちなみにSSHで入ろうとすると。

$ ssh -p port -i key username@ipaddr
This service allows sftp connections only.
Connection to ipaddr closed.

SFTP接続だけだよ、と言われる。

ディレクトリの制限をする必要がないとき

ディレクトリの制限をする必要がない(ChrootDirectoryがない)場合で、SFTPだけのログインにしたい場合。そのユーザの.ssh/authorized_keysを変更すると楽かも。

-ssh-rsa ...
+command="internal-sftp" ssh-rsa ...

authorized_keysの行頭にこれを追加するだけでSFTP専用ユーザになる。上で設定したような、sshd_configを編集したりという必要はないみたい。

authorized_keysはこれ以外にも、特定ホストからしかログインを許可しない、とかいろいろ設定できるようなので調べてみると良いかも。