2015/08/26
CentOS 6 に rssh を導入する
rssh は ssh (1) を利用したアクセスのうち
scp (1) や sftp (1) といった
特定のコマンドのみの実行を許可したり
chroot 環境を提供するログインシェルで、
セキュアなファイル転送は提供したいがシェルアカウントへの
ログインを拒否したい場合などに非常に有効なログインシェルだ。
scp (1) や sftp (1) のみの実行を許可する場合は
アカウントのログインシェルを rssh に変更して
設定ファイルで実行を許可するコマンドを指定するだけで設定は完了する。
しかし chroot 環境を提供する場合はそのための環境設定が必要である。
$ sudo yum -y install rssh
:
:
:
インストール:
rssh.x86_64 0:2.3.4-1.el6
完了しました!
# This is the default rssh config file
# set the log facility. "LOG_USER" and "user" are equivalent.
logfacility = LOG_USER
# Leave these all commented out to make the default action for rssh to lock
# users out completely...
allowscp # scpを許可
allowsftp # sftpを許可
#allowcvs
#allowrdist
#allowrsync
# set the default umask
umask = 022
# If you want to chroot users, use this to set the directory where the root of
# the chroot jail will be located.
#
# if you DO NOT want to chroot users, LEAVE THIS COMMENTED OUT.
chrootpath = /opt/chroot # chroot先ディレクトリ
# You can quote anywhere, but quotes not required unless the path contains a
# space... as in this example.
#chrootpath = "/usr/local/my chroot"
##########################################
# EXAMPLES of configuring per-user options
:
:
:
いくつかエラーが表示されるがここでは気にしなくても大丈夫
$ sudo sh /usr/share/doc/rssh-2.3.4/mkchroot.sh /opt/chroot
NOT changing owner of root jail.
NOT changing perms of root jail.
setting up /opt/chroot/usr/bin
setting up /opt/chroot/usr/libexec/openssh
setting up /opt/chroot/usr/libexec
Copying libraries for /usr/bin/scp.
(0x00007fff541ff000)
cp: cannot stat `(0x00007fff541ff000)': そのようなファイルやディレクトリはありません
/usr/lib64/libcrypto.so.10
/lib64/libutil.so.1
/lib64/libz.so.1
/lib64/libnsl.so.1
/lib64/libcrypt.so.1
/lib64/libresolv.so.2
/lib64/libgssapi_krb5.so.2
/lib64/libkrb5.so.3
/lib64/libk5crypto.so.3
/lib64/libcom_err.so.2
/usr/lib64/libnss3.so
/lib64/libc.so.6
/lib64/libdl.so.2
/lib64/libfreebl3.so
/lib64/libkrb5support.so.0
/lib64/libkeyutils.so.1
/lib64/libpthread.so.0
/usr/lib64/libnssutil3.so
/lib64/libplc4.so
/lib64/libplds4.so
/lib64/libnspr4.so
/lib64/libselinux.so.1
/lib64/librt.so.1
Copying libraries for /usr/libexec/openssh/sftp-server.
(0x00007fff577f1000)
cp: cannot stat `(0x00007fff577f1000)': そのようなファイルやディレクトリはありません
/usr/lib64/libcrypto.so.10
/lib64/libutil.so.1
/lib64/libz.so.1
/lib64/libnsl.so.1
/lib64/libcrypt.so.1
/lib64/libresolv.so.2
/lib64/libgssapi_krb5.so.2
/lib64/libkrb5.so.3
/lib64/libk5crypto.so.3
/lib64/libcom_err.so.2
/usr/lib64/libnss3.so
/lib64/libc.so.6
/lib64/libdl.so.2
/lib64/libfreebl3.so
/lib64/libkrb5support.so.0
/lib64/libkeyutils.so.1
/lib64/libpthread.so.0
/usr/lib64/libnssutil3.so
/lib64/libplc4.so
/lib64/libplds4.so
/lib64/libnspr4.so
/lib64/libselinux.so.1
/lib64/librt.so.1
Copying libraries for /usr/bin/rssh.
(0x00007fff00bff000)
cp: cannot stat `(0x00007fff00bff000)': そのようなファイルやディレクトリはありません
/lib64/libc.so.6
Copying libraries for /usr/libexec/rssh_chroot_helper.
(0x00007fff3e152000)
cp: cannot stat `(0x00007fff3e152000)': そのようなファイルやディレクトリはありません
/lib64/libc.so.6
copying name service resolution libraries...
tar: メンバ名から先頭の `/' を取り除きます
tar: /lib/libnss_files*: stat 不能: そのようなファイルやディレクトリはありません
tar: /lib/libnss1_files*: stat 不能: そのようなファイルやディレクトリはありません
tar: 前のエラーにより失敗ステータスで終了します
Setting up /etc in the chroot jail
cp: omitting directory `/etc/ld.so.conf.d'
Chroot jail configuration completed.
NOTE: if you are not using the passwd file for authentication,
you may need to copy some of the /lib/libnss_* files into the jail.
NOTE: you must MANUALLY edit your syslog rc script to start syslogd
with appropriate options to log to /opt/chroot/dev/log. In most cases,
you will need to start syslog as:
/sbin/syslogd -a /opt/chroot/dev/log
NOTE: we make no guarantee that ANY of this will work for you... if it
doesn't, you're on your own. Sorry!
まず chroot 環境に /dev/null を作成する。
$ ls -l /dev/null
crw-rw-rw-. 1 root root 1, 3 8月 26 10:58 2015 /dev/null
$ sudo mknod /opt/chroot/dev/null c 1 3
$ sudo chmod 666 /opt/chroot/dev/null
$ ls -l /opt/chroot/dev/null
crw-rw-rw-. 1 root root 1, 3 8月 26 11:59 2015 /opt/chroot/dev/null
chroot 環境にコピーされるのは以下のコマンドなので、
それぞれのコマンドの ldd の結果を参照して
不足しているライブラリをコピーする。
ldd の出力結果からコピーが必要なライブラリを決定しているのだが
linux-vdso.so.1 と ld-linux-x86-64.so.2 は
表示形式が通常と異なっているためにコピーできていない様。
$ ldd /usr/bin/scp
linux-vdso.so.1 => (0x00007ffef53f0000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007fbd8e06a000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007fbd8de67000)
libz.so.1 => /lib64/libz.so.1 (0x00007fbd8dc50000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fbd8da37000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fbd8d800000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fbd8d5e5000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fbd8d3a1000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fbd8d0ba000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fbd8ce8d000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fbd8cc89000)
libnss3.so => /usr/lib64/libnss3.so (0x00007fbd8c94a000)
libc.so.6 => /lib64/libc.so.6 (0x00007fbd8c5b5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fbd8c3b1000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007fbd8c1ae000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fbd8bfa2000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fbd8bd9f000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbd8bb82000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbd8e662000)
libnssutil3.so => /usr/lib64/libnssutil3.so (0x00007fbd8b955000)
libplc4.so => /lib64/libplc4.so (0x00007fbd8b750000)
libplds4.so => /lib64/libplds4.so (0x00007fbd8b54c000)
libnspr4.so => /lib64/libnspr4.so (0x00007fbd8b30d000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbd8b0ee000)
librt.so.1 => /lib64/librt.so.1 (0x00007fbd8aee5000)
$ ldd /usr/libexec/openssh/sftp-server
linux-vdso.so.1 => (0x00007ffe2abcf000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007fbca7520000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007fbca731d000)
libz.so.1 => /lib64/libz.so.1 (0x00007fbca7106000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fbca6eed000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fbca6cb6000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fbca6a9b000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fbca6857000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fbca6570000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fbca6343000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fbca613f000)
libnss3.so => /usr/lib64/libnss3.so (0x00007fbca5e00000)
libc.so.6 => /lib64/libc.so.6 (0x00007fbca5a6b000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fbca5867000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007fbca5664000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fbca5458000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fbca5255000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbca5038000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbca7b18000)
libnssutil3.so => /usr/lib64/libnssutil3.so (0x00007fbca4e0b000)
libplc4.so => /lib64/libplc4.so (0x00007fbca4c06000)
libplds4.so => /lib64/libplds4.so (0x00007fbca4a02000)
libnspr4.so => /lib64/libnspr4.so (0x00007fbca47c3000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbca45a4000)
librt.so.1 => /lib64/librt.so.1 (0x00007fbca439b000)
$ ldd /usr/bin/rssh
linux-vdso.so.1 => (0x00007ffffe781000)
libc.so.6 => /lib64/libc.so.6 (0x00007f823c297000)
/lib64/ld-linux-x86-64.so.2 (0x00007f823c630000)
$ ldd /usr/libexec/rssh_chroot_helper
linux-vdso.so.1 => (0x00007fffb99e9000)
libc.so.6 => /lib64/libc.so.6 (0x00007fde8f0ff000)
/lib64/ld-linux-x86-64.so.2 (0x00007fde8f498000)
$ ls -1 /opt/chroot/lib64
libc.so.6
libcom_err.so.2
libcrypt.so.1
libdl.so.2
libfreebl3.so
libgssapi_krb5.so.2
libk5crypto.so.3
libkeyutils.so.1
libkrb5.so.3
libkrb5support.so.0
libnsl.so.1
libnspr4.so
libplc4.so
libplds4.so
libpthread.so.0
libresolv.so.2
librt.so.1
libselinux.so.1
libutil.so.1
libz.so.1
linux-vdso.so.1 は各プログラムのアドレス空間のみに常駐する
Virtual Dynamic Shared Object なので実体は存在しなくて問題ない。
それ以外に不足しているライブラリ(今回はld-linux-x86-64.so.2) を
chroot 環境にコピーする。
なおここで設定したファイルは後に削除する事。
# 不足しているライブラリをコピー
$ sudo cp -p /lib64/ld-linux-x86-64.so.2 /opt/chroot/lib64
# /bin/bash の実行を可能に
$ sudo mkdir /opt/chroot/bin
$ sudo cp -p /bin/bash /opt/chroot/bin/
$ sudo cp -p /lib64/libtinfo.so.5 /opt/chroot/lib64
# /usr/bin/ldd の実行を可能に
$ sudo cp -p /usr/bin/ldd /opt/chroot/usr/bin
$ sudo cp -p /bin/cat /opt/chroot/bin
# /usr/bin/strace の実行を可能に
$ sudo cp -p /usr/bin/strace /opt/chroot/usr/bin
scp (1) でアカウント情報を正しく取得できていない事が確認できる。
strace (1) で動作を確認してみると
/lib64/libnss_files.so.2 が open (2)エラーになっている事が判る。
# chroot /opt/chroot /bin/sh
# 必要なライブラリーを確認
# ldd /usr/bin/scp
linux-vdso.so.1 => (0x00007fff00345000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f2b2ca5b000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f2b2c858000)
libz.so.1 => /lib64/libz.so.1 (0x00007f2b2c641000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f2b2c428000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f2b2c1f1000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f2b2bfd6000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f2b2bd92000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f2b2baab000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f2b2b87e000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f2b2b67a000)
libnss3.so => /usr/lib64/libnss3.so (0x00007f2b2b33b000)
libc.so.6 => /lib64/libc.so.6 (0x00007f2b2afa6000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f2b2ada2000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f2b2ab9f000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f2b2a993000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f2b2a790000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2b2a573000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2b2d053000)
libnssutil3.so => /usr/lib64/libnssutil3.so (0x00007f2b2a346000)
libplc4.so => /lib64/libplc4.so (0x00007f2b2a141000)
libplds4.so => /lib64/libplds4.so (0x00007f2b29f3d000)
libnspr4.so => /lib64/libnspr4.so (0x00007f2b29cfe000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f2b29adf000)
librt.so.1 => /lib64/librt.so.1 (0x00007f2b298d6000)
# /usr/bin/scp -t .
unknown user 0
# strace /usr/bin/scp -t .
:
:
:
open("/lib64/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib64/tls/x86_64/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64/tls/x86_64", 0x7ffc3cabffb0) = -1 ENOENT (No such file or directory)
open("/lib64/tls/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64/tls", 0x7ffc3cabffb0) = -1 ENOENT (No such file or directory)
open("/lib64/x86_64/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64/x86_64", 0x7ffc3cabffb0) = -1 ENOENT (No such file or directory)
open("/lib64/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/usr/lib64/tls/x86_64/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/tls/x86_64", 0x7ffc3cabffb0) = -1 ENOENT (No such file or directory)
open("/usr/lib64/tls/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/tls", 0x7ffc3cabffb0) = -1 ENOENT (No such file or directory)
open("/usr/lib64/x86_64/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/x86_64", 0x7ffc3cabffb0) = -1 ENOENT (No such file or directory)
open("/usr/lib64/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
munmap(0x7f86d27d9000, 13667) = 0
write(2, "unknown user 0\r\n", 16unknown user 0
) = 16
exit_group(255) = ?
+++ exited with 255 +++
附属のスクリプトでメッセージに表示されてる様に
必要な libnss_* をコピーする。
$ sudo cp -p /lib64/libnss_files.so.2 /opt/chroot/lib64
これで chroot された環境に scp (1)、sftp (1) での
アクセスが可能となる。
正常な動作が確認できたら検証のためのコマンドを削除する。
$ sudo rm /opt/chroot/bin/bash $ sudo rm /opt/chroot/lib64/libtinfo.so.5 $ sudo rm /opt/chroot/usr/bin/ldd $ sudo rm /opt/chroot/bin/cat $ sudo rm /opt/chroot/usr/bin/strace