CentOS8にOpenSSLとOpenSSHをソースインストールする方法

投稿者: | 2020-04-08

今回はCentOS8にOpenSSLとOpenSSHをソースからインストールする方法を説明します。どちらもCentOS8のインストール時にあらかじめ導入されていますが、最新バージョンのOpenSSLやOpenSSHを使用したいという人へのインストール内容となります。

実施環境・導入バージョン

OSCentOS 8 最小限のインストール
OpenSSL1.1.1f
OpenSSH8.2p.1

事前準備

# dnf install -y tar wget gcc make perl zlib-devel pam-devel
# dnf install -y lksctp-tools lksctp-tools-devel

今回はCentOS8の最小限のインストールのため、ファイルの取得、解凍、コンパイル用にwget、tar、gcc、make等をインストールしています。既に導入済みの方はこれらのコマンドを省いて大丈夫です。

OpenSSLやOpenSSHのインストール用にperl、zlib、pamをインストールします。これらをインストールしていないとコンパイル時にエラーとなります。

lksctp関連については、OpenSSLのソースインストール後にdnfコマンドが起動しなくなる事象を回避するコンパイルオプションのためにインストールします。

旧バージョンのOpenSSLの削除

旧バージョンのOpenSSLが残っていると、ソースインストール後に共有ライブラリで競合するため削除します。

# dnf remove -y openssl

OpenSSLのインストール

# cd /usr/local/src
# wget https://www.openssl.org/source/openssl-1.1.1f.tar.gz 
# tar zxf openssl-1.1.1f.tar.gz
# cd openssl-1.1.1f
# ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl/shared enable-md2 enable-rc5 sctp zlib -fPIC 
# make
# make install

管理人はソースインストールの際、/usr/local/src配下でコンパイル等を行うため、フォルダに移動しOpenSSLのソースをwgetでダウンロードします。ダウンロード後はtarコマンドにてソースファイルを解凍し、フォルダ移動後に必要なコンフィグオプションをつけてMakefileを作成します。今回は/usr/local/opensslにインストールしますが、インストール場所やフォルダ名を変更する場合は「prefix」部分を個々の環境に合わせて設定してください。

Makefile作成後、makeコマンドでコンパイルを行いインストールします。環境によっては少し時間がかかります。

※参考
「./config –prefix=/usr/local/openssl --openssldir=/usr/local/openssl/shared zlib」でもコンパイルには成功しますが、OpenSSLインストール後にdnfコマンドが起動しなくなります。dnfのデータベースの再構築でも解消しなかったためMakefile作成時のオプションには注意が必要です。

共有ライブラリ等の設定・動作確認

※注意
共有ライブラリの設定後、OpenSSHの設定が完了するまでsshdが起動に失敗します。そのため、今回の手順の完了前に現在接続しているターミナルを閉じないようにしてください。ターミナルを閉じた場合は、sshで接続できなくなるためコンソール接続やレスキューモード等の修復が必要となります。

初めに、共有ライブラリへ追加するconfファイルを作成します。

# vi /etc/ld.so.conf.d/openssl-1.1.1f.conf

■openssl-1.1.1f.conf
--------------------------------------------------
/usr/local/openssl/lib
--------------------------------------------------

・ファイル作成後、共有ライブラリのキャッシュファイルを更新
# ldconfig

共有ライブラリ設定後、「openssl version」コマンドで下記表示が出ればインストール完了です。

# openssl version
OpenSSL 1.1.1f  31 Mar 2020

OpenSSHのインストール

初めに「/etc/ssh/」配下のssh_hostと付く鍵の権限を変更します。この権限が強すぎるとインストール時に警告が出ます。

# chmod 600 /etc/ssh/ssh_host_*
# wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.2p1.tar.gz 
# tar zxf openssh-8.2p1.tar.gz
# cd openssh-8.2p1
# ./configure \
    --with-zlib=/usr/local \
    --with-tcp-wrappers \
    --with-ssl-dir=/usr/local/openssl \
    --with-ssl-engine \
    --with-pam \
    --with-md5-passwords \
    --bindir=/usr/bin \
    --sbindir=/usr/sbin \
    --libexecdir=/usr/local/libexec \
    --sysconfdir=/etc/ssh
