TT Lab
はじめる
学ぶ 学習パス コース

閉域網のミラーとプライベート CA

システム全体に信頼させるか、リポジトリ一つだけか

TT Labで続きを見る

一言でいうと

RHEL系のプライベートCAは、/etc/pki/ca-trust/source/anchors/に入れて、update-ca-trust extractで、システム全体に行き渡らせます。ところが、システム全体に信頼させることが、いつも正解とは限りません。リポジトリ1つだけを別のCAで確認する必要があるなら、.repoのsslcacertが、その範囲を絞ります。

なぜ必要なのか

エアギャップ環境のRHELサーバーのdnfは、社内リポジトリを見ます。そのリポジトリをHTTPSで立てた瞬間、Curl error (60)系のエラーとともに、Cannot download repomd.xmlになります。よくあるその場しのぎは、sslverify=0です。そうすると、社内ネットワークでリポジトリになりすました誰もが、パッケージの一覧を出せます。リポジトリのメタデータは、「何をどのハッシュでインストールするか」を決める文書なので、その文書の出所を確認しないことは、インストール全体を任せることです。

どう動くのか

システムのトラストストア: RHEL 9のドキュメントによると、証明書を/etc/pki/ca-trust/source/anchors/(または優先順位が低い/usr/share/pki/ca-trust-source/anchors/)に置いて、update-ca-trust extractを実行します。PEMもDERも受け付けます。確認は、p11-kitのtrust list、入れたり外したりは、trust anchor <파일>・trust anchor --removeでもできます(プレースホルダーはファイルです)。このラボのイメージ(Rocky 9.3)で見ると、/etc/pki/tls/certs/ca-bundle.crtは、/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pemを指すシンボリックリンクです。extractが書き直すのは、このextractedの下のファイルで、curlやdnfのように、システムのバンドルを見るツールは、その結果を読みます。

リポジトリ1つだけを信頼させる: dnfの設定ドキュメントは、リポジトリのオプションsslcacertを、「SSL証明書を検証するCAファイルのパス。空ならシステムのデフォルト」とし、sslverifyのデフォルトを真と書いています。協力会社が自分のCAで立てたリポジトリを取得する必要があるけれど、そのCAを、サーバーのすべてのプログラムに信頼させたくないときは、そのリポジトリの.repoにだけ、sslcacertを書きます。信頼の範囲を、必要な分だけに絞る方法です。

リポジトリを作成する: createrepo_c <디렉터리>は(プレースホルダーはディレクトリです)、rpmを読んで、repodata/(repomd.xmlと、primary・filelists・other)を作成します。dnfは、baseurlの下のrepodata/repomd.xmlから取得します。Webサーバーは、ファイルを出すだけで十分です。

署名の検査は別です。TLSは「このリポジトリサーバーが正しいか」を、rpmのGPG署名(gpgcheck)は「このパッケージをディストリビューションが作ったか」を確認します。公式リポジトリからコピーしてきたrpmには、もともとの署名がそのまま残っているので、ディストリビューションの公開鍵(/etc/pki/rpm-gpg/)を、gpgkeyで指し示せば、社内リポジトリでも、署名検査を有効にしたまま、インストールできます。社内リポジトリだから、2つのうち1つをオフにしてもよいという論理は、成立しません。

現場での姿

このラボのイメージで測ってみました。プライベートCAの証明書でHTTPSリポジトリを起動して、.repoで指し示すと、dnf makecacheが、Curl error (60): SSL peer certificate or SSH remote key was not OK ... [SSL certificate problem: unable to get local issuer certificate]を経て、Cannot download repomd.xml ... All mirrors were triedで、0.3秒で終わりました(-qを指定すると、前の原因の行が消えて、最後の行だけが残るので、記録するときは外して実行します)。ルートをanchorsに入れて、update-ca-trust extractを実行すると、trust listに、label: Airgap Internal Root CA、trust: anchor、category: authorityが現れて、同じコマンドが通りました。treeをインストールすると、dnf info --installed treeのFrom repoが、airgapでした。どのリポジトリからインストールされたかは、この行で確認します。

次のラボですること

オフラインリポジトリのrpmで、/srv/rpmrepoを作成して、プライベートCAの証明書で、repo.airgap.internal:8443にHTTPSで起動します。.repoを書いて失敗を記録したあと、anchorsとupdate-ca-trustで、システムに信頼させて、treeをインストールします。最後に、別のCAで立てた2つ目のリポジトリを、sslcacertで、そのリポジトリだけ信頼させます。

参考ドキュメント: RHEL 9 — Using shared system certificates・trust(1)・DNF Configuration Reference(sslcacert, sslverify)