RHEL:HTTPS 社内リポジトリと update-ca-trust
目標
RHEL系で、社内のdnfリポジトリをHTTPSで立てて、プライベートCAをシステムの信頼に入れて、インストールします。信頼の範囲をリポジトリ1つに絞る、sslcacertも使います。
なぜ重要なのか
社内リポジトリをHTTPSに変えると、dnfが証明書の検証で止まり、最もよくある対応は、sslverify=0です。リポジトリのメタデータは、何をインストールするかを決める文書なので、出所の確認をオフにしてはいけません。システム全体の信頼(update-ca-trust)と、リポジトリごとの信頼(sslcacert)を、使い分けられるようになれば、その場しのぎなしで解決できます。このPodは、外部に届きません(DNSだけ)。パッケージは、イメージの中の/opt/localrepoから持ってきます。
ステップ
/opt/localrepoのtreeのrpmを、/srv/rpmrepoにコピーして、createrepo_cでリポジトリを作成してください。/root/pkiに、ルート(ca.crt・ca.key、CNAirgap Internal Root CA)と、repo.airgap.internalの証明書(repo.crt・repo.key、SAN)を作成して、/etc/hostsに名前を追加してください。/root/pki/serve.pyで、/srv/rpmrepoをhttps://repo.airgap.internal:8443/で起動してください。/etc/yum.repos.d/airgap.repoに、リポジトリairgapを書いてください(署名検査はオン、ディストリビューションのキーは/etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9)。- 別のリポジトリをオフにして、
airgapだけでdnf makecacheを実行し、失敗する出力を/root/rhel/tls-fail.txtに保存してください。 - ルートを、システムの信頼に
airgap-root.crtとして入れて、もう一度抽出してください。 airgapリポジトリだけで、treeをインストールしてください。- 協力会社のCA(
/root/pki/team-ca.crt、CNPartner Team CA)で、team.airgap.internalの証明書を発行して、9443に同じリポジトリを起動し、/etc/yum.repos.d/airgap-team.repoのsslcacertで、そのリポジトリだけがこのCAを信頼するようにしてください。協力会社のCAは、システムの信頼には入れません。
参考
- リポジトリ1つだけで:
dnf --disablerepo='*' --enablerepo=airgap makecache - システムの信頼を見る:
trust list | grep -A3 Airgap・抽出:update-ca-trust extract - どこからインストールされたか:
dnf info --installed treeのFrom repo - よくある間違い1:
sslverify=0で済ませること。採点は、この設定を拒否します。 - よくある間違い2: 協力会社のCAまで、anchorsに入れること。その瞬間、サーバーのすべてのプログラムが、そのCAを信頼します。
createrepo_cで社内リポジトリを作成する
/opt/localrepoのtreeのrpmを、/srv/rpmrepoにコピーして、createrepo_cでリポジトリを作成してください。
リポジトリは、rpmファイルと、それを説明するrepodataディレクトリです。createrepo_cにディレクトリを指定すると、repomd.xmlと一覧ファイルを作成します。
プライベートCAとリポジトリの証明書
/root/pkiに、ルート(ca.crt・ca.key)と、repo.airgap.internalの証明書(repo.crt・repo.key、SAN)を作成して、/etc/hostsに名前を追加してください。
ルートは、自己署名でCA:TRUE、サーバー証明書は、ルートで署名しながら、SANを拡張ファイルで指定します。プライベートCAのモジュールと同じ手順です。
HTTPSでリポジトリを公開する
/root/pki/serve.pyで、/srv/rpmrepoをhttps://repo.airgap.internal:8443/で起動してください。
Pythonの標準ライブラリのhttp.serverを、sslコンテキストで包みます。このイメージのPythonは、3.9です。バックグラウンドで起動して、--cacertを指定したcurlで、repomd.xmlを取得してみてください。
.repoファイルを書く
/etc/yum.repos.d/airgap.repoに、リポジトリairgapを書いてください(署名検査はオン、ディストリビューションのキーを指定)。
セクション名が、リポジトリidです。baseurlは、repodataがあるディレクトリのアドレスで、署名検査と、公開鍵ファイルのパスも、一緒に書きます。証明書の検証をオフにする行は、書きません。
証明書の検証の失敗を記録する
別のリポジトリをオフにして、airgapだけでdnf makecacheを実行し、失敗する出力を/root/rhel/tls-fail.txtに保存してください。
--disablerepoと--enablerepoを一緒に使うと、リポジトリ1つだけを見られます。出力の全体(標準エラー出力を含む)を保存してください。
システムの信頼にルートを入れる
ルートを、システムの信頼にairgap-root.crtとして入れて、もう一度抽出してください。
RHEL系は、anchorsディレクトリに置いて、抽出コマンドを実行します。trust listで、ラベルと信頼の種類を確認してください。
社内リポジトリからインストールする
airgapリポジトリだけで、treeをインストールしてください。
リポジトリ1つだけをオンにしてインストールすれば、ほかの場所から来ることはできません。インストール後、dnf info --installedで、どのリポジトリから来たかを見てください。
リポジトリ1つだけを、別のCAで確認する
協力会社のCA(/root/pki/team-ca.crt、CN Partner Team CA)で、team.airgap.internalの証明書を発行して、9443に同じリポジトリを起動し、/etc/yum.repos.d/airgap-team.repoのsslcacertで、そのリポジトリだけを信頼するようにしてください。
協力会社のCAは、anchorsには入れません。.repoには、リポジトリごとに、CAファイルを指定するオプションがあります。確認は、そのリポジトリだけをオンにしたmakecacheで行い、そしてシステムのcurlが、今も拒否するかどうかでも行ってください。