CentOS 6 に rssh を導入する


**rssh** は *ssh* (1)を利用したアクセスのうち *scp* (1)や *sftp* (1)といった特定のコマンドのみの実行を許可したり **chroot** 環境を提供するログインシェルで、セキュアなファイル転送は提供したいがシェルアカウントへのログインを拒否したい場合などに非常に有効なログインシェルです。

*scp* (1)や *sftp* (1)のみの実行を許可する場合はアカウントのログインシェルを *rssh* に変更して設定ファイルで実行を許可するコマンドを指定するだけで設定は完了します。
しかし **chroot** 環境を提供する場合はそのための環境設定が必要なのでその手順です。
> ここでは **chroot** するディレクトリを */path/to/chroot* として記述しています。

## rssh のインストール
CentOS 6 では *yum* (1)から導入可能です。

```sh:ターミナル
$ sudo yum -y install rssh
  :
  :
インストール:
  rssh.x86_64 0:2.3.4-1.el6

完了しました!
```

## 設定ファイルの編集
*ssp* (1)、 *sftp* (1)のアクセスを許可し **chroot** するディレクトリを指定します。 

```sh:/etc/rssh.conf
# 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 = /path/to/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
  : 
  : 
  :  
```

## chroot 環境の初期設定 
*rssh* に附属のスクリプトで **chroot** 環境の初期構築を行います。
いくつかエラーが表示されますがここでは気にしなくても大丈夫です。

```sh:ターミナル
$ sudo sh /usr/share/doc/rssh-2.3.4/mkchroot.sh /path/to/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)': そのようなファイルやディレクトリはありません
  :
  :
Copying libraries for /usr/libexec/openssh/sftp-server.
    (0x00007fff577f1000)
cp: cannot stat `(0x00007fff577f1000)': そのようなファイルやディレクトリはありません
  :
  :
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!
```

## 環境構築の続き
附属のスクリプトでメッセージに表示されている処理やエラーで完結できなかった処理などを実行して環境を構築します。

### /dev/null の作成
まず **chroot** 環境に */dev/null* を作成します。

```sh:ターミナル
$ ls -l /dev/null
crw-rw-rw-. 1 root root 1, 3  8月 26 10:58 2015 /dev/null
$ sudo mknod /path/to/chroot/dev/null c 1 3
$ sudo chmod 666 /path/to/chroot/dev/null
$ ls -l /path/to/chroot/dev/null
crw-rw-rw-. 1 root root 1, 3  8月 26 11:59 2015 /opt/chroot/dev/null
```

### ライブラリのコピー
次にライブラリをコピーします。
附属のスクリプトのエラーメッセージから *ldd* (1)で参照されたライブラリのうちいくつかがコピーできていない事が確認できるので手動でコピーします。
**chroot** 環境にコピーされるのは以下のコマンドなので、それぞれのコマンドの *ldd* (1)の結果を参照して不足しているライブラリをコピーします。

* /usr/bin/scp
* /usr/libexec/openssh/sftp-server
* /usr/bin/rssh
* /usr/libexec/rssh_chroot_helper

> *ldd* (1)の出力結果からコピーが必要なライブラリを決定しているのですが *linux-vdso.so.1* と *ld-linux-x86-64.so.2* は表示形式が通常と異なっているためにコピーできていない様です。 

```sh:ターミナル
$ 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
   :
   :
$ ldd /usr/bin/rssh
   :
   :
$ ldd /usr/libexec/rssh_chroot_helper
   :
   :
```

*linux-vdso.so.1* は各プログラムのアドレス空間のみに常駐する Virtual Dynamic Shared Object なので実体は存在しなくて問題ありません。
それ以外に不足しているライブラリ（今回は *ld-linux-x86-64.so.2* ）を **chroot** 環境にコピーします。

```sh:ターミナル
$ sudo cp /lib64/ld-linux-x86-64.so.2 /path/to/chroot/lib64
```

### 認証関係のファイルコピー
附属のスクリプトでメッセージに表示されてる様に認証処理で必要な libnss_* をコピーします。

```sh:ターミナル
$ sudo cp -p /lib64/libnss_files.so.2 /path/to/chroot/lib64
```

これで **chroot** された環境に *scp* (1)、 *sftp* (1) での アクセスが可能となります。

## 動作確認

### ログインシェルの変更
**chroot** するユーザのログインシェルを *rssh* (1)に変更します。

```sh:ターミナル
$ sudo chsh -s /usr/bin/rssh ユーザーID
```

### sftp でアクセス確認
*sftp* (1)でアクセスして確認します。

```sh:ターミナル
sftp ユーザID@localhost
Connecting to localhost...
ユーザID@localhost's password:
sftp> pwd
Remote working directory: /
sftp> exit
```