准备 RHCSA 风格验证的系统

LinuxBeginner
立即练习

介绍

本次最终引导式实验将整合多项 RHCSA 备考技能。你仍将获得命令指导,但这些步骤更接近管理员的验证工作流:检查系统、配置所需状态,并使用标准工具证明最终结果。

在本实验中,你将创建一个本地操作员身份、准备持久化存储、从该存储部署一个小服务、添加 SELinux 和防火墙策略,并运行最终的就绪检查。

检查准备好的系统

在此步骤中,你将检查为最终工作流准备的资源。首先确认块设备、服务状态和 SELinux 模式。

环境初始化已在 public 区域中永久保留 SSH 和使用 3002/tcp 的 LabEx 浏览器终端访问规则。更改应用程序的防火墙策略时,请保留这些管理访问规则。

进入项目目录。

cd /home/labex/project

显示准备好的分区路径。后续命令将复用此路径,因此你无需猜测哪个块设备属于该实验。

cat /home/labex/project/rhcsa-final-part

检查准备好的块设备。它目前还没有最终的文件系统,因此这是你格式化前的基准状态。

lsblk "$(cat /home/labex/project/rhcsa-final-part)"

检查最终服务是否尚未配置。|| true 可以确保即使此时该单元尚未存在,实验也能继续进行。

systemctl status rhcsa-final-web.service --no-pager || true

在开始之前确认 SELinux 处于强制(enforcing)模式。强制模式很重要,因为后续的 SELinux 标签不仅仅是信息性的,它们会影响策略是否被应用。

getenforce

创建操作员身份和共享目录

在此步骤中,你将创建一个本地组、一个本地用户以及一个设置了 setgid 的共享目录。这些命令在编写时考虑了安全性,即使你需要重新运行它们也没问题。

如果组不存在,则创建该组。getent group 首先检查本地名称服务,|| 部分仅在查找失败时创建组。

getent group rhcsaops || sudo groupadd rhcsaops

如果 finaladmin 用户不存在,则创建该用户。

id finaladmin >/dev/null 2>&1 || sudo useradd -m -s /bin/bash -G rhcsaops finaladmin

确保该用户是操作员组的成员。-aG 选项用于追加组成员身份,而不是替换用户现有的附加组。

sudo usermod -aG rhcsaops finaladmin
id finaladmin

为操作员笔记创建一个共享目录。模式 2770 赋予组完全访问权限并设置 setgid 位,这样新文件就会继承 rhcsaops 组。

sudo mkdir -p /srv/rhcsa-final/team
sudo chown root:rhcsaops /srv/rhcsa-final/team
sudo chmod 2770 /srv/rhcsa-final/team

以 finaladmin 身份写入一个测试文件。

sudo -u finaladmin bash -c 'echo final validation access > /srv/rhcsa-final/team/finaladmin.txt'

检查目录和文件。

sudo stat -c '%a %U:%G %n' /srv/rhcsa-final/team /srv/rhcsa-final/team/finaladmin.txt

准备持久化存储

在此步骤中,你将在准备好的分区上创建文件系统,并按 UUID 进行持久化挂载。这反映了 RHCSA 风格任务中使用的存储验证模式。

将准备好的分区路径存储在 shell 变量中。

part="$(cat /home/labex/project/rhcsa-final-part)"

创建一个带有可识别标签的 ext4 文件系统。此操作会破坏准备好的练习分区,因此请务必在确认设备路径后再执行。

sudo mkfs.ext4 -F -L RHCSA_FINAL "$part"

创建挂载点。

sudo mkdir -p /mnt/rhcsa-final

获取文件系统 UUID 并替换该挂载点可能存在的旧 fstab 行。UUID 是持久化挂载的稳定标识符,删除旧行可以防止 fstab 中出现重复条目。

uuid="$(sudo blkid -s UUID -o value "$part")"
sudo sed -i '/\/mnt\/rhcsa-final/d' /etc/fstab

添加持久化挂载条目。

echo "UUID=$uuid /mnt/rhcsa-final ext4 defaults 0 0" | sudo tee -a /etc/fstab

从 fstab 挂载并检查结果。mount -a 证明 fstab 行当前有效,而 findmnt 和 df 则确认了挂载目标和可用容量。

sudo mount -a
findmnt /mnt/rhcsa-final
df -h /mnt/rhcsa-final

部署并启用最终服务

