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」エラーが発生し解決できず。個別に鍵を生成することで回避しました。

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

Tera Termでエラーが発生した場合の対処法 :「SSHパケットを送信中にエラーが発生しました. 切断します. (WSAAsyncSelect:10093)」

はじめに

KVMでCentOS7にCentOS7の仮想環境を立ててみるで建てたCentOS環境にTera TermからSSHで接続したところ、画面が真っ黒なまま接続出来ず、Tera Termを閉じるとタイトルのエラーが発生。
原因は分からなかったものの解消方法はわかったのでメモします。

エラー画面

同じ目にあっている人がいたら試してみてください。

対処法

  1. メニューから「設定」>「SSH…」を選択します
  2. 優先する鍵交換アルゴリズムの順(E) (SSH2のみ)の欄で「ecdh-sha2-nistp256」が「ecdh-sha2-nistp384」より上にあれば、「ecdh-sha2-nistp256」の方を下に持ってくる。
    というか、「ecdh-sha2-nistp521」→「ecdh-sha2-nistp384」→「ecdh-sha2-nistp256」の順にするとより良い。(セキュリティ的な意味で)
  3. メニューから「設定」>「設定の保存(S)…」を忘れずに。
  4. Tera Termを再起動してSSH接続し直す。

以上でエラーが解消しSSH接続できるようになったと思います。

おわりに

原因はわかってないですがとりあえず解消はできました。Tera Termのバグなのか仮想環境側のバグなのかも不明です。物理のCentOSには接続出来ているので仮想環境の問題の匂いもしますが断定はできない。
今はこれ以上調べる余力も技術もないので、一旦上記でしのぎます。

KVM上の仮想環境に立てたからかSSH関連で色々とトラブルにあいました。おかげさまでLinuxの仕組みを少しだけ知ることができたので、いつでも見返せるよう少しずつ記事にしていきたいなと思います。

KVMでCentOS7にCentOS7の仮想環境を立ててみる

はじめに

自由に使えるLinux環境が欲しいなと思いまして。

物理環境は色々やりすぎて壊れると面倒ですし、仮想環境を立てることにしました。

最近は仮想化といえばコンテナ仮想化(特にdocker)の話題が多いですが、端末丸ごと使い潰したい場合や、一から何度も構築の練習をしたい場合は従来からのハイバーバイザ仮想化の方が良いと踏んで始めてみようと思います。

KVMとは

Kernel-based Virtual Machine

Linuxで使われるハイパーバイザ型の仮想化基盤です。

CentOS7などではデフォルトで有効となっています。

今回の環境

ホストOS:CentOS Linux release 7.5.1804(Core)

CPU:Intel Celeron (コア数2) 詳細は忘れてしまった。コア数2以上ないと動かなかったような気も

ゲストOS:CentOS Linux release 7.6.180 (Core)

作成方法

必要なソフトウェア(パッケージ)のインストール

バージョンとかにこだわる必要がある人はソースからインストールする方法をググりましょう。

そうでない人は以下のコマンドを実行します。

$ sudo yum install -y qemu-kvm libvirt libvirt-client virt-install virt-manager bridge-utils

私も調べながらなので全て何に使うのか理解したわけじゃないですが

一応何に使うのか一覧を

  • qemu-kvm:KVMにおいて仮想マシンのハードウェアをエミュレートするもの
  • libvirt:仮想化管理用のAPI群
  • libvirt-client:仮想端末に接続するためのクライアント
  • virt-install:仮想端末をインストールするためのソフトウェア
  • virt-manager:仮想端末をGUIで管理するためのソフトウェア。Hyper-Vマネージャーのような存在。試していないがホスト側にGUI環境が存在していないなら不要だと思われる

ネットワーク周りの設定

調べてみると、仮想OSをインストールする前にまずはネットワークの設定が必要らしいです。

多分後からでもできるのですが手戻りが嫌なので先に設定します

ホストOSとゲストOSで通信するためと、ゲストOSがほすとOSのネットワークインターフェースを使用してインターネットに接続するためです。

やること

仮想ブリッジを作成してホストマシンの設定を移し替えます。

ホストマシンは作成した仮想ブリッジにNICを接続して通信をできるようにします。

仮想マシンは作成時にNICを仮想ブリッジに紐づけることになります。(ここは仮想マシンインストール時にやります)

仮想ブリッジの作成

以下のコマンドを実行します。

$ nmcli con add type bridge ifname br0

br0という名前(ifname)の仮想ブリッジを作成します。

以下のコマンドで作成できたかを確認します。

$ nmcli dev

DEVICE列がbr0、TYPE列がbridgeとなっているデバイスがあればOKです。

CONNECTION列は上記コマンドでは指定していないのでデフォルト値になります。おそらくbridge-br0となっていると思います。

仮想ブリッジにホストマシンのネットワーク設定を移し替え

以下のコマンドを、IPアドレスなどを自身のホスト環境のものに当てはめて実行します。

br0ではなく接続名(bridge-br0)を指定することに注意です

$ nmcli con mod bridge-br0 ipv4.method manual ipv4.address "192.168.0.10/24" ipv4.gateway "192.168.0.1" ipv4.dns "192.168.0.1"

書くまでもないレベルですが、

  • IPv4手動設定
  • IPアドレス設定
  • デフォルトゲートウェイ設定
  • DNSサーバ設定

