インフラエンジニアbacchiのわかったことまとめ

bacchi.me

CentOS7でscpなchrootの環境をつくる

CentOS7でのchrootの設定手順をまとめました。

sftpの設定はらくらく出来たのですが、
scpの設定にドはまりしてしまい大いに時間をかけてしまいました。

同じようにchrootでscpの設定を行う人がスムーズに作業ができればいいなと思います。

事前準備

この例ではscpでの接続のみ許可します。
chrootのユーザーには公開鍵認証で接続することとします。

  • 事前にchroot接続用のユーザーを作成しておく
  • 事前に公開鍵をchrootのユーザーのホームディレクトリに配置しておく
  • chrootユーザーの環境定義スクリプトを配置する

chrootユーザー環境定義スクリプト

以下のスクリプトを配置しておきましょう。

/usr/local/bin/scp_only.sh
---
#!/bin/sh
# scp_only.sh - chrootユーザーの環境定義スクリプト

export PATH=$PATH:/bin

LOG_FILE=/tmp/scp_only.log
echo $SSH_ORIGINAL_COMMAND > ${LOG_FILE}
echo $PWD >> ${LOG_FILE}

echo $SSH_ORIGINAL_COMMAND | grep '^scp ' > /dev/null 2>&1 || exit 77

umask 002
cd /home/${USER}
exec $SSH_ORIGINAL_COMMAND

chroot用のディレクトリを掘る

/chrootディレクトリを作り、その下にユーザー名のディレクトリを作ります。
さらに、その下に/binやchroot後のユーザーのホームディレクトリを作ります。

ここでは先にchroot後のユーザーのホームディレクトリを作ります。

# mkdir -p /chroot/USER_NAME/home/USER_NAME
# chown USER_NAME:USER_GROUP /chroot/USER_NAME/home/USER_NAME

chrootに必要なコマンド、ライブラリのコピー

chrootで使用するコマンドや、コマンドが必要とするライブラリをコピーしてやる必要があります。

mkdirでディレクトリを掘って、lddで必要なライブラリを探して、コピーして・・

と作業してもよいですが、面倒くさいのでスクリプトで一気に作ります。

/usr/local/sbin/create_chroot_env.sh
----
#!/bin/sh
# create_chroot_env.sh - chrooted scp 用の chroot 環境作成スクリプト
#

COMMANDS=\'/bin/bash /usr/local/sbin/scp_only.sh /bin/sh /bin/grep /bin/scp\'
LIBS=\'/lib64/libnss_files.so.2\'

