KVM 虚拟化技术实战指南 - 第四部分:安全设置与系统更新

文档信息

  • 系列: KVM 虚拟化技术实战指南
  • 部分: 第四部分 - 安全设置与系统更新
  • 版本: V1.0
  • 创建日期: 2026 年 3 月 9 日
  • 对应视频: 9-09 (05:17)
  • 预计阅读时间: 1-2 小时

目录

  1. 宿主机安全加固
  2. 虚拟机安全配置
  3. 网络安全加固
  4. 存储安全
  5. 访问控制与认证
  6. 安全监控与审计
  7. 系统更新策略
  8. 备份与恢复
  9. 安全最佳实践

宿主机安全加固

系统最小化安装

原则: 只安装必要的软件包,减少攻击面

# CentOS/RHEL 最小化安装
# 在安装时选择 "Minimal Install"

# 查看已安装的软件包组
yum grouplist

# 移除不必要的软件包组
yum groupremove -y "GNOME Desktop"
yum groupremove -y "Graphical Administration Tools"

# 只保留核心工具
yum install -y \
  vim \
  wget \
  curl \
  git \
  bash-completion \
  bridge-utils \
  virt-top

检查清单:

□ 无图形界面 (除非必需)
□ 最小化软件包
□ 禁用不必要的服务
□ 关闭不用的端口

禁用不必要的服务

查看运行中的服务:

# 列出所有启用的服务
systemctl list-units --type=service --state=running

# 查看启用的服务
systemctl list-unit-files --state=enabled

禁用危险服务:

# 禁用不必要的服务
systemctl disable --now \
  cups \              # 打印服务
  avahi-daemon \      # 服务发现
  bluetooth \         # 蓝牙
  postfix \           # 邮件服务 (如不需要)
  NetworkManager-wait-online.service

# 保护关键服务
systemctl mask \
  kexec \             # 防止 kexec 重启
  ctrl-alt-del.target # 防止 Ctrl+Alt+Del 重启

配置防火墙

firewalld 配置:

# 启用防火墙
systemctl enable --now firewalld

# 查看默认区域
firewall-cmd --get-default-zone

# 设置默认区域为 drop (丢弃所有未明确允许的流量)
firewall-cmd --set-default-zone=drop

# 允许 SSH
firewall-cmd --permanent --add-service=ssh

# 允许 libvirt 相关端口
firewall-cmd --permanent --add-service=libvirt
firewall-cmd --permanent --add-service=libvirt-tls
firewall-cmd --permanent --add-port=16509/tcp  # libvirt TLS
firewall-cmd --permanent --add-port=16514/tcp  # libvirt TCP

# 允许 VNC (如果需要)
firewall-cmd --permanent --add-port=5900-5910/tcp

# 重新加载
firewall-cmd --reload

# 查看规则
firewall-cmd --list-all

iptables 高级配置:

# 创建自定义链
iptables -N KVM_SECURITY

# 允许已建立的连接
iptables -A KVM_SECURITY -m state --state RELATED,ESTABLISHED -j ACCEPT

# 允许 VM 流量
iptables -A KVM_SECURITY -m conntrack --ctstate NEW -m multiport \
  --dports 22,80,443 -j ACCEPT

# 限制连接速率
iptables -A INPUT -p tcp --dport 22 -m limit \
  --limit 3/min --limit-burst 3 -j ACCEPT

# 防止暴力破解
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m recent --update \
  --seconds 60 --hitcount 4 --name SSH -j DROP

# 保存规则
service iptables save

SELinux 配置

查看 SELinux 状态:

# 查看状态
getenforce

# 查看详细模式
sestatus

# 输出:
# SELinux status:                 enabled
# SELinuxfs mount:                /sys/fs/selinux
# SELinux root directory:         /etc/selinux
# Loaded policy name:             targeted
# Current mode:                   enforcing
# Mode from config file:          enforcing

SELinux 策略配置:

