SSHサーバー(OpenSSH)のインストール

概要:SSHサーバー(OpenSSH)は、Telnet同様にクライアントからサーバーへリモート接続して、遠隔地からサーバーを操作することができるサーバーである。 ただし、Telnetが暗号化しないでそのままデータを送受信するのに対して、SSHでは通信内容を暗号化するため、盗聴されても問題ない。
外部への公開を想定し、内部からだけではなく外部からも安全にサーバーにリモート接続できるようにするため、鍵方式によるログインのみを許可することとし、rootによる直接のログインは許可しない。
また、SSHサーバーへの接続方式にはSSH1とSSH2があるが、より安全なSSH2による接続のみ許可することとする。
以下の作業では始めに既存SSHを出来るだけ使用し、SSHをアンインストール中は、Console画面から作業する。

1. OpenSSHサーバーのパッケージ作成

# yum -y install pam-devel
 ← opensshのRPM作成に必要なパッケージをインストール
# cd /tmp/work
# wget http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-5.3p1.tar.gz
 ← opensshダウンロード
注:最新版のURLはダウンロードページ
  [http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/]で確認すること。
# tar zxvf openssh-5.3p1.tar.gz ← openssh展開
# 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 \
# rm -rf openssh-5.3p1/contrib/aix/      ← RedHat以外のディレクトリを削除
# rm -rf openssh-5.3p1/contrib/hpux/     ← 〃
# rm -rf openssh-5.3p1/contrib/caldera/  ← 〃
# rm -rf openssh-5.3p1/contrib/suse/     ← 〃
# rm -rf openssh-5.3p1/contrib/cygwin/   ← 〃
# rm -rf openssh-5.3p1/contrib/solaris/  ← 〃
# rm openssh-5.3p1.tar.gz ← 既存圧縮ファイルの削除
# tar czvf openssh-5.3p1.tar.gz openssh-5.3p1/
 ← openssh展開先ディレクトリ再圧縮
# rm -rf openssh-5.3p1 ← openssh展開先ディレクトリ削除
# rpmbuild -tb --clean openssh-5.3p1.tar.gz ← RPMパッケージ作成
エラー: ビルド依存性の失敗:
     openssl-devel は openssh-5.3p1-1.i386 に必要とされています
     krb5-devel は openssh-5.3p1-1.i386 に必要とされています

rpmbuildで上記のようなエラーがでた場合はrpmbuildのビルド依存性の失敗を参照。
上記エラーが出たので以下を実行する。

# yum -y install openssl-devel ← krb5-devel は openssl-develを導入する時に導入される。
# rm -f openssh-5.3p1.tar.gz ← 作成した圧縮ファイルの削除

2. SSHサーバーアンインストール
以下はConsole画面からの操作

# /etc/rc.d/init.d/sshd stop ← SSHサーバー停止
sshdを停止中:                                              [  OK  ]

# yum -y remove openssh ← openssh関連パッケージアンインストール

3. SSHサーバーインストール

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

# rpm -Uvh /usr/src/redhat/RPMS/i386/openssh-server-5.3p1-1.i386.rpm
 ← 作成したopenssh-serverのRPMパッケージをインストール
# rpm -Uvh /usr/src/redhat/RPMS/i386/openssh-clients-5.3p1-1.i386.rpm
 ← 作成したopenssh-clientsのRPMパッケージをインストール
# rm -f /usr/src/redhat/RPMS/i386/openssh-* ← 作成したRPMを削除

4. SSHサーバー起動スクリプト修正
SSHサーバー起動時に以下のワーニングメッセージが出力されることの対処。
Starting sshd:WARNING: initlog is deprecated and will be removed in a future release

# 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
}

5. SSHサーバー起動

# /etc/rc.d/init.d/sshd start ← SSHサーバー起動
sshd を起動中:                                             [  OK  ]
# chkconfig sshd on ← SSHサーバー自動起動設定
# chkconfig --list sshd ← SSHサーバー自動起動設定確認
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
 ← ランレベル2~5のonを確認

以下はTera Termから操作を行う。

6. SSH鍵方式ログイン設定
SSHサーバーを鍵方式によるログイン方式のみ許可するように設定する前に、管理者ユーザーを鍵方式ログインできるようにする。→ SSH鍵ペア作成とセットアップ参照。

7. SSHサーバー設定

# 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 ← パスワードなしでのログインを禁止

8. chroot設定
管理者用ユーザー(wheelグループ所属ユーザー)を除いて、一般ユーザーが自身のホームディレクトリ以外を参照できないようにする。

 # usermod -G wheel centos ← 管理者ユーザー(例:centos)をwheelグループに追加
 # vi /etc/ssh/sshd_config ← SSHサーバー設定ファイル編集

以下を最終行へ追加

 Match Group *,!wheel
         ChrootDirectory /home/%u/./

9. SSHサーバー設定反映

# /etc/rc.d/init.d/sshd reload ← SSHサーバー再起動
sshd を再読み込み中:                                       [  OK  ]

注:これ以降鍵方式によるログインしか出来なくなる。

10. chrootユーザー作成 [chroot設定時のみ]

  1. ) chrootユーザー作成スクリプト作成
    # mkdir -p ~/bin ← chrootユーザー作成スクリプト格納ディレクトリ作成
    # 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
    
    # chmod u+x ~/bin/chroot-useradd ← chrootユーザー環境作成スクリプトに実行権限付加
    
  2. ) chrootユーザー作成 ホームディレクトリより上層へのアクセスを禁止するユーザー(ここではcentosuserとする)の作成
    # chroot-useradd centosuser ← ユーザー作成
    Changing password for user centosuser.
    New UNIX password: ← ユーザーパスワード応答
    Retype new UNIX password: ← ユーザーパスワード応答(確認)
    passwd: all authentication tokens updated successfully.
    
  3. ) chrootユーザー用の鍵ペアを作成し、公開鍵セットアップを行う。。→ SSH鍵ペア作成とセットアップ参照。
     
  4. ) chrootユーザー確認 chrootユーザーでSSHサーバーにログインする。
    -bash-3.02$ pwd ← ホームディレクトリが/(ルート)になっているかpwdで確認
    / ← ホームディレクトリが/(ルート)になっている(これ以上、上層へ移動できない)
    
    -bash-3.02$ su - ← rootになれるか確認
    -bash: su: command not found ← rootになれない
    

11. 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
# echo "sshd:127.0.0.1" >> /etc/hosts.allow ← サーバー自身からのsshへのアクセスを許可
# echo "sshd: 192.168.1." >> /etc/hosts.allow ← 内部(例:192.168.1.XXXからのsshアクセスを許可)
# echo "sshd: .ppp.asahi-net.or.jp"  >> /etc/hosts.allow
 ← 外部(例:xxx.ppp.asahi-net.or.jpからのsshアクセスを許可)
# echo "sshd: ALL" >> /etc/hosts.deny ← sshへの全てのアクセスを禁止

注:上記では、内部(例:192.168.1.XXX)と外部(例:xxx.ppp.asahi-net.or.jp)からのみ、SSHへのアクセスを許可している。


最終更新のRSS
Last-modified: 2014-05-03 (土) 19:43:07 (3639d)