
RHCSA第二次作业听起来可能就是一个普通的认证练习但说实话真正认真做完这套题的人一只脚已经迈进Linux运维的门槛了。RHCSA全称是Red Hat Certified System Administrator红帽认证系统管理员考试形式是纯实操机考没有选择题考的都是在命令行里真刀真枪干活的功夫。第一次作业通常还在熟悉vim、find、软链接这些基础操作到了第二次作业内容就开始往用户权限、安全上下文、服务管理这些硬核方向走了。我自己的体会是第二次作业更像是从“会用Linux”向“能管Linux”过渡的一道坎。很多人觉得RHCSA难不是难在命令记不住而是难在不懂原理、不会排查。这篇博文就围绕我这次做的第二次作业把题目设计思路、实操过程、踩过的坑和排查心得都整理出来给正在备考或者刚入门的同行一个参考。1. 第二次作业到底在练什么——设计思路与考察重点RHCSA的EX200考试大纲里有个很典型的特点就是把日常运维中最容易出错、最需要理解原理的部分拆成一个个独立任务。第二次作业通常不会让你去装系统、配网络那是第一次作业和第三次作业的活而是把火力集中在用户权限、文件系统安全、服务与计划任务这几个模块上。1.1 作业题目的整体构成我先说我这次拿到的这套第二次作业题目大致由五个任务组成创建用户和组并给指定用户配置sudo免密权限。设置特定的文件权限包括ACL访问控制列表。修改SELinux上下文并调整一个布尔值让HTTP服务能访问自定义目录。配置cron定时任务实现定时清理日志。编写一个systemd服务单元让一个脚本随机启动。每个任务之间没有明显的关联这就很接近真实考试的状态你可能上一题在改SELinux下一题就跳到cron思维要能快速切换。考试环境是RHEL 9但命令在8、9上基本通用下面的操作在CentOS Stream、Rocky Linux上也能跑。1.2 为什么这些内容值得反复练我见过很多考生在RHCSA上挂掉原因不是题不会做而是细节丢了分。比如题目要求“在/var/www/html下创建目录并赋予SELinux上下文”有人做完普通权限就跑了SELinux没配结果题目验证时网页打不开整道题零分。第二次作业专门把这些易错点集中在一起说白了就是逼着你建立一种“做一步、验证一步”的习惯。很多培训机构给这套作业起外号叫“权限与服务的组合拳”我觉得很贴切。把用户、权限、SELinux、服务、计划任务这五块吃透RHCSA考试里至少四十分的分量就稳了。2. 用户与组管理从“建用户”到“提权限”用户和组的管理是最基础也是很多人最容易糊弄过去的环节。真实工作里你新建一个用户、把一个运维同事加进sudo组都是再普通不过的操作。但RHCSA考试不会让你只敲一条useradd就完事它要求你对用户属性、密码策略、组关系有完整的理解。2.1 用户创建的完整姿势我这次作业第一题是创建用户harry、natasha、tom其中harry和natasha属于组admintom不属于admin组还要为harry设置密码为“redhat123”。这道题考察的是对useradd命令底层行为的理解。直接执行useradd harry useradd natasha useradd tom groupadd admin usermod -aG admin harry usermod -aG admin natasha注意usermod -aG里的-a参数一定不能漏。如果不加-a系统会把用户从其他附属组里踢掉只保留你指定的组。这在真实环境里是个很隐蔽的坑特别是老管理员习惯用usermod -G给用户加组一不小就把人从百十个组里全踢出去了。后来版本里-G不带-a甚至会有警告但考试和脚本里还是要养成写-aG的习惯。还有密码策略。题目只要求设置密码直接echo redhat123 | passwd --stdin harryRHEL 9 里--stdin选项依然可用这是最简单的非交互式改密码方式。不过考试环境里建议先自己passwd harry交互设置一遍因为有些考场终端对--stdin支持有点玄学交卷前务必确认getent passwd harry能看到用户且/etc/shadow里对应字段不是!!。2.2 sudo提权与sudoers写法第二题是给harry配置sudo权限要求他能在所有主机上以任意用户身份执行任意命令并且不需要密码。这基本就是教科书级的sudo配置visudo -f /etc/sudoers.d/harry在打开的配置里写入harry ALL(ALL) NOPASSWD: ALL这里有个很重要的习惯不要在系统自带的/etc/sudoers文件里直接改。单独在/etc/sudoers.d/下建文件是官方推荐的扩展方式主文件里的#includedir指令会自动加载这个目录下的所有配置。如果你直接编辑/etc/sudoers一旦语法写错可能导致整个sudo系统瘫痪。我见过有人写错sudoers后连sudo ls都跑不了只能通过单用户模式救回来代价太大了。校验配置可以用visudo -c输出parsed OK就说明语法没问题。交作业前务必测试su - harry -c sudo -l能看到(ALL) NOPASSWD: ALL就表示配置生效了。2.3 批量创建与密码策略有些版本的作业里会有批量创建用户的变体比如按列表一次性创建十个用户。我这次没遇到但备考时一定要会for name in user1 user2 user3; do useradd $name echo $name:123456 | chpasswd donechpasswd是批量设置密码的标准工具可以批量读入用户名:密码格式。比echo | passwd --stdin更适合脚本场景。密码策略方面RHCSA级别只需知道/etc/login.defs里PASS_MAX_DAYS、PASS_MIN_LEN这些参数控制默认行为以及chage命令能调整用户密码有效期。考试如果考到“设置tom的密码过期天数为30天”操作是chage -M 30 tom用chage -l tom能查看当前策略。实际运维里给外包人员开账号时经常要配合设置密码到期强制修改这些都是基本功。3. 文件权限与ACL常被忽略的细节文件权限这一块看起来每个Linux新手都会chmod 777但RHCSA考的是你对权限模型更深层的理解。第二次作业里关于权限的题一般不会直接让你chmod而是设置一个“特殊权限”或“ACL权限”。3.1 普通权限的三个维度传统Unix权限分三个维度属主u、属组g、其他人o每个维度又有读4、写2、执行1三个权限位。数字表示法755就是一个经典的“用户rwx、组rx、其他人rx”的组合。但RHCSA考试喜欢考特殊权限位setuidSUID数字4开头比如4755给可执行文件加上后用户执行该文件时临时获得文件属主的权限。典型例子是/usr/bin/passwd。setgidSGID数字2开头比如2755作用于目录时在该目录下新建的文件自动继承目录的属组。sticky bit粘滞位数字1开头比如1777典型例子是/tmp只有文件属主和root才能删除目录里的文件。第二作业里如果有“给/home/admin目录设置SGID使新建文件自动属于admin组”这种题操作就是chown root:admin /home/admin chmod 2770 /home/admin设置完用ls -ld /home/admin检查权限位显示drwxrws---那个s就是SGID生效的标志。我想提醒一点粘滞位符号是tSUID和SGID都是s区分看位置。rwsr-xr-x是SUIDrwxr-sr-x是SGID。很多人只记数字不看符号位置一到考试检查环节就懵。3.2 ACL的使用场景与命令ACLAccess Control List访问控制列表是为了解决传统权限只能设一个属主一个属组的问题。现实中常有这种场景一个文件属主是root属组是data但你想让另一个用户zhang能读又不想把他加进data组。这时候ACL就派上用场了。作业里的典型题目是“给/data/share目录里的conf.txt设置ACL让harry用户有rw权限。”先确认文件系统支持ACL。RHEL 9默认支持不需要额外挂载参数。然后执行setfacl -m u:harry:rw /data/share/conf.txt-m是修改u:开头表示设置用户权限g:开头表示设置组权限末尾跟上权限字符串。查看设置结果getfacl /data/share/conf.txt输出里会多出user:harry:rw-这一行。注意设置ACL后ls -l输出的权限位末尾会多个比如-rw-rw----这个加号是提醒你该文件有扩展ACL。ACL有个继承属性需要特别留意。默认ACLdefault ACL只能用在目录上通过setfacl -m d:u:harry:rw /data/share给/data/share设置默认ACL后该目录下新建的文件会自动继承给harry分配rw权限。这在真实运维里很实用比如共享目录给项目组用新拖进去的文件自动带上权限不用再单独setfacl。但也是考试常埋坑的地方——题目只让你给现有文件设ACL你如果画蛇添足设了默认ACL可能导致新建文件权限过于宽松验题时被扣掉一部分分。所以做题前题目怎么说就怎么做不要自由发挥。3.3 umask与默认权限umask也是常考概念。新建文件的默认权限是666 - umask目录是777 - umask默认umask一般是022所以新建文件默认是644新目录是755。作业里如果有“修改tom用户默认的umask为027使该用户新建文件和目录时不给同组和其他人写权限”做法是修改tom的shell配置文件echo umask 027 /home/tom/.bashrc然后su - tom -c umask验证。测试输出是0027就对了。这里要注意umask 027意味着新建文件的权限是666-027640属主rw、属组r、其他人无目录是750。但很多同学对减法有误解以为666-027会得到647之类的错数其实权限减法按位算不是十进制减法。搞懂这一点遇到任何umask题都能算对。4. SELinuxRHCSA真正的分水岭如果要在RHCSA题目里找一个让最多人丢分的点SELinux绝对排在前面。因为SELinux策略机制比较抽象记不住标签名和布尔值而且报错日志晦涩排查起来容易一头雾水。第二次作业关于SELinux的题目我做的时候也是一边查一边试。但搞懂原理之后你会发现它的逻辑其实非常规整。4.1 SELinux的模式与转换SELinux有三个模式enforcing强制违反策略直接拒绝。permissive宽容违反策略只记录日志不干扰操作。disabled关闭完全禁用。考试环境默认是enforcing所以你怎么折腾都不会被直接disable。查看当前状态getenforce临时切换模式用setenforce 0切到permissive或setenforce 1切回enforcing重启失效。如果要永久改编辑/etc/selinux/configSELINUXenforcing我强烈建议备考期间无论如何都保持enforcing做题因为你平时如果习惯了permissive一到考场上系统强制拦截你才发现自己压根不会处理SELinux拒绝日志。我周围太多人就是这么挂的。SELinux还有一个重要概念叫“上下文”context。可以把它理解成文件在SELinux世界里的“身份证”每个文件都得有自己对应的标签。比如HTTP服务httpd想读取/var/www/html下的文件那么这些文件必须有httpd_sys_content_t标签而普通用户主目录里的文件通常标签是user_home_t。查看标签ls -Z /var/www/html输出类似-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html4.2 布尔值、上下文与故障排查第二次作业SELinux部分的常见考题有两种。一种是“把/web目录下的文件标签改为httpd_sys_content_t使httpd能够访问”另一种是“开启名为httpd_can_network_connect的布尔值”。改标签的命令要记清楚semanage fcontext -a -t httpd_sys_content_t /web(/.*)? restorecon -Rv /web/web(/.*)?表示该目录本身及其下所有文件。这条正则的全角括号在考试里比较常见。如果只写/web可能只改目录本身目录内的文件还是原始的default_t或unconfined_u标签其中一个不对httpd依然无权访问。布尔值的操作更简单getsebool httpd_can_network_connect setsebool -P httpd_can_network_connect on-P参数表示永久生效即写入策略并重启后仍然保留不加-P只对当前运行周期有效。考试或生产环境里一般都是要永久所以别漏了-P。如果题目就是要你确认httpd能访问自定义目录验证的方法比较直接curl http://localhost/你的文件如果返回内容正常SELinux上下文就对了。这一步是交作业前必须做的“亲眼验证”比任何命令回显都靠谱。我这次做的时候刚改完全文curl直接403检查之后发现问题出在我把目录建在/webdata下但SELinux标签打得不对后来按上面两条命令重做后curl就正常了。插一句有些刚上手的朋友习惯图省事直接chcon -t httpd_sys_content_t /webdatachcon改的是“临时标签”重启后或者文件被restorecon恢复后可能失效不是持久方案。RHCSA考试虽然不要求semanage fcontext甚至用chcon也能得分但真实生产环境里restorecon一跑全没了那时候哭都来不及。所以养成用semanage fcontext的习惯绝对不吃亏。4.3 我踩过的SELinux坑这次作业我实际踩的一个大坑是题目要求“httpd能够访问/custom目录并确保文件标签正确”。我改完上下文后curl还是403最后ausearch -m avc -ts recent查看SELinux拒绝日志发现错误类型是name_connect因为httpd需要连接外部的某个服务端口。解决办法是开启对应的布尔值开关比如httpd_can_network_connect开启后重启httpd服务才行。这个经历让我明白了SELinux排查的真谛不要靠猜要看日志。ausearch -m avc -ts recent grep denied /var/log/audit/audit.log | tail -20ausearch是最常用的SELinux排错工具能看到被拒绝的操作类型、源进程、目标文件。没有/var/log/audit的情况下可以用journalctl -xe代替也能搜到to AVC日志。看日志解决SELinux问题比盲目setenforce 0高一个段位。考试时间充足完全能靠日志找到原因。5. 计划任务和系统服务把“静态操作”变成“长期服务”RHCSA考试里很少让你做一个“一次性”操作更多是“配置一个长期运行机制”。计划任务和服务管理就是在测这个能力。第二次作业相应增加了cron和systemd的题量。5.1 cron配置与排错这次作业里有一道cron题为harry配置一个任务每天凌晨2点执行/usr/local/bin/clean_log.sh。配置cron其实非常简单crontab -u harry -e写入0 2 * * * /usr/local/bin/clean_log.sh注意cron环境变量和你的登录shell不一样脚本里用到路径最好写绝对路径脚本本身也需要有执行权限。如果脚本依赖环境变量尽量在脚本开头export或直接使用绝对命令路径。排错是很多人栽跟头的环节。任务不执行先确认crond服务状态systemctl status crond如果crond正常再看日志grep CRON /var/log/cron这里有个小细节我提醒一下/var/log/cron不是所有系统默认都有日志轮转策略RHEL 9基本是默认开启的。日志里能看到任务被启动、执行的记录和错误信息。排查时重点看有没有No MTA installed这类提示通常不影响执行结果。但最隐蔽的坑是脚本开头没有声明解释器比如直接写命令没加#!/bin/bashcron执行时默认用/bin/sh而/bin/sh在某些系统上对某些bash特有的语法不兼容导致脚本执行失败。所以写脚本第一行务必要是#!/bin/bash。注意cron的环境变量问题。有一次同学找我排错任务明明是执行了一个备份脚本但日志显示任务确实跑了可备份文件就是没生成。后来发现脚本内部有~这个符号在cron最小化环境里~不会展开成他设定的那个路径改成$HOME就正常了。这类问题很难一眼看出来但遇到任务跑不成功的先怀疑脚本对环境变量的依赖。5.2 systemd服务管理第二个服务题是“把/usr/local/bin/hello.sh做成一个systemd服务设置开机自启”。这题考察的是对systemd单元文件的掌握。在/etc/systemd/system/下创建hello.service[Unit] DescriptionHello service [Service] Typesimple ExecStart/usr/local/bin/hello.sh Restarton-failure [Install] WantedBymulti-user.target然后systemctl daemon-reload systemctl enable --now hello这里重点说几个容易出错的地方。Typesimple是最基础的服务类型表示ExecStart启动的进程就是服务的主进程。如果那个脚本写的是个循环就用Typesimple如果脚本启动后会fork一个进程出来自身退出那应该用Typeforking。考试题目自己写的脚本一般是简单循环所以Typesimple就够了。ExecStart必须是绝对路径如果可执行文件没有执行权限服务启动会直接失败。启动失败排查用systemctl status hello journalctl -u hello -n 50很多同学在daemon-reload之前就启动服务会得到一个“Unit not found”的错误这是最常见的低级失误。改完单元文件第一件事永远是systemctl daemon-reload确认服务状态变成“loaded”再enable和start。还有个小技巧启动服务时用systemctl enable --now hello把enable和start合并成一步命令更简洁。系统重启验证服务是否自启可以使用systemctl is-enabled hello输出enabled就代表配置成功。6. 作业踩坑实录与速查表每次做完一套作业最值钱的就是那些“明明知道答案却还是做错”的记录。我把这次第二次作业里自己和身边人踩过的坑整理成一张速查表对应考试里经常出现的验证特征方便你交作业前自己过一遍。6.1 常见错误与排查思路这是我总结的高频错误清单每一行都是从实际做题里捞出来的题目类型常见错误排查/验证方法用户创建usermod忘记加-a导致被移除附属组id harry检查组列表是否完整sudo配置直接改/etc/sudoers导致语法错误visudo -c并用su - harry -c sudo -l验证文件权限混淆SUID和SGID符号位置ls -l查看权限位s所在位置ACL只设置了文件ACL未设置默认ACL或反了getfacl /目标查看是否有默认ACL行SELinux使用chcon而不是semanage fcontext重启或restorecon后curl验证SELinux布尔值忘记加-P参数重启后失效getsebool确认仍是oncron脚本使用相对路径或未加执行权限手动执行脚本然后看/var/log/cron日志systemd修改单元文件后忘记daemon-reloadsystemctl status显示单元加载信息6.2 作业检查清单我每次做完作业都会按这套检查清单走一遍能挡住八成的低级失误所有逻辑是否都通过状态命令验证过id、getfacl、ls -Z、systemctl status、crontab -l。所有服务能否从禁用状态启动成功优先测试systemctl is-enabled。SELinux是否处于enforcing状态getenforce输出强制模式。是否有多余权限操作比如明明没让你chmod 777你偏给所有目录都加了777会被严格判分。cron任务是否已设置执行权限ls -l /path/script检查。sudo配置有没有语法问题visudo -c结果是否parsed OK。这套checklist其实也适用于日常工作环境特别是给新同学评审作业时照着一项项打勾就行。写在最后的一点点心得做完这套第二次作业我最大的感受是RHCSA考的不是“你会背多少命令”而是“命令背后的体系你是否理顺了”。用户与组是一套体系权限与ACL是一套体系SELinux是一套systemd与cron是一套。理清之后再去记命令基本不用死背每看到一个配置脑子里自己就会浮现出为什么这么写。平时练习的时候还有一个习惯我觉得很值得推荐多开一个终端窗口一边改配置一边用systemctl status、getfacl、getenforce这类只读命令观察变化。这样做的好处是你会形成一套条件反射——改完任何东西都会本能地想去验证一下。有了这个反射考试时基本不会出现“做完了但不知道自己错在哪”的情况。最后补充一句作业里的命令都是常见的真正难的价值在于你亲手踩一遍坑、亲手看一遍日志、亲手把错误修复。这个过程没人能替代。当然如果你第一次做这套题就一路顺畅那恭喜你RHCSA对你来说可能已经近在眼前了。