OpenSSHを最新版へ
今回はOpenSSHを最新版の3.7.1へ入れ替えます。何故ならば3.7.1前のバージョンにセキュリティーホールが見つかったらしいから。どの箇所に見つかり、僕の環境でも影響があるか判らないですがとりあえず入れ替えます。
我が家のサーバーで使用するTurboLinux 7 Serverにはそれ以前のものが動作していたので最新版(現時点では3.7.1)に入れ替える事とします。

※ 3.7.1p1をインストールした二日後、何気なくhttp://www.linux.or.jp/を見ていたら3.7.1p2がリリースされている事がかかれていた。3.7.1p1では対応不足であったらしい。面倒だが再度インストールだ。

ここでは、OpenSSHのインストールの紹介のみです。実際にクライアントから接続する際はOpenSSHのインストールを使うを参照してください。

インストールの流れは次のようになります。
作業は全てrootで行います。
  1. ソースコードのダウンロード
  2. sshdユーザーの作成
  3. make
  4. sshd_configの設定
  5. PAMの設定
  6. ログインユーザー用の鍵作成
  7. 機動スクリプトの作成
  1. ソースコードのダウンロード
    まずはFTPサイトからソースコードをダウンロードします。(ダウンロードは/usr/local/srcに行ったと仮定して説明をします。)
    [root src]# ftp ftp.openbsd.org
    ftp> cd /pub/OpenBSD/OpenSSH/portable
    ftp> get openssh-3.7.1p2.tar.gz
    ftp> quit
    ダウンロードしたファイルを展開します。
    [
    root src]# tar zxvf openssh-3.7.1p2.tar.gz
    [
    root src]# cd openssh-3.7.1p2

  2. sshdユーザーの作成
    「Privilege separation」を有効にする場合(デフォルト有効)にsshdユーザーが必要になります。
    詳しくはREADME.privsepを読んでください。
    [root openssh-3.7.1p2]# mkdir /var/empty
    [root openssh-3.7.1p2]# chown root:sys /var/empty
    [root openssh-3.7.1p2]# chmod 755 /var/empty
    [root openssh-3.7.1p2]# groupadd sshd
    [root openssh-3.7.1p2]# useradd -g sshd -c 'sshd privsep' -d /var/empty -s /bin/false sshd

  3. make
    次はmakeです。
    OpenSSHを使うにあたり、ZlibとOpenSSL,PAMが必要です。たいていの環境にはインストールされていますがインストールされていない場合は先にインストールします。-> ZlibインストールOpenSSLインストール
    以下、簡単にオプションの説明です。
     --prefix・・・インストール先の設定。デフォルトでは/usr/localです。(通常デフォルトのままでいいです。デフォルトのままならば、/usr/local/binや/usr/local/sbinなどにインストールされます。--prefixを指定し、インストール先を変更するとパスを通す必要があります。僕自身はいつもインストール先を/usr/local/xxxに指定しているので何となくこうしているだけです。)
     --sysconfdir・・・設定ファイルなどを保存するディレクトリ。デフォルトではPREFIX/etcです。(デフォルトでもよいのですが、既存のものがここを使用していたのでそれに従います。)
     --with-ssl-dir・・・OpenSSLのインストールされているディレクトリ。(僕の環境では/usr/local/opensslに格納されています。)
     --with-pam・・・PAM機能を有効にします。
    [root openssh-3.7.1p2]# ./configure --with-pam --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/openssl --prefix=/usr/local/openssh3.7.1p2 <-- prefixは通常指定しなくてよいです。
    [
    root openssh-3.7.1p2]# make
    [
    root openssh-3.7.1p2]# make install

    これ以下prefixを指定した人だけ。
    [root openssh-3.7.1p2]# cd /usr/local
    [
    root local]# ln -s openssh3.7.1p2 openssh  <-- インストールディレクトリに対し、シンボリックリンクを張ります。
    次にパスの通っていない場所にインストール下のでパスを通します。編集するファイルは/etc/bashrcです。

    [root local]# vi /etc/bashrc  
    <--ファイルの最後の行に以下の2行を加えてください。
    export PATH=$PATH:/usr/local/openssh/bin            
    <--追加
    export MANPATH=$MANPATH:/usr/local/openssh/man     <--追加

    エラーがでた場合には。(僕がやってしまった過ち)
    「Privilege separation」が有効な場合に(デフォルト有効)、ユーザーを作成していないと以下のエラーになります。
    /usr/local/openssh/sbin/sshd -t -f /etc/ssh/sshd_config
    Privilege separation user sshd does not exist
    make: [check-config] Error 255 (ignored)


  4. sshd_configの設定
    sshdの設定を行います。
    ポリシーとしてはRSA認証のみを許可します。
    この場合公開鍵、秘密鍵を利用して認証を行う事になります。

    /etc/ssh/sshd_configファイルを修正します。
    このファイルを参照するとほぼすべての項目がコメントになっているはずです。コメントの場合はデフォルト値が使われます。
    以下の項目のみコメント(#)をはずし、値を設定してください。


    PermitRootLogin no  
    <--値をyesからnoに変更します。
    PasswordAuthentication no  <--値をyesからnoに変更します。

  5. PAMの設定
    PAMを有効にしている為、PAMの設定ファイルを作成します。といってもサンプルファイルをそのまま使えばOKです。
    [root openssh-3.7.1p2]# cp -p ./contrib/sshd.pam.generic /etc/pam.d/sshd
    PAMの設定を忘れたままクライアントからログインを試みると/var/log/securityに以下のようなログが出力されます。
    Jul 16 00:51:51 ryouto sshd[29765]: PAM rejected by account configuration[13]: User account has expired
    Jul 16 00:51:51 ryouto sshd[29765]: fatal: monitor_read: unsupported request: 24

  6. ログインユーザー用の鍵作成
    鍵の作成は、ログインするユーザー毎に行います。
    作成した公開鍵をユーザーホームディレクトリ/.ssh/に配置し、秘密鍵はユーザーが持ち歩く事になります。
    以下に鍵の作成手順を示しますが、この操作はログインするユーザー毎に行ってください。
    以下の例では、ユーザーhogeの鍵を作成しています。

    ここで作成する鍵はrsa1です。何故ならばWindows環境ではrsa1をサポートしているツールが多いらしいからです。(WindowsからTeraTermを使う場合などはrsa1です。)
    [hoge hoge]$ ssh-keygen -t rsa1 <--rsa1の鍵を作成します。
    Generating public/private rsa1 key pair.
    Enter file in which to save the key (/home/hoge/.ssh/identity):
    このままでよいので未入力でEnter
    Created directory '/home/hoge/.ssh'.
    Enter passphrase (empty for no passphrase):
    適当なパスフレーズを入力します。ログインで使用します。
    Enter same passphrase again:
    Your identification has been saved in /home/hoge/.ssh/identity.
    <-- 秘密鍵です。
    Your public key has been saved in /home/hoge/.ssh/identity.pub.
    The key fingerprint is:
    ae:b3:87:ef:e3:38:86:83:9c:38:c5:bc:14:0d:08:14 hoge@ryouto.jp

    [
    hoge hoge]$ cd .ssh
    [
    hoge .ssh]$ cp -p identity.pub authorized_keys

  7. 起動スクリプトの作成
    最後に起動用スクリプト(/etc/rc.d/init.d/sshd)を作成します。
    TurboLinuxインストール時にインストールされた古いバージョンのOpenSSHで使用されていたスクリプトをそのまま流用します。環境に合わせてパスさえあわせればそのまま使用できるはずです。
    #!/bin/bash

    # Init file for OpenSSH server daemon
    #
    # chkconfig: 2345 55 25
    # description: OpenSSH server daemon
    #
    # processname: sshd
    # config: /etc/ssh/ssh_host_key
    # config: /etc/ssh/ssh_host_key.pub
    # config: /etc/ssh/ssh_random_seed
    # config: /etc/ssh/sshd_config
    # pidfile: /var/run/sshd.pid
    # securlevel: 100

    # source function library
    . /etc/rc.d/init.d/functions

    [ -f /etc/sysconfig/sshd ] && . /etc/sysconfig/sshd

    RETVAL=0

    # Some functions to make the below more readable
    KEYGEN=/usr/local/openssh/bin/ssh-keygen
    RSA1_KEY=/etc/ssh/ssh_host_key
    RSA_KEY=/etc/ssh/ssh_host_rsa_key
    DSA_KEY=/etc/ssh/ssh_host_dsa_key
    PID_FILE=/var/run/sshd.pid
    my_success() {
        local msg
        if [ $# -gt 1 ]; then
            msg="$2"
        else
            msg="done"
        fi
        case "`type -type success`" in
            function)
                success "$1"
            ;;
            *)
                echo -n "${msg}"
            ;;
        esac
    }
    my_failure() {
        local msg
        if [ $# -gt 1 ]; then
            msg="$2"
        else
            msg="FAILED"
        fi
        case "`type -type failure`" in
            function)
                failure "$1"
            ;;
            *)
                echo -n "${msg}"
            ;;
        esac
    }
    do_rsa1_keygen() {
        if ! test -f $RSA1_KEY ; then
            echo -n "Generating SSH1 RSA host key: "
            if $KEYGEN -q -t rsa1 -f $RSA1_KEY -C '' -N '' >&/dev/null; then
                my_success "RSA1 key generation"
                echo
            else
                my_failure "RSA1 key generation"
                echo
                exit 1
            fi
        fi
    }
    do_rsa_keygen() {
        if ! test -f $RSA_KEY ; then
            echo -n "Generating SSH2 RSA host key: "
            if $KEYGEN -q -t rsa -f $RSA_KEY -C '' -N '' >&/dev/null; then
                my_success "RSA key generation"
                echo
            else
                my_failure "RSA key generation"
                echo
                exit 1
            fi
        fi
    }
    do_dsa_keygen() {
        if ! test -f $DSA_KEY ; then
            echo -n "Generating SSH2 DSA host key: "
            if $KEYGEN -q -t dsa -f $DSA_KEY -C '' -N '' >&/dev/null; then
                my_success "DSA key generation"
                echo
            else
                my_failure "DSA key generation"
                echo
                exit 1
            fi
        fi
    }

    case "$1" in
        start)
            # Create keys if necessary
            do_rsa1_keygen;
            do_rsa_keygen;
            do_dsa_keygen;

            echo -n "Starting sshd: "
            if [ ! -f $PID_FILE ] ; then
                /usr/local/openssh/sbin/sshd $OPTIONS
                RETVAL=$?
                if [ "$RETVAL" = "0" ] ; then
                    my_success "sshd startup" "sshd"
                    touch /var/lock/subsys/sshd
                else
                    my_failure "sshd startup" ""
                fi
            fi
            echo
            ;;
        stop)
            echo -n "Shutting down sshd: "
            if [ -f $PID_FILE ] ; then
                killproc sshd
                RETVAL=$?
                [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/sshd
            fi
            echo
            ;;
        restart)
            $0 stop
            $0 start
            RETVAL=$?
            ;;
        condrestart)
            if [ -f /var/lock/subsys/sshd ] ; then
            $0 stop
            $0 start
            RETVAL=$?
            fi
            ;;
        status)
            status sshd
            RETVAL=$?
            ;;
        *)
            echo "Usage: sshd {start|stop|restart|status|condrestart}"
            exit 1
            ;;
    esac

    exit $RETVAL

    最後に、システム起動時に自動起動するようrunlevelの設定をしておきます。
    これは先ほど作成した/etc/rc.d/init.d/sshdにシンボリックリンクを張るだけです。
    runlevel3,5で起動、0,6の時を終了するように設定します。
    起動時の順番、終了時の順番は私の環境に依存しているので各環境に合わせて下さい。networkより遅く起動すれば問題ないと思います。
    [root rc3.d]# ln -s ../init.d/sshd S83sshd
    [root rc3.d]# cd ../rc5.d
    [root rc5.d]# ln -s ../init.d/sshd S83sshd
    [root rc5.d]# cd ../rc0.d
    [
    root rc0.d]# ln -s ../init.d/sshd K03sshd
    [root rc0.d]# cd ../rc6.d
    [
    root rc6.d]# ln -s ../init.d/sshd K03sshd

    後はクライアントから接続確認をするだけです。
    OpenSSHのインストールを使うを参照してください。

お問い合わせはwebmaster@ryouto.jpまで。
Copyright (C)2003 ryouto.jp. All Rights Reserved.