标题是我的要求。我读了几个小时,找到了将 /home 移动到分区和将 /tmp 移动到分区的教程。但没有一个教程可以将所有推荐的目录转换为 Ubuntu Server 的分区。一个教程很接近,但忽略了将数据从先前目录复制到新分区的明显必要步骤。
无论如何,经过很多小时,我仍然没有找到一个涵盖我常见情况的教程。
情况:
我在生产服务器和测试服务器(分别为 vps 和 virtualbox)上安装了 Ubuntu Server,并做了一些工作。在阅读服务器强化教程时,我意识到出于资源管理和安全原因,最好将 /boot /home /swapfile /tmp /usr 和 var... /opt? 全部放在单独的分区上。
创建上述分区的正确方法是使用 LVM
但是,没有一个教程讨论/推荐分区大小(按比例,因为显然不同的系统有不同的可用磁盘空间,我的是 80GB / )
此外,有些教程提到了必要的更改/etc/fstab
,有些则没有。
nodev,noexec,nosuid
我的目标是将 80GB 的单个分区设置转换为多个分区,然后使用以下方法保护分区免受常见攻击和漏洞利用:/etc/fstab
我可以花几天时间在 virtualbox 中测试和失败不同的配置...或者一些英俊和/或美丽的“Ubuntu 服务器分区大师“可以发布一个易于遵循的(中级用户目标受众)权威指南正如我上面所描述的,并成为互联网名人,因为许多在 vps 上托管自己的项目的用户将永远爱你和崇拜你。:-)
更新
我最初没有发布主服务器强化指南,因为我不想让这篇文章成为对这个人非常详尽的工作的“辩论”。然而,事后看来,我认为这对那些想要回答这篇文章的人来说是有帮助的,让他们看到我试图实现的实际安全优势。
答案1
我认为通常将内容分成不同的文件系统不会帮助/提高安全性。如果有人在系统运行时闯入系统,无论如何一切都会挂载,将所有内容放在一个文件系统中没有任何逻辑上的区别。你学习的材料给出了哪些理由?
话虽如此,能帮助提高性能(这些挂载点下有不同的文件系统或不同的硬件)并缩短灾难恢复所需的时间(例如,如果只有保存 /var 的 SSD 冒烟,则只需恢复该备份,其余部分保持运行)。
您询问的是建议的分区大小:
- 15-20 GB就
/
足够了。我从来不需要更多空间来运行服务器(运行 Web 服务器 + 邮件服务器)。 swap
我通常会将其放在与 RAM 大小相同的卷/分区上 - 只是为了使挂起到磁盘可以工作。人们过去推荐 2xRAM 大小,但对于当今的 RAM 大小,当您遇到需要大量交换的情况时,您无论如何都会遇到麻烦。您会从大幅减速中注意到这一点,然后您应该快速增加可用 RAM。/boot
只需要 500 MB,这为 8 个以上的内核+initrd 版本提供了空间。确保apt autoremove
经常运行,以便在内核升级后保持精简。- 我会保留
/usr
和/opt
作为目录/
,只是看不到将它们移动到自己的文件系统有什么好处。 - 正如所述本强化指南,为 创建一个单独的卷
/tmp
确实很有意义,因为它允许您使该全球可写目录更加受限 - 无论是在它可以使用的总可用空间中有多少空间,还是可以对存储在那里的文件执行哪些操作。指南建议在挂载文件系统时使用 nodev、nosuid 和 noexec 选项。指南仅提供“一次性使用”的挂载命令。将其转换为 /etc/fstab 中的一行意味着您将 放入nodev,nosuid,noexec
挂载专用 /tmp 卷的行的第 4 列(选项)中/tmp
。 - 剩下的就是
/home
和/var
- 这通常是“重要”的东西。在我的服务器上/home
几乎是空的,但/var
包含 public_html、日志、数据库等。因此,我将它/home
作为目录保存在 上/
,但/var
肯定有自己的卷,并且备份最频繁。完成上述操作后,将所有剩余空间留给它。
然后你问如何进行转变:
- 在正在运行的系统中,一切正常
/
,连接新磁盘(VDI 文件,...),使用 pvcreate、lvcreate 准备它,然后准备您选择的文件系统(例如 mkfs.ext4)。 - 然后在 /mnt 下创建临时挂载点,例如 /mnt/newroot、/mnt/newvar 等,并将文件系统挂载在那里。
- 然后对每个文件系统使用
rsync -xaP <source>/ <destination>/
。'-x' 选项将阻止 rsync 跨越文件系统边界,即,如果您这样做,rsync -xaP / /mnt/newroot/
它也不会复制 /var、/home 甚至所有挂载在 /mnt 下的新文件系统。'-a' 将确保权限等将在未经修改的情况下被接管,而 '-P' 显示进度。有关详细信息,请参阅man rsync
。
完成之后,编辑/mnt/newroot/etc/fstab
并确保在适当的挂载点列出所有文件系统。如果您已经做到了这一点,那么这应该不会太难(因为您选择了所有 /dev/mapper/... 名称、文件系统等)。
您还必须使用 grub-install 和 update-grub 来使新磁盘可启动,但我不太确定具体步骤。使用虚拟机,您可以轻松尝试,如果它无法启动,请再次连接旧磁盘并修复它。
作为参考,这里有一个 shell 会话,它为您提供了有关分区 + LVM + 格式化 + 引用 fstab 主题的一些特定命令。请注意,您很可能必须修改它们,例如,如果您的设备不是 /dev/sda,如果您想要不同的文件系统等 - 这只是一个例子。
# After using fdisk to create one partition that covers the whole device,
# it looks like this:
root@ubuntu:~# fdisk -l /dev/sda
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 18ACB4C9-3F33-7041-8BEB-D819F138A809
Device Start End Sectors Size Type
/dev/sda1 2048 209715166 209713119 100G Linux LVM
# Create a physical volume for LVM
root@ubuntu:~# pvcreate /dev/sda1
Physical volume "/dev/sda1" successfully created.
# Create a volume group with the name "vg1" for LVM that will
# hold all our logical volumes
root@ubuntu:~# vgcreate vg1 /dev/sda1
Volume group "vg1" successfully created
# Create the logical volumes as described above
root@ubuntu:~# lvcreate --name root --size 20G vg1
Logical volume "root" created.
root@ubuntu:~# lvcreate --name swap --size 8G vg1
Logical volume "swap" created.
root@ubuntu:~# lvcreate --name boot --size 500M vg1
Logical volume "boot" created.
root@ubuntu:~# lvcreate --name tmp --size 5G vg1
Logical volume "tmp" created.
# Have a look at the logical volumes
root@ubuntu:~# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
boot vg1 -wi-a----- 500.00m
root vg1 -wi-a----- 20.00g
swap vg1 -wi-a----- 8.00g
tmp vg1 -wi-a----- 5.00g
# Have a look at the volume group and see how much space is left
root@ubuntu:~# vgs
VG #PV #LV #SN Attr VSize VFree
vg1 1 4 0 wz--n- <100.00g <66.51g
# Use the remaining space for the last logical volume, var
root@ubuntu:~# lvcreate --name var --size 66.5G vg1
Logical volume "var" created.
# Have another look at the volumes
root@ubuntu:~# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
boot vg1 -wi-a----- 500.00m
root vg1 -wi-a----- 20.00g
swap vg1 -wi-a----- 8.00g
tmp vg1 -wi-a----- 5.00g
var vg1 -wi-a----- 66.50g
# Format all volumes with ext4 file system
for i in /dev/mapper/vg1-*; do mkfs.ext4 $i; done
# Turn vg1-swap into swap space
mkswap /dev/mapper/vg1-swap
# Create fstab entries that look like this
/dev/mapper/vg1-root / ext4 defaults 0 1
/dev/mapper/vg1-boot /boot ext4 defaults 0 2
/dev/mapper/vg1-var /var ext4 defaults 0 2
/dev/mapper/vg1-tmp /tmp ext4 nosuid,nodev,noexec 0 0
/dev/mapper/vg1-swap none swap sw 0 0