○ OpenSSH (chroot+sshlogin) の設定

・chroot環境でsshログイン、scp、sftp接続を行います
・openssh-7.5p1の"ChrootDirectory"を使います
・専用の秘密鍵・公開鍵を使用します
・間違ってもrootの秘密鍵を渡さないこと

・公開サーバで使う場合は、ローカル環境で十分実証して下さい

・ソースの取得、削除は省略します
・エディタ、ファイラーの操作は省略します
・Enterキーを省略します

・ログイン端末で "#" はroot、"$" は一般ユーザのプロンプトの記号です
・設定ファイルで "#" で始まる行はコメントとして解釈されます

○参照ファイル

パッケージの追加
最初の設定 (Xen)
OpenSSHのインストール
OpenSSH (chroot+sftponly) の設定

○仮設定

:サーバ jupiter.528p.com
:OS CentOS 6.9
:openssh 7.5p1
:selinx disabled or permissive
:作業 /root 一部 /home/umi
:言語 LANG=en_US.UTF-8
:ユーザー rootで実行 一部 umiで実行


:クライアント  mars.528p.com
:OS CentOS 7.3
:openssh 6.6.1p1
:作業 /home/umi
:言語 LANG=en_US.UTF-8
:ユーザー umiで実行

・メンテナンスの場合は一般ユーザから行います



○chrootの設定

○chroot専用ユーザ・グループの設定

・仮定 一般ユーザ (umi) とします
・useraddに"-M"オプションをつけるとホームディレクトリを作成しません
・.bash_logout .bash_profile .bashrc が存在するとうまくいかない
・sshログインには/bin/bashをログインSHELLに設定する必要があります
・パスワードを設定しないと公開鍵認証でもエラーになります
・groupIDは/etc/groupファイルを参照して未使用の番号を使用します

[root@jupiter:~]
# useradd -M -s /bin/bash umi
# passwd umi
New UNIX password:← パスワードを入力
Retype new UNIX password:← 再入力
# groupadd -g 302 torikago
# gpasswd -a umi torikago

○ディレクトリの作成・必要なファイルのコピー

・スクリプトを作成して管理者権限で実行します
・ディレクトリ名等は、自分の環境に合わせてください
・必要なコマンドはAPPSの行に追加して下さい

・root権限でユーザのchrootディレクトリを作ります
・chrootディレクトリの所有者はrootでなければなりません
・同時にユーザの書き込み可能なディレクトリ (例 data) をつくります
・ユーザのhomeディレクトリを作り、上位のディレクトリにリンクをはります
・パーミッションに注意、chrootされないwheelグループのアクセスが可能です

・chrootディレクトリ内に必要なファイルをコピーします
・ファイルが変更された場合、再コピーする必要があります
・コピーしたファイルはrootの所有権のまま使います
・ライブラリのコピーの部分でmkdirに"-p"オプションを付けます
紫色部分 opensshの状態によって変わります

・Subsystemでsftp-serverを使うにはchroot環境にコピーする必要があります
・このchroot環境では日本語編集はできません

:create_chroot_env5 (root root 700)

#!/bin/bash

#
# Usage: ./create_chroot_env5 username
#

# Here specify the apps you want into the enviroment
APPS="/bin/bash /bin/cat /bin/cp /bin/chmod /bin/ls \
/bin/mkdir /bin/mv /bin/touch /bin/pwd /bin/rm /bin/vi \
/usr/bin/id /usr/local/bin/scp /usr/local/bin/sftp"

# Here specify the dir's
SUBDIR="data public_html"

# Sanity check
if [ "$1" = "" ] ; then
    echo " Usage: ./create_chroot_env5 username"
    exit
fi

# Obtain username and HomeDir
CHROOT_USER=$1
CHROOT_DIR=`grep /etc/passwd -e "^$CHROOT_USER" | cut -d':' -f 6`
if [ ! -d $CHROOT_DIR ] ; then
    mkdir $CHROOT_DIR
else
    chmod 755 $CHROOT_DIR    
    chown root:root $CHROOT_DIR
fi

cd $CHROOT_DIR

# Create writeable Directories only for you
# For "Could not chdir to home" warning
HOME_DIR=`echo $CHROOT_DIR | sed 's/^\///'`
mkdir -p $HOME_DIR

# For ftp access or http access
for sub in $SUBDIR; do
    if [ ! -d $sub ] ; then
        mkdir $sub
        chown $CHROOT_USER:$CHROOT_USER $sub
        chmod 711 $sub
    fi
    # For sftp access
    cd $HOME_DIR
    ln -s ../../$sub
    cd $CHROOT_DIR