を設定してます。コマンドの意味を考えながら学習すると、後から別のところで出てきたときに出てきやすくなりますね。

ホストマシンのNICを接続

この手順では一度ネットワークが切断されるので注意です。手順ミスをした時に元のIP設定が使えなくても接続できる方法(例えば物理的にディスプレイとキーボードを使う)があった方が安心です。

仮想ブリッジにNICを紐づける設定を追加します。

$ #仮想ブリッジにホストのNICを紐づける設定を追加
$ nmcli con add type bridge-slave ifname enp3s0 master bridge-br0
$ #次の手順でパスワードを求められて再起動がかからない状態で切断されないようにするために権限昇格
$ su
# #ホストの従来の設定を削除
# nmcli con del [元の設定の接続名] && reboot

再起動されるので、時間をおいて再度ホストに接続してください。

設定確認

$ nmcli dev
$ #DEVEICE: enp3s0 - TYPE: ehernet - CONNECTION: bridge-slave-enp3s0 のデバイスがあればOK 
$ brctl show
$ #bridge name: br0 - interface: enp3s0 のブリッジがあればOK
$ ip a
$ #br0に元のホストのIPなどが設定されていればOK

以上でネットワークの設定完了です。

仮想マシンのインストール

ようやくゲストOSのインストールです。

ゲストOSのisoを取得

cURLで取得します。

ダウンロード元のURLはインストールするOSに応じて自分で探すしかないですが、筆者がインストールしたCentOSの場合ここから適当ものを選びました。(ページが更新されている可能性はありますが)

例だと奈良のサーバです。

$ #iso保存用のディレクトリを作成(今回は/iso)
$ cd /
$ mkdir iso
$ curl -LO http://ftp.nara.wide.ad.jp/pub/Linux/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso

ゲストOSのインストール

調べると仮想ディスクの作成をしている手順もあるのですが、なくても仮想マシンの作成はできるよう。

コマンド実行

以下のコマンド実行時に自動で作成されている?(.qcow形式のファイルができるがこれがそうな気がする)

ちょっと理解しきれていないですが、今回は試すこと優先で進めたのでそのままインストールへ進みます。

$ sudo virt-install --name=testvm \
--memory=1024 \
--disk size=20 \
--vcpus=1 \
--location='/iso/CentOS-7-x86_64-DVD-1810.iso' \
--network bridge=br0 \
--graphics=none \
--extra-args='console=tty0 console=ttyS0, 115200n8'

オプションは適宜変更してもらえればと思います。

オプション 内容
name 作成する仮想マシンの名前
memory 仮想マシンのメモリ量
disk size 仮想マシンのディスクサイズ(GB単位)
cpus 仮想マシンの仮想CPU数
location インストールするゲストOSのisoファイルのパス
network ホストのどのブリッジを使用するかの設定
graphics GUIを使用するか
(使用する場合はどのように設定するかは調べてません。kdeとかを指定するのかも)
extra-args ホストマシンからゲストマシンへ接続するための設定
入出力デバイスとホストのコンソールを紐づけている?
最後の115200n8はない場合も見かけたが、ないと接続できなくなるような記述っぽいものもあったのでつけておくと無難。ボーレート、パリティ、データビット数の設定らしい。

コマンドを実行すると、色々と画面が流れて、CentOS7のインストーラanacondaが起動します。(最初Pythonのanacondaかと思って???となりました)

インストール

画面に従って設定していきます。

注意点は2点です。

  1. 設定中にqで抜けない
  2. 削除操作はdeleteキーで(back spaceではない)

特に1は、押してしまうとインストールが中断されます。動かない仮想マシンが出来上がります。

対処法は調べればあると思いますが、面倒だったので私は仮想マシンを一度削除して作り直しました。

設定を確定して先に進むときはc キーを押すようになっています。

設定が終わったらbキーでインストールを開始します。(全て設定する必要はないですが、全てやっておいた方が後で楽だと思います。)

自動で画面が進みますが、この画面で長期間止まります。筆者の場合は1時間くらい放置して別のことしていたら先に進んでました。調べてみるとBUGのような記述もあったのですが確信はできず

この画面になったらインストール完了です。Enterを押すと仮想マシンへログインできます。(インストーラでパスワードを設定していたらパスワードを求められる)

仮想マシンへの接続と切断

上記手順を実施した直後だと接続している状態ですが、ここは順序立てて説明します。

仮想マシン一覧の確認

以下のコマンドで。管理者権限でインストールした場合は確認時も管理者権限が必要です。(一般ユーザー権限でインストールできるかは未確認)

—all オプションをつけない場合は、起動中の仮想マシンのみを表示します。慣れておくと混乱しません。

$ sudo virsh list --all

接続

IDか名前で仮想マシンを指定して接続します。

$ sudo virsh console testvm

切断

接続時に書いてありますが、^ + ] で切断します。

WindowならCtrl + ]です。

おわりに

以上で、KVMでCentOS7の仮想マシンを使えるようになりました。

OSが起動しなくなるまで弄り倒してあげましょう。(ホストに影響のない範囲で。また、何らかの形でホスト含むOSが起動しなくなっても筆者は責任を取れません。)

楽しいLinuxライフを!