sftpとChrootDirectory

4月9日のエントリで環境を作って、4月10日のエントリで問題を書いた件。

もう一度整理するとこんな感じ。

  • サーバ側はOpenSSHをつかって、クライアント側はputtyFileZillaを使って比較的容易にセキュアなftpサーバをたてることができる。
  • しかしデフォルトのままの設定だと、サーバ上の読み込み権があるファイルが丸見えになる。
  • SSHでログインされることもある。SFTPアクセスだけに制限したい。

考えられるのはsftpでアクセスしてくるユーザにchrootっぽい制限をかけて、特定のディレクトリ以外のアクセスを許さないこと。tectia(商用ssh)にはユーザ単位にchrootをかける機能があります。OpenSSHも4.8から似たような機能が追加されました。今日はそれを試してみます。

だいたいここの通り。ちょっと間違っているところがあるのでそこは修正しました。

ユーザを作成する

今回は例としてuserというユーザを作成します。同時にパスワードを適当に設定します。

# useradd user
# passwd user

作成したユーザのホームディレクトリを/(ルート)にする。

ChrootDirectoryを使うと、ホームディレクトリは見かけ上/(ルート)になります。なのでホームディレクトリを/に設定。

# usermod -d / user

本来のホームディレクトリのパーミションを調整

sftpで接続するユーザに見せたいディレクトリ、すなわち本来のホームディレクトリはroot所有で、rootのみがread/writeのパーミションである必要があるようです。

# chown root:root /home/user
# chmod 755 /home/user

sftponlyというグループを作成する。

# groupadd sftponly

グループの名前は適当で結構。後でsshd_configに使います。

作成したユーザをsftponlyグループに追加する。

なにかコマンドあるのかな。groupファイルを編集しました。

sftponly:x:1002:user

パスワードでのログインを許可する。

ここからはsshdの設定。sshd_configでパスワードでのログインを許可します。

PasswordAuthentication yes

デフォルトはyesなので、コメントアウトだけでも可です。

内部のsftpを使うように指定する。

デフォルトだとsftpで接続されたときにはsftp-serverが接続を担当しますが、sshdの内部のものを使うように指定します。

#Subsystem      sftp    /usr/local/libexec/sftp-server
Subsystem       sftp    internal-sftp

認証されたユーザがsftponlyグループの場合、ChrootDirectoryを実施。

同時にsftpだけを許可するようにもしています。sshd_configに以下の行を追加。

Match group sftponly
         ChrootDirectory /home/%u
         X11Forwarding no
         AllowTcpForwarding no
         ForceCommand internal-sftp

ここまで済んだらsshdを再起動。パスワード認証ですが、上記例でいうと/home/user以外は見えないし、sshは接続不可です。
ホームディレクトリのオーナがuserではないので公開鍵での認証はできない。。のかなぁ。。