done

# If necessary sftp access Maildir
if [ -d $CHROOT_DIR/Maildir ] ; then
    cd $HOME_DIR
    ln -s ../../Maildir
fi

cd $CHROOT_DIR

# Create Directories no one will do it for you
mkdir {etc,bin,dev}
mkdir -p usr/bin
mkdir -p usr/local/bin
MAKEDEV -d dev -x null random zero

# Create short version to /usr/bin/groups
# On some system it requires /bin/sh,
# which is generally unnessesary in a chroot cage

echo "#!/bin/bash" > usr/bin/groups
echo "id -Gn" >> usr/bin/groups

# Add some users to ./etc/passwd
grep /etc/passwd -e "^root" -e "^$CHROOT_USER" > etc/passwd
grep /etc/group -e "^root" -e "^$CHROOT_USER" > etc/group

# Copy the apps and the related libs
for prog in $APPS; do
    cp $prog ./$prog

    # obtain a list of related libraryes
    ldd $prog > /dev/null
    if [ "$?" = 0 ] ; then
    LIBS=`ldd $prog | awk '{ print $3 }'`
        for l in $LIBS; do
        mkdir -p ./`dirname $l` > /dev/null 2>&1
        cp $l ./$l
       done
    fi
done

# From some strange reason these 3 libraries are not in the ldd output,
# but without them some stuff will not work, like usr/bin/groups
cp /lib/{libnss_compat.so.2,libnsl.so.1,libnss_files.so.2} ./lib/

# My original openssh'settings needs
cp -L /lib/ld-linux.so.2 ./lib/
cp /etc/{ld.so.cache,ld.so.conf,localtime} ./etc/

create_chroot_env5

・openssh-4.7(chroot)で使用したcreate_chroot_envを修正したものです

○スクリプトの実行

・rootディレクトリにコピーして実行します

[root@jupiter:~]
# chmod -c 700 create_chroot_env5
# ./create_chroot_env5 umi

○必要なライブラリの検索

