■概要

SSHサーバーは、Telnet同様にクライアントからサーバーへリモート接続して、遠隔地からサーバーを操作することができるサーバー。
ただし、Telnetが暗号化しないでそのままデータを送受信するのに対して、SSHでは通信内容を暗号化するため、盗聴されても問題ない。
ここでは、内部からだけではなく外部からも安全にサーバーにリモート接続できるようにするため、鍵方式によるログインのみを許可することにより、クラッカーによるパスワードアタックで不正にSSHサーバーへログインされてしまわないようにする。
また、SSHサーバーへの接続方式にはSSH1とSSH2があるが(SSH1とSSH2の違いについて)、より安全なSSH2による接続のみ許可することとする。
さらに、SSHログインしたユーザが自身のホームディレクトリ以外を参照できないようにする。
※リモート接続するのが管理者のみで不特定ユーザへリモート接続を開放しない場合は、SSHサーバー構築(OpenSSH)でも可。

なお、SSHサーバーを外部に開放せず、内部ユーザも信頼できる場合は、SSHサーバーの設定はデフォルトのまま、パスワード方式によるログイン方式でもよい。


■サーバーへTelnet接続

OpenSSH+ChrootをインストールするのにSSHサーバーを削除する必要があるが、SSHサーバーを削除してしまうとWindowsからリモート接続できなくなってしまうので、代替手段として一時的にTelnetでWindowsからリモート接続できるようにする。

(1)Telnetサーバーインストール
[root@centos ~]# yum -y install telnet-server ← Telnetサーバーインストール

[root@centos ~]# vi /etc/xinetd.d/telnet ← xinetd用Telnetサーバー設定ファイル編集
        disable         = yes
    ↓
        disable         = no ← Telnetサーバーを有効にする

[root@centos ~]# /etc/rc.d/init.d/xinetd restart ← xinetd再起動(Telnetサーバー起動)
xinetd を停止中:                                           [失敗]
xinetd を起動中:                                           [  OK  ]

(2)Telnetサーバーへログイン
PoderosaでTelnetサーバーへログインする。
※PoderosaインストールはWindowsからSSHサーバーへリモート接続(Poderosaパスワード方式ログイン編)参照


「ホスト」⇒サーバーIPアドレス
「プロトコル」⇒Telnet
「エンコーディング」欄⇒システムの文字コードを選択※「echo $LANG」コマンドで確認可能
「OK」ボタン押下

CentOS release 4.4 (Final)
Kernel 2.6.9-42.0.8.EL.xs0.4.6.281xenU on an i686
login: centos ← ユーザ名応答
Password: ← パスワード応答(表示はされない)
Last login: Thu Nov  2 02:37:24 from 192.168.1.10
[centos@centos ~]# ← Telnetでログインした

[centos@centos ~]# su - ← rootにスイッチ
Password: ← rootパスワード応答(表示はされない)

[root@centos ~]# ← rootになった
※Telnetサーバーへはrootで直接ログインできないので、管理者用の一般ユーザでログインしてrootにスイッチする

■SSHサーバーアンインストール

OpenSSH+Chrootを新規にインストールするため、既にインストールされて起動しているSSHサーバーをアンインストールする。
[root@centos ~]# /etc/rc.d/init.d/sshd stop ← SSHサーバー停止
sshdを停止中:                                              [  OK  ]

[root@centos ~]# yum -y remove openssh ← openssh関連パッケージアンインストール

■SSHサーバーインストール

(1)SSHサーバーインストール
OpenSSH+ChrootのRPMパッケージを作成してインストールする。
[root@centos ~]# wget http://chrootssh.sourceforge.net/download/openssh-4.5p1-chroot.tar.bz2
 ← openssh+chrootダウンロード

[root@centos ~]# tar jxvf openssh-4.5p1-chroot.tar.bz2 ← openssh+chroot展開

[root@centos ~]# vi openssh-4.5p1-chroot/contrib/redhat/openssh.spec ← specファイル編集
# Do we want to disable building of x11-askpass? (1=yes 0=no)
%define no_x11_askpass 0
↓
%define no_x11_askpass 1 ← x11_askpassの無効化

# Do we want to disable building of gnome-askpass? (1=yes 0=no)
%define no_gnome_askpass 0
↓
%define no_gnome_askpass 1 ← gnome_askpassの無効化

%configure \
        configure --without-zlib-version-check \ ← 追加(zlibのバージョンチェック無効化)
        --sysconfdir=%{_sysconfdir}/ssh \

