CentOS7のOpenSSHのバージョンアップ

さくらクラウドで、CentOS7でWebサービスを展開する際、まず最初にやっておきたいインフラの設定の一つに、OpenSSHの更新があります。
今回は、CentOS7に、最新のOpenSSHをインストールしなおす手順をやってみます。
2020年12月時点での、さくらクラウドでCentOS7のインスタン生成時のデフォルトのOpenSSHのバージョンは、

# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

となっているので、
2020年12月時点での最新、OpenSSH_7.6p1にアップデートしてみたいと思います。

■root以外のユーザを作る
※更新後にsshd_configが強制的に更新され、rootでのログインができなくなるため
その他のユーザでログインできる状況を作っておきましょう

# adduser yonaha
# passwd yonaha

その後、SSHログイン出来るか確認する

■必要なパッケージをgroupinstallでごそっとインストールする
最小限のパッケージセットをごそっと、wgetコマンド等も入ってる

# yum groupinstall -y "Base"

開発ツールのパッケージをごそっと、automake、gcc等が入ってる

# yum groupinstall -y "Office Suite and Productivity" --setopt=group_package_types=mandatory,default,optional

※CentOS7ではデフォルトでインストールされないオプションパッケージがあるらしく、引数で渡してあげるやり方で解決するとのことです、
RedHatの記事参考 → https://access.redhat.com/solutions/1310043

ちなみに、CentOS6では下記でOKです。

# yum groupinstall -y "Development tools"

別途下記パッケージ、configure時に必要になるので入れておくとハッピーかも

# yum -y install zlib-devel openssl-devel rpm-build pam-devel

■RPMを作るためOpenSSHの最新のソースをダウンロード
ミラーサイトから最新のソースをダウンロードする

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

specファイルを修正する「no_x11_askpass」と「no_gnome_askpass」の値を1に変更する。

# cd openssh-8.4p1/
# vi contrib/redhat/openssh.spec
%define no_x11_askpass 1
%define no_gnome_askpass 1

不必要なディレクトリを削除して、configure

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

※configureとは、OSのCPUやバージョンを調べたり,必要な関連ツールを調査したりして、Makefileファイルを作るらしい・・・要するに準備する呪文らしい。

RPMBUILDでRPMファイルを生成する

# cd
# tar czvf openssh-8.4p1.cust.tar.gz openssh-8.4p1/
# rpmbuild --tb --clean openssh-8.4p1.cust.tar.gz

■OpenSSH7.6p1インストールちょっとその前に、SSHのアップデート時にSSH接続が切れる問題の解消策
SSHが立ち上がらなくなる対策として、別途telnet接続が出来るように設定しておき、
telnetでサーバに接続し、SSHを起動させるという手順を取るのいいのだが、
そういう状況も言ってられない場合も、特に客先のサーバだと。
という人のために、SSH再起動用のShellを作って対策してみましょう。
それでもSSHが起動してこない場合は、設定諸々が間違っているので、
あきらめてサーバ管理者の協力を仰ぎましょう。

# cd
# vi sshd_start_checker.sh

内容は下記、起動してるかチェックして起動していない場合は、起動する

#!/bin/sh
CHECK=`systemctl status sshd.service | grep running`
if [ "$CHECK" = "" ]; then
  systemctl start sshd.service
fi

上記シェルを、クーロンに埋めて1分毎に起動する

# crontab -e
* * * * * /root/sshd_start_checker.sh >/dev/null 2>&1

下記コマンドで、SSH止めても上がってるくるチェックする

# systemctl stop sshd.service
# systemctl status sshd.service

■さっそく旧OpenSSHの削除、さっき作ったRPMで新OpenSSHのインストール

# cd /root/rpmbuild/RPMS/x86_64/
# ls -la
//※↓こんな感じになってるはず
[root@adan x86_64]# ll
合計 1344
-rw-r--r-- 1 root root 470392  3月  7 15:16 openssh-7.6p1-1.x86_64.rpm
-rw-r--r-- 1 root root 513756  3月  7 15:16 openssh-clients-7.6p1-1.x86_64.rpm
-rw-r--r-- 1 root root  16980  3月  7 15:16 openssh-debuginfo-7.6p1-1.x86_64.rpm
-rw-r--r-- 1 root root 366444  3月  7 15:16 openssh-server-7.6p1-1.x86_64.rpm

//*一旦古いやつを削除しRPMインストール
# yum -y remove openssh
# rpm -Uvh openssh-7.6p1-1.x86_64.rpm
# rpm -Uvh openssh-server-7.6p1-1.x86_64.rpm
# rpm -Uvh openssh-clients-7.6p1-1.x86_64.rpm
# rpm -Uvh openssh-debuginfo-7.6p1-1.x86_64.rpm 

■再起動して新OpenSSHに切り替える

# systemctl restart sshd.service

ローカルから接続してみる

$ ssh yonaha@xxx.xxx.xxx.xxx
Unable to negotiate with xxx.xxx.xxx.xxx port 22: no matching host key type found. Their offer:

あれ?つながらない。。。

状態を確認してみる

# systemctl status sshd.service
error: Permissions 0640 for '/etc/ssh/ssh_host_ed25519_key' are too open.

となっていて、なんだか秘密鍵のファイル権限周りが原因らしい。

なので、権限周りを600に変えてやる

# chmod 600 /etc/ssh/ssh_host_ed25519_key
# chmod 600 /etc/ssh/ssh_host_ecdsa_key
# chmod 600 /etc/ssh/ssh_host_rsa_key

再び再機動

# systemctl restart sshd.service

ローカルで試してみると無事に接続確認が取れました。

# ssh -V
OpenSSH_8.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

とりあえず、無事繋がったのでOK…だがなんでだろぅ、今度SSHの鍵認証周り暗号方式周りを調べてみます。


プロに聞いてみる
株式会社adanはエンジニアのキャリアに真剣に向き合っています。
企業の情報エンジニアとしてのキャリアアップの方法、現在の待遇(給料・報酬)未経験からのステップアップ方法などのご相談を受け付けています。
お気軽にお問合せください。