晓铧.

Do more of what makes you happy.

第六周作业

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
定时任务日志 cronsystemd 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) 高(事件合并、多线程同步)
可靠性 依赖脚本健壮性,可能丢失事件 事件队列管理,失败重试机制
配置灵活性 脚本可自定义,但需自行处理异常 预定义多种配置选项,支持多目标同步
日志和监控 需自行实现完整日志和告警 内置日志和状态监控功能
维护成本 较高(脚本需定期维护) 较低(开源社区支持)
适用场景 小规模、简单同步需求 大规模、高性能、高可靠同步环境
posted @ 2025-05-29 23:00  晓铧  阅读(46)  评论(0)    收藏  举报