[root@centos ~]# rm -rf openssh-4.5p1-chroot/contrib/aix/ ← RedHat以外のディレクトリを削除

[root@centos ~]# rm -rf openssh-4.5p1-chroot/contrib/hpux/ ← 〃

[root@centos ~]# rm -rf openssh-4.5p1-chroot/contrib/caldera/ ← 〃

[root@centos ~]# rm -rf openssh-4.5p1-chroot/contrib/suse/ ← 〃

[root@centos ~]# rm -rf openssh-4.5p1-chroot/contrib/cygwin/ ← 〃

[root@centos ~]# rm -rf openssh-4.5p1-chroot/contrib/solaris/ ← 〃

[root@centos ~]# mv openssh-4.5p1-chroot openssh-4.5p1 ← 展開してできたディレクトリをリネーム

[root@centos ~]# tar czvf openssh-4.5p1.tar.gz openssh-4.5p1/ ← リネーム後のディレクトリを圧縮

[root@centos ~]# rm -rf openssh-4.5p1 ← 不要となったリネーム後のディレクトリを削除

[root@centos ~]# rpmbuild -tb --clean openssh-4.5p1.tar.gz ← RPMパッケージ作成
※時間がかかる
rpmbuildが「ビルド依存性の失敗」で異常終了した場合

[root@centos ~]# rpm -Uvh /usr/src/redhat/RPMS/i386/openssh-4.5p1-1.i386.rpm
 ← 作成したopensshのRPMパッケージをインストール
Preparing...                ########################################### [100%]
   1:openssh                ########################################### [100%]

[root@centos ~]# rpm -Uvh /usr/src/redhat/RPMS/i386/openssh-server-4.5p1-1.i386.rpm
 ← 作成したopenssh-serverのRPMパッケージをインストール
Preparing...                ########################################### [100%]
   1:openssh-server         ########################################### [100%]

[root@centos ~]# rpm -Uvh /usr/src/redhat/RPMS/i386/openssh-clients-4.5p1-1.i386.rpm
 ← 作成したopenssh-clientsのRPMパッケージをインストール
Preparing...                ########################################### [100%]
   1:openssh-clients        ########################################### [100%]

[root@centos ~]# rm -f /usr/src/redhat/RPMS/i386/* ← 作成したRPMを削除

[root@centos ~]# rm -f openssh-4.5p1.tar.gz ← 削除

[root@centos ~]# rm -f openssh-4.5p1-chroot.tar.bz2 ← ダウンロードしたファイルを削除
※最新版のURLはダウンロードページで確認

(2)yumによるアップデート除外設定
yumの自動アップデート機能により、Chroot機能を含んでいないopensshパッケージにアップデートされてしまわないようにするため、yumの処理対象からopensshパッケージを除外するようにする。
[root@centos ~]# vi /etc/yum.conf ← yum設定ファイル編集
exclude=openssh* ← 最終行へ追加(yumの処理対象からopensshパッケージを除外する)

■SSHサーバー起動

(1)SSHサーバー起動スクリプト修正(FC4,FC5,FC6のみ)
※SSHサーバー起動時に以下のワーニングメッセージが出力されることの対処
Starting sshd:WARNING: initlog is deprecated and will be removed in a future release
[root@centos ~]# vi /etc/rc.d/init.d/sshd ← SSHサーバー起動スクリプト修正
start()
{
        # Create keys if necessary
        do_rsa1_keygen
        do_rsa_keygen
        do_dsa_keygen

        echo -n $"Starting $prog:"
        #initlog -c "$SSHD $OPTIONS" && success || failure ← 行頭に#を追加してコメントアウト
        $SSHD $OPTIONS && success || failure ← 追加
        RETVAL=$?
        [ "$RETVAL" = 0 ] && touch /var/lock/subsys/sshd
        echo
}

(2)SSHサーバー起動
[root@centos ~]# ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key -N "" ← ホストキー(RSA1)再作成
Generating public/private rsa1 key pair.
/etc/ssh/ssh_host_key already exists.
Overwrite (y/n)? y ← y応答
Your identification has been saved in /etc/ssh/ssh_host_key.
Your public key has been saved in /etc/ssh/ssh_host_key.pub.
The key fingerprint is:
41:4f:30:53:7e:a2:c1:a5:aa:50:39:0e:8b:cd:12:8b root@centos.wakuwakustation.com