在此步骤中,你将在挂载的文件系统上放置 Web 内容,并创建一个在本地端口 18083 上提供服务的 systemd 服务。

创建 Web 内容目录。

sudo mkdir -p /mnt/rhcsa-final/www

创建内容文件。

echo "RHCSA final validation service" | sudo tee /mnt/rhcsa-final/www/index.html >/dev/null

设置权限,以便 labex 服务用户可以读取内容,而无需使其全局可写。该服务只需要组读取和目录遍历权限,不需要广泛的写入权限。

sudo chown -R root:labex /mnt/rhcsa-final/www
sudo chmod 750 /mnt/rhcsa-final/www
sudo chmod 640 /mnt/rhcsa-final/www/index.html

创建服务单元。该服务从挂载的内容目录运行,并绑定到本地主机的 18083 端口,这使得使用 curl 进行本地验证变得非常容易。

sudo tee /etc/systemd/system/rhcsa-final-web.service >/dev/null <<'EOF'
[Unit]
Description=RHCSA final validation web service
After=network.target

[Service]
Type=simple
User=labex
Group=labex
WorkingDirectory=/mnt/rhcsa-final/www
ExecStart=/usr/bin/python3 -m http.server 18083 --bind 127.0.0.1
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

保护单元文件,重新加载 systemd 并启用服务。/etc/systemd/system 下的单元文件应由 root 用户所有,daemon-reload 会让 systemd 在你启用并重启服务之前读取新的单元配置。

sudo chown root:root /etc/systemd/system/rhcsa-final-web.service
sudo chmod 644 /etc/systemd/system/rhcsa-final-web.service
sudo systemctl daemon-reload
sudo systemctl enable rhcsa-final-web.service
sudo systemctl restart rhcsa-final-web.service
sleep 1

测试服务。

systemctl is-active rhcsa-final-web.service
curl -s http://127.0.0.1:18083/

添加 SELinux 和防火墙策略

在此步骤中,你将完善服务策略。为内容和端口添加持久化的 SELinux 标签,然后使用 firewalld 开放端口。

添加或更新持久化文件上下文规则。|| 模式使其可以安全地重新运行:当规则缺失时添加它,当路径已经有自定义规则时修改它。

sudo semanage fcontext -a -t httpd_sys_content_t '/mnt/rhcsa-final/www(/.*)?' || sudo semanage fcontext -m -t httpd_sys_content_t '/mnt/rhcsa-final/www(/.*)?'

应用上下文规则。restorecon 会更改当前文件标签以匹配你刚刚创建的持久化 SELinux 规则。

sudo restorecon -Rv /mnt/rhcsa-final/www

添加或更新 SELinux HTTP 端口标签。添加或修改模式可以同时处理全新系统和端口标签已存在的情况。

sudo semanage port -a -t http_port_t -p tcp 18083 || sudo semanage port -m -t http_port_t -p tcp 18083

启动 firewalld 并永久开放服务端口。

sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-port=18083/tcp
sudo firewall-cmd --reload

检查标签和防火墙状态。这些检查将策略工作与可观察的状态联系起来:文件标签、允许的 HTTP 端口类型以及开放的防火墙端口。

ls -Z /mnt/rhcsa-final/www/index.html
sudo semanage port -l | grep '^http_port_t'
sudo firewall-cmd --list-ports

运行最终就绪检查

在此步骤中,你将使用在整个课程中使用的相同工具来验证完整的系统状态。这不是一份书面报告,而是一次操作检查。

检查本地身份和组成员身份。

id finaladmin
getent group rhcsaops

检查持久化存储。你正在同时验证实时挂载和保存的 fstab 条目,因为仅验证其中任何一个都只是存储要求的一半。

findmnt /mnt/rhcsa-final
grep /mnt/rhcsa-final /etc/fstab

检查服务。

systemctl is-enabled rhcsa-final-web.service
systemctl is-active rhcsa-final-web.service
curl -s http://127.0.0.1:18083/

检查 SELinux 和 firewalld。最终状态应显示 SELinux 处于强制模式、服务文件上有 HTTP 内容标签,并且 firewalld 中开放了 18083/tcp 端口。

getenforce
ls -Z /mnt/rhcsa-final/www/index.html
sudo firewall-cmd --list-ports

总结

你通过配置操作员身份、setgid 共享目录、持久化存储、systemd 服务、SELinux 文件和端口标签、firewalld 暴露以及基于命令的最终验证,完成了一个最终的引导式就绪工作流。