2008-04-14 sftpとChrootDirectory
sftpとChrootDirectory
job |
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というグループを作成する。
# groupadd sftponly
グループの名前は適当で結構。後でsshd_configに使います。
作成したユーザをsftponlyグループに追加する。
なにかコマンドあるのかな。groupファイルを編集しました。
sftponly:x:1002:user
パスワードでのログインを許可する。
ここからはsshdの設定。sshd_configでパスワードでのログインを許可します。
PasswordAuthentication 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ではないので公開鍵での認証はできない。。のかなぁ。。
えぇ、それはわかっているんですが、chrootされる前のhome、この例だと/home/user/.ssh。
でも/home/userをroot:rootにしてしまうので、それでパーミションがおかしいぞって認証が通らんのです。
もうちょい調べないとですね。
自分では試せてませんが StrictModes no でできそうな気もします。
指定できない様ですが、これは結局そのuserはそのディレクトリ直下には書込が出来ないと
言う事態を生んでしまってるんでしょうか?
これって回避策はあるんでしょうか…
Specifies a path to chroot(2) to after authentication. This
path, and all its components, must be root-owned directories that
are not writable by any other user or group.
とあります。ちなみにこの例での”user”のホームディレクトリ/home/userをchmod 777したところ認証のあと
Read from remote host gavora: Connection reset by peer
といわれて接続が切断されます。744じゃないとだめみたいですね。
ファイルを配布するためのFTPサーバとして使う、つまりファイルを置くことが出来るのはサーバの管理者だけ、であれば運用上なにも問題はありませんが、外部から接続してきたユーザがファイルを置くという用途には使えないでしょうね。
やっぱりそうですか…色々試したんですが、これは回避策はなさそうですね。
何か裏技的にも切り抜けれればと思ったのですが。
これは素直に、最初に/home/userフォルダ下に777フォルダを作っておいて、
ここにユーザーには置いてもらうしかないかなぁ、という感じに今は考えています。
作ってあげれば大丈夫ですね。
コメントだと書ききれないので、4月25日のエントリで追記しておきました。