CentOS7のOpenSSHの更新(セキュアなサーバを作ろう)

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

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

となっているので、
2018年3月時点での最新、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-7.6p1.tar.gz
# tar xzvf openssh-7.6p1.tar.gz

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

# cd openssh-7.6p1/
# 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-7.6p1.cust.tar.gz openssh-7.6p1/
# rpmbuild --tb --clean openssh-7.6p1.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_7.6p1, OpenSSL 1.0.2k-fips  26 Jan 2017

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