sftp/scp chroot on CentOS 5

▼要件

  • sftp/scpでの操作のみを許可
  • ホームディレクトリより上の階層に移動不可
  • ホームディレクトリはchroot後の/とする

▼環境

  • CentOS 5 64bit
  • rpmforgeリポジトリ利用
  • ホームディレクトリは作成済み

▼このメモを書いた理由

  • chroot作成スクリプトがrpmに含まれてない
  • 見つけたが不備があり、かつ見通しが自分には悪かった

▼インストール
yum --enablerepo=rpmforge install rssh

▼ユーザ追加
※ホームディレクトリのパス末尾は/で終わることに注意。
useradd -m -d /var/www/vhosts/hoge.jp/ -s /usr/bin/rssh fuga

▼/etc/rssh.conf(追加)
allowscp
allowsftp
user = fuga:011:00011:/var/www/vhosts/hoge.jp

▼chroot jailを作るためのshellスクリプト
※CentOS5用ディレクトリパスで作ってある
#---- ここから ----
#!/bin/bash

_USER=$1
_CMDS=”/usr/libexec/openssh/sftp-server /usr/bin/scp /usr/bin/rssh /usr/libexec/rssh_chroot_helper”

##### functions #####
_HOMEDIR=$(eval echo ~$_USER)
cd “$_HOMEDIR”

Mkdir_Copy () {
local _PATH=$1
[ -f “$_PATH” ] || { echo $0: $_PATH not found, exit.; exit 1; }
[ ! -d “$(dirname .$_PATH)” ] && mkdir -p “$(dirname .$_PATH)”
[ ! -f “.$_PATH” ] && cp -aL “$_PATH” “.$_PATH”
return 0
}

##### Copy bin & lib #####
for _BIN in $_CMDS; do
Mkdir_Copy “$_BIN”
ldd “$_BIN” \
| while read _LIB _A _PATH _HEX; do
if [ $(echo “$_LIB” | cut -c1) = / ]; then
_PATH=”$_LIB”
fi
[ “$_LIB” = ‘linux-vdso.so.1’ ] && continue
Mkdir_Copy “$_PATH”
done
done

cp -a /lib64/libnss_* ./lib64
#cp -a /lib64/libm* ./lib64
#cp -a /lib64/ld-* ./lib64

##### etc #####
mkdir ./etc
grep “^$_USER:” /etc/passwd > ./etc/passwd
cp -a /etc/nsswitch.conf /etc/ld.so.conf /etc/ld.so.cache /etc/localtime ./etc

##### dev #####
mkdir ./dev
mknod -m 666 ./dev/null c 1 3
#/etc/init.d/syslog stop
#echo “SYSLOGD_OPTIONS=\”-m 0 -a $_HOMEDIR/dev/log\”” >> /etc/sysconfig/syslog
#/etc/init.d/syslog start

exit
#—- ここまで —-

カテゴリー: Linux パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です