概要
- Ubuntu 20.04をインターネットに公開している
- 諸々の事情で22.04にアップグレードできない
- 2023/09/11にサポート終了となったOpenSSLの1.1.1をアップグレードしたい。
- OpenSSHの脆弱性、CVE-2024-6387 の対応を行いたい
方を対象としています。
参考環境
OS:Ubuntu 20.04
openssl version -a
OpenSSL 1.1.1f 31 Mar 2020
built on: Wed May 24 17:14:51 2023 UTC
platform: debian-amd64
options: bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-mSG92N/openssl-1.1.1f=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_TLS_SECURITY_LEVEL=2 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAESNI_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific
ssh -V
OpenSSH_8.2p1 Ubuntu-4ubuntu0.9, OpenSSL 1.1.1f 31 Mar 2020
参考とした手順
実施する前の留意点
- コピペだけで済むように、エディタを使わない手順にしています。
- 実際に筆者が実施した手順をそのまま載せています。typo等はご容赦ください。
- 作業影響が極めて大きいため、作業時間の見積や日時調整は迅速かつ丁寧に行ってください。
- 特にmake / make testは思っている以上に時間がかかります。
- この手順では、sslのパスが変わります。同一サーバ内の他のプログラムがsslを参照している場合は、特に注意してください。
さっくりとはならない手順
- システム全体のバックアップ
- 【OpenSSL】必要なライブラリをインストールします。
- 【OpenSSL】githubレポジトリから最新安定版のソースコードをダウンロードします。
- 【OpenSSL】ソースからインストールしていきます。
- 【OpenSSL】設定を行います。(コンフィグを反映させ、パスを通します)
- 【OpenSSL】バージョンアップを確認します。
- 【OpenSSL】自動アップデートを無効化します。
- システム全体の再起動を行います。(1回目)
- 【OpenSSH】コンフィグに必要なディレクトリの作成を行います。
- 【OpenSSH】インストールに必要なパッケージをインストールします。
- 【OpenSSH】作業用ディレクトリに移動します。
- 【OpenSSH】ソースをダウンロードします。
- 【OpenSSH】OpenSSHをソースからビルドします。
- システム全体の再起動を行います。(2回目)
- 【OpenSSH】バージョンアップを確認します。
実施した手順
全体のバックアップを取得します。
任意の方法でシステム全体のバックアップを取ります。とはいえ、EOL/脆弱性対応のため切り戻しは基本的に許されません。
必要なライブラリのインストール
sudo aptitude install build-essential zlib1g-dev libssl-dev libpam0g-dev libselinux1-dev libkrb5-dev checkinstall zlib1g-dev git
aptitudeを用いています。必要に応じてaptを使ってください。
【OpenSSL】root昇格
OpenSSLをソースコードからコンパイルしてインストールする一連の作業は管理者権限で実行します。
sudo su -
【OpenSSL】ソースコードの取得
cd /hoge && pwd
任意のディレクトリを指定します
git clone https://github.com/openssl/openssl -b openssl-3.3.1
2024/07/03現在の最新版をダウンロードします。
※root昇格済みなのでsudoが不要であることにご注意ください
cd openssl
【OpenSSL】ソースからインストール
./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib
Configuring OpenSSL version 3.3.1 for target linux-x86_64
Using os-specific seed configuration
Created configdata.pm
Running configdata.pm
Created Makefile.in
Created Makefile
Created include/openssl/configuration.h
**********************************************************************
*** ***
*** OpenSSL has been successfully configured ***
*** ***
*** If you encounter a problem while building, please open an ***
*** issue on GitHub <https://github.com/openssl/openssl/issues> ***
*** and include the output from the following command: ***
*** ***
*** perl configdata.pm --dump ***
*** ***
*** (If you are new to OpenSSL, you might want to consult the ***
*** 'Troubleshooting' section in the INSTALL.md file first) ***
*** ***
**********************************************************************
make
makeは時間がかかります。状況を時折確認しながら待ちましょう。
make test
make 同様に時間がかかります。
make install
【OpenSSL】インストール後の設定
cat <<- __EOF__ | tee -a /etc/ld.so.conf.d/openssl-3.3.1.conf
/usr/local/ssl/lib64
__EOF__
ldconfig -v
mv /usr/bin/c_rehash /path/to/backup/c_rehash.$(date +%Y%m%d)
任意の退避ディレクトリを指定します
mv /usr/bin/openssl /path/to/backup/openssl.$(date +%Y%m%d)
任意の退避ディレクトリを指定します
cat <<- __EOF__ | tee -a /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/ssl/bin"
__EOF__
source /etc/environment
echo $PATH
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/ssl/bin"
と表示されることを確認します
【OpenSSL】バージョンアップ後の確認
openssl version -a
OpenSSL 3.3.1 4 Jun 2024 (Library: OpenSSL 3.3.1 4 Jun 2024)
built on: Wed Jul 3 02:04:25 2024 UTC
platform: linux-x86_64
options: bn(64,64)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_BUILDING_OPENSSL -DZLIB -DNDEBUG
OPENSSLDIR: "/usr/local/ssl"
ENGINESDIR: "/usr/local/ssl/lib64/engines-3"
MODULESDIR: "/usr/local/ssl/lib64/ossl-modules"
Seeding source: os-specific
CPUINFO: OPENSSL_ia32cap=0xfffa3203578bffff:0x7a9
これで、Ubuntu20.04でもOpenSSL3.3.1を利用することが可能になりました。
システム全体の再起動(1回目)
sudo reboot
【OpenSSL】自動アップグレード無効
強制的に3.3系に上げるので、その後、1.1.xがアップグレードされる可能性を防ぎます。
sudo apt-mark hold openssl
sudo aptitude hold openssl
これに続けて、CVE-2024-6387の対応を行います。
【OpenSSH】ディレクトリ作成と設定
sudo mkdir /var/lib/sshd && sudo chmod -R 700 /var/lib/sshd/ && sudo chown -R root:sys /var/lib/sshd/
【OpenSSH】作業用ディレクトリ移動
cd /hoge && pwd
任意のディレクトリを指定します。
【OpenSSH】ソースのダウンロードと展開
wget -c http://mirror.exonetric.net/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz
上記CVEの脆弱性に対応したバージョンを用います。
tar -xzf openssh-9.8p1.tar.gz
cd openssh-9.8p1
【OpenSSH】展開したソースコードをインストール
which openssl
/usr/local/ssl/bin/openssl
本手順でSSLのバージョンアップを行った場合の環境となります。
./configure --with-kerberos5 --with-md5-passwords --with-pam --with-selinux --with-privsep-path=/var/lib/sshd/ --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/ssl
--with-ssl-dir=/usr/local/ssl
は、opensslがあるディレクトリを指定します。
make
sudo make install
システム全体の再起動(2回目)
sudo reboot
【OpenSSH】バージョンアップ確認
この時点でSSH接続できていれば、ほぼ設定完了です。
ssh -V
OpenSSH_9.8p1, OpenSSL 3.3.1 4 Jun 2024
バージョンアップされていることを確認します。
自動アップグレード無効
強制的に9.x系に上げるので、その後、8.xがアップグレードされる可能性を防ぎます。
sudo apt-mark hold openssh-server
sudo aptitude hold openssh-server
システム全体の確認
- ログインできることを確認します。
- 他のサービスが正常に稼働していることを確認します。