TT Lab
开始
学习 学习路径 课程

隔离网络镜像与私有 CA

RHEL:HTTPS 内部仓库与 update-ca-trust

在 TT Lab 中继续学习

目标

在 RHEL 系列上用 HTTPS 搭建内部 dnf 仓库,把私有 CA 放入系统信任并完成安装。还要用到把信任范围缩小到一个仓库的 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 在 https://repo.airgap.internal:8443/ 提供 /srv/rpmrepo。
  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 在 https://repo.airgap.internal:8443/ 提供 /srv/rpmrepo。

用 ssl 上下文包装 Python 标准库的 http.server。这个镜像中的 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,就可以只看一个仓库。请保存完整的输出(包括标准错误)。

把根证书放入系统信任

把根证书以 airgap-root.crt 放入系统信任,并重新提取。

RHEL 系列是放在 anchors 目录中,再运行提取命令。请用 trust list 确认标签和信任类型。

从内部仓库安装

只用 airgap 仓库安装 tree。

只开启一个仓库进行安装,就不可能来自其他地方。安装之后,请用 dnf info --installed 查看它来自哪个仓库。

只让一个仓库使用另一个 CA

用合作方 CA(/root/pki/team-ca.crt,CN 为 Partner Team CA)签发 team.airgap.internal 证书,在 9443 端口启动同样的仓库,并通过 /etc/yum.repos.d/airgap-team.repo 的 sslcacert,让只有那个仓库信任这个 CA。

合作方 CA 不放进 anchors。.repo 中有按仓库指定 CA 文件的选项。请用只开启该仓库的 makecache 来确认,并确认系统 curl 是否仍然拒绝。