2013年7月24日水曜日

Mac OS X Mountain Lion で OpenSSH をビルド・インストールする ( 作業メモ )

先日 Mac OS X Mountain Lion から RaspberryPi(FreeBSD) に ssh 接続しようとすると、RaspberryPi 側から接続がはねられる(Connection colosed by host)という現象に悩まされました。

鍵交換アルゴリズムが hmac-sha1 だとダメで、hmac-md5-xx だと OK のようだ、という情報を得たので、

% ssh -m hmac-md5 host-ip-address
Connection closed by host-ip-address
% ssh -m hmac-md5-96 host-ip-address
Connection closed by host-ip-address

( 認証は公開鍵暗号方式で、ホストには公開鍵を登録済 )

とやっぱりダメです。 ターミナルで確認すると、デフォルトで Mountain Lion に入っている OpenSSH のバージョンがそもそも結構古いです。

% which ssh
/usr/bin/ssh
% ssh -V
OpenSSH_5.9p1, OpenSSL 0.9.8x 10 May 2012

ちなみにこの記事時点での最新は以下の通りで、FreeBSD 側はこれです。

raspberry-pi% ssh -V
OpenSSH_6.2p2, OpenSSL 1.0.1e-freebsd 11 Feb 2013

そこで、試しに Mac OS X の OpenSSH をソースコードからビルドインストールしてみることにしました。

尚、Mac OS X Mountain Lion でこの作業を行うには、Xcode 及び、Command Line Tools ( Xcode の Preferences からインストール) が必要となります。
現在は Command Line Tools はどうもターミナルから以下のコマンドを入力しないとインストールできないようです。

% xcode-select --install

1:OpenSSH のソースコードを取得する

まず、OpenSSH のミラーサイトからソースコードを取得します。
Portable OpenSSH のページの下の方にダウンロード用のミラーサイト一覧があるので適当なものを選択してダウンロードします。

今回は現時点の最新である openssh-6.2p2 をダウンロードしようとしたら、 最初に開いたミラーサイトにはなぜか存在しませんでした。こんなこともあるんですね。 次に開いたミラーサイトには存在したので、そちらからダウンロードしました。

ダウンロードした openssh-6.2p2.tar.gz をダブルクリックで解凍します。
本当はファイルの正真性を確認すべきなのでしょうが、ここでは省略します。
興味が有る方は入門OpenSSH 2.3.2. ダウンロードしたパッケージの正真性を確認する を参考にするとよいでしょう。

2:OpenSSL のソースコードを取得する

合わせて OpenSSL も更新するため、こちらも OpenSSL のソースコードダウンロードページから現時点での最新版 openssl-1.0.1e をダウンロードします。 最新版は[LATEST]と表示されています
ダウンロードした openssl-1.0.1e.tar.gz をダブルクリックで解凍します。

3:OpenSSL をコンパイル、インストールする

OpenSSH は ssl に依存していますので、 最初に OpenSSL を ビルド・インストールします。
ターミナルを立ち上げて、

% cd Downloads/openssl-1.0.1e

64bit 版 Mac の場合は、./Configure darwin64-x86_64-cc を使用して構成します。
32bit 版 Mac の場合は、通常通り ./config を使用します。
他の ssl とかぶらないインストール場所を --openssldir でオプション指定します。今回は /usr/local/openssl を指定しています。また、共有ライブラリオプション shared をつけています。

% ./Configure darwin64-x86_64-cc --openssldir=/usr/local/openssl shared
% make
% sudo make install

4:OpenSSH をコンパイル、インストールする

無事に終了したら、いよいよ本命の OpenSSH の ビルド・インストール です。

% cd ../openssh-6.2p2

今回は、/usr/local 以下にインストール、PAM サポート有効、MD5 形式パスワードサポート、 zlib のバージョンチェックなし、ssl は先ほどインストールした OpenSSL を使用、で build することにするため、 以下のオプションを付けて configure スクリプトを実行します。
インストール先はデフォルトで /usr/local になっているため、今回は特に指定しませんが、/usr/local 以外にインストールしたい場合は、別途 --prefix オプション等で指定します。
OpenSSL を今回のように新規でインストールしない場合でも、システム上に複数の ssl が存在していると Your OpenSSL headers do not match your library. のようなエラーを吐いて終了してしまうので、その場合は --with-ssl-dir で ssl のディレクトリを指定する必要があります。

% ./configure --with-pam --with-md5-passwords --without-zlib-version-check --with-ssl-dir=/usr/local/openssl
% make
% sudo make install
% rehash

5: 環境変数 PATH の修正をする

インストールが完了したら、今後 ssh クライアントを使用する際は、 /usr/local/bin のものを優先的に使用したいため、環境変数の設定をする必要があります。 要は PATH の先頭に、/usr/local/bin が入っていればいいわけなので、

% printenv

で表示される PATH の値を確認して、問題なければ修正をする必要はありません。 わたしの環境では以下の状態でした。

 
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

Mountain Lion 以前では環境変数の修正をする場合は ~/.MacOSX/environment.plist に設定すれば良かったらしいのですが、Mountain Lion からはこのファイルが使えなくなった(!)そうなので、
今回は代わりに、 /etc/paths を修正します。

尚、OpenSSL も今回インストールするバージョンに切り替えるのであれば ( いろんな意味でそのほうが良いでしょう )、 /usr/local/openssl/binも合わせて追加する必要があります。

現在の内容を確認すると

% more /etc/paths
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

これを、

% sudo vi /etc/paths

で以下のように修正し、保存して終了します。

/usr/local/openssl/bin
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

一旦再起動します。
再びコンソールから環境変数の確認をします。

% printenv
PATH=/usr/local/openssl/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

これで PATH が修正されました。

6:インストール後のバージョンを確認する

ここで、正しくインストールが実行されたか、ssh のバージョンを確認します。

% which ssh
/usr/local/bin/ssh
% ssh -V
OpenSSH_6.2p2, OpenSSL 1.0.1e 11 Feb 2013
% which openssl
/usr/local/openssl/bin/openssl
% openssl version
OpenSSL 1.0.1e 11 Feb 2013

上記のように表示されれば、無事 update に成功となります。

sshd を起動済みの場合は、システム環境設定のインターネットとワイヤレスの共有から、リモートログインのオンオフをすれば sshd が再起動します。

ちなみに、この update で、無事に Mac OS X Mountain Lion からも、 RaspberryPi(FreeBSD) に ssh 接続できるようになりました。

0 件のコメント:

コメントを投稿