SSHでchroot環境を構築してみる -- 2007-04-09  

SSH(SFTPも)でchrootな環境を構築してみました。ネット上で調べてみるとOpenSSH-chrootの情報が多かったのですが、ちょっと不便そうなので認証フレームワークであるPAMの設定変更で構築することにしました。
環境はVine 4.0 + OpenSSH 4.5p1-0vl1 + PAM 0.99.3.0-0vl4 (2007年1月現在)で行いました。
あと、Vine 3.2 + OpenSSH 4.5p1-0vl1 + PAM 0.77-38vl2.1で行いました。通常、Vine 3.2のOpenSSHは3.9なのですが、sshdの設定でMatchブロックが使いたかったのでVine 4.1用のSRPMから作成しました。
環境設定はhttp://www.asahi-net.or.jp/~AA4T-NNGK/jail2.htmlを参考にしました。きっちりしたchroot環境を構築されています。解説も詳しいです(^^;。

chrootな環境とは  

chrootな環境とは、ユーザーがログイン時に利用できる環境をシステムから閉じこめてしまう環境です。なぜこのような環境が必要かというと、ProFTPなどではchroot設定が簡単にでき、サーバにログインしたユーザーがホームディレクトリより上を参照できないようにできますが*1、OpenSSHでのsftpではそれができません。
従って、必要最小限のディレクトリ構成を準備して、その中にユーザーを閉じこめてしまいます。

 

やり方を私が調べた限りではOpenSSH-chrootまたはPAMでの方法があるようです。前者の方法ではSSHを再コンパイルする必要があり、パッケージ管理の観点からもめんどくさいのでPAMで実現する方法を選びました(実際PAMで実現する方が柔軟性があると思います)。

最小限のchroot環境を作成  

基本設定
chrootでのルートディレクトリ/pam-jails/
対象ユーザーdobu
グループdobu

この設定に従うと、dobuのホームディレクトリは/pam-jails/home/dobu/になります。

ディレクトリの作成  

まずは/pam-jails/以下に必要なディレクトリを作成します。パーミッションは本来のディレクトリに合わせます。ここでの目的はSFTPが使える環境の構築です。

/pam-jails/
    bin/
    dev/
    etc/
        profile.d/
        security/
    home/
        dobu/
    lib/
        i686/
    usr/
        bin/
        lib/
            i686/
        libexec/

最小限のプログラムのコピー  

ディレクトリが作成されたところで最小限のプログラム本体をコピーします。

bin/bash, cat, egrep, grep, hostname, ls, more, pwd, sh
usr/bin/[, groups, id, test, which

ここでいう最小限のプログラムとはSSHでログインできて変なエラーが出ない、ということを指します。その他作業に必要な物があればコピーしましょう。

ダイナミックリンクライブラリのコピー  

プログラムだけでは動かないので必要なダイナミックリンクライブラリをコピーします。

sshdの設定  

/etc/sshd_config  

sshdの挙動を設定します。

UsePAM yes
ChallengeResponseAuthentication no

を設定します。

PAMの設定  

本来のシステムのPAM設定ファイルを修正します。

/etc/pam.d/sshd  

sshでのPAMの挙動を定義します。

#%PAM-1.0
auth       include      system-auth
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
session    include      system-auth
session    required     pam_loginuid.so
session    required     pam_chroot.so     <-- この行を追加

/etc/security/chroot.conf  

pam_chroot.soモジュールの設定ファイル。正規表現でユーザー名を指定するようです。

# /etc/security/chroot.conf
# format:
# username_regex        chroot_dir
^dobu$                 /pam-jails

chroot環境に必要なファイルのコピー  

PAMモジュールで必要なものをコピーします。

# cp -a /etc/security/pam_env.conf /etc/security/console.perms /pam-jails/etc/security
*1 つまりユーザーホームディレクトリがルートディレクトリになります