sftpとChrootDirectory
4月9日のエントリで環境を作って、4月10日のエントリで問題を書いた件。
もう一度整理するとこんな感じ。
- サーバ側はOpenSSHをつかって、クライアント側はputtyとFileZillaを使って比較的容易にセキュアな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グループに追加する。
なにかコマンドあるのかな。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ではないので公開鍵での認証はできない。。のかなぁ。。