RHEL(RedHat Enterprise Linux) を「インターネットから隔離された状態で」使う、というのが本ブログエントリのテーマです。セキュリティ要件など何らかの事情があってインターネットに接続することが許されていない環境下で RHEL を使う、という場合の設定手順を紹介します。

これ、CentOS だと特に意識することもなく、インストール用の DVD などを用意して普通にインストールできるし、(インターネットに接続できない不便さはあっても)そのまま使い続けることもできます。ただ同じことを RHEL でやろうとするとうまくいかないことがあって、それを回避するにはどうすればよいか、を自分なりに調べた内容のアウトプットです。


【RHEL と CentOS との違い】
まず RHEL は CentOS と同じように使えないのでしょうか? その違いは何で、どのような影響があるのでしょうか?

今回のテーマとしてとりあげる問題はサブスクリプションマネージャー(subscription-manager)にあります。RHEL は CentOS とは異なり、サブスクリプションがないと使えません。サブスクリプションは有償のものであったり、開発者向けに無償で提供されているものもありますが、なんらかの登録を行い、その登録情報をインストール中に入力することで使えるようになります(下画面ではインストール中に表示される「Red Hat に接続」という部分で正しいサブスクリプション情報を入力しないと先に進めません。つまりこの時点ではインターネット接続が必要です):
2024010701

2024010702


なお一部のクラウドベンダーでは初めから RHEL がインストールされたイメージを使うことができますが、この場合もサブスクプションを無視して使えているわけではなく、特殊なサブスクリプションが適用された状態になっています(RHEL のサブスクリプション料金がクラウドの料金に含まれているはずです)。サブスクリプションマネージャーはこのサブスクリプション情報を管理するシステムを提供しています。


【サブスクリプションマネージャーが管理しているもの】
このサブスクリプションマネージャーが管理しているものの1つが「yum(dnf) のリポジトリ」です。例えば RHEL の場合、RedHat が提供しているツール類に加えて ansible など RHEL のサブスクリプションを所有している前提で使うことのできるツールが提供されていて、その利用のためのリポジトリ情報(yum などでインストールするためにサーバー情報や鍵情報)がサブスクリプションマネージャーによって管理されています。サブスクリプションマネージャーが yum リポジトリを管理していることで(インターネットに繋がっている RHEL や、特定のクラウド環境内で使っている RHEL は)RHEL 向けに提供されているツールを使うことができる、という仕組みになっています。そしてその仕組みを管理しているのがサブスクリプションマネージャーということになります。


【サブスクリプションマネージャーが有効な場合に不都合となるケース】
そしてこの適用されているサブスクリプション情報は、インストール後の利用時にも影響を与え続けることになります。たとえネットワークインターフェースを無効にするなどしてインターネットに(物理的/論理的に)繋がっていない状況を作り出したとしても、サブスクリプション情報はシステムに残り続けます。

これが「インターネットに接続していない環境」だと不都合な問題が発生します。以下、具体的な画面(VirtualBox 内にインストールした RHEL 9.3 の画面)を交えて紹介します。

まず RHEL 9.3 をインストールします。上述のようにサブスクリプション情報を入力/認証する必要があるため、初期セットアップ時にはインターネット接続が必要です。この時点では VirtualBox 側のネットワーク設定でアダプター割り当てを「NAT」にしていました:
2024010801


この状態で(インターネット接続がある状態で) "yum repolist" を実行して現在有効な yum のリポジトリを確認すると2つのリポジトリが有効に登録されていました。そして "yum install tmux"(tmux というツールをインストールする際のコマンド)を実行すると登録されているリポジトリから必要なモジュールを探し、「インストールしますか?」と聞かれるところまで実行できました("n" を押してインストールをキャンセルします)。期待通りの挙動になっています:
2024010802


この状態からネットワークを無効にします。今回は VirtualBox 側の割り当て設定を「未割当」にしました。RHEL 側からはネットワークアダプターそのものは認識できるが、DHCP などで IP アドレスが割り当てられることもなく、実質的に使えない状態になるはずです。こうすることで物理的なサーバーをインターネットが使えない環境に移動させた時と近い状況が作り出せているはずです:
2024010803


この状態で先ほどと同じコマンドを実行してみます。"yum repolist" を実行すると先ほどと同じ結果になり、リポジトリそのものは2つ登録されたままになっていることがわかります。しかし "yum install tmux" を実行して tmux をインストールしようとすると、今度は(ネットワークが使えず)リポジトリ先にアクセスすることができないため失敗してしまいます。これもここまでは期待通りの挙動と言えます:
2024010804


ただ問題は「使えないリポジトリが登録されたままになっている」点です。この状態から tmux などのツールを追加インストールするにはローカルリポジトリを作成するなどすることで可能ではあるのですが、この使えないリポジトリは邪魔なので消す必要があります。

