以下省略!

タイダルウ(ry ほぼ毎日1記事執筆運動実施中。 ※記事に広告(アフィリエイト)リンクを掲載している場合があります。

CentOSのデフォOpenSSH(5.3p1)はちょっとアレなんで最新版(7.1p1)をコンパイルしてみた

f:id:abyssluke:20151011173400p:plain:w200:left先日ECDSAに鍵変更したと書いたが、その後CentOS 6.7なVPSSSHにログインしたところどうやらECDSAではなくRSAの鍵で認証されている様子。軽くググったらCentOSのOpenSSHはECDSAの鍵認証を受け付けないっぽい?みたいなことが書いてあったような… というわけでOpenSSHの執筆時点での最新版 7.1p1のソースを取ってきてコンパイルするなど。続きを読むから。
目次

0.環境について

  • この記事ではCentOS 6.7 64bit(x86_64)環境を想定している。
  • シリアルコンソールやtelnetからsshdの再起動操作を行うので使えるかどうか確認する。
    • 利用しているさくらのVPSにはVNCコンソール、シリアルコンソールの2種類あるがどちらでもOK。
    • もしtelnetdを(インストールし)立ち上げる場合は作業が終了したらただちに停止すること。
  • 各種操作は原則root環境で行っている(#)。

1.必要なやつインストール

開発ツールやらヘッダーファイルやらを入れておく。

# yum groupinstall -y "Base" "Development tools"
# yum install -y openssl-devel krb5-devel pam-devel tcp_wrappers-devel

2.ソースを取ってきて展開

執筆時点で最新版であるOpenSSH 7.1p1をダウンロードして展開。

# cd
# wget http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-7.1p1.tar.gz
# tar xzvf openssh-7.1p1.tar.gz

3.SPECファイルを弄る

OpenSSHのソースにはこの後行うRedHat系向けのRPMファイルの構築に必要なSPECファイルが含まれている。
このSPECファイルにある「%define no_x11_askpass 0」と「%define no_gnome_askpass 0」の0を1に変更する。

# cd openssh-7.1p1
# cp contrib/redhat/openssh.spec{,.org}
# vi contrib/redhat/openssh.spec
# cat contrib/redhat/openssh.spec
(前略)
# Do we want to disable building of x11-askpass? (1=yes 0=no)
%define no_x11_askpass 1

# Do we want to disable building of gnome-askpass? (1=yes 0=no)
%define no_gnome_askpass 1
(後略)

4.余分なディレクトリを消してconfigure

contribディレクトリ内のどうでもいいディレクトリを削除しconfigureする。
configureの際に--without-zlib-version-checkを入れないとエラーになるっぽい?(環境依存)

# cd contrib
# rm -rf aix/ solaris/ suse/ hpux/ cygwin/
# cd ..
# ./configure --without-zlib-version-check

5.RPMを作る

./configureの後はmakeだ!と思いがちだが今回は違う。opensshのディレクトリのtarballを作ってからrpmbuildでビルドしRPMファイルを生成する。

# cd ..
# tar czvf openssh-7.1p1.cust.tar.gz openssh-7.1p1/
# rm -rf openssh-7.1p1
# rpmbuild --tb --clean openssh-7.1p1.cust.tar.gz

64bit環境の場合は(rootで行った場合)/root/rpmbuild/RPMS/x86_64内に4つのRPMファイルができているはず。

# cd /root/rpmbuild/RPMS/x86_64
# ls -l
合計 1424
-rw-r--r-- 1 root root 460560 10月 11 12:25 2015 openssh-7.1p1-1.x86_64.rpm
-rw-r--r-- 1 root root 578044 10月 11 12:25 2015 openssh-clients-7.1p1-1.x86_64.rpm
-rw-r--r-- 1 root root  16960 10月 11 12:25 2015 openssh-debuginfo-7.1p1-1.x86_64.rpm
-rw-r--r-- 1 root root 389896 10月 11 12:25 2015 openssh-server-7.1p1-1.x86_64.rpm

(ファイルサイズなどは環境によって変わるかも)

6.前のバージョンさよなら&新しいバージョンいらっしゃい

旧バージョンをアンインストールし、新しいバージョンを生成したRPMからインストールする。
yumで旧バージョンをアンインストールする際、道連れで削除されるパッケージ(gitなど)があるので注意(後で入れなおす)。

# yum -y remove openssh
# rpm -Uvh openssh-7.1p1-1.x86_64.rpm
# rpm -Uvh openssh-server-7.1p1-1.x86_64.rpm
# rpm -Uvh openssh-clients-7.1p1-1.x86_64.rpm
# rpm -Uvh openssh-debuginfo-7.1p1-1.x86_64.rpm

もしかするとdebuginfoの方はインストールしなくても大丈夫かもしれない。

7.最低限のsshd設定をする

インストールするとsshdの設定が一旦リセットされる(旧バージョンをアンインストールする前にバックアップしておいたほうがいいかもしれない)。
念の為オリジナルをバックアップしてからポート設定、rootログイン不許可、パスワード認証の不許可などの最低限の設定を行う。

# cp /etc/ssh/sshd_config{,.org}
# vi /etc/ssh/sshd_config
※変更した箇所

13行目
#Port 22 → Port (任意のポート)

44行目
#PermitRootLogin prohibit-password → PermitRootLogin no

72,73行目
#PasswordAuthentication yes → PasswordAuthentication no
#PermitEmptyPasswords no → PermitEmptyPasswords no

97行目
#UsePAM no → UsePAM no

8.sshd再起動(シリアルコンソール等で行う)

新しいバージョンでsshdを再起動する。ここだけはシリアルコンソールやtelnetで行うこと。使わない方法もあるが(参考ページ参照)。

# /etc/init.d/sshd restart

9.接続&バージョンチェック

無事に接続できればOK。sshコマンドで接続する時に-vオプションを付けると接続処理中にOpenSSH_7.1の文字列が確認できる。

$ ssh -V
OpenSSH_7.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013
$ sshd -V
unknown option -- V
OpenSSH_7.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013
usage: sshd [-46DdeiqTt] [-b bits] [-C connection_spec] [-c host_cert_file]
            [-E log_file] [-f config_file] [-g login_grace_time]
            [-h host_key_file] [-k key_gen_time] [-o option] [-p port]
            [-u len]

10.道連れで削除されたパッケージをインストールしなおす

筆者環境の場合は以下のようにした。firstbootもアンインストールされたが再インストールしなくてもいいと判断。

# yum install -y git perl-Git python-meh systemtap systemtap-client

11.バージョン上げてから気づいたオチ的な何か

OpenSSHのバージョンを上げても未だにRSAの鍵で認証されていたので、見てみたところクライアント(Ubuntu機)のssh-agentに当該鍵が登録されていた。登録されている鍵を削除したところECDSAの鍵で認証されるようになった。
ssh接続時にパスフレーズを入力しろというGUIなダイアログが出てきたのはその関係かも。
ということはもしかしてサーバー側のOpenSSHのバージョン上げなくてもssh-agentから鍵消せばECDSAで接続されたということか…?

ちなみにOpenSSH 7.1p1に上げたということはEd25519も対応しているっぽい感じ(ssh-keygenにもEd25519の選択肢があった)なので、試しにEd25519の鍵を作りログインしてみたら成功した。