RH415 v7.5 综合练习题解
本文是 RHCSS 培训课程 RH415 v7.5 的考试练习题,将此题库练习十遍,基本可通过考试。
练习前准备
[kiosk@foundation0 ~]$ rht-vmctl fullreset all # 重置所有 kvm
[kiosk@foundation0 ~]$ su - # 提权至 root
[root@foundation0 ~]# cd /home/kiosk/backup/ex415v7.5-prepare # 进入练习环境准备目录 /home/kiosk/backup/ex415v7.5-prepare
[root@foundation0 ex415v7.5-prepare]# sh ex415v7.5-prepare.sh # 运行练习环境准备脚本 ex415v7.5-prepare.sh
Create an encrypted volume - 创建一个加密卷【root@servera】
lvcreate -l+100%FREE treasure -n wallet # 底层块设备逻辑卷 wallet 使用 treasure 卷组中的所有可用空间
cryptsetup luksFormat /dev/mapper/treasure-wallet # 此处按提示输入大写“YES”,并使用密钥 RedHat2022 加密
cryptsetup luksDump /dev/mapper/treasure-wallet # 查看 /dev/mapper/treasure-wallet 头部信息
cryptsetup luksOpen /dev/mapper/treasure-wallet cryptedtest # 手动打开 LUKS 加密分区,并将其映射至 /dev/mapper 中的逻辑设备
lsblk --path # 列出所有可用块设备
mkfs.ext4 /dev/mapper/cryptedtest # 设备被 ext4 格式化
# 启动时,设备不需要自动解密或挂载
mkdir /mnt/cryptedtest # 创建加密块挂载目录 /mnt/cryptedtest
mount /dev/mapper/cryptedtest /mnt/cryptedtest/ # 挂载加密块 /dev/mapper/cryptedtest 至挂载目录 /mnt/cryptedtest
df -Th | grep /mnt/cryptedtest # 查看 /mnt/cryptedtest 空间占用情况
echo "ex415test" > /mnt/cryptedtest/test.txt # 设备中包含文本文件 test.txt,内容是 ex415test
Manage LUKS keys - 管理 LUKS 密钥【root@servera】
servera 上的 LUKS 设备 SKUL_VG/Secure_LV 解密密码为:RedHat4Security,但是此密码已经不再安全。
cryptsetup luksDump /dev/mapper/SKUL_VG-Secure_LV # 查看 /dev/mapper/SKUL_VG-Secure_LV 头部信息,可以看到 0 号槽位有一个老密码
cryptsetup luksAddKey /dev/mapper/SKUL_VG-Secure_LV # 增加一个 LUKS 密码
Enter any existing passphrase: <old_passphrase> # 解密密码为:RedHat4Security
Enter new passphrase for key slot: <new_passphrase> # 设置新密码为:RedHat2022
# 使用老密码不再能够解密
cryptsetup luksKillSlot /dev/mapper/SKUL_VG-Secure_LV 0 # 删除第 0 号槽位的老密码
Enter any remaining passphrase: <new_passphrase> # 输入新密码 RedHat2022
cryptsetup luksDump /dev/mapper/SKUL_VG-Secure_LV # 再次查看 /dev/mapper/SKUL_VG-Secure_LV 头部信息,可以发现已经移除了 0 号槽位的老密码
Configure NBDE - 配置 NBDE
root@serverd
# 配置 serverd 成为 NBDE 密钥服务器
yum install -y tang # 安装 tang 软件包
systemctl enable --now tangd.socket # 激活 tangd 服务 socket 并设置开机自启
systemctl status tangd.socket # 查看 tangd 服务 socket 状态
systemctl enable --now firewalld.service # 激活 firewalld 服务 socket 并设置开机自启
systemctl status firewalld.service # 查看 firewalld 服务 socket 状态
firewall-cmd --permanent --add-service=http # 防火墙放通 Tang 服务器所需的 http(80/TCP)端口
firewall-cmd --reload # 重启防火墙
firewall-cmd --list-all | grep http # 列举所有 http(80/TCP)端口的防火墙策略
root@servera
lvcreate -L 256MiB SECURITY_VG -n Clevis_LV # 在 vg SECURITY_VG 中创建 256MB 的逻辑卷 Clevis_LV
# 利用此逻辑卷,创建一个名为 RH415_data、密码为 RedHat2022 的加密设备
cryptsetup luksFormat /dev/mapper/SECURITY_VG-Clevis_LV # 此处按提示输入大写“YES”,并使用密钥 RedHat2022 加密
cryptsetup luksOpen /dev/mapper/SECURITY_VG-Clevis_LV RH415_data # 手动打开 LUKS 加密分区,并将其映射至 /dev/mapper 中的逻辑设备
mkfs.ext4 /dev/mapper/RH415_data # 设备被 ext4 格式化
# 将加密设备 RH415_data 的 NBDE 密钥服务器的密码设置为 RedHat2022 并配合 NBDE 将加密设备 RH415_data 永久挂载到 /mnt/data
mkdir /mnt/data # 创建加密块挂载目录 /mnt/data
mount /dev/mapper/RH415_data /mnt/data # 挂载加密块 /dev/mapper/RH415_data 至挂载目录 /mnt/data
df -Th | grep RH415_data # 查看 RH415_data 空间占用情况
echo "ex415test" > /mnt/data/test.txt # 挂载点中包含文本文件 test.txt,内容是 ex415test
yum install -y clevis* # 安装 clevis* 相关软件包
clevis luks bind -d /dev/mapper/SECURITY_VG-Clevis_LV tang '{"url":"http://serverd.lab.example.com"}' # 连接 tang 服务器
systemctl enable clevis-luks-askpass.path # 启用 clevis-luks-askpass.path 以防止非根分区被提示输入密码
vim /etc/crypttab # 输入如下一行并保存
RH415_data /dev/mapper/SECURITY_VG-Clevis_LV none _netdev
vim /etc/fstab # 输入如下一行并保存
/dev/mapper/RH415_data /mnt/data ext4 _netdev 0 0
reboot # 打开 servera 控制台检查启动过程是否具有 LUKS 设备的自动解密与挂载的过程
Configure intrusion detection - 配置 AIDE【root@servera】
# 下载 http://content.example.com/rh415.cfg 并将其放置在 /etc 中
cd /etc # 切换至 /etc 目录
wget http://content.example.com/rh415.cfg # 下载 http://content.example.com/rh415.cfg
chown root:root rh415.cfg # 更改 rh415.cfg 文件属组为 root.root
chmod 0664 rh415.cfg # 更改 rh415.cfg 文件权限为 0664
yum install -y aide # 安装 aide 软件包
cp /etc/aide.conf /tmp # 复制 /etc/aide.conf 文件至 /tmp 目录
sed -i '99,312d' /etc/aide.conf # 删除与 rh415.cfg 文件无关的所有配置
# AIDE 必须监控文件 /etc/rh415.cfg 的权限、所有权和时间戳变化
vim /etc/aide.conf # 输入如下一行并保存
/etc/rh415.cfg EVERYTHING # 监控 /etc/rh415.cfg 文件的 EVERYTHING
aide --init # 初始化 aide 数据库
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz # AIDE 数据库位于 /var/lib/aide/aide.db.gz 中
aide --check # 检查文件系统更改,显示如下两行表示正常
AIDE, version 0.15.1
### All files match AIDE database. Looks okay!
Monitor file activity - 监控文件活动【root@servera】
echo "-w /root/rockentries.txt -p rwxa -k rh415" >> /etc/audit/rules.d/audit.rules # 配置监控 /root/rockentries.txt, 关键字为 rh415,以监控该文件上的任何读取、写入、执行和追加事件
augenrules --load # 加载上述审计规则
cat /etc/audit/audit.rules # 查看 audit 审计规则是否包含上述配置
cat /root/rockentries.txt # cat 命令触发 auditd 审计事件
ausearch -i -k rh415 # 输出 key 为 rh415 的日志
Monitor file modification - 监控文件修改(可选题)【root@node2】
grep recipes /etc/group # 在 /etc/group 中搜索 recipes 组
recipes : x : 5000:george,michael
id george # 查看 george 用户 id 信息
uid=1201(george) gid=1201(george) groups=1201(george),5000(recipes)
id michael # 查看 michael 用户 id 信息
uid=1202(michael) gid=1202(michael) groups=1202(michael),5000(recipes)
vim /etc/audit/rules.d/audit.rules # 编辑 audit 审计规则
-w /topsecret.txt -p w -k vault # 审计 topsecret.txt 文件的写入,审计过滤关键字为 vault
-a always,exit -F auid=1201 -F auid=1202 -F auid!=0 -F uid!=0 -F euid!=0 # 对用户 george 与 michael 进行审计,用户 root 除外
augenrules --load # 加载上述审计规则
cat /etc/audit/audit.rules # 查看 audit 审计规则是否包含上述配置
Monitor program execution - 监控程序执行(可选题)【root@serverb】
which payroll # 查看 payroll 指令的绝对路径
/usr/local/bin/payroll
id bob # 查看 bob 用户 id 信息
uid=1001(bob) gid=1001(bob) groups=1001(bob)
id mary # 查看 mary 用户 id 信息
uid=1002(mary) gid=1002(mary) groups=1002(mary)
id fred # 查看 fred 用户 id 信息
uid=1003(fred) gid=1003(fred) groups=1003(fred)
vim /etc/audit/rules.d/audit.rules # 编辑 audit 审计规则
-w /usr/local/bin/payroll -p x -k payday # 审计 /usr/local/bin/payroll 的执行,审计过滤关键字为 payday
-a always,exit -F auid=1001 -F auid=1002 -F auid!=1003 -F uid!=1003 -F euid!=1003 # 对用户 bob 与 mary 进行审计,用户 fred 除外
augenrules --load # 加载上述审计规则
cat /etc/audit/audit.rules # 查看 audit 审计规则是否包含上述配置
Track failed logins - 跟踪失败的登录【root@servera & serverb】
authconfig --enablefaillock --faillockargs="deny=4 fail_interval=120 unlock_time=120" --update # 当对非 root 用户的 4 次连续失败登录后(本地登录或 ssh 登录),用户锁定 2 分钟
grep pam_faillock /etc/pam.d/system-auth-ac # 查看 /etc/pam.d/system-auth-ac 中 pam_faillock 模块相关条目
grep pam_faillock /etc/pam.d/password-auth-ac # 查看 /etc/pam.d/password-auth-ac 中 pam_faillock 模块相关条目
# 验证:使用普通用户账号连续4次登录失败被锁定2分钟
Restrict USB devices - 限制 USB 设备【root@node2】
yum install -y usbguard usbutils udisks2 # 安装 usbguard、usbutils、udisks2 软件包
usbguard generate-policy > /etc/usbguard/rules.conf # 生成默认的 USB 限制规则
cat /etc/usbguard/rules.conf # 查看默认 USB 限制规则
systemctl enable --now usbguard.service # 激活 usbguard 服务并设置开机自启
lsusb -v | less # 以 less 分页显示 USB 信息
# GREG-456 设备位于 Bus 001 Device 003: ID 46f4:0001
udisksctl status
MODEL REVISION SERIAL DEVICE
--------------------------------------------------------------------------
VirtIO Disk vda
QEMU QEMU HARDDISK 2.5+ CURTIS-123 sda
QEMU QEMU HARDDISK 2.5+ GREG-456 sdb
QEMU QEMU HARDDISK 2.5+ XYZ-ABC-789 sdc
parted -s /dev/sdb mklabel msdos # 给 /dev/sdb 硬盘加上 msdos 标签
parted -s /dev/sdb mkpart primary ext4 2048s 16383s
# 使用 fdisk 命令确认起始与终末扇区
# 使用 fdisk 或 parted 命令分区都可以
udevadm settle # 监视 udev 事件队列,并在所有事件全部处理完成之后退出
mkfs.ext4 -L GREG-456 /dev/sdb1
blkid | grep sdb1 # 查看 sdb1 块设备文件类型
mkdir /mnt/usbguard # 创建加载目录 /mnt/usbguard
mount /dev/sdb1 /mnt/usbguard # 挂载 /dev/sdb1 至挂载目录 /mnt/usbguard
df -Th | grep sdb1 # 查看 sdb1 空间占用情况
usbguard list-devices # 列举所有设备
6: allow id 1d6b:0002 serial "0000:00:04.0" name "EHCI Host Controller" hash "..."
parent-hash "VC8ZB6FZ51WMN42QA3CqGvK9+eLDu4jpdgzSwLFn+fs=" via-port "usb1" with-interface 09:00:00
7: allow id 46f4:0001 serial "CURTIS-123" name "QEMU USB HARDDRIVE" hash "..."
parent-hash "Nk/GTsYsILAzeLjPtZg0++medV8vhq/hd1Ew0r9Q/F8=" via-port "1-1" with-interface 08:06:50
8: allow id 46f4:0001 serial "GREG-456" name "QEMU USB HARDDRIVE" hash "..."
parent-hash "Nk/GTsYsILAzeLjPtZg0++medV8vhq/hd1Ew0r9Q/F8=" via-port "1-2" with-interface 08:06:50
9: allow id 46f4:0001 serial "XYZ-ABC-789" name "QEMU USB HARDDRIVE" hash "..."
parent-hash "Nk/GTsYsILAzeLjPtZg0++medV8vhq/hd1Ew0r9Q/F8=" via-port "1-3" with-interface 08:06:50
10: allow id 0627:0001 serial "42" name "QEMU USB Tablet" hash "..."
parent-hash "Nk/GTsYsILAzeLjPtZg0++medV8vhq/hd1Ew0r9Q/F8=" via-port "1-4" with-interface 03:00:00
usbguard block-device -p 7 # block 阻止第 7 个 设备授权
usbguard reject-device -p 9 # reject 取消第 9 个 设备授权并移除该设备
usbguard list-devices # 再次列举所有设备
cat /etc/usbguard/rules.conf # 确认 usbguard 规则
vim /etc/usbguard/usbguard-daemon.conf # 编辑 USBGuard 守护进程配置文件
InsertedDevicePolicy=block # 插入的新设备默认为 block 阻止
IPCAllowedUsers=root # 守护进程接受来自 root 的 IPC 连接
AuditBackend=LinuxAudit # 日志记录使用 Linux Audit
usbguard add-user usbadmin --policy=list --exceptions=listen --devices=list,listen # 允许 usbadmin 用户列举 USB 设备、侦听异常事件,并列举 USB 授权策略等
Configure login access control - 配置登录访问控制【root@serverd】
vim /etc/security/access.conf # 修改登陆访问控制配置文件 /etc/security/access.conf
+:root:ALL # root 用户可以从任何地方 SSH 登录 serverd
+:kmoon:172.25.250.11 # kmoon 用户只可以使用 SSH 从 serverb 登录 serverd
-:ALL:ALL # 其他所有用户均不允许登录 serverd
authconfig --enablepamaccess --update # enable pam_access.so module
Configure password policy - 配置密码策略【root@serverb】
vim /etc/security/pwquality.conf # 修改密码策略配置文件 /etc/security/pwquality.conf
minlen = 12 # 密码最小长度 12 位
lcredit = -4 # 小写字符最少 4 位
ucredit = -4 # 大写字符最少 4 位
dcredit = -3 # 数字字符最少 3 位
ocredit = -1 # 特殊字符最少 1 位
# 用户最多只有 5 次机会尝试输入密码
vim /etc/pam.d/system-auth # 修改如下一行并保存
password requisite pam_pwquality.so try_first_pass local_users_only retry=5 authtok_type=
vim /etc/pam.d/password-auth # 修改如下一行并保存
password requisite pam_pwquality.so try_first_pass local_users_only retry=5 authtok_type=
Configure auditing - 配置审计功能【root@serverb】
cp /usr/share/doc/audit-2.8.1/rules/30-stig.rules /etc/audit/rules.d/
ls -l /etc/audit/rules.d/30-stig.rules
vim /etc/audit/rules.d/audit.rules
-a never,user -F subj_type=crond_t # 永不审计 crond 服务(守护进程)
# man audit.rules 命令搜索 never 与 user
# never: never to audit
# user: userspace
# crond daemon as progress has crond_t domain
augenrules --load # 加载上述审计规则
vim /etc/audit/auditd.conf # 编辑 audit 审计规则
freq = 16384 # Auditd 的 backlog buffer 为 16384
# 如果磁盘空间低于 400MB 发送邮件给 root
space_left = 400
space_left_action = EMAIL
admin_space_left = 400
admin_space_left_action = EMAIL
reboot # 重启节点使 auditd 配置生效
Enable SELinux - 启用 SELinux【root@serverc】
HTML content: http://serverc:8001
CGI script content: http://serverc:8001/cgi-bin/hello.cgi
配置 serverc:SELinux 设为 Enforcing 模式
getenforce
Disabled
vim /etc/selinux/config
SELINUX=enforcing
reboot
# 练习环境: 打开 serverc 控制台 --> 按 "e" --> 修改只保留 console=tty0 该行最后添加 rd.break --> Ctrl-x
# 考试环境: 直接添加 rd.break
# switch_root# mount -o remount,rw /sysroot
# switch_root# chroot /sysroot
# sh# touch /.autorelabel
# sh# exit
# switch_root# exit
# 稍等片刻系统切换 Disabled 模式的 SELinux 为 Enforcing 模式的 SELinux
semanage port -a -t http_port_t -p tcp 8001 # 防火墙允许 ssh 和 8001 端口
systemctl enable --now firewalld.service
firewall-cmd --permanent --add-port=8001/tcp
firewall-cmd --reload
systemctl restart httpd.service
curl http://serverc:8001/ # 打开报错
ausearch -i -m AVC -ts boot | grep path
type=AVC ... avc: denied { getattr } for pid=1925 comm=httpd path=/custom/www/html/index.html
... scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:default_t:s0 ...
# 确认 apache httpd 的审计状态
ls -ldZ /custom
semanage fcontext -a -t httpd_sys_content_t '/custom(/.*)?'
restorecon -R -v /custom
ls -ldZ /custom
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /custom
chcon -R -t httpd_sys_script_exec_t /custom/www/cgi-bin
curl http://serverc:8001/
It works!
curl http://serverc:8001/cgi-bin/hello.cgi
Hello World
Configure SELinux confined users - 配置 SELinux 受限用户【root@serverc】
getenforce
Enforcing
semanage login -a -s sysadm_u sandra
semanage user sysadm_u --add -R secadm_r --add -R sysadm_r
setsebool -P ssh_sysadm_login on
# sysadm_u 具有 ssh_sysadm_login 布尔值
# 启用该布尔值以允许 sysadm_u 通过 ssh 登录
semanage login -m -s user_u -r s0 __default__
# 修改 __default__ selinux 用户
semanage login -a -s sysadm_u sandra
# 修改回 sysadm_u
usermod -Z user_u sarah
usermod -Z user_u sally
semanage login -a -s staff_u sarah
semanage login -a -s staff_u sally
echo "sarah ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/sarah
echo "sally ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/sally
echo "sandra ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/sandra
semanage login -l
Login Name SELinux User MLS/MCS Range Service
__default__ user_u s0 *
root unconfined_u s0-s0:c0.c1023 *
sally staff_u s0-s0:c0.c1023 *
sandra sysadm_u s0 *
sarah staff_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
# 确认所有的 linux 用户映射为 selinux 用户
# 验证:
# 1. 使用 sarch, sally 与 sandra 用户通过 ssh 登录 serverc
# 2. 登录成功后使用 'id -Z' 命令确认已映射为 selinux 用户
Configure Ansible - 配置 Ansible
root@serverd
yum install -y ansible # 安装 ansible 软件包
ssh-copy-id student@serverb # 将公钥拷贝至 serverb 的 student 账户
su - student # 切换至 student
ssh-keygen # 使用 ssh-keygen 生成 ssh 密钥对
ssh-copy-id student@serverb # 将公钥拷贝至 serverb 的 student 账户
vim ansible.cfg # 编辑 ansible 配置文件 ansible.cfg
[defaults]
# 通用配置
inventory = ./inventory
# 主机清单文件为 ./inventory
remote_user = student
# ansible 受管主机登陆用户为 student
log_path = ansible.log
# 日志记录文件为 ansible.log
[privilege_escalation]
# 提权配置
become = False
# 不允许提权
become_user = root
# 提权至 root
become_method = sudo
# 提权使用命令
become_ask_pass = False
# sudo 免密提权
vim inventory # 编辑 ansible 主机清单 inventory
[servers] # 主机组
serverb # 受管主机
root@serverb
echo "student ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/student # 配置 student 免密提权
su - student # 切换至 student
sudo su - # 提权至 root
student@serverd
ansible all -m ping # 测试所有受管主机连通性
serverb | SUCCESS => { # serverb 测试成功
"changed": false, # 无变化
"ping": "pong" # 与控制节点通信正常
}
ansible all -m command -a 'fdisk -l' -b
ansible all -m command -a 'fdisk -l'
serverb | FAILED | rc=2 >> # serverb 运行失败
[Errno 2] No such file or directory # 报错无此文件或目录
Generate a compliance report - 生成合规扫描报告【ssh -X root@workstation】
yum install -y *scap* # 安装 *scap* 软件包
scap-workbench &
RHEL7 --> Load Content --> Profile --> Standard System Security Profile(13) -->
Scan --> Save Result --> HTML Report --> /root/scan-report.html --> Save Result -->
XCCDF Results --> /root/scan-results.xml
ls -lh
Customize a compliance profile - 自定义合规性配置文件【ssh -X root@workstation】
scap-workbench &
RHEL7 --> Load Content --> Profile --> Standard System Security Profile(13) -->
Customize --> New Profile ID: xccdf_org.ssgproject.content_profile_standard_ACME -->
OK --> Deselect Everything --> Install firewalld + Verify firewalld Enabled + Disable vsftpd Service
+ Telnet + Ensure auditd Collects Information on the Use of Privileged Commands - sudo -->
OK --> File --> Save Customization Only --> /root/ACME-tailoring.xml --> Save
ls -lh /root/ACME-tailoring.xml
Remediate a system - 修复系统【ssh -X root@workstation】
scap-workbench &
RHEL7 --> Load Content --> File --> Load Customization File --> /root/ACME-tailoring.xml -->
Scan --> Save Result --> XCCDF Results --> /root/tailoring-results.xml --> Save
ls -lh /root/tailoring-results.xml
scap-workbench &
RHEL7 --> Load Content --> File --> Load Customization File --> /root/ACME-tailoring.xml -->
Generate remediation role --> ansible --> /root/ACME-remediation.yml
ls -lh /root/ACME-remediation.yml