[root@centos ~]# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" ← ホストキー(RSA2)再作成
Generating public/private rsa key pair.
/etc/ssh/ssh_host_rsa_key already exists.
Overwrite (y/n)? y ← y応答
Your identification has been saved in /etc/ssh/ssh_host_rsa_key.
Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub.
The key fingerprint is:
a2:ad:b1:ff:94:ed:cb:85:6d:32:78:c7:e5:15:4a:50 root@centos.wakuwakustation.com

[root@centos ~]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N "" ← ホストキー(DSA)再作成
Generating public/private dsa key pair.
/etc/ssh/ssh_host_dsa_key already exists.
Overwrite (y/n)? y ← y応答
Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
The key fingerprint is:
c2:10:be:ec:53:c3:b0:07:b4:da:c3:49:1c:02:a5:68 root@centos.wakuwakustation.com

[root@centos ~]# /etc/rc.d/init.d/sshd start ← SSHサーバー起動
sshd を起動中:                                             [  OK  ]

[root@centos ~]# chkconfig sshd on ← SSHサーバー自動起動設定

[root@centos ~]# chkconfig --list sshd ← SSHサーバー自動起動設定確認
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off ← ランレベル2~5のonを確認

■Telnetサーバー削除

TelnetからログアウトしてSSHでログインし直してから、不要になったTelnetサーバーを削除する。
[root@centos ~]# vi /etc/xinetd.d/telnet ← xinetd用Telnetサーバー設定ファイル編集
        disable         = no
    ↓
        disable         = yes ← Telnetサーバーを無効効にする

[root@centos ~]# /etc/rc.d/init.d/xinetd restart ← xinetd再起動(Telnetサーバー停止)
xinetd を停止中:                                           [  OK  ]
xinetd を起動中:                                           [  OK  ]

[root@centos ~]# yum -y remove telnet-server ← Telnetサーバーアンインストール

■管理者ユーザ鍵方式ログイン設定

SSHサーバーを鍵方式によるログイン方式のみ許可するように設定する前に、管理者ユーザを鍵方式ログインできるようにする。⇒WindowsからSSHサーバーへリモート接続(Poderosa鍵方式ログイン編)参照

■SSHサーバー設定

[root@centos ~]# vi /etc/ssh/sshd_config ← SSHサーバー設定ファイル編集
#Protocol 2,1
↓
Protocol 2 ← SSH2でのみ接続を許可

#SyslogFacility AUTH
↓
SyslogFacility AUTHPRIV ← ログを/var/log/secureに記録する※CentOSデフォルトに合わせる2007.04.10追加

#PermitRootLogin yes
↓
PermitRootLogin no ← rootでのログインを禁止

#PasswordAuthentication yes
↓
PasswordAuthentication no ← パスワードでのログインを禁止(鍵方式によるログインのみ許可)

#PermitEmptyPasswords no
↓
PermitEmptyPasswords no ← パスワードなしでのログインを禁止

■SSHサーバー再起動

(1)SSHサーバー再起動
[root@centos ~]# /etc/rc.d/init.d/sshd restart ← SSHサーバー再起動
sshdを停止中:                                              [  OK  ]
sshdを起動中:                                              [  OK  ]

(2)ポート22番のOPEN
ルーター側の設定でポート22番をOPENする。

ポートチェック【外部からポート開放確認】で「host名」にサーバー名(例:wakuwakustation.com)、「port番号」に22と入力して「ポートチェック」ボタン押下し、「ホスト=wakuwakustation.com ポート=22 にアクセスできました。」と表示されることを確認。

■chrootユーザ作成

(1)chrootユーザ作成スクリプト作成
[root@centos ~]# mkdir -p ~/bin ← chrootユーザ作成スクリプト格納ディレクトリ作成

[root@centos ~]# vi ~/bin/chroot-useradd ← chrootユーザ作成スクリプト作成※
#!/bin/bash
#
# Usage: ./chroot-useradd username [shell]
#

# Here specify the apps you want into the enviroment
CMD="bash ls touch mkdir cp mv rm pwd chmod cat vi id rsync ssh scp sftp ping ssh-keygen perl"
APPS=`which $CMD`
APPS="${APPS} /usr/libexec/openssh/sftp-server"

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

# Obtain username and HomeDir
CHROOT_USERNAME=$1
if [ "$2" = "" ] ; then
    useradd $CHROOT_USERNAME
else
    useradd -s $2 $CHROOT_USERNAME