リポジトリの情報は /etc/yum.repos.d/ フォルダ以下に .repo という拡張子を持ったファイルを用意しておくことでシステムに認識させることができます。RHEL の場合も /etc/yum.repos.d/redhat.repo というファイルが用意されており、ここでサブスクリプション情報に合わせたリポジトリが使えるようになっています。 というわけでいったんこのファイルを(redhat_repo などに)リネームして、RHEL のリポジトリが無効になるよう更新してみます。 本来ならばこれで登録リポジトリは空になるはずだと期待していたのですが、実際にやっていると登録リポジトリは変わらず2つ存在したままで、しかもリネームしたはずの /etc/yum.repos.d/redhat.repo ファイルがいつの間にか復活(!?)していました:
2024010805


これがサブスクリプションマネージャーの挙動です。ansible など RHEL のサブスクリプションがないと使えないリポジトリも含めて管理されており、何かの手違いでサブスクリプション情報が消えてしまわないよう(ansible などがインストールできなくなってしまわないよう)リポジトリ情報はリポジトリファイル以外でも管理されていて、変更が加わってもリポジトリの更新時に再度自動で復活させるような挙動を見せます。

この挙動により RHEL をインターネット接続がない環境で使おうとした際の、上述の「使えないリポジトリが登録されたままになっている」点を解決しようとしてもすぐに元に戻ってしまう、という問題が残ってしまうのでした。


(↓以下補足)
自分だけのケースかもしれませんが少し補足します。上述のようなインターネット接続が使えない環境下で RedHat OCP(OpenShift Container Platform) をローカルインストールしようと試みた際に RedHat が提供している ocp4-helpernode というツールを使おうとしました。 その時も上述のように RedHat のリポジトリが自動で復活する問題を抱えていたのですが、「ローカルリポジトリを作って、自動復活する前に各種ツールをインストールして準備」したつもりでした。 が、それだと最終的に ocp4-helpernode を使おうとした段階になって RedHat のリポジトリが復活してしまい、「準備ツールをインストールした時と環境が異なっている」ことが検知されたようなエラーメッセージ(↓)が表示されて止まってしまいました:

  :
  :
TASK [set_fact] ****************************************************************
ok: [localhost]

TASK [Install needed packages] *************************************************
fatal: [localhost]: FAILED! => {"changed": false, "failures": [], "msg": "Unknown Error occurred: Some packages from local repository have incorrect checksum", "rc": 1, "results": []}

自分の場合はもともとこの環境を作りたくて調べていたのですが、CentOS とは異なり、RHEL だとこのリポジトリを管理するサブスクリプションマネージャーをどうにかしないといけない、ということがわかったのでした。

なお、同じこと(OCP をネットワーク接続のない環境で物理サーバーにインストール)を RHEL ではなく CentOS を使って行うことも検討したのですが、こちらの場合は RHEL のサブスクリプションには含まれている ansible や ansible の関連ツールのインストールが別途必要になったり、上で紹介した ocp4-helpernode 自体が RHEL 向けだけに提供されていたりして、別の部分で余計にややこしそうだったのであきらめました。
(↑以上補足)


というわけで、RHEL のサブスクリプションマネージャーは便利な反面、利用形態によっては邪魔になってしまうケースもあることがわかったのでした。


【サブスクリプションマネージャーを無効にする方法】
前置きの長いブログになってしまいましたが、このような背景からサブスクリプションマネージャーを無効にしたい、という需要も少なからずあるように感じています。もちろん無効にすることで RHEL が管理している最新のリポジトリは使えなくなってしまうし、ansible など RHEL のサブスクリプションと合わせて提供されるツールもインストールできなくなってしまうというリスクがあります。そのリスクを理解した上で「それでも無効にしたい」場合だけ実施するようにしてください(私は責任取れません)

RHEL のサブスクリプションマネージャーは以下のコマンドで無効にできます:
# subscription-manager config --rhsm.manage_repos=0

上述のような「インターネット接続がない環境下でいろいろなツールをセットアップ」しないといけないようなケースでは、まず上のコマンドを実行してサブスクリプションマネージャーを無効化した上で、DVD などから必要なモジュールを取り出し、あるいはファイルのみダウンロードしたりした上で、必要に応じてローカルリポジトリを用意してインストール/セットアップを行う、という手順が必要になると思います。

自分のように OCP をネットワーク接続のない環境でセットアップ、、なんて無茶なことをやろうとする場合に自分が調べてこのブログにまとめた関連情報(躓きそうな箇所に関する情報)を以下に記載しておくので参考にしていただけると嬉しいです:




(参照)
ネットワークが制限された環境でのクラスターのベアメタルへのインストール
OpenShift on Power 完全オフライン環境でのインストール