あるシステム管理者の日常 このページをアンテナに追加 RSSフィード

2008-04-14 sftpとChrootDirectory

sftpとChrootDirectory

| sftpとChrootDirectoryを含むブックマーク

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

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

考えられるのは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ではないので公開鍵での認証はできない。。のかなぁ。。

とーりすがりとーりすがり 2008/04/17 07:18 chrootは認証が済んでからされるので公開鍵はchrootされるまえのhomeに置かないとダメなようですよー

rougerefrougeref 2008/04/17 18:58 コメントありがとうございます。
えぇ、それはわかっているんですが、chrootされる前のhome、この例だと/home/user/.ssh。
でも/home/userをroot:rootにしてしまうので、それでパーミションがおかしいぞって認証が通らんのです。
もうちょい調べないとですね。

とーりすがりとーりすがり 2008/04/19 11:22 ホームディレクトリのオーナーが〜は chroot 前の事でしたかー。
自分では試せてませんが StrictModes no でできそうな気もします。

とーりすがり2とーりすがり2 2008/04/23 18:20 ChrootDirectoryは、rootのみがread/writeのパーミションであるディレクトリにしか
指定できない様ですが、これは結局そのuserはそのディレクトリ直下には書込が出来ないと
言う事態を生んでしまってるんでしょうか?
これって回避策はあるんでしょうか…

rougerefrougeref 2008/04/24 15:43 sshd_configのmanには
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サーバとして使う、つまりファイルを置くことが出来るのはサーバの管理者だけ、であれば運用上なにも問題はありませんが、外部から接続してきたユーザがファイルを置くという用途には使えないでしょうね。

とーりすがり2とーりすがり2 2008/04/25 07:51 回答ありがとうございます。
やっぱりそうですか…色々試したんですが、これは回避策はなさそうですね。
何か裏技的にも切り抜けれればと思ったのですが。
これは素直に、最初に/home/userフォルダ下に777フォルダを作っておいて、
ここにユーザーには置いてもらうしかないかなぁ、という感じに今は考えています。

rougerefrougeref 2008/04/25 18:53 あ、そうか。ホームディレクトリ以下に適当な読み書きできるディレクトリを
作ってあげれば大丈夫ですね。
コメントだと書ききれないので、4月25日のエントリで追記しておきました。