CentOS7でソフトウェアをソースからインストールする(OpenSSLとOpenSSHでの説明)

はじめに

こちらの記事でインストールしたCentOS7でSSHの鍵を生成しようとしたところ、「error in libcrypto」というエラーが。
エラー自体は鍵の生成を一括でなく個別にすることで解消しました。(ssh-keygenを一括生成の-Aオプションでなく、-tオプションで個別に鍵生成する)

しかし、何となく気持ちよくないので原因を調査してみました。ただ力及ばず原因は分からず。とりあえずバージョンアップして解消しないかみてみるついでにソースからインストールする手法を学ぼうかと。

結論から言うと結局別のエラーが出てそちらが解消できなかったのですが、ソースからインストールする勉強にはなったので手順とかつまづいたところとか残します。

手順

必要なパッケージのインストール

今回使うyumパッケージをまとめてインストールします。
インストールされていないものがあるとどこかでエラーが発生するはずです。

$sudo yum install -y wget gcc make perl zlib-devel pam-devel

それぞれ以下のようなソフトです。

ソフト名 役割
wget ネットワークからデータをダウンロードするソフトウェアです。
ソースのダウンロードにつかいます。
gcc GNU Compiler Colletionの略。GNUによる様々な言語のコンパイラ群です。
そのうちC言語のコンパイラを指したGNU C Compilerの意味で使われたりもします。
今回はOpenSSLとOpenSSHのコンパイルに使用します。
make gccと合わせて使います。Makefileという定義ファイルを使ってコンパイルを楽にするためのソフトウェアです。
perl Perl言語のパッケージです。今回はOpenSSLのMakefile作成に使います。
zlib-devel zipやgzipの圧縮ができるライブラリです。
今回はそのヘッダファイルをOpenSSLのコンパイル時に使用します。
「devel」はdevelopの意味で開発用にヘッダファイルなどをダウンロードする用のパッケージです。
pam-devel PAM認証用のヘッダファイルです。
今回はOpenSSHのコンパイル時に使用します。

 

OpenSSLのインストール

ソースのダウンロード

以下コマンドでダウンロードします。バージョンは自分のダウンロードしたいものに変えてください。
URLは下記がダメになっていたら公式などから探してください。

#作業ディレクトリへ移動
$cd /usr/local/src

#ダウンロード
$wget http://www.openssl.org/source/openssl-1.1.1c.tar.gz
#httpが使えない場合は同じドメインでwwwサーバをftpサーバにして、FTPでダウンロードすればいけるはず
$wget ftp://ftp.openssl.org/source/openssl-1.1.1c.tar.gz

tar.gzファイルはgzipファイルの圧縮ファイルです。解凍しましょう。

$tar xvfz openssl-1.1.1c.tar.gz

オプションの意味は次の通り。

オプション 意味
x 圧縮ファイルからのファイルの取り出し
v 結果を出力する
f 圧縮ファイルのファイル名を指定
z 圧縮ファイルがgzip形式であることの指定

Makefileの設定

解凍したソースのフォルダ内にはconfigという設定ツールが入っています。
このツールを使って、OpenSSLをコンパイルするためのMakefileを作成します。
–prefix=〜のパスは、OpenSSLをインストールする先に合わせてください。
例えば他にも/usr/local/binにインストールしたりがあるかと思います。

#解凍したフォルダへ移動
$cd openssl-1.1.1c

#configコマンドを実行
$./config --pref=/opt/openssl shared zlib

コマンドが成功すると設定が終わりMakefileが作成されます。

 

インストール

作成されたMakefileの処理をmakeコマンドで実行します。
その後make installでインストールします。

これらのコマンドは時間がかかります。(私の環境では合計1時間くらいかかったような記憶です)

#Makefileでのコンパイル
$make

#インストール時は管理者権限が必要
$sudo make install

これでインストールはできましたが、元々古いバージョンのOpenSSLを使用していた場合は、新しい OpenSSLを他のソフトウェアから参照して利用するためにもう少し設定が必要です。
使用していない人は1つ飛ばして確認へ。

シンボリックリンクの作成

他のソフトなどがOpenSSLを参照した際に、新しいOpenSSLが参照されるように、シンボリックリンクを作成します。
また、OpenSSLのバージョン次第で依存するライブラリのバージョンが変わるため、正しいバージョンのライブラリを参照できるようにします。

