goo blog サービス終了のお知らせ 

メモ

覚書です

sftp-serverとchroot

2009-01-27 04:10:35 | Linux
Bazaar Version Controlを導入してみました。
その関係でサーバにsftp-serverを用意したわけですが、余計なディレクトリも見えてしまうなぁということで調べてみました。
二つ方法があるみたいです。

1.internal-sftpの利用
2.sftp-serverにパッチをあてる。

詳細はHOWTO: chroot SFTP (only) - Indexにまとめられていました。
internal-sftpについてはOpenSSH SFTP chroot() with ChrootDirectorysftpとChrootDirectory - あるシステム管理者の日常がわかりやすいかも知れません。

1.internal-sftpの利用
OpenSSH versions 4.9 upwards (using the new OpenSSH 'built in' capability). を参考にします。

注意点:
公開するディレクトリのオーナーをroot:rootまたはroot:sftponlyにする必要があり、chroot後のroot(/)についてはパーミッション755(sftponlyグループなら750も可みたい)じゃないとダメみたいです。
そのため/は読み取りはできるけれど、書き込みはできません。
bazaarでpushしてもらう場合、レポジトリのディレクトリ以下のパーミッションを777(グループがsftponlyの場合、774か775)にする形になります。オーナーはroot:rootまたはroot:sftponlyでOKです。
あるいはオーナーをusernameにして、750または755でいけるみたいです。
またsshd_configの設定でパスワード認証をYesにする必要があるようです。(Yesにするのは、該当(ユーザー|グループ)だけでOKです)

追記:
パスワード認証をNoにする方法が↓に書かれてありました。
sftpとChrootDirectory(4) - あるシステム管理者の日常
認証の鍵は/home/username/.ssh以下のものを用い、chrootは別のディレクトリ(/home2/username)にするという形みたいですね。
勉強になりました。
というわけで、1番を推奨します^^

設定例:
ホームディレクトリは/home/username/、シェルは/bin/falseとします。
chown -R root:sftponly /home2/username/
chmod -R 750 /home2/username
mkdir /home2/username/public
chown -R username:username /home2/username/public/
chmod 755 /home2/username/public

設定例:
Subsystem sftp internal-sftp
Match group sftponly
        ChrootDirectory /home2/%u
        PasswordAuthentication no
        X11Forwarding no
        AllowTcpForwarding no
        ForceCommand internal-sftp

2.sftp-serverにパッチをあてる
ベースは4.9のsftp-serverみたいなので、差分とって、最新のOpenSSHに適用して、問題がないかどうかは、私にはよくわかりません。
参考にされる場合は、自己責任でお願いします。
パスワード認証をnoにしてアクセスできるようにしたい場合です。
~/.ssh/authorized_keysへの鍵の登録など設定が済んでいることが前提です。

HOWTO: chroot SFTP (only) - Indexからsftp-server.cとsftpsh.cを入手します。
wget http://www.minstrel.org.uk/papers/sftp/openssh5/sftp-server.c
wget http://www.minstrel.org.uk/papers/sftp/sftpsh.c

wget ftp://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-4.9p1.tar.gz
sftp-server.cの差分をとって、パッチを作成します。
sftpsh.cについては、Debian(lenny)の場合、sftp-serverのパスを/usr/lib/openssh/sftp-serverに修正します。

wget ftp://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-5.1p1.tar.gz
先に作成したパッチを適用し、ビルドしてインストールすればOKだと思われます。

Debian(lenney)の場合
aptitude install build-essential devscripts
aptitude build-dep openssh
でコンパイルに必要なパッケージを導入します。
apt-get source openssh
でソースを入手して、展開します。
パッチをあてます。
5.1p1ではすべてはあたらなかったので、手動で修正しました。
dch -n
debuild -us -uc
でパッケージを作成し、できたパッケージをインストールします。
(ビルドするためのパッケージが不足すると警告がでるような場合には、適宜インストールします。)

あとは上記サイトにあるように設定します。
具体的には、
sftpsh.cをコンパイルして/bin/以下にコピー。gcc -o sftpsh sftpsh.c;cp sftpsh /bin/
echo /bin/sftpsh >> /etc/shells
ユーザーのシェルを/bin/sftpshにする。
ホームディレクトリを/home/username/./とする
SUID(Set User ID)属性を与える。
chmod u+s /usr/lib/openssh/sftp-server
ホームディレクトリのオーナーはrootにする必要はありません。レポジトリのパーミッションも755で問題ありません。
これで一応sftpだけ受け付けるようになります。sshは認証自体はされますが、sftpshがログインを拒否します。

ただ繰り返しになりますが、問題がないかどうかは、私にはよくわかりません。
参考にされる場合は、自己責任でお願いします。

設定例:
Subsystem sftp /usr/lib/openssh/sftp-server
Match group sftponly
        PasswordAuthentication no
        X11Forwarding no
        AllowTcpForwarding no