PHPの脆弱性が世間を騒がせておりますが、AlmaLinux8の標準でバンドルされているPHPのバージョンを変更する手順を紹介します。また、全く別件ですが、perlの依存関係についても解消したので、合わせてお知らせします。
現在のPHPのバージョンの確認
現在有効になっているPHPモジュール(ストリーム)を確認するには、以下のコマンドを実行します。
# dnf module list php
AlmaLinux 8 - AppStream
Name Stream Profiles Summary
php 7.2 [d][e] common [d], devel, minimal PHP scripting language
php 7.3 common [d], devel, minimal PHP scripting language
php 7.4 common [d], devel, minimal PHP scripting language
php 8.0 common [d], devel, minimal PHP scripting language
php 8.2 common [d], devel, minimal PHP scripting language
表示の見方
- バージョンの横にある [e] は Enabled(有効化されている) を意味します。
- [d] は Default(標準設定) を意味します。
PHP 8.2への変更手順(標準モジュール使用)
- 既存のPHPモジュール設定をリセット
現在有効になっているPHP 7.2のモジュール設定をクリアします。
# dnf module reset php
- 標準のPHP 8.2モジュールを有効化
AlmaLinux 8の標準リポジトリで提供されている php:8.2 ストリームを指定して有効化します。
# dnf module enable php:8.2
- パッケージの同期とアップデートを実行
既存のPHP 7.2関連パッケージをすべてPHP 8.2へ一括更新します。
# dnf distro-sync --allowerasing --refresh
- 関連サービスの再起動
Apacheと、裏側で動作するPHP-FPMの双方を再起動して設定を反映させます。
PHP-FPMの再起動 (こちらは自動で再起動されていました)
# systemctl restart php-fpm
Apacheの再起動
# systemctl restart httpd
- バージョンの確認
切り替えが正常に完了したか、以下のコマンドで確認してください。
# php -v
出力結果に PHP 8.2.x と表示されていれば、標準モジュールでのアップデートは無事成功です。
念のため、
# rpm -qa | grep php
でも、phpのパッケージが8.2になっている事を確認しておきます。
<番外編>
dnfコマンドを実行した際に、以下のようにモジュールの依存関係問題が表示されていました。(文面が見にくいので一部XXXに編集)ここからは、perlの依存関係の解消の手順について記載します。
# dnf module list perl
モジュールの依存関係問題:
問題 1: module perl:5.26:XXX.x86_64 from appstream conflicts with module(perl:5.32) provided by perl:5.32:XXX.x86_64 from appstream
- module perl:5.32:XXX.x86_64 from appstream conflicts with module(perl:5.26) provided by perl:5.26:XXX.x86_64 from appstream
- module freeradius:3.0:XXX.x86_64 from appstream requires module(perl:5.26), but none of the providers can be installed
- 競合するリクエスト
問題 2: module perl:5.26:XXX.x86_64 from appstream conflicts with module(perl:5.32) provided by perl:5.32:XXX.x86_64 from appstream
- module perl:5.32:XXX.x86_64 from appstream conflicts with module(perl:5.26) provided by perl:5.26:XXX.x86_64 from appstream
- module freeradius:3.0:XXX.x86_64 from appstream requires module(perl:5.26), but none of the providers can be installed
- 競合するリクエスト
AlmaLinux 8 - AppStream
Name Stream Profiles Summary
perl 5.24 common [d], minimal Practical Extraction and Report Language
perl 5.26 [d] common [d], minimal Practical Extraction and Report Language
perl 5.30 common [d], minimal Practical Extraction and Report Language
perl 5.32 [e] common [d], minimal Practical Extraction and Report Language
freeradiusはインストールしていないはずですが、念のため、
# rpm -qa | grep freeradius
や
# dnf list installed freeradius
を実行してインストールされていないことを確認します。
「FreeRADIUSはインストールしていない」にもかかわらずこのエラーが出る理由は、DNFモジュールの仕様にあります。FreeRADIUSのパッケージ自体がシステムになくても、リポジトリ(AppStream)側で「FreeRADIUS 3.0 モジュール」が有効(enable)になっているか、システムがデフォルトで有効とみなしているため、DNFが「FreeRADIUSを動かすためのPerl 5.26が必要だ」と自動判定してしまい、手動で選んだ Perl 5.32 と衝突しています。
FreeRADIUSを実際には使わないのであれば、FreeRADIUSのモジュール自体を無効化(disable)することで、Perl 5.32 への切り替えエラーを完全に解消できます。
perlの依存関係を解消する手順
1. 衝突の原因になっている freeradius モジュールを完全に無効化する
# dnf module disable freeradius
2. Perl関連のモジュール設定を一度リセットする
# dnf module reset perl perl-DBI
3. 使いたい Perl 5.32 モジュールを有効化する
# dnf module enable perl:5.32
4. DNFのキャッシュを完全に削除する
# dnf clean all
5. 依存関係を整理しながらシステムを同期・更新する
# dnf distro-sync --allowerasing
なぜこれで直るのか?
dnf module disable freeradius を実行することで、DNFに対して「このシステムではFreeRADIUSのことは一切考慮しなくていい」と指示を出します。これにより、Perl 5.26 への縛りが消え、安全に Perl 5.32 へアップグレードできるようになります。
このあと、dnf module list perl や dnf update を試してみて、エラーが消えたことを確認します。
なお、現在は問題なく動いているように見えても、このエラーを放置すると今後一切のセキュリティアップデートやパッケージの新規インストール(dnf update や dnf install)が正常に機能しなくなる(毎回エラーで停止する)可能性が極めて高いため、このエラーに気が付いたときに対処しておくべきです。
今回はここまでです。最後までお読みいただきありがとうございました。