#元のOpenSSLが入っているディレクトリに移動
$cd /usr/bin

#元のOpenSSLを退避
$sudo mv openssl openssl.bak

#新しいOpenSSLのシンボリックリンクを作成
$sudo ln -s /opt/openssl/bin/openssl openssl

#新しいOpenSSLが参照するライブラリファイルを設定
$sudo vi /etc/ld.so.conf

/opt/openssl/ssl/lib  #追記
include ld.so.conf.d/*.conf #元からある

#ld.so.confの設定を反映させる
$sudo ldconfig

確認

これでOpenSSLのインストールは完了です。
バージョンが新しくなっているか確認します。

$cd #一応ホームディレクトリで確認

$openssl version
OpenSSL 1.1.1c 28 May 2019 #インストールしたバージョンが出ればOK

OpenSSHのインストール

インストールまでの流れはOpenSSLとほぼ同じです。(config、ではなくconfigureコマンドのオプションが違うくらい)
細かい説明は省いて進めます。復習がてら追っていくと良いと思います。
configureのオプションも全ては理解しきれていないので、ニュアンスだとモヤモヤする場合は別途ググってください。

$cd /usr/local/source

#ソースをダウンロード
$wget http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-8.0p1.tar.gz
#ftpの場合もサーバは一緒
$wget ftp://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-8.0p1.tar.gz

#解凍
$tar xvfz openssh-8.0p1.tar.gz

#Makefile作成 (OpenSSLに比べオプションが多彩なので、気になる場合は別途検索してください)
$cd openssh-8.0p1
$./configure ¥ #¥はコマンド中の改行 ¥の前にスペース一つ開けておくとオプションが綺麗に見える
--with-tcp-wrappers ¥ #このオプションは新しいバージョンでは意味がないかも。筆者環境では無視された。
--with-ssl-dir=/opt/openssl/ ¥ #OpenSSLのインストール先を指定
--with-pam ¥
--with-md5-passwords ¥
--bindir=/usr/bin ¥
--sbindir=/usr/sbin ¥
--libexecdir=/usr/libexec ¥
--sysconfdir=/etc/ssh

#ここは特に時間がかかる
#コンパイル
$make

#インストール
$sudo make install

#バージョン確認
$ssh -V #Vは大文字
OpenSSH_8.0p1, OpenSSL 1.1.1c 28 May 2019

最後にバージョンが確認できていますが、これだけではまだちゃんと動作していない場合があります。
以下のコマンドを実行して、起動時にタイムアウトしないか確認してください。

$sudo systemctl restart sshd

タイムアウトしなければ問題ありませんが、タイムアウトする場合はsystemd関連の設定が必要になります。

SSHデーモンの起動設定

#ファイルのバックアップ
#同じディレクトリ内でコピーして編集しても良い
$sudo cp /usr/lib/systemd/system/sshd.service /etc/systemd/system

#編集
$sudo vi /etc/systemd/system/sshd.service

(略)
[Service]
#Type=notify #コメントアウトする
Type=simple #デフォルト値なのでなくても良いはずですが一応

#設定ファイルの再読み込み
$sudo systemctl daemon-reload

#sshdの再起動
#sudo systemctl restart sshd

Type=〜のオプションは難しいのでこちらの記事や検索して調べていただけますと。
どうやらsshdからsystemdへ起動通知がいっていなかったのが正常化されることによってタイムアウトが直るみたいです。

ssh鍵の権限について

この手順はSSH鍵の権限が600より緩いと発生すると思われます。
再起動後、サービスの状況を確認しましょう。

$sudo systemctl status -l sshd

もし「Permissions 06xx for ‘/etc/ssh/ssh_host_xxxxxxx’」のようなエラーが出ていた場合は、SSH鍵にアクセスできる権限が広すぎます。この状態だとSSHが起動できないようなので、権限を制限しましょう。

$sudo chmod 600 ssh_host_* #*でワイルドカード指定ができる

#もう一度再起動
$sudo systemctl restart sshd

筆者の場合はここまでやってsshdが起動できるようになりました。

終わりに

これでソースからのソフトウェアのインストールができるようになりました。

ちなみに当初のssh-keygenの「error in libcrypto」エラーは解消しましたが、代わりに「invalid format」エラーが発生し解決できず。個別に鍵を生成することで回避しました。

ただソースからのインストールの一連の流れで学べたことは多いので、エラー関係なくやってよかったかなと思います。