・全ての必要なライブラリがコピーされないかもしれない
・lddコマンドで必要なライブラリを表示させ、コピーされているか確認する
・linux-gate.so.1 (システム・コールを処理する特殊な共有オブジェクト)
・/lib/i686/nosegneg/* (glibcのnosegnegがうまく機能する場合)
・ld-linux.so.2 (静的にコンパイルされた動的リンカ)

$ ldd /bin/bash
        linux-gate.so.1 =>  (0xb7ff0000)
        libtermcap.so.2 => /lib/libtermcap.so.2 (0x4ac86000)
        libdl.so.2 => /lib/libdl.so.2 (0x4ac7f000)
        libc.so.6 => /lib/i686/nosegneg/libc.so.6 (0x4ab21000)
        /lib/ld-linux.so.2 (0x4ab02000)

○ファイル及びディレクトリのユーザ・グループ・パーミッションの設定

home/umi/ 755 root:root

.ssh/ 700 umi:umi


authorized_keys 600 umi:umi

bin/ 755 root:root

dev/ 755 root:root

etc/ 755 root:root

lib/ 755 root:root


i686/nosegneg/ 755 root:root

usr/ 755 root:root


bin/ 755 root:root


lib/ 755 root:root


local/ 755 root:root



bin/ 755 root:root



lib/ 755 root:root



libexec/ 755 root:root

home/ 755 root:root


umi/ 755 root:root



~data 777 root:root  symbolic link



~public_html 777 root:root  symbolic link

data/ 711 umi:umi


openssh-7.5p1.tar.gz 644 umi:umi

public_html/ 711 umi:umi


test.html 644 umi:umi

○configファイルの修正

・デフォルトから変更した部分を記述しています
・chrootユーザのsftp接続には、"internal-sftp"を使います
・"Match"は最終行に追加します、torikagoグループのみChrootさせます
・"ForceCommand"を指定すると、そのコマンドのみ可能なので注意
紫色部分 パスワード認証を許可する場合 (rootは公開鍵認証)

:/etc/ssh/sshd_config

Port 22
AddressFamily inet
ListenAddress 0.0.0.0
AllowGroups wheel torikago

SyslogFacility AUTHPRIV
LogLevel VERBOSE
PermitRootLogin without-password
RSAAuthentication no
PubkeyAuthentication yes
IgnoreUserKnownHosts yes
PasswordAuthentication no
ChallengeResponseAuthentication no
X11UseLocalhost no
PrintMotd no
PermitUserRC no

Subsystem	sftp	internal-sftp

Match Group torikago
    PasswordAuthentication yes
    AllowAgentForwarding no
    AllowTcpForwarding no
    ChrootDirectory /home/%u

○sshdの再起動

[root@jupiter:~]
# service sshd restart



○公開鍵の作製とサーバへのコピー

○ローカルホスト上でECDSA認証鍵を作ります

・ユーザのディレクトリに.sshディレクトリが作られます
・id_ecdsa (ECDSA秘密鍵) id_ecdsa.pub (ECDSA公開鍵) が収納されます

[umi@mars ~]
$ ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/umi/.ssh/id_ecdsa):← Enterキー
Created directory '/home/umi/.ssh'.
Enter passphrase (empty for no passphrase):← パスフレーズを入力
Enter same passphrase again:← 再入力
Your identification has been saved in /home/umi/.ssh/id_ecdsa.
Your public key has been saved in /home/umi/.ssh/id_ecdsa.pub.
The key fingerprint is:
22:e5:4c:4a:e6:80:7a:8e:93:7e:80:16:14:f3:64:49 umi@mars.528p.com
The key's randomart image is:
+--[ECDSA  256]---+
| ooE.            |
| o=.             |
|o ..o o          |
|.. = *           |
|o o + + S        |
|.B   . .         |
|= o              |
|.. .             |
| ..              |
+-----------------+

○サーバ上でid_ecdsa.pub (ECDSA公開鍵) を登録します

・ローカルホストからサーバにid_ecdsa.pub (ECDSA公開鍵)を転送しておきます
・専用ディレクトリをつくり、公開鍵を専用ファイルに書き加えます
・ディレクトリとファイルのパーミッション・オーナーを変更します

# cd /home/umi
[root@jupiter:/home/umi]
# mkdir .ssh
# cat id_ecdsa >> .ssh/authorized_keys
# chmod 700 .ssh
# chmod 600 .ssh/authorized_keys
# chown -R umi:umi .ssh

○selinuxヘの対応 (selinuxが有効の場合)

:新規ファイルのselinuxラベルを修正

# cd ~
[root@jupiter:~]
# restorecon -Rv /etc
# restorecon -RFv /home/umi

○sshによる接続

・カレントディレクトリは/home/umi/home/umiになります (userがumiの場合)

[umi@mars:~]
$ ssh umi@jupiter.528p.com
-bash-4.1$ pwd
/home/umi
-bash-4.1$ ls
data  public_html
-bash-4.1$ cd ../../
-bash-4.1$ pwd
/
-bash-4.1$ ls
bin  data  dev	etc  home  lib	public_html  usr
-bash-4.1$ exit
logout
Connection to umi@jupiter.528p.com closed.



○scpによる接続

・送信先に書込可能なディレクトリを指定します (紫色部分)

[umi@mars:~]
$ scp test.html umi@jupiter.528p.com:public_html
test.html                      100%  228     0.2KB/s   00:00

○sftpによる接続

・カレントディレクトリは/home/umi/home/umiになります (userがumiの場合)

[umi@mars:~]
$ sftp umi@jupiter.528p.com
Connecting to jupiter.528p.com...
sftp> pwd
Remote working directory: /home/umi
sftp> ls
data	public_html
sftp> cd ../../
sftp> pwd
Remote working directory: /
sftp> ls
bin  data  dev	etc  home  lib	public_html  usr
sftp> cd /home/sola
Couldn't stat remote file: No such file or directory
sftp> cd /home/umi/data
sftp> pwd
Remote working directory: /data
sftp> put openssh-7.5p1.tar.gz
Uploading openssh-7.5p1.tar.gz to /data/openssh-7.5p1.tar.gz
openssh-7.5p1.tar.gz           100% 1475KB   1.4MB/s   00:00 
sftp> ls
openssh-7.5p1.tar.gz
sftp> exit
$

・wheelグループのユーザでsftp接続

[sola@mars:~]
$ sftp sola@jupiter.528p.com
Connecting to jupiter.528p.com...
sftp> cd /home/umi/data
sftp> pwd
Remote working directory: /home/umi/data
sftp> ls
remote readdir("/home/staff/data"): Permission denied
sftp> exit
$

○ Copyright(c) 528p.com All Rights Reserved.