先日ECDSAに鍵変更したと書いたが、その後CentOS 6.7なVPSのSSHにログインしたところどうやらECDSAではなくRSAの鍵で認証されている様子。軽くググったらCentOSのOpenSSHはECDSAの鍵認証を受け付けないっぽい?みたいなことが書いてあったような… というわけでOpenSSHの執筆時点での最新版 7.1p1のソースを取ってきてコンパイルするなど。続きを読むから。
目次
- 0.環境について
- 1.必要なやつインストール
- 2.ソースを取ってきて展開
- 3.SPECファイルを弄る
- 4.余分なディレクトリを消してconfigure
- 5.RPMを作る
- 6.前のバージョンさよなら&新しいバージョンいらっしゃい
- 7.最低限のsshd設定をする
- 8.sshd再起動(シリアルコンソール等で行う)
- 9.接続&バージョンチェック
- 10.道連れで削除されたパッケージをインストールしなおす
- 11.バージョン上げてから気づいたオチ的な何か
- 12.参考ページ
0.環境について
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の鍵を作りログインしてみたら成功した。