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

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

RHEL:HTTPS 社内リポジトリと update-ca-trust

TT Labで続きを見る

目標

RHEL系で、社内のdnfリポジトリをHTTPSで立てて、プライベートCAをシステムの信頼に入れて、インストールします。信頼の範囲をリポジトリ1つに絞る、sslcacertも使います。

なぜ重要なのか

社内リポジトリをHTTPSに変えると、dnfが証明書の検証で止まり、最もよくある対応は、sslverify=0です。リポジトリのメタデータは、何をインストールするかを決める文書なので、出所の確認をオフにしてはいけません。システム全体の信頼(update-ca-trust)と、リポジトリごとの信頼(sslcacert)を、使い分けられるようになれば、その場しのぎなしで解決できます。このPodは、外部に届きません(DNSだけ)。パッケージは、イメージの中の/opt/localrepoから持ってきます。

ステップ

  1. /opt/localrepoのtreeのrpmを、/srv/rpmrepoにコピーして、createrepo_cでリポジトリを作成してください。
  2. /root/pkiに、ルート(ca.crt・ca.key、CN Airgap Internal Root CA)と、repo.airgap.internalの証明書(repo.crt・repo.key、SAN)を作成して、/etc/hostsに名前を追加してください。
  3. /root/pki/serve.pyで、/srv/rpmrepoをhttps://repo.airgap.internal:8443/で起動してください。
  4. /etc/yum.repos.d/airgap.repoに、リポジトリairgapを書いてください(署名検査はオン、ディストリビューションのキーは/etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9)。
  5. 別のリポジトリをオフにして、airgapだけでdnf makecacheを実行し、失敗する出力を/root/rhel/tls-fail.txtに保存してください。
  6. ルートを、システムの信頼にairgap-root.crtとして入れて、もう一度抽出してください。
  7. airgapリポジトリだけで、treeをインストールしてください。
  8. 協力会社のCA(/root/pki/team-ca.crt、CN Partner Team CA)で、team.airgap.internalの証明書を発行して、9443に同じリポジトリを起動し、/etc/yum.repos.d/airgap-team.repoのsslcacertで、そのリポジトリだけがこのCAを信頼するようにしてください。協力会社の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が、今も拒否するかどうかでも行ってください。