SSHサーバー構築(OpenSSH)

最終更新日: 2017.05.25

<<トップページ <<新着情報 <<逆引き集 <<リンク集 <<サイト内検索 <<メルマガ <<Scientific Linuxで自宅サーバー構築 <<Fedoraで自宅サーバー構築

■概要

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

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

■サーバーへTelnet接続

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

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

[root@centos ~]# chkconfig telnet on ← Telnetサーバー有効化

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

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



「ホスト」⇒サーバーIPアドレス
「サービス」⇒Telnet
「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を新規にインストールするため、既にインストールされて起動しているSSHサーバーをアンインストールする。
[root@centos ~]# /etc/rc.d/init.d/sshd stop ← SSHサーバー停止
sshdを停止中:                                              [  OK  ]

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

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

CentOS標準のOpenSSHはバージョンが古くchroot機能が含まれていないため、本家からソースを入手してRPMパッケージを作成してインストールする。
[root@centos ~]# yum -y install pam-devel ← opensshのRPM作成に必要なパッケージをインストール

[root@centos ~]# wget http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-5.3p1.tar.gz ← opensshダウンロード

※最新版のURLはダウンロードページで確認

[root@centos ~]# tar zxvf openssh-5.3p1.tar.gz ← openssh展開

[root@centos ~]# vi openssh-5.3p1/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-5.3p1/contrib/aix/ ← RedHat以外のディレクトリを削除

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

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

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

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

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

[root@centos ~]# tar czvf openssh-5.3p1.tar.gz openssh-5.3p1/ ← openssh展開先ディレクトリ再圧縮

[root@centos ~]# rm -rf openssh-5.3p1 ← openssh展開先ディレクトリ削除

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

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

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

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

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

[root@centos ~]# rm -f openssh-5.3p1.tar.gz ← ダウンロードしたファイルを削除

■SSHサーバー起動

(1)SSHサーバー起動スクリプト修正
※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 ~]# /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 ~]# chkconfig telnet off ← 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サーバーへリモート接続(TeraTerm鍵方式ログイン編)参照

■SSHサーバー設定

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

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

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

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

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

[root@centos ~]# echo Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com >> /etc/ssh/sshd_config ← 弱い暗号方式を使用しないようにする

[root@centos ~]# echo Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com >> /etc/ssh/ssh_config ← 弱い暗号方式を使用しないようにする

[root@centos ~]# echo MACs hmac-sha2-256,hmac-sha2-512,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,umac-64-etm@openssh.com,umac-128-etm@openssh.com >> /etc/ssh/sshd_config ← 弱い暗号方式を使用しないようにする

[root@centos ~]# echo MACs hmac-sha2-256,hmac-sha2-512,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,umac-64-etm@openssh.com,umac-128-etm@openssh.com >> /etc/ssh/ssh_config ← 弱い暗号方式を使用しないようにする

(2)chroot設定
管理者用ユーザー(wheelグループ所属ユーザー)を除いて、一般ユーザーが自身のホームディレクトリ以外を参照できないようにする。
[root@centos ~]# usermod -G wheel centos ← 管理者ユーザー(例:centos)をwheelグループに追加

[root@centos ~]# vi /etc/ssh/sshd_config ← SSHサーバー設定ファイル編集
以下を最終行へ追加
Match Group *,!wheel
        ChrootDirectory /home/%u/./

■SSHサーバー設定反映

(1)SSHサーバー設定反映
[root@centos ~]# /etc/rc.d/init.d/sshd reload ← SSHサーバー設定反映
sshd を再読み込み中:                                       [  OK  ]

(2)TCP22番ポート開放
【ルーター】
ルーター側の設定で、TCP22番ポートへのアクセスをサーバーに転送するようにする。
※ルーターの設定は各ルーターのマニュアルまたはメーカー別ルーターポート開放手順を参照

【ファイアウォール】
サーバー側のファイアウォール設定で、TCP22番ポートへのアクセスを許可するようにする。
ファイアウォール設定はこちらを参照

Portチェックテスト【外部からのPort開放確認】で「ホスト名(FQDN) または グローバルIPアドレス」にサーバー名(例:centossrv.com)、「チェックポート番号」に22と入力、「ご注意・制約事項」を確認チェックして「Portチェック実行」ボタンを押下し、
ホスト:centossrv.com
ポート:22
にアクセスできました
と表示されることを確認。

■chrootユーザー作成※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
chown root:root /home/$CHROOT_USERNAME
chmod 755 /home/$CHROOT_USERNAME
usermod -d /home/$CHROOT_USERNAME/./ $CHROOT_USERNAME
passwd $CHROOT_USERNAME
rm -f /home/$CHROOT_USERNAME/.* > /dev/null 2>&1
cd /home/$CHROOT_USERNAME/./

# 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設定時のみ

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

■chrootユーザー確認※chroot設定時のみ

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

-bash-3.02$ su - ← rootになれるか確認
-bash: su: command not found ← rootになれない

■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へのアクセスを許可している




▲このページのトップへ戻る

LPIロゴ Copyright© 2005-2017 fallenangels, All rights reserved.
ご自由にリンクしてください(連絡は不要です)
本ページへのご意見・ご要望、誤字・脱字・リンク切れ等のご連絡はこちらからお願いします