# 允许 libvirt 使用各种资源
setsebool -P virt_use_samba 1      # 访问 Samba 共享
setsebool -P virt_use_nfs 1         # 访问 NFS 存储
setsebool -P virt_use_execmem 1     # JIT 编译需要
setsebool -P virt_use_usb 1         # USB 设备直通

# 设置 VM 镜像上下文
chcon -t virt_image_t /var/lib/libvirt/images/*.qcow2

# 恢复默认上下文
restorecon -Rv /var/lib/libvirt/

SELinux 故障排查:

# 查看 SELinux 拒绝日志
grep "denied" /var/log/audit/audit.log | tail -20

# 使用 audit2why 分析
audit2why < /var/log/audit/audit.log

# 生成策略模块
audit2allow -M mypol < /var/log/audit/audit.log

# 安装策略模块
semodule -i mypol.pp

内核参数优化

安全相关的内核参数:

# 编辑 /etc/sysctl.conf
cat >> /etc/sysctl.conf <<EOF

# 网络栈安全
net.ipv4.tcp_syncookies = 1          # 防止 SYN 洪水攻击
net.ipv4.conf.all.rp_filter = 1      # 反向路径过滤
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1

# IP 转发 (KVM 需要)
net.ipv4.ip_forward = 1

# 内存保护
kernel.randomize_va_space = 2        # ASLR
kernel.exec-shield = 1
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2

# 核心转储限制
fs.suid_dumpable = 0

# 文件系统
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288
EOF

# 应用配置
sysctl -p

# 验证
sysctl -a | grep -E 'rp_filter|accept_redirects|send_redirects'

虚拟机安全配置

AppArmor 配置 (Ubuntu)

安装和配置:

# 安装 AppArmor
apt install -y apparmor apparmor-utils

# 查看状态
systemctl status apparmor

# 查看配置文件
aa-status

# 为 VM 创建配置文件
cat > /etc/apparmor.d/usr.bin.qemu-system-x86_64 <<EOF
#include <tunables/global>

/usr/bin/qemu-system-x86_64 flags=(complain) {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  
  # KVM 设备
  /dev/kvm rw,
  /dev/net/tun rw,
  
  # VM 磁盘
  /var/lib/libvirt/images/** rw,
  
  # 日志
  /var/log/libvirt/qemu/** rw,
  
  # 禁止访问
  /etc/shadow ix,
  /etc/passwd r,
}
EOF

# 加载配置文件
apparmor_parser -r /etc/apparmor.d/usr.bin.qemu-system-x86_64

# 查看状态
aa-status

seccomp 配置

启用 seccomp:

<!-- 编辑 VM 配置 -->
virsh edit vm-name

<!-- 添加 seccomp 配置: -->
<domain type='kvm'>
  ...
  <seclabel type='dynamic' model='dac' relabel='yes'/>
  <seclabel type='dynamic' model='selinux' relabel='yes'/>
  
  <sysinfo type='smbios'>
    <bios>
      <entry name='vendor'>QEMU</entry>
    </bios>
  </sysinfo>
  
  <!-- seccomp 配置 -->
  <seccomp>
    <syscall name='open' action='allow'/>
    <syscall name='read' action='allow'/>
    <syscall name='write' action='allow'/>
    <syscall name='close' action='allow'/>
    <syscall name='mmap' action='allow'/>
    <syscall name='mprotect' action='allow'/>
    <syscall name='brk' action='allow'/>
    <syscall name='exit_group' action='allow'/>
    
    <!-- 禁止危险调用 -->
    <syscall name='ptrace' action='errno' errno='EPERM'/>
    <syscall name='mount' action='errno' errno='EPERM'/>
    <syscall name='umount2' action='errno' errno='EPERM'/>
  </seccomp>
</domain>

VM 资源配置限制

CPU 和内存限制:

<!-- 编辑 VM 配置 -->
virsh edit vm-name

<domain type='kvm'>
  <!-- CPU 限制 -->
  <cputune>
    <vcpupin vcpu='0' cpuset='0'/>
    <vcpupin vcpu='1' cpuset='1'/>
    <emulatorpin cpuset='2-3'/>
    <shares>1024</shares>
    <period>100000</period>
    <quota>50000</quota>
  </cputune>
  
  <!-- 内存限制 -->
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <memoryBacking>
    <locked/>
    <nosharepages/>
  </memoryBacking>
  
  <!-- I/O 限制 -->
  <devices>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='none' io='native'/>
      <source file='/var/lib/libvirt/images/vm.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <iotune>
        <read_bytes_sec>104857600</read_bytes_sec>
        <write_bytes_sec>52428800</write_bytes_sec>
        <read_iops_sec>1000</read_iops_sec>
        <write_iops_sec>500</write_iops_sec>
      </iotune>
    </disk>
  </devices>
</domain>

参数说明:

  • shares: CPU 时间片权重 (默认 1024)
  • period: 周期 (微秒)
  • quota: 周期内可用 CPU 时间 (微秒)
  • read_bytes_sec: 每秒读取字节限制
  • write_bytes_sec: 每秒写入字节限制
  • iops_sec: 每秒 I/O 操作限制

网络安全加固

端口隔离

使用 private VLAN:

<!-- 创建隔离网络 -->
cat > isolated-network.xml <<EOF
<network>
  <name>isolated-secure</name>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr-secure' stp='on' delay='0'/>
  <ip address='192.168.100.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.100.2' end='192.168.100.254'/>
    </dhcp>
  </ip>
  
  <!-- 端口隔离 -->
  <port isolated='yes'/>
</network>
EOF

virsh net-define isolated-network.xml
virsh net-start isolated-secure

防火墙规则优化

VM 级别防火墙:

# 在 VM 中配置

# CentOS/RHEL (firewalld)
firewall-cmd --permanent --zone=public \
  --add-service=ssh
firewall-cmd --permanent --zone=public \
  --add-service=http
firewall-cmd --permanent --zone=public \
  --add-service=https
firewall-cmd --reload

# 查看规则
firewall-cmd --list-all

# Ubuntu (ufw)
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow http
ufw allow https
ufw enable
ufw status verbose

限制 VM 访问:

# 在宿主机配置 iptables 规则
# 限制 VM 只能访问特定端口

iptables -I FORWARD -m physdev \
  --physdev-is-bridged \
  --physdev-in vnet0 \
  -p tcp --dport 80 -j ACCEPT

iptables -I FORWARD -m physdev \
  --physdev-is-bridged \
  --physdev-in vnet0 \
  -p tcp --dport 443 -j ACCEPT

# 禁止访问其他端口
iptables -I FORWARD -m physdev \
  --physdev-is-bridged \
  --physdev-in vnet0 \
  -j DROP

SSH 安全加固

VM 中 SSH 配置:

# 编辑 /etc/ssh/sshd_config
cat > /etc/ssh/sshd_config <<EOF
# 基本配置
Port 2222                    # 自定义端口
Protocol 2
ListenAddress 0.0.0.0

# 认证
PermitRootLogin no           # 禁止 root 登录
PasswordAuthentication no    # 禁用密码认证
PubkeyAuthentication yes     # 启用公钥认证
AuthorizedKeysFile .ssh/authorized_keys

# 安全
MaxAuthTries 3               # 最大尝试次数
LoginGraceTime 60            # 登录超时 (秒)
ClientAliveInterval 300      # 保持连接
ClientAliveCountMax 2        # 最大无响应次数

# 限制
MaxSessions 10               # 最大会话数
MaxStartups 10:30:60         # 最大启动数
PermitEmptyPasswords no      # 禁止空密码
ChallengeResponseAuthentication no

# 日志
SyslogFacility AUTH
LogLevel INFO

# X11
X11Forwarding no
X11UseLocalhost yes

# 其他
UseDNS no
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
EOF

# 重启 SSH
systemctl restart sshd

# 测试配置
sshd -t
# 无输出表示配置正确

SSH 密钥管理:

# 生成强密钥
ssh-keygen -t ed25519 -a 100

# 或使用 RSA 4096
ssh-keygen -t rsa -b 4096 -o -a 100

# 复制公钥到 VM
ssh-copy-id -p 2222 user@vm-ip

# 设置权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub

存储安全

磁盘加密

使用 LUKS 加密:

# 创建加密卷
cryptsetup luksFormat /dev/sdb1

# 打开加密卷
cryptsetup open /dev/sdb1 vm-storage

# 创建文件系统
mkfs.ext4 /dev/mapper/vm-storage

# 挂载
mount /dev/mapper/vm-storage /mnt/vm-storage

# 添加到 /etc/crypttab
echo "vm-storage /dev/sdb1 none luks" >> /etc/crypttab

# 添加到 /etc/fstab
echo "/dev/mapper/vm-storage /mnt/vm-storage ext4 defaults 0 2" >> /etc/fstab

QEMU 内置加密:

# 创建加密的 QCOW2 镜像
qemu-img create -f qcow2 \
  -o encryption=on \
  -o cipher-alg=aes-256 \
  /var/lib/libvirt/images/encrypted-vm.qcow2 \
  50G

# 创建 VM 时使用
virt-install \
  --name encrypted-vm \
  --disk /var/lib/libvirt/images/encrypted-vm.qcow2,format=qcow2 \
  ...

存储权限控制

设置正确的权限:

# VM 镜像目录
chown -R libvirt-qemu:kvm /var/lib/libvirt/images
chmod -R 750 /var/lib/libvirt/images

# 配置文件
chown root:libvirt /etc/libvirt/qemu/*.xml
chmod 640 /etc/libvirt/qemu/*.xml

# 日志文件
chown libvirt-qemu:libvirt /var/log/libvirt/qemu/*.log
chmod 640 /var/log/libvirt/qemu/*.log

SELinux 上下文:

# 设置正确的上下文
chcon -t virt_image_t /var/lib/libvirt/images/*.qcow2
chcon -t virt_var_log_t /var/log/libvirt/qemu/*.log

# 永久生效
semanage fcontext -a -t virt_image_t "/var/lib/libvirt/images(/.*)?"
restorecon -Rv /var/lib/libvirt/images

访问控制与认证

libvirt 认证配置

启用 TLS 认证:

# 生成 CA 证书
mkdir -p /etc/pki/CA/{certs,private,newcerts}
echo 01 > /etc/pki/CA/serial
touch /etc/pki/CA/index.txt

# 创建 CA 私钥
openssl genrsa -aes256 -out /etc/pki/CA/private/ca.key.pem 4096

# 创建 CA 证书
openssl req -config /etc/pki/CA/openssl.cnf \
  -key /etc/pki/CA/private/ca.key.pem \
  -new -x509 -days 3650 -sha256 \
  -extensions v3_ca \
  -out /etc/pki/CA/certs/ca.cert.pem

# 生成服务器证书
openssl genrsa -out /etc/pki/libvirt/server.key.pem 2048

openssl req -config /etc/pki/CA/openssl.cnf \
  -key /etc/pki/libvirt/server.key.pem \
  -new -sha256 -out /etc/pki/libvirt/server.csr.pem

openssl ca -config /etc/pki/CA/openssl.cnf \
  -extensions server_cert -days 375 -notext -md sha256 \
  -in /etc/pki/libvirt/server.csr.pem \
  -out /etc/pki/libvirt/server.cert.pem

# 配置 libvirt
cat >> /etc/libvirt/libvirtd.conf <<EOF
listen_tls = 1
tls_port = "16514"
ca_file = "/etc/pki/CA/certs/ca.cert.pem"
cert_file = "/etc/pki/libvirt/server.cert.pem"
key_file = "/etc/pki/libvirt/server.key.pem"
EOF

# 重启 libvirtd
systemctl restart libvirtd

RBAC 权限管理

使用 polkit 配置权限:

# 创建 polkit 规则
cat > /etc/polkit-1/rules.d/50-org.libvirt.unix.manage.rules <<EOF
polkit.addRule(function(action, subject) {
  // 允许 libvirt 组的用户管理 VM
  if (action.id == "org.libvirt.unix.manage" &&
      subject.isInGroup("libvirt")) {
    return polkit.Result.YES;
  }
  
  // 允许 wheel 组的用户只读访问
  if (action.id == "org.libvirt.unix.manage" &&
      subject.isInGroup("wheel")) {
    if (action.lookup("read_only") == "yes") {
      return polkit.Result.YES;
    }
  }
});
EOF

# 创建用户组
groupadd libvirt
groupadd libvirt-guests

# 添加用户到组
usermod -aG libvirt admin
usermod -aG libvirt-guests guest

自定义 libvirt 权限:

<!-- /etc/libvirt/qemu.conf -->

# 运行 VM 的用户和组
#user = "libvirt-qemu"
#group = "kvm"

# 动态安全标签
#security_driver = ["selinux", "dac"]

# 文件权限
#user = "root"
#group = "root"

# 限制
#max_files = 65536
#max_core = "unlimited"

# 网络限制
#mac_filter = 1
#ip_filter = 1

安全监控与审计

审计日志配置

启用 libvirt 审计:

# 安装 auditd
yum install -y audit audit-libs

# 启用服务
systemctl enable --now auditd

# 配置 libvirt 审计规则
cat >> /etc/audit/rules.d/libvirt.rules <<EOF
-w /etc/libvirt/ -p wa -k libvirt-config
-w /var/log/libvirt/ -p wa -k libvirt-log
-a exit,always -F arch=b64 -S open -F dir=/dev/kvm -k kvm-access
-a exit,always -F arch=b64 -S ioctl -F dir=/dev/kvm -k kvm-access
EOF

# 重载规则
augenrules --load

# 查看审计日志
ausearch -k libvirt-config
ausearch -k libvirt-log
ausearch -k kvm-access

日志集中管理

配置 rsyslog:

# 编辑 /etc/rsyslog.conf
cat >> /etc/rsyslog.conf <<EOF

# libvirt 日志
:programname, isequal, "libvirtd" /var/log/libvirt/libvirtd.log
:programname, isequal, "qemu-system-x86_64" /var/log/libvirt/qemu/%HOSTNAME%.log

# 安全日志
:msg, contains, "authentication" /var/log/secure
:msg, contains, "Failed password" /var/log/secure
EOF

# 重启 rsyslog
systemctl restart rsyslog

# 日志轮转
cat > /etc/logrotate.d/libvirt <<EOF
/var/log/libvirt/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root libvirt
    postrotate
        systemctl kill -s HUP rsyslog.service
    endscript
}
EOF

入侵检测

安装 OSSEC:

# 安装 OSSEC
yum install -y ossec-hids

# 配置监控
cat >> /var/ossec/etc/ossec.conf <<EOF
<syscheck>
  <frequency>43200</frequency>
  <directories>/etc/libvirt</directories>
  <directories>/var/lib/libvirt</directories>
  <directories>/etc/passwd</directories>
  <directories>/etc/shadow</directories>
</syscheck>

<rootcheck>
  <disabled>no</disabled>
  <check_unixaudit>yes</check_unixaudit>
  <check_trojans>yes</check_trojans>
</rootcheck>
EOF

# 启动服务
systemctl enable --now ossec

系统更新策略

宿主机更新

CentOS/RHEL 更新:

# 查看可更新列表
yum check-update

# 仅安全更新
yum update --security -y

# 排除内核更新
yum update --exclude=kernel* -y

# 完整更新
yum update -y

# 清理旧内核
package-cleanup --oldkernels --count=2

# 重启 (如果内核更新)
reboot

Ubuntu 更新:

# 更新软件包列表
apt update

# 查看可更新
apt list --upgradable

# 仅安全更新
apt upgrade --only-upgrade -y

# 完整更新
apt full-upgrade -y

# 清理旧内核
apt autoremove --purge -y

# 重启
reboot

自动化更新

配置 unattended-upgrades (Ubuntu):

# 安装
apt install -y unattended-upgrades

# 配置
cat > /etc/apt/apt.conf.d/50unattended-upgrades <<EOF
Unattended-Upgrade::Allowed-Origins {
    "\${distro_id}:\${distro_codename}-security";
};

Unattended-Upgrade::Package-Blacklist {
    "linux-image-*";
    "linux-headers-*";
};

Unattended-Upgrade::Mail "admin@example.com";
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
EOF

# 启用
dpkg-reconfigure -plow unattended-upgrades

配置 yum-cron (CentOS):

# 安装
yum install -y yum-cron

# 配置
cat > /etc/yum/yum-cron.conf <<EOF
[commands]
update_cmd = security
update_messages = yes
download_updates = yes
apply_updates = yes
random_sleep = 0

[security]
security_type = security
EOF

# 启用
systemctl enable --now yum-cron

VM 更新管理

批量更新 VM:

#!/bin/bash
# update-vms.sh

VMS=$(virsh list --name)

for vm in $VMS; do
  echo "Updating $vm..."
  
  # 检查 VM 是否运行
  if virsh domstate $vm | grep -q "running"; then
    # 通过 SSH 更新
    ssh admin@$(virsh domifaddr $vm | awk '{print $1}' | cut -d'/' -f1) \
      "sudo yum update -y"
    
    echo "$vm updated successfully"
  else
    echo "$vm is not running, skipping"
  fi
done

echo "All VMs updated"

备份与恢复

VM 备份策略

热备份 (运行时):

# 创建快照
virsh snapshot-create-as vm-name backup-$(date +%Y%m%d-%H%M%S) \
  --description "Daily backup" \
  --disk-only \
  --quiesce

# 备份快照
virsh snapshot-dumpxml vm-name backup-20260309-120000 > backup.xml

# 复制磁盘
cp /var/lib/libvirt/images/vm-name-snap.qcow2 /backup/vm-name-backup.qcow2

# 验证备份
qemu-img check /backup/vm-name-backup.qcow2

冷备份 (停机):

# 关闭 VM
virsh shutdown vm-name

# 等待完全关闭
virsh list --all | grep vm-name

# 备份配置
virsh dumpxml vm-name > /backup/vm-name.xml

# 备份磁盘
tar -czf /backup/vm-name-disk.tar.gz \
  /var/lib/libvirt/images/vm-name.qcow2

# 启动 VM
virsh start vm-name

备份自动化脚本

#!/bin/bash
# backup-vms.sh

BACKUP_DIR="/backup/vms"
DATE=$(date +%Y%m%d-%H%M%S)
RETENTION_DAYS=7

mkdir -p $BACKUP_DIR

# 获取所有 VM 列表
VMS=$(virsh list --name)

for vm in $VMS; do
  echo "Backing up $vm..."
  
  # 创建备份目录
  mkdir -p $BACKUP_DIR/$vm
  
  # 备份配置
  virsh dumpxml $vm > $BACKUP_DIR/$vm/$vm.xml
  
  # 备份磁盘 (使用快照)
  virsh snapshot-create-as $vm backup-$DATE --disk-only
  
  # 获取快照文件
  SNAP_FILE=$(virsh domblklist $vm | grep -v "Target" | grep "vda" | awk '{print $2}')
  
  # 复制快照
  cp $SNAP_FILE $BACKUP_DIR/$vm/disk-$DATE.qcow2
  
  # 删除快照
  virsh snapshot-delete $vm backup-$DATE
  
  # 压缩
  tar -czf $BACKUP_DIR/$vm-$DATE.tar.gz $BACKUP_DIR/$vm
  rm -rf $BACKUP_DIR/$vm
  
  echo "$vm backed up successfully"
done

# 清理旧备份
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -delete

echo "Backup completed"

VM 恢复

从备份恢复:

#!/bin/bash
# restore-vm.sh

BACKUP_FILE=$1
VM_NAME=$2

echo "Restoring $VM_NAME from $BACKUP_FILE..."

# 解压备份
tar -xzf $BACKUP_FILE

# 恢复配置
virsh define $VM_NAME.xml

# 恢复磁盘
cp disk-*.qcow2 /var/lib/libvirt/images/$VM_NAME.qcow2

# 设置权限
chown libvirt-qemu:kvm /var/lib/libvirt/images/$VM_NAME.qcow2
chmod 640 /var/lib/libvirt/images/$VM_NAME.qcow2

# 启动 VM
virsh start $VM_NAME

echo "$VM_NAME restored successfully"

安全最佳实践

安全检查清单

宿主机安全:

□ 最小化安装
□ 禁用不必要服务
□ 配置防火墙
□ 启用 SELinux/AppArmor
□ 配置审计日志
□ 定期更新系统
□ 限制物理访问
□ 使用强密码/密钥

VM 安全:

□ 使用 virtio 驱动
□ 配置资源限制
□ 启用 seccomp
□ 配置 AppArmor/SELinux
□ SSH 加固
□ 定期更新
□ 备份配置和数据
□ 监控日志

网络安全:

□ 网络隔离
□ 端口限制
□ 防火墙规则
□ 使用 TLS 加密
□ 禁用不必要协议
□ 监控网络流量
□ 配置 IDS/IPS

存储安全:

□ 磁盘加密
□ 权限控制
□ SELinux 上下文
□ 定期备份
□ 验证备份完整性
□ 异地备份

安全加固脚本

#!/bin/bash
# kvm-hardening.sh

echo "=== KVM 宿主机安全加固 ==="

# 1. 配置防火墙
echo "[1/8] 配置防火墙..."
systemctl enable --now firewalld
firewall-cmd --set-default-zone=drop
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=libvirt
firewall-cmd --reload

# 2. 禁用服务
echo "[2/8] 禁用不必要的服务..."
systemctl disable --now cups avahi-daemon bluetooth

# 3. 配置 SELinux
echo "[3/8] 配置 SELinux..."
setenforce 1
sed -i 's/SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config

# 4. 内核参数
echo "[4/8] 配置内核参数..."
cat >> /etc/sysctl.conf <<EOF
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.ip_forward = 1
kernel.randomize_va_space = 2
EOF
sysctl -p

# 5. SSH 加固
echo "[5/8] SSH 加固..."
sed -i 's/PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart sshd

# 6. 审计配置
echo "[6/8] 配置审计..."
auditctl -w /etc/libvirt/ -p wa -k libvirt
auditctl -w /var/log/libvirt/ -p wa -k libvirt-log

# 7. 权限设置
echo "[7/8] 设置权限..."
chown -R libvirt-qemu:kvm /var/lib/libvirt/images
chmod -R 750 /var/lib/libvirt/images

# 8. 日志配置
echo "[8/8] 配置日志..."
systemctl enable --now rsyslog
systemctl enable --now auditd

echo "=== 安全加固完成 ==="

总结

安全配置要点

1. 最小化原则
   - 只安装必要的软件
   - 只开放必要的端口
   - 只授予必要的权限

2. 纵深防御
   - 多层安全防护
   - 不依赖单一安全措施

3. 定期更新
   - 及时应用安全补丁
   - 监控系统漏洞

4. 审计监控
   - 记录所有操作
   - 及时发现异常

5. 备份恢复
   - 定期备份
   - 测试恢复流程

安全工具推荐

工具用途推荐度
firewalld防火墙⭐⭐⭐⭐⭐
SELinux强制访问控制⭐⭐⭐⭐⭐
auditd审计日志⭐⭐⭐⭐⭐
OSSEC入侵检测⭐⭐⭐⭐
fail2ban防暴力破解⭐⭐⭐⭐
AIDE文件完整性⭐⭐⭐⭐

本文档属于 KVM 虚拟化技术实战系列
对应视频:9-09 (05:17)
最后更新:2026 年 3 月

更多推荐