OpenSSH 5.8のビルドとインストール on Fedora

普段使っているツールをもっと理解しようと思い、OpenSSHを触ってみました。といっても、今日のメモは、ツールを入手して使える状態にするところまでですが。

以下は、自分向けのまとめ。

# 誤解や、方法が間違っているところがあれば、指摘を頂けると嬉しいです。

ビルドとインストール

Fedora 15で、最新の移植版OpenSSHをビルドします。Fedora 15には、SSHが元々インストールされています*1。手元の環境(Linux 2.6.38.6-26.rc1.fc15.x86_64)では、SSH 5.6が入っていました。しかし、セキュリティ上最新版を使った方がよいのと、ビルド作業も勉強になるという理由で、改めてビルドを行います。

OpenSSH本体のダウンロード

OpenSSHのLinux移植版をダウンロードして、解凍します。2011年6月12日時点の最新バージョンは、5.8でした。

依存ライブラリのインストール

README.platformのLinuxの項を参考に、zlib-devel、openssl-devel、pam-develをインストールします。

$ sudo yum install zlib-devel openssl-devel pam-devel

もちろん、gccが入っていなければインストールしておきます。

configure

configureスクリプトを実行します。

$ ./configure --with-md5-passwords --with-tcp-wrappers

上では、オプションを2つ指定しています。

  • MD5形式パスワードのサポート有効化
  • TCP wrappersのサポート有効化
    • /etc/hosts.allow と /etc/hosts.deny を使えるようになる

configureを実行すると、次のエラーが出る場合があります。

checking for libwrap... configure: error: *** libwrap missing^

sshdがlibwrapを必要とします。ここでは、実行ファイル(soファイル)はあるものの、コードがないので怒られていました。tcp_wrappers-develをインストールすると解決します。

$ sudo yum install tcp_wrappers-devel
make

configureエラーがなくなったら、makeします。

$ make
$ sudo make install

インストールディレクトリは、デフォルトで次の位置になります。

  • 元々インストールされていたSSH
  • 今回インストールするSSH
    • /usr/local/bin/ssh
インストール結果の確認

エラーを出さずにmake installできたら、優先的に実行されるSSHが、今回ビルドしたバージョンに変わったことを確認します。

$ ssh -V
OpenSSH_5.8p2, OpenSSL 1.0.0d-fips 8 Feb 2011

$ /usr/bin/ssh -V
OpenSSH_5.6p1, OpenSSL 1.0.0d-fips 8 Feb 2011

$ /usr/local/bin/ssh -V
OpenSSH_5.8p2, OpenSSL 1.0.0d-fips 8 Feb 2011

SSHはOKのようです。

しかし、自機にtelnet接続してみると、表示されるバージョンが古いままです。

$ telnet localhost 22
Trying ::1...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.6

この時に表示されるSSHは、サーバーデーモン、つまりsshdです。

sshdを再起動してみても、結果は変わりません。

$ sudo /etc/init.d/sshd restart
Restarting sshd (via systemctl):                           [  OK  ]

…というところでやっと気づきましたが、起動スクリプトで、元々インストールされていたsshdが実行されるのが原因でした。ヒィ、恥ずかしい。。

起動スクリプトを編集します。

$ cp /etc/init.d/sshd ~/sshd.backup
$ sudo vi /etc/init.d/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            オリジナル
# config: /usr/local/etc/sshd_config       変更後
# pidfile: /var/run/sshd.pid

()

# コメントアウト行はオリジナル、直後の行が追記したもの。
# Some functions to make the below more readable
#KEYGEN=/usr/bin/ssh-keygen
KEYGEN=/usr/local/bin/ssh-keygen
#SSHD=/usr/sbin/sshd
SSHD=/usr/local/sbin/sshd
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

start()
{
        [ -x $SSHD ] || exit 5

        # 新しくインストールした方の設定ファイルを使う
        #[ -f /etc/ssh/sshd_config ] || exit 6
        [ -f /usr/local/etc/sshd_config ] || exit 6
(略)
}

新しいバージョンに差し替えるのは、ssh-keygenとsshdのコマンド、設定ファイルだけです。ホストの鍵ファイルは変更しません。なぜなら、ホストの鍵は一度使ったら変更しないのが原則だからです。マシンがすでにサーバとして接続を受けつけていた場合、ホストの鍵が変わると、他のマシンから別のマシンになったと認識されてしまいます。

なお、今回はOSのインストール直後で、SSHサーバも未使用の状態でしたが、そのあたりの背景を学習する都合上、元のSSHに付いてきたホスト鍵を使いました。

変更したファイルを保存して、sshdを再起動し、もう一度telnetで接続します。

$ telnet localhost 22
Trying ::1...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.8

バージョン5.8のsshdが動いていることを確認できます。

これで、最新版のOpenSSHを使えるようになりました。

・・・ネコを挟みながらどこかへ続きます・・・(http://www.linkstyle.co.jp/

*1:Webサーバ構成で、パッケージをカスタマイズせずにインストールした場合は、入っています