二、虚拟化技术与云计算-8-kvm-virtualization-guide-part4-security-updates
·
KVM 虚拟化技术实战指南 - 第四部分:安全设置与系统更新
文档信息
- 系列: KVM 虚拟化技术实战指南
- 部分: 第四部分 - 安全设置与系统更新
- 版本: V1.0
- 创建日期: 2026 年 3 月 9 日
- 对应视频: 9-09 (05:17)
- 预计阅读时间: 1-2 小时
目录
宿主机安全加固
系统最小化安装
原则: 只安装必要的软件包,减少攻击面
# 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 月
更多推荐
所有评论(0)