fi
usermod -d /home/$CHROOT_USERNAME/./ $CHROOT_USERNAME
passwd $CHROOT_USERNAME
chown $CHROOT_USERNAME /home/$CHROOT_USERNAME
chgrp $CHROOT_USERNAME /home/$CHROOT_USERNAME
rm -f /home/$CHROOT_USERNAME/.* > /dev/null 2>&1
HOMEDIR=`grep /etc/passwd -e "^$CHROOT_USERNAME"  | cut -d':' -f 6`
cd $HOMEDIR

# Create Directories no one will do it for you
mkdir -p etc
mkdir -p bin
mkdir -p usr/bin
mkdir -p usr/local/bin
mkdir -p usr/libexec/openssh
MAKEDEV -d dev -x null 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
chmod 755 usr/bin/groups

# Add some users to ./etc/paswd
grep /etc/passwd -e "^root" -e "^$CHROOT_USERNAME" > etc/passwd
grep /etc/group -e "^root" -e "^$CHROOT_USERNAME" > 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 > /dev/null 2>&1
        done
    fi
done

# From some strange reason these 4 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 lib/
cp /lib/libnsl.so.1 lib/
cp /lib/libnss_files.so.2 lib/
cp /lib/ld-linux.so.2 ./lib/
cp /lib/libc.so.6 lib/
cp /lib/libm.so.6 lib/
cp /lib/libpthread.so.0 lib/
cp /lib/librt.so.1 lib/
cp /lib/libthread_db.so.1 lib/

exit 0



[root@centos ~]# chmod u+x ~/bin/chroot-useradd ← chrootユーザ環境作成スクリプトに実行権限付加

(2)chrootユーザ作成
ホームディレクトリより上層へのアクセスを禁止するユーザ(ここではcentosuserとする)の作成
[root@centos ~]# chroot-useradd centosuser ← ユーザ作成
Changing password for user centosuser.
New UNIX password: ← ユーザパスワード応答
Retype new UNIX password: ← ユーザパスワード応答(確認)
passwd: all authentication tokens updated successfully.

■chrootユーザ鍵方式接続設定

chrootユーザ用の鍵ペア作成、公開鍵セットアップを行う。⇒WindowsからSSHサーバーへリモート接続(Poderosa鍵方式ログイン編)参照

■chrootユーザ確認

chrootユーザでSSHサーバーにログインする。
-bash-3.00$ pwd ← ホームディレクトリが/(ルート)になっているかpwdで確認
/ ← ホームディレクトリが/(ルート)になっている(これ以上、上層へ移動できない)

-bash-3.00$ su - ← rootになれるか確認
-bash: su: command not found ← rootになれない
なお、chrootユーザ作成以外で作成したユーザは制限なくアクセスできるため(パーミッションによる制約は受けるが)、 管理者のみ通常のユーザ作成手順で作成し、管理者以外のユーザへSSHを開放する場合は、chrootユーザとして作成するようにする。

■SSHアクセス制限

SSHでは、ユーザ名とパスワードをランダムにかえてログインを連続試行してくる攻撃ツールが出回っているため、サーバーを一定期間運営していると以下のようなログが大量に記録されるようになる。
当サイトではパスワードによる認証は許可していないのでログインされてしまうことはないが、ログが大量に記録されて煩わしいので、SSHサーバーへアクセスできるホストを制限する。

Invalid user fluffy from xxx.xxx.xxx.xxx
Invalid user admin from xxx.xxx.xxx.xxx
Invalid user test from xxx.xxx.xxx.xxx
Invalid user guest from xxx.xxx.xxx.xxx
Invalid user webmaster from xxx.xxx.xxx.xxx
Invalid user mysql from xxx.xxx.xxx.xxx
Invalid user oracle from xxx.xxx.xxx.xxx

[root@centos ~]# echo "sshd:127.0.0.1" >> /etc/hosts.allow ← サーバー自身からのsshへのアクセスを許可

[root@centos ~]# echo "sshd: 192.168.1." >> /etc/hosts.allow ← 内部(例:192.168.1.XXXからのsshアクセスを許可)

[root@centos ~]# echo "sshd: .ppp.asahi-net.or.jp"  >> /etc/hosts.allow ← 外部(例:xxx.ppp.asahi-net.or.jpからのsshアクセスを許可)

[root@centos ~]# echo "sshd: ALL" >> /etc/hosts.deny ← sshへの全てのアクセスを禁止
※上記では、内部(例:192.168.1.XXX)と外部(例:xxx.ppp.asahi-net.or.jp)からのみ、SSHへのアクセスを許可している