在这个实践练习中,我们将运行一组步骤来检查您在本书中获得的知识。 与前面的章节相反,并不是所有的步骤都将被指出,因此它是留给您的自由裁量权来执行所需的步骤来实现您的预期目标。 建议避免引用过去的章节作为指导。 相反,尝试使用您的内存或系统中可用的工具。 这个练习,如果执行正确,将有效地训练你为正式考试。
强烈建议在开始这项练习时先用一个时钟来记录时间。
本章的所有练习都需要使用虚拟机(VM),运行 Red Hat Enterprise Linux 8 并安装基本安装。 此外,存储操作还需要新的虚拟驱动器。
在练习中,假设你具备以下条件:
- Red Hat Enterprise Linux 8 安装基础操作系统最小安装软件选择。
- 访问 Red Hat 客户门户网站,并激活订阅。
- 虚拟机必须是一次性的。 这是因为在操作期间对其执行的操作可能使其无法使用,并需要重新安装它。
这是一份针对任何测试的一般性建议清单,其中大多数都属于常识范畴,但在进行任何此类测试之前,我们必须牢记这些建议:
- 在正式考试或其他考试开始前阅读所有的问题。
- 特定的词有特定的含义,可以提示需求或实现目标的方法。 这就是为什么先阅读所有内容可以让你从多个角度了解如何完成测试。
- 让自己舒适。 安装您最喜欢的编辑器并运行
updatedb
,以获得一个包含软件包和已安装文件的新数据库,以便随时使用。 定义键盘布局。 安装tmux
并学习如何使用它,这样您就可以打开新的标签页并命名它们,而不需要额外的窗口。 - 定位请求之间的依赖关系,因为一些目标需要依赖其他目标才能完成。 找到这些依赖项,以便了解如何定位解决方案,而不必因为选择了错误的路径而返回并重做一些步骤。
- 使用一个计时器。 这对你了解哪些练习需要更多时间来完成很重要,这样你就能看到哪些地方需要改进。
- 不要记住特定的命令行。 了解如何通过
man
、/usr/share/docs
或--help
等参数使用系统中可用的文档来执行所需的命令。 - 确保更改持续存在,并且在重新引导后仍然处于活动状态。 有些更改在运行时可能是活动的,但必须持久化这些更改。 示例可能包括防火墙规则、启动时启动的服务等等。
- 记住使用
dnf whatprovides /COMMAND"
来查找提供可能丢失的文件的包。 - 检查以下链接:https://www.redhat.com/en/services/training/ex200-red-hat-certified-system-administrator-rhcsa-exam?=Objectives。 这将为您提供正式的 EX200 考试目标。
重要提示
按照设计,创建了下面的练习,以便命令、包等不会有突出显示。 记住到目前为止学习的内容,以便检测关键字,了解需要做什么。
不要过早地开始演练。 试着回忆一下都讲了些什么。
- 配置时区为 GMT。
- 允许 root 用户通过 SSH 无密码登录。
- 创建一个用户(命名为user),该用户可以连接到机器而无需密码。
- 用户
user
应每周更换密码,并提前 2 天通知,密码过期后可提前 1 天使用。 - 根用户必须能够在没有密码的情况下作为用户进行 SSH,这样任何人都不能使用密码作为根用户进行远程连接。
- 用户用户应该能够在没有密码的情况下成为 root 用户,并且也可以在没有密码的情况下执行命令。
- 当用户试图通过 SSH 登录时,显示一条不允许非法访问此系统的合法消息。
- SSH 必须监听端口22222,而不是默认端口22。
- 创建一个名为
devel
的组。 - 使
user
成为devel
的成员。 - 将用户成员资格存储在用户的主文件夹中名为
userids
的文件中。 - 用户用户和root用户应该能够通过 SSH 连接到本地主机,而不需要指定端口,并且默认为压缩连接。
- 找到系统中所有的手册页名称,并将这些名称放入名为manpages.txt的文件中。
- 打印不允许系统登录的用户的用户名。 对于每个用户名,打印该用户的用户 ID 和组。
- 每 5 分钟监控可用的系统资源。 不要使用 cron。 存储为*/root/resources.log*。
- 添加一个每分钟的作业来报告可用的空闲磁盘空间百分比,并将其存储在*/root/ frespace .log*中,以便它同时显示文件系统和空闲空间。
- 设置系统只保留 3 天的日志。
- 配置*/root/ frespace .log和/root/resources.log*的日志轮转。
- 配置对pool.ntp.org的时间同步,使用快速同步。
- 为子网172.22.0.1/24提供 NTP 服务器服务。
- 配置每分钟收集的系统统计信息。
- 设置系统用户的密码长度为 12 个字符。
- 创建一个名为*privacy,*的 bot 用户,该用户将保持其文件在默认情况下仅对自身可见。
- 在共享中创建一个可以被所有用户访问的文件夹,并且默认的新文件和目录仍然可以被devel组的用户访问。
- 配置 IPv4 地址mynic 地址,IPv6 地址
```sh
Ip6: 2001:db8:0:1::c000:207/64 g
gateway 2001:db8:0:1::1
Ipv4 192.0.1.3/24
gateway 192.0.1.1
```
- 允许主机使用谷歌主机名达到www.google.com,使用redhat主机名达到www.redhat.com
- 报告从供应商分发的文件中修改的文件,并将它们存储在*/root/ modified .txt*中。
- 通过 HTTP 在*/mirror 路径*下提供我们的系统安装介质包,以便其他系统作为镜像使用,在我们的系统中配置存储库。 从这个镜像中删除内核包,这样其他系统(甚至我们的系统)就找不到新的内核了。 防止 glibc 包在不删除它们的情况下被安装。
- 当为用户时,在*/home/user/root/文件夹中复制/root*文件夹,并每天保持同步,同步添加和删除。
- 检查我们的系统符合 PCI-DSS 标准。
- 增加一个 30gb 的硬盘到系统中。 但是,只需使用 15 GB 将镜像移动到它,这样在引导时就可以使用压缩和重复数据删除。 让它在*/mirror/mirror*下可用。
- 当我们计划根据相同的数据镜像自定义的包集时,将文件系统配置为报告我们的镜像至少要使用 1,500 GB。
- 在*/mirror/mytailormirror下创建第二个镜像副本,删除所有以字母k**开头的包。
- 在添加的硬盘驱动器的剩余空间(15gb)中创建一个新卷,并使用它来扩展根文件系统。
- 创建一个引导条目,允许您启动到紧急模式,以便更改根密码。
- 创建一个自定义调优配置文件,将第一个驱动器的预读量定义为4096,第二个驱动器的预读量定义为1024。 如果发生 OOM 事件,这个配置文件也会导致系统崩溃。
- 禁用并删除安装的 HTTP 包。 然后,使用registry.redhat 设置 HTTP 服务器。 / /rhel8/httpd-24
对于本节,我们将复制目标列表中的每一项,然后在其下面提供解释,使用适当的语法突出显示和解释。
我们可以通过执行date
命令来检查当前的系统日期。 在随后打印的行的最后一部分,将显示时区。 为了配置它,我们可以使用timedatectl
命令,或者修改/etc/localtime
符号链接。
所以,为了达到这个目的,我们可以使用以下方法之一:
timedatectl set-timezone GMT
rm –fv /etc/localtime; ln –s /usr/share/zoneinfo/GMT /etc/localtime
现在date
应该报告正确的时区。
这样做需要以下条件:
- SSH 必须安装并且可用(这意味着安装并启动)。
- 根用户应该生成一个 SSH 密钥,并将其添加到授权密钥列表中。
首先,让我们用 SSH 来解决这个问题,如下所示:
dnf –y install openssh-server; systemctl enable sshd; systemctl start sshd
现在,让我们通过按Enter来生成一个 SSH 密钥来接受所有的默认值:
ssh-keygen
现在,让我们将生成的密钥(/root/.ssh/id_rsa
)添加到授权密钥中:
cd; cd .ssh; cat id_rsa.pub >> authorized_keys; chmod 600 authorized_keys
为了验证这一点,我们可以执行ssh localhost date
,然后我们将能够获得当前系统的日期和时间,而无需提供密码。
这需要创建一个用户和一个以类似于根用户的方式添加的 SSH 密钥。 下面的选项也将与用户相关,但为了本演示的目的,我们将把它们作为单独的任务处理:
useradd user
su – user
现在,让我们通过按Enter来生成一个 SSH 密钥来接受所有的默认值:
ssh-keygen
现在,让我们将生成的密钥(/root/.ssh/id_rsa
)添加到授权密钥中:
cd; cd .ssh; cat id_rsa.pub >> authorized_keys; chmod 600 authorized_keys
为了验证这一点,我们可以执行ssh localhost date
,这样就可以在不提供密码的情况下获得当前系统日期和时间。
然后,使用logout
返回到root
用户。
这需要我们调整用户限制,如下所示:
chage –W 2 user
chage –I 1 user
chage -M 7 user
这需要两个步骤。 第一种方法是使用根的授权密钥启用user
,然后调优sshd
守护进程,如下所示:
cat /root/id_rsa.pub >> ~user/.ssh/authorized_keys
编辑/etc/sshd/sshd_config
文件,添加或替换PermitRootLogin
行,使其如下所示:
PermitRootLogin prohibit-password
保存并重新启动sshd
守护进程:
systemctl restart sshd
这意味着通过添加以下行来配置/etc/sudoers
文件:
user ALL=(ALL) NOPASSWD:ALL
Create a file, for example, /etc/ssh/banner
, with the message to display. 例如:"Get out of here"
。
修改/etc/ssh/sshd_config
并使用/etc/ssh/banner
设置行旗号,然后使用systemctl restart sshd
重新启动sshd
守护进程。
这是一个棘手的问题。 第一步是修改/etc/ssh/sshd_config
并定义端口22222
。 完成后,使用以下命令重新启动sshd
:
systemctl restart sshd
这当然会失败…… 为什么?
防火墙必须配置为:
firewall-cmd –-add-port=22222/tcp --permanent
firewall-cmd –-add-port=22222/tcp
SELinux 必须被配置:
semanage port -a -t ssh_port_t -p tcp 22222
现在,可以重新启动sshd
守护进程:
systemctl restart sshd
使用以下命令:
groupadd devel
使用以下命令:
usermod –G devel user
使用以下命令:
id user > ~user/userids
我们将默认的 SSH 端口修改为22222
。
为user
和 root 创建一个名为.ssh/config
的文件,其内容如下:
Host localhost
Port 22222
Compression yes
手册页存储在/usr/share/man
中。 因此,使用以下命令:
find /usr/share/man/ -type f > manpages.txt
下面的命令首先用nologin
shell 构建系统中的用户列表:
for user in $(cat /etc/passwd| grep nologin|cut -d ":" -f 1)
do
echo "$user -- $(grep $user /etc/group|cut -d ":" -f 1|xargs)"
done
从该列表中,检查/etc/group
文件中的成员关系,只留下组名,并使用xargs
将它们连接到要打印的字符串中。
上面的示例使用了for
循环和通过$()
内联执行命令。
理想的监视方式是 cron,但由于我们被告知不要使用它,这只会留给我们 systemd 计时器。 (您可以通过以下链接检查测试的文件:https://github.com/PacktPublishing/Red-Hat-Enterprise-Linux-8-Administration/tree/main/chapter-18-exercise1。
创建/etc/systemd/system/monitorresources.service
,包含以下内容:
[Unit]
Description=Monitor system resources
[Service]
Type=oneshot
ExecStart=/root/myresources.sh
创建/etc/systemd/system/monitorresources.timer
,包含以下内容:
[Unit]
Description=Monitor system resources
[Timer]
OnCalendar=*-*-* *:0,5,10,15,20,25,30,35,40,45,50,55:00
Persistent=true
[Install]
WantedBy=timers.target
创建/root/myresources.sh
,包含以下内容:
#!/bin/bash
df > /root/resources.log
使能新的定时器,具体如下:
systemctl daemon-reload
systemctl enable monitorresources.timer
它工作吗? 如果没有,journalctl –f
将给出一些细节。 SELinux 阻止我们执行根文件,所以让我们将其转换为二进制类型并标记为可执行文件,如下所示:
chcon –t bin_t /root/myresources.sh
chmod +x /root/myresources.sh
df
报告使用了磁盘空间和可用空间,因此我们需要进行一些计算。
这将报告安装位置、大小、使用空间和可用空间,以;
作为分隔符。 参考以下内容:
df|awk '{print $6";"$2";"$3";"$4}'
Bash 允许我们进行一些数学操作,但这些操作缺少小数部分。 幸运的是,我们可以做一个小技巧:我们将对它进行循环,如下所示:
for each in $(df|awk '{print $6";"$2";"$3";"$4}'|grep -v "Mounted")
do
FREE=$(echo $each|cut -d ";" -f 4)
TOTAL=$(echo $each|cut -d ";" -f 2)
echo "$each has $((FREE*100/TOTAL)) free"
done
for
循环将检查所有可用的数据,获取一些特定的字段,用;
分隔它们,然后对存储在$each
变量中的每一行运行循环。
我们削减输出,然后得到第四个字段。 这是可用的空间。
我们削减输出,然后我们得到第二个字段。 这是块的总数。
由于bash
可以做整数除法,我们可以乘以 100,然后除法得到百分比,并添加一个字符串作为输出的一部分。
或者(但不是作为说明),我们可以将df
已经给出的使用百分比折现为 100,并节省一些计算步骤。
我们还需要将输出存储在一个文件中。 为此,我们可以将整个循环包装在一个重定向中,或者将其添加到echo
行中,以便它附加到一个文件中。
我们也需要通过 cron 来做,所以完整的解决方案如下:
创建一个包含以下内容的/root/myfreespace.sh
脚本:
for each in $(df|awk '{print $6";"$2";"$3";"$4}'|grep -v "Mounted")
do
FREE=$(echo $each|cut -d ";" -f 4)
TOTAL=$(echo $each|cut -d ";" -f 2)
echo "$each has $((FREE*100/TOTAL)) free"
done
然后,使用chmod 755 /root/myfreespace.sh
使其可执行。
运行crontab -e
编辑根目录的 crontab,并添加如下行:
*/1 * * * * /root/myfreespace.sh >> /root/freespace.log
这可以通过编辑/etc/logrorate.conf
来实现,设置如下:
daily
rotate 3
删除其他每周、每月等事件,只留下我们想要的。
创建一个/etc/logrotate.d/rotateroot
文件,内容如下:
/root/freespace.log {
missingok
notifempty
sharedscripts
copytruncate
}
/root/resources.log {
missingok
notifempty
sharedscripts
copytruncate
}
编辑/etc/chrony.conf
,添加如下行:
pool pool.ntp.org iburst
然后执行如下命令:
systemctl restart chronyd
编辑/etc/chrony.conf
,添加以下行:
Allow 172.22.0.1/24
然后执行如下命令:
systemctl restart chronyd
执行如下命令:
dnf –y install sysstat
我们现在需要修改/usr/lib/systemd/system/sysstat-collect.timer
。 让我们创建一个覆盖,如下所示:
cp /usr/lib/systemd/system/sysstat-collect.timer /etc/systemd/system/
通过替换OnCalendar
值来编辑/etc/systemd/system/sysstat-collect.timer
,使其看起来如下所示:
OnCalendar=*:00/1
然后,用下面的命令重新加载单元:
systemctl daemon-reload
用下面这行编辑/etc/login.defs
:
PASS_MIN_LEN 12
为此,运行以下命令:
adduser privacy
su – privacy
echo "umask 0077" >> .bashrc
该分辨率使用umask
来删除其他人对所有新创建文件的权限。
为此,运行以下命令:
mkdir /shared
chown root:devel /shared
chmod 777 /shared
chmod +s /shared
25。 使用提供的数据 Ip6 配置 IPv4 和 IPv6 地址名为“mynic”的网络连接,如下:2001:db8:0:1::c000:207/64 g gateway 2001:db8:0:1::1 IPv4 192.0.1.3/24 gateway 192.0.1.1
下面是如何实现这一点:
nmcli con add con-name mynic type ethernet ifname eth0 ipv6.address 2001:db8:0:1::c000:207/64 ipv6.gateway 2001:db8:0:1::1 ipv4.address 192.0.1.3/24 ipv4.gateway 192.0.1.1
允许主机使用谷歌主机名访问 www.google.com,使用 redhat 主机名访问 www.redhat.com
运行并记录获取到的 IPs,如下所示:
ping www.google.com
ping www.redhat.com
请记录上述查询到的 ip 地址。
编辑/etc/hosts
,添加以下内容:
IPFORGOOGLE google
IPFORREDHAT redhat
保存并退出。
下面是如何实现这一点:
rpm -Va > /root/altered.txt
让我们的系统安装媒体包通过 HTTP 在 path /mirror 下可用,以便其他系统使用它作为镜像,并在我们的系统中配置存储库。 从镜像中删除内核包,这样其他系统(甚至我们的系统)就找不到新的内核了。 忽略要安装的回购文件中的 glibc 包,而不删除它们
这是一个复杂的问题,所以让我们一步一步地研究它。
安装http
并使用以下方法启用它:
dnf –y install httpd
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=http
systemctl start httpd
systemctl enable httpd
在/mirror
下创建一个文件夹,然后复制源媒体包,使其在http
上可用:
mkdir /mirror /var/www/html/mirror
mount /dev/cdrom /mnt
rsync –avr –progress /mnt/ /mirror/
mount –o bind /mirror /var/www/html/mirror
chcon -R -t httpd_sys_content_t /var/www/html/mirror/
删除内核包:
find /mirror -name kernel* -exec rm '{}' \;
使用以下命令创建存储库文件元数据:
dnf –y install createrepo
cd /mirror
createrepo .
使用我们创建的存储库创建一个存储库文件,并在系统上设置它,忽略其中的glibc*
包。
编辑/etc/yum.repos.d/mymirror.repo
,添加以下内容:
[mymirror]
name=My RHEL8 Mirror
baseurl=http://localhost/mirror/
enabled=1
gpgcheck=0
exclude=glibc*
下面是如何实现这一点:
su – user
crontab –e
编辑 crontab 并添加如下一行:
@daily rsync -avr –-progress –-delete root@localhost:/root/ /home/user/root/
dnf –y install openscap scap-security-guide openscap-utils
oscap xccdf eval --report pci-dss-report.html --profile pci-dss /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml
压缩和重复数据删除在这里的意思是 VDO。 我们需要把现有的镜子搬到那里,把旧的镜子搬到那里。
如果我们有安装介质,我们可以选择复制它,并重复内核删除或传输。 为此,首先让我们在新硬盘(sdb
)的分区中创建 VDO 卷:
fdisk /dev/sdb
n <enter>
p <enter>
1 <enter>
<enter>
+15G <enter>
w <enter>
q <enter>
这将从一开始就创建一个 15gb 的分区。 让我们在它上面创建一个 VDO 卷,使用以下命令:
dnf –y install vdo kmod-kvdo
vdo create –n myvdo –device /dev/sdb --force
pvcreate /dev/mapper/myvdo
vgcreate myvdo /dev/mapper/myvdo
lvcreate –L 15G –n myvol myvdo
mkfs.xfs /dev/myvdo/myvol
# Let's umount cdrom if it was still mounted
umount /mnt
# Mount vdo under /mnt and copy files over
mount /dev/myvdo/myvol /mnt
rsync –avr –progress /mirror/ /mnt/mirror/
# Delete the original mirror once copy has finished
rm –Rfv /mirror
umount /mnt
mount /dev/myvdo/myvol /mirror
此时,旧镜像被复制到 VDO 卷上的mirror
文件夹中。 它安装在/mirror
下,因此按照要求在/mirror/mirror
下有原镜。 我们可能需要执行以下操作:
- 将 mount
/mirror
绑定到/var/www/html/mirror/
以使文件可用。 - 恢复 SELinux 上下文以允许
httpd
守护进程访问/var/www/html/mirror/
中的文件。
调整我们创建的 repofile 以指向新路径。
请参考以下命令:
vdo growLogical --name=myvdo --vdoLogicalSize=1500G
下面是如何实现这一点:
rsync –avr –progress /mirror/mirror/ /mirror/mytailormirror/
find /mirror/mytailormirror/ -name "k*" -type f –exec rm '{}' \;
cd /mirror/mytailormirror/
createrepo .
下面是如何实现这一点:
fdisk /dev/sdb
n <enter>
p <enter>
<enter>
<enter>
w <enter>
q <enter>
pvcreate /dev/sdb2
# run vgscan to find out the volume name to use (avoid myvdo as is the VDO from above)
vgextend $MYROOTVG /dev/sdb2
# run lvscan to find out the LV storing the root filesystem and pvscan to find the maximum available space
lvresize –L +15G /dev/rhel/root
下面是如何实现这一点:
grubby --args="systemd.unit=emergency.target" --update-kernel=/boot/vmlinuz-$(uname –r)
参考以下命令:
dnf –y install tuned
mkdir –p /etc/tuned/myprofile
编辑/etc/tuned/myprofile/tuned.conf
文件,添加以下内容:
[main]
summary=My custom tuned profile
[sysctl]
vm.panic_on_oom=1
[main_disk]
type=disk
devices=sda
readahead=>4096
[data_disk]
type=disk
devices=!sda
readahead=>1024
下面是如何实现这一点:
rpm –e httpd
dnf –y install podman
podman login registry.redhat.io # provide RHN credentials
podman pull registry.redhat.io/rhel8/httpd-24
podman run -d --name httpd –p 80:8080 -v /var/www:/var/www:Z registry.redhat.io/rhel8/httpd-24