# make
# make install

インストール後、「ssh -V」コマンドで 下記表示が出ればインストール完了です。

# ssh -V
OpenSSH_8.2p1, OpenSSL 1.1.1f  31 Mar 2020

sshd_config、Unitファイルの設定

# vi /etc/ssh/sshd_config

■sshd_config
--------------------------------------------------
・変更前
GSSAPIAuthentication yes
GSSAPICleanupCredentials no

・変更後
#GSSAPIAuthentication yes
#GSSAPICleanupCredentials no
--------------------------------------------------
# vi /usr/lib/systemd/system/sshd.service

■sshd.service
--------------------------------------------------
・変更前
Type=notify

・変更後
Type=simple
--------------------------------------------------

変更後、「systemctl daemon-reload」コマンドでUnitファイルの変更を読み込ませます。

# systemctl daemon-reload

crypto-policyの設定

CentOS7の場合、ここまでの作業で「systemctl restart sshd」とsshdを再起動して終わりですが、CentOS8で同じように再起動をすると「GSSAlgorithm Bad command」というエラーが出てsshdの起動が失敗します。

少し調べてみると、CentOS8からsshdを起動する際、crypto-policyという暗号化の設定をまとめたファイルをオプションと環境変数に指定していることが分かりました。この設定ファイルの中にGSSAlgorithmの設定があり、恐らく最新のOpenSSHで該当の暗号化設定に対応していない、もしくは何かしらの不具合でエラーとなっている、と推測されます(この点に関しては、ネット上などで確実にこれが原因だ、という内容を確認できないため、あくまで推測としています)

RedHadの説明ページでは「この暗号化設定ファイルを使用しないのは良くない」的な内容の記載もあるためオプションやファイル自体の削除はせず、今回は設定が記載されているテキストファイルからGSSAlgorithm部分のみを削除します。

# vi /usr/share/crypto-policies/DEFAULT/opensshserver.txt

■opensshserver.txt
--------------------------------------------------
・削除する部分
-oGSSAPIKexAlgorithms=gss-gex-sha1-,gss-group14-sha1-
--------------------------------------------------

sshdの起動・動作確認

crypto-policyの設定完了後、sshdを再起動します。

# systemctl restart sshd

再起動後、ステータスを確認し「active」となっていれば大丈夫です。

# systemctl status sshd

ステータス確認後、ターミナルソフトを使用しssh接続を行って接続できれば設定完了です。

sshログイン、suの起動が遅い時

OpenSSHを最新バージョンに上げた後、sshのログインやsuコマンドでのユーザー切り替えが遅くなる場合、「systemd-logind」が起動に失敗している可能性があります。

# systemctl status systemd-logind

OpenSSLのパスが変わったことによりOpenSSLのライブラリがSELinuxで拒否されていることが原因みたいです。SELinuxを無効にするか、SELinuxでsystemd-logindコンテキストに対してOpenSSLのライブラリパスを許可することで回避できます。

パターン1:SELinuxを無効にする場合

# vi /etc/selinux/config

■config
--------------------------------------------------
・変更前
SELINUX=enforcing

・変更後
SELINUX=disabled
--------------------------------------------------

SELinuxの変更は再起動後に設定されるため再起動します。

# reboot

パターン2:SELinuxでsystemd-logindを許可する場合

・最小限のインストールのためsemanageコマンド等のインストール
# dnf install -y policycoreutils-python-utils

・SELinuxに許可を与える
# semanage -a -t systemd_logind_exec_t '/usr/local/openssl/lib(/.*)?' 

・既存ファイルのSELinux権限を変更する
# restorecon -R /usr/local/openssl/lib

まとめ

OpenSSLをソースインストールで最新版にし、共有ライブラリを設定したらssh接続ができなくなったところから今回の内容が始まりました。最初はすぐ終わるだろうと思っていましたが、まさか暗号化設定どうこうまで発展するとは思っていませんでした。OpenSSLをソースインストールで最新版にして共有ライブラリを設定した際には、OpenSSHの更新も忘れないようにしましょう。