if [ ${#} -ne 1 ]; then
cat < ${JAIL}/etc/passwd
chmod 644 ${JAIL}/etc/passwd
fi

if [ ! -e ${JAIL}/etc/nsswitch.conf ]; then
fi

mkdir_jail /tmp 1777

スクリプトを配置したら、実行権限を付与しておくとよいです。

引数にユーザー名を指定して、create_chroot_env.shを実行します。

# /usr/local/sbin/create_chroot_env.sh USER_NAME

スクリプトを実行した後は以下のようなディレクトリが出来ます。

# ls -Rl /chroot/USER_NAME
/chroot/USER_NAME:
合計 4
drwxr-xr-x. 2 root root   47  3月  6 13:12 bin
drwxr-xr-x. 2 root root   17  3月  6 13:12 dev
drwxr-xr-x. 2 root root   39  3月  6 13:12 etc
drwxr-xr-x. 3 root root   24  3月  6 13:12 home
drwxr-xr-x. 2 root root 4096  3月  6 13:12 lib64
drwxrwxrwt. 2 root root   25  3月  6 16:21 tmp
drwxr-xr-x. 3 root root   18  3月  6 13:12 usr

/chroot/USER_NAME/bin:
合計 2104
-rwxr-xr-x. 1 root root 960392  9月 26 10:53 bash
-rwxr-xr-x. 1 root root 154648  6月 10  2014 grep
-rwxr-xr-x. 1 root root  70208  6月 10  2014 scp
-rwxr-xr-x. 1 root root 960392  9月 26 10:53 sh

/chroot/USER_NAME/dev:
合計 0
crw-rw-rw-. 1 root root 1, 3  3月  6 13:12 null

/chroot/USER_NAME/etc:
合計 8
-rw-r--r--. 1 root root 14  3月  6 13:12 nsswitch.conf
-rw-r--r--. 1 root root 52  3月  6 13:12 passwd

/chroot/USER_NAME/home:
合計 0
drwxr-xr-x. 4 USER_NAME tomcat 30  3月  6 16:21 USER_NAME

/chroot/USER_NAME/home/USER_NAME:
合計 0

/chroot/USER_NAME/lib64:
合計 8464
-rwxr-xr-x. 1 root root  160240  1月 28 05:13 ld-linux-x86-64.so.2
-rwxr-xr-x. 1 root root 2107600  1月 28 05:13 libc.so.6
-rwxr-xr-x. 1 root root   40816  1月 28 05:13 libcrypt.so.1
-rwxr-xr-x. 1 root root 2004592  1月 21 05:58 libcrypto.so.10
-rwxr-xr-x. 1 root root   19512  1月 28 05:13 libdl.so.2
-rwxr-xr-x. 1 root root  502040 12月  3 22:57 libfreebl3.so
-rwxr-xr-x. 1 root root   62800  6月 10  2014 liblber-2.4.so.2
-rwxr-xr-x. 1 root root  340144  6月 10  2014 libldap-2.4.so.2
-rwxr-xr-x. 1 root root  113320  1月 28 05:13 libnsl.so.1
-rwxr-xr-x. 1 root root  251824  7月 23  2014 libnspr4.so
-rwxr-xr-x. 1 root root 1215920 12月  3 23:23 libnss3.so
-rwxr-xr-x. 1 root root   58288  1月 28 05:13 libnss_files.so.2
-rwxr-xr-x. 1 root root  182008 12月  3 21:53 libnssutil3.so
-rwxr-xr-x. 1 root root  398264  6月 10  2014 libpcre.so.1
-rwxr-xr-x. 1 root root   20016  7月 23  2014 libplc4.so
-rwxr-xr-x. 1 root root   15776  7月 23  2014 libplds4.so
-rwxr-xr-x. 1 root root  141616  1月 28 05:13 libpthread.so.0
-rwxr-xr-x. 1 root root  110808  1月 28 05:13 libresolv.so.2
-rwxr-xr-x. 1 root root   44048  1月 28 05:13 librt.so.1
-rwxr-xr-x. 1 root root  121296  6月 10  2014 libsasl2.so.3
-rwxr-xr-x. 1 root root  164016 12月  3 23:23 libsmime3.so
-rwxr-xr-x. 1 root root  259968 12月  3 23:23 libssl3.so
-rwxr-xr-x. 1 root root  174520  6月 10  2014 libtinfo.so.5
-rwxr-xr-x. 1 root root   14608  1月 28 05:13 libutil.so.1
-rwxr-xr-x. 1 root root   90632  6月 10  2014 libz.so.1

/chroot/USER_NAME/tmp:
合計 4
-rw-r--r--. 1 USER_NAME tomcat 19  3月  6 16:21 scp_only.log

/chroot/USER_NAME/usr:
合計 0
drwxr-xr-x. 3 root root 17  3月  6 13:12 local

/chroot/USER_NAME/usr/local:
合計 0
drwxr-xr-x. 2 root root 24  3月  6 13:12 sbin

/chroot/USER_NAME/usr/local/sbin:
合計 4
-rwxr-xr-x. 1 root root 253  3月  6 13:12 scp_only.sh

これで環境の構築は完了です。

sshd_configの設定

/etc/ssh/sshd_configのおしりに以下を記述し、sshをreloadもしくはrestartします。


Match User USER_NAME ChrootDirectory /chroot/USER_NAME X11Forwarding no AllowTcpForwarding no ForceCommand /usr/local/sbin/scp_only.sh

これでchrootでscpを行う用意が出来ました。

  • B!