第六周作业
1.总结sudo配置文件格式,总结相关示例。
查看sudo软件包ubuntu/rocky
[root@ubuntu24 ~]# dpkg -l sudo
[root@rocky9 ~]# rpm -qa sudo
基本语法
sudo [选项] 命令 [参数]
| 选项 | 功能描述 |
|---|---|
-h |
显示帮助信息。 |
-V |
显示版本信息。 |
-l |
列出当前用户可执行的 sudo 命令(需配置 /etc/sudoers)。 |
-u 用户名 |
以指定用户(而非 root)的身份执行命令。 |
-i |
模拟登录 shell,加载目标用户的环境变量和配置。 |
-s |
以目标用户身份执行 shell(默认是当前 shell)。 |
-E |
保留当前用户的环境变量(需 sudoers 配置允许)。 |
-k |
清除当前用户的 sudo 认证时间戳,下次使用时需重新输入密码。 |
-K |
彻底清除 sudo 缓存,等同于删除 /var/run/sudo 中的用户缓存文件。 |
配置文件:
查看配置文件
[root@rocky-12]# rpm -ql sudo
...
/etc/sudoers #授权规则配置文件
/etc/sudo.conf #主配置文件
...
/var/db/sudo # Centos系统 审计文件
/var/log/sudo.log # Centos系统 日志文件,默认没有开启
/var/log/secure # Centos系统中辅助的日志文件
示例
允许用户执行所有命令(需密码)
# 用户 alice 可在所有主机上以 root 身份执行所有命令(需输入密码)
alice ALL=(ALL) ALL
# 用户组 wheel(默认管理员组)成员拥有完全权限(需取消注释配置文件中的 `%wheel ALL=(ALL) ALL`)
%wheel ALL=(ALL) ALL
允许用户无密码执行特定命令
# 用户 bob 无需密码重启 Nginx
bob ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
# 组 devops 无需密码执行所有 `apt` 命令
%devops ALL=(root) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get
仅允许执行特定命令(含参数)
# 用户 charlie 仅允许删除 /tmp/*.log 文件
charlie ALL=(root) /bin/rm /tmp/*.log
# 用户 eve 允许查看日志,但禁止修改 /etc/passwd
eve ALL=(root) /usr/bin/journalctl, !/usr/bin/vi /etc/passwd
禁止执行危险命令
# 用户 dave 允许所有操作,但禁止关闭系统
dave ALL=(ALL) ALL, !/sbin/shutdown, !/sbin/reboot
2.搭建时间同步服务器,详细总结配置和搭建过程
安装 chrony 服务
yum install chrony -y
配置 chrony 服务器
vim /etc/chrony.conf
# 1. 注释掉默认的上游 NTP 服务器(改为使用本地时间)
# server 0.rockylinux.pool.ntp.org iburst
# server 1.rockylinux.pool.ntp.org iburst
# server 2.rockylinux.pool.ntp.org iburst
# 2. 将当前服务器设为时间源(虚拟时钟,层级设为 10)
server 127.127.1.0 iburst # 本地虚拟时钟(chrony 专用)
local stratum 10 # 设置层级(1-15,数值越小越权威)
# 3. 允许局域网客户端同步(替换为你的局域网网段)
allow 192.168.1.0/24 # 允许指定网段访问(chrony 使用 allow 而非 restrict)
deny all # 拒绝其他所有访问
# 4. 其他常用配置(可选)
maxupdateskew 100.0 # 允许最大时间偏差(毫秒)
driftfile /var/lib/chrony/drift # 自动调整时间漂移(默认已启用)
启动服务
sudo systemctl start chronyd # 启动 chrony 服务
sudo systemctl enable chronyd # 开机自启
查看时间同步源状态
chronyc sources -v # 查看同步源,* 表示主同步源,+ 表示备用
210 Number of sources = 1
.-- Source mode '^' = server, '=' = peer, '#' = local clock
/ .- Source state '*' = current, '+' = combined, '-' = not combined, '?' = unreachable
| / .- Source priority (0-10, 0 is highest)
|| / .- Source address or name
||| Stratum Polling interval Last seen
===* 127.127.1.0 10 64 0
查看时间同步详情
chronyc tracking # 显示当前时间是否同步成功
Reference ID : 00000000 (127.127.1.0)
Stratum : 10
Ref time (UTC) : Tue May 20 23:45:00 2025
System time : 0.0000043 seconds slow of NTP time
Last offset : +0.000002 seconds
RMS offset : 0.000001 seconds
Frequency : 0.000 ppm slow
Residual freq : 0.000 ppm
Skew : 0.001 ppm
Root delay : 0.00000 seconds
Root dispersion : 0.00000 seconds
Update interval : 64.0 seconds
Leap status : Normal
修改客户端 chrony 配置
vim /etc/chrony.conf
server <10.0.0.12> iburst
重启客户端服务并同步时间
sudo systemctl restart chronyd
chronyc -a sync # 立即强制同步时间
验证客户端同步状态
chronyc sources -v # 检查是否连接到服务器
date +"%Y-%m-%d %H:%M:%S" # 查看当前时间是否与服务器一致
3.总结常见的日志服务管理的常见日志服务
1. rsyslog
-
用途:传统的系统日志服务,基于
syslog协议,支持日志过滤、路由和存储。 -
特点:轻量级,兼容性强,适用于大多数 Linux 发行版。
支持多种输入输出模块(如 TCP/UDP、TLS 加密)。可配置日志规则(如按优先级、程序名、主机名过滤)。
-
配置文件:
/etc/rsyslog.conf和/etc/rsyslog.d/*.conf。
2. systemd-journald
- 用途:
systemd的原生日志服务,专门收集系统和服务的结构化日志。 - 特点:
- 日志存储在二进制文件中(
/var/log/journal/),支持高效查询。 - 无需额外配置,自动捕获
systemd服务日志。 - 支持日志持久化(默认仅内存存储,需配置持久化)。
- 日志存储在二进制文件中(
3. syslog-ng
- 用途:商业级日志管理工具,功能强大,支持复杂日志路由和过滤。
- 特点:
- 支持多种协议(TCP、TLS、HTTP)和日志格式(JSON、CEF)。
- 提供高级过滤、重写和模板功能。
- 可与数据库(MySQL、PostgreSQL)集成。
- 配置文件:
/etc/syslog-ng/syslog-ng.conf。 - 适用场景:企业级环境,需要高度定制化日志收集和分析。
4. ELK Stack(Elasticsearch + Logstash + Kibana)
- 用途:集中式日志管理与分析平台。
- 组件:
- Elasticsearch:存储和索引日志数据。
- Logstash:日志收集、解析和转发。
- Kibana:可视化日志数据(Dashboard、图表)。
- 特点:
- 适合大规模分布式系统。
- 支持实时日志搜索、分析和告警。
- 适用场景:大型企业、云计算环境或需要深度日志分析的场景。
4.总结日志分类, 优先级别。图文并茂解释应用如何将日志发到rsyslog,并写到目标。
日志分类
| 类别 | 说明 | 典型日志文件 |
|---|---|---|
| 系统日志 | 内核、系统服务、硬件相关的日志 | /var/log/messages, /var/log/syslog |
| 认证日志 | 用户登录、认证失败、sudo操作等 | /var/log/auth.log, /var/log/secure |
| 应用日志 | 特定应用程序的日志(如Nginx、MySQL、Apache) | /var/log/nginx/access.log, /var/log/mysql/error.log |
| 安全日志 | 安全相关事件(如SELinux、AppArmor) | /var/log/audit/audit.log |
| 内核日志 | 内核消息(硬件错误、模块加载等) | /var/log/kern.log |
| 定时任务日志 | cron 或 systemd timers 的执行记录 |
/var/log/cron, /var/log/syslog |
优先级别
| 数值 | 级别 | 说明 |
|---|---|---|
| 0 | EMERG | 系统不可用(需立即处理) |
| 1 | ALERT | 需要立即采取行动(如磁盘满) |
| 2 | CRIT | 严重错误(如硬件故障) |
| 3 | ERR | 错误事件(非紧急) |
| 4 | WARNING | 警告信息(潜在问题) |
| 5 | NOTICE | 正常但重要的事件(如服务启动) |
| 6 | INFO | 常规信息(用户登录、服务状态) |
| 7 | DEBUG | 调试信息(详细开发日志) |
rsyslog 基本架构与日志传输流程
┌───────────────┐
│ 应用程序 │ (生成日志)
└───────────────┘
▲
│ (通过不同方式传输)
│
┌───────────────────┴───────────────────┐
│ 传输方式(3种常见方式) │
├───────────────────────────────────────┤
│ 1. 本地套接字(默认):/var/run/syslog │
│ 2. 网络协议(UDP/TCP):端口 514 │
│ 3. 直接写入文件(非标准,需配置) │
└───────────────────────────────────────┘
▼
┌───────────────┐
│ rsyslog │ (接收、处理日志)
│ 配置文件: │
│ /etc/rsyslog.conf │
│ /etc/rsyslog.d/*.conf │
└───────────────┘
▲
│ (按规则过滤、路由)
│
┌───────────────────┴───────────────────┐
│ 目标存储 │
├───────────────────────────────────────┤
│ 1. 本地文件:/var/log/xxx.log │
│ 2. 远程服务器:通过 TCP/UDP 转发 │
│ 3. 数据库:MySQL/PostgreSQL │
│ 4. 消息队列:Kafka/RabbitMQ │
└───────────────────────────────────────┘
5.完成功能,将3个主机(要求主机名为ip)的ssh日志,通过rsyslog服务将ssh日志写入到集中的主机上的rsyslog服务,写入到/var/log/all-ssh.log文件
配置客户端
sudo vim /etc/rsyslog.conf
取消以下行的注释,开启 UDP 或 TCP 模块
#module(load="imudp")
#input(type="imudp" port="514")
编辑 rsyslog.d 目录下的配置文件:
sudo vim /etc/rsyslog.d/50-default.conf
auth,authpriv.* @10.0.0.13 # 使用UDP
auth,authpriv.* @@10.0.0.13 # 使用TCP
sudo systemctl restart rsyslog #重启
配置服务器
sudo vim /etc/rsyslog.conf
取消以下行的注释,开启 UDP
#module(load="imudp")
#input(type="imudp" port="514")
创建日志文件配置
sudo vim /etc/rsyslog.d/sshlog.conf
# 记录所有主机的SSH日志
$template RemoteSSH,"/var/log/all-ssh.log"
*.* ?RemoteSSH
& ~ # 防止日志重复记录
sudo touch /var/log/all-ssh.log
sudo chmod 640 /var/log/all-ssh.log
sudo chown root:adm /var/log/all-ssh.log
sudo systemctl restart rsyslog #重启 rsyslog 服务
测试日志收集
logger -p authpriv.info "Test message from $(hostname)"
tail -f /var/log/all-ssh.log #服务器上查看日志文件
6.总结/var/log/目录下常用日志文件作用。
在 Linux 系统中,/var/log 目录存储了系统和应用程序的日志文件,是运维和故障排查的核心目录。以下是常见日志文件的作用分类及说明:
系统日志
| 文件名 | 作用 | 适用场景 |
|---|---|---|
syslog |
记录系统级别的通用日志(服务启动、内核消息、应用程序错误等)。 | 所有系统(Debian/Ubuntu/CentOS) |
messages |
类似 syslog,但通常由 rsyslog 生成,记录内核和系统服务信息。 |
CentOS/RHEL 系 |
kern.log |
专门记录内核消息(硬件错误、模块加载、设备驱动问题)。 | 硬件调试、内核问题排查 |
boot.log |
记录系统启动过程中各服务的初始化日志。 | 启动失败时分析服务加载问题 |
dmesg |
动态记录内核环形缓冲区的信息(需运行 dmesg 命令查看)。 |
实时查看硬件或驱动相关日志 |
| 日志文件 / 目录 | 作用描述 |
|---|---|
/var/log/messages |
系统核心日志,记录内核和服务的启动、错误信息 |
/var/log/secure |
认证日志,记录登录、sudo 使用和远程连接尝试 |
/var/log/httpd/ |
Apache 服务器访问和错误日志 |
/var/log/nginx/ |
Nginx 服务器访问和错误日志 |
/var/log/mysql/ |
MySQL/MariaDB 数据库服务日志 |
/var/log/cron |
计划任务(crontab)执行日志 |
/var/log/wtmp |
成功登录会话记录(last 命令来源) |
/var/log/btmp |
失败登录尝试记录(lastb 命令来源) |
/var/log/maillog |
邮件服务(postfix/sendmail)日志 |
/var/log/yum.log |
Yum 软件包管理操作日志 |
/var/log/apt/ |
Apt 软件包管理操作日志 |
/var/log/systemd/ |
systemd 服务日志 |
/var/log/Xorg.0.log |
X Window 图形界面启动日志 |
7.总结journalctl命令的选项及示例
journalctl 是 systemd 的日志管理工具,用于查询、过滤和分析系统日志。以下是其常用选项及详细示例:
| 选项 | 功能 | 示例 |
|---|---|---|
-u <unit> |
查看指定服务/单元的日志(如 nginx.service) |
journalctl -u nginx.service |
-f |
实时跟踪日志(类似 tail -f) |
journalctl -f -u nginx.service |
-n <num> |
显示最近的 <num> 条日志 |
journalctl -n 50 |
--since <time> |
显示指定时间之后的日志(格式:YYYY-MM-DD HH:MM:SS) |
journalctl --since "2023-10-01 00:00:00" |
--until <time> |
显示指定时间之前的日志 | journalctl --until "2023-10-01 23:59:59" |
| 选项 | 功能 | 示例 |
|---|---|---|
--since today |
显示今天的日志 | journalctl --since today |
--until now |
显示截至当前的日志 | journalctl --until now |
--since "1 hour ago" |
显示过去1小时的日志 | journalctl --since "1 hour ago" |
--since "2 days ago" --until "1 day ago" |
显示2天前到1天前的日志 | journalctl --since "2 days ago" --until "1 day ago" |
8.完成将多个主机(要求主机名为ip)的logger命令日志集中写入到mysql表中
1.主机安装mysql软件
# Ubuntu/Debian
apt update && sudo apt install rsyslog rsyslog-mysql mysql-client -y
# CentOS/RHEL
yum install rsyslog rsyslog-mysql mariadb -y
mysql-server配置
apt install mysql-server -y #安装mysql服务
vim /etc/mysql/mysql.conf.d/mysqld.cnf
注释然后允许接受外部请求
#bind-address
#mysqlx-bind-address
systemctl restart mysql.servic #重启mysql服务
mysql -e "create database rsyslog;"
mysql -e "use rsyslog; source /root/rsyslog.sql;"
mysql -e "show tables from rsyslog"
+------------------------+
| Tables_in_rsyslog |
+------------------------+
| SystemEvents |
| SystemEventsProperties |
+------------------------+
mysql -e "create user 'rsysloger'@'10.0.0.%' identified by '123456';"
mysql -e "grant all on rsyslog.* to 'rsysloger'@'10.0.0.%';"
mysql -e "create user 'rsysloger'@'localhost' identified by '123456';"
mysql -e "grant all on rsyslog.* to 'rsysloger'@'localhost';"
mysql -e "flush privileges;"
客户端配置
cat /usr/share/rsyslog-mysql/rsyslog-mysql.conf.template
module (load="ommysql")
*.* action(type="ommysql" server="_DBC_DBSERVER_" db="_DBC_DBNAME_"
uid="_DBC_DBUSER_" pwd="_DBC_DBPASS_")
scp /usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql root@10.0.0.13:rsyslog.sql
cp /usr/share/rsyslog-mysql/rsyslog-mysql.conf.template /etc/rsyslog.d/mysql.conf
vim /etc/rsyslog.d/mysql.conf
module (load="ommysql")
*.* action(type="ommysql" server="10.0.0.16" db="rsyslog" uid="rsysloger"
pwd="123456")
logger "this msg from rocky-client 1"
logger "this msg from rocky-client 2"
9.尝试使用logrotate服务切割message日志,每天切割一次,要求大于不超过3M, 保存90天的日志, 旧日志以时间为后缀,要求压缩。
编辑配置文件
vim /etc/logrotate.d/messages
/var/log/messages {
daily # 每天切割一次
size 3M # 当日志文件超过 3MB 时触发切割
rotate 90 # 保留 90 天的旧日志
compress # 压缩旧日志(默认使用 gzip)
missingok # 如果日志文件不存在,不报错
notifempty # 如果日志为空,不切割
create 0640 root adm # 新日志文件的权限和所有者
dateext # 使用日期作为旧日志文件的后缀(如 messages-2023-10-01)
dateformat -%Y%m%d # 日期格式(可调整,如 -%Y-%m-%d)
}
测试配置
logrotate -vf /etc/logrotate.d/messages
ls -lh /var/log/messages* # 查看切割后的日志文件
ls -lh /var/log/messages-*.gz # 查看压缩后的旧日志
10.apache请按照课程完成搭建和练习,本部分不是重点,不出题
11.总结http协议相关面试题,建议面试前背一背。参考链接: https://juejin.cn/post/7117533146454687757
12.使用inotify + rsync和sersync实现文件的同步,并且总结两种方式的优缺点
inotify + rsync
安装软件
[root@rocky9-12 ~]# yum install epel-release
[root@rocky9-12 ~]# yum install inotify-tools
客户端实现同步的专用脚本
准备工作
[root@rocky9-12 ~]# mkdir /data/scrips -p
准备密码文件
[root@rocky9-12 ~]# echo 123456 > /data/scrips/www_rsync.pwd
[root@rocky9-12 ~]# chmod 600 /data/scrips/www_rsync.pwd
# 编辑rsyncd.conf
cat > /etc/rsyncd.conf << EOF
[data]
path = /data/target
comment = Data Sync
read only = false
list = false
uid = root
gid = root
auth users = backup
secrets file = /etc/rsyncd.secrets
EOF
# 创建认证文件
echo "backup:password" > /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets
# 启动rsync服务
rsync --daemon
sersync
安装 sersync
# 下载并解压sersync
wget https://github.com/wsgzao/sersync/archive/master.zip
unzip master.zip
cd sersync-master/
make && make install
# 配置环境变量
ln -s /usr/local/bin/sersync /usr/bin/sersync
配置同步任务
<!-- /etc/sersync/confxml.xml -->
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
<host hostip="localhost" port="8008"></host>
<debug start="false"/>
<fileSystem xfs="false"/>
<filter start="false">
<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
</filter>
<inotify>
<delete start="true"/>
<createFolder start="true"/>
<createFile start="true"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="false"/>
<modify start="false"/>
</inotify>
<sersync>
<localpath watch="/data/source">
<remote ip="192.168.1.100" name="data"/>
<!-- 可添加多个远程目标 -->
<!-- <remote ip="192.168.1.101" name="data"/> -->
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="backup" passwordfile="/etc/rsync.pass"/>
<userDefinedPort start="false" port="874"/>
<timeout start="false" time="100"/>
<ssh start="false"/>
</rsync>
<failLog path="/var/log/sersync_fail_log.sh" timeToExecute="60"/>
<crontab start="false" schedule="600">
<crontabfilter start="false">
<exclude expression="*.php"></exclude>
<exclude expression="info/*"></exclude>
</crontabfilter>
</crontab>
<plugin start="false" name="command"/>
</sersync>
<plugin name="command">
<param prefix="/bin/sh" suffix="" ignoreError="true"/>
<filter start="false">
<include expression="(.*)\.php"/>
<include expression="(.*)\.sh"/>
</filter>
</plugin>
<plugin name="socket">
<localpath watch="/data/source">
<deshost ip="192.168.1.100" port="8009"/>
</localpath>
</plugin>
<plugin name="refreshCDN">
<localpath watch="/data/source">
<cdninfo domainname="cc.test.com" port="80" username="xxx" passwd="xxx"/>
<sendurl base="http://cdnis.test.com/cdn/refresh"/>
<regexurl regex="false" match=""/>
</localpath>
</plugin>
</head>
启动 sersync 服务
# 启动sersync(守护进程模式)
sersync -d -r -o /etc/sersync/confxml.xml
# 添加到开机启动
echo "/usr/bin/sersync -d -r -o /etc/sersync/confxml.xml" >> /etc/rc.local
chmod +x /etc/rc.local
优缺点:
| 对比项 | inotify + rsync | sersync |
|---|---|---|
| 实现复杂度 | 中等(需编写脚本) | 低(配置文件为主) |
| 性能 | 一般(每次变化触发一次 rsync) | 高(事件合并、多线程同步) |
| 可靠性 | 依赖脚本健壮性,可能丢失事件 | 事件队列管理,失败重试机制 |
| 配置灵活性 | 脚本可自定义,但需自行处理异常 | 预定义多种配置选项,支持多目标同步 |
| 日志和监控 | 需自行实现完整日志和告警 | 内置日志和状态监控功能 |
| 维护成本 | 较高(脚本需定期维护) | 较低(开源社区支持) |
| 适用场景 | 小规模、简单同步需求 | 大规模、高性能、高可靠同步环境 |

浙公网安备 33010602011771号