Linux 安全——物理安全

Table of Contents

考虑在能够接触到物理机的情况下,怎样去加强 GNU/Linux 的安全。

1. BIOS 加密

在 BIOS 中,设置开机加密。

2. Single User Mode(单用户模式)加密

什么是单用户模式?

以 CentOS 为例,在 GRUB 启动时按“e”编辑启动项,Linux 内核参数后面加上“s”或者“emergency.target”,前者是进入单用户模式,后者是进入Emergency Mode(应急模式)。

很多发行版进入这两模式时是不需要密码的,如果能物理接触系统,就可以通过这个方式重置 root 密码。

可以开启进入单用户模式时,需要密码验证。在用 Systemed 的发行版中,编辑以下俩文件:

/lib/systemd/system/emergency.service
/lib/systemd/system/rescue.service

把 ExecStart 里 sushell 改成 sulogin 即可。

有些老系统,把 /etc/sysconfig/init 里 SINGLE 项改成 sulogin 的绝对路径。

但是多数 GNU/Linux 发行版(如 Ubuntu)在安装过程中会让创建一个新账号,而避免 root 账号,所以默认 root 账号可能是空密码,空密码可以直接进入单用户模式的,所以系统安装好后记得为 root 设置密码。

3. 加密 GRUB(防止修改内核参数)

即便单用户模式需要密码登录,我们仍旧可以绕过,启动时编辑 GRUB 菜单,设置内核启动参数:

init = /bin/bash

来改变内核后的 init 程序,这样又可以绕过权限限制了。

目前要做的就是为 GRUB 加密,以 CentOS7 为例,编辑 /etc/grub.d/40_custom,新增:

set superusers="root"
password root root

然后执行:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

4. 加密磁盘

即使加密了 GRUB,也可以通过借助 DVD 启动 GNU/Linux 来进入 Rescue 模式,编辑和访问系统的数据,比如编辑 grub.cfg 来去掉密码验证等。

虽然可以在 BIOS 里设置 BIOS 密码来防止,但 BIOS 毕竟是靠电池维护配置的,可以通过为电池放电来清空密码,所以最好还是为磁盘加密。

4.1. LUKS(Linux Unified Key Setup)

使用 LUKS 的步骤如下:

1、如果待加密分区已有数据,请做备份,因为要对分区做格式化。

2、格式化成加密分区:

sudo cryptsetup luksFormat /dev/sdb

3、在加密分区的基础上建立文件系统:

sudo cryptsetup luksOpen /dev/sdb data # 先挂载加密分区,data 为分区名
sudo mkfs.ext4 /dev/mapper/data # 在此基础上建立文件系统,如 ext4

以上步骤完成以后,就能正常使用加密分区了:

1、挂载分区(桌面环境操作的话,可以自动完成下面的挂载步骤):

sudo cryptsetup luksOpen /dev/sdb data
sudo mount /dev/mapper/data /data

2、卸载挂载点:

sudo umount /data
sudo cryptsetup luksClose [分区名]

3、设置成开机自动挂载,在 /etc/crypttab 增加:

data	/dev/sdb	none	luks

修改fstab:

/dev/mapper/data	/data	ext4	defaults	0	0

5. 系统账户安全

  • 不直接使用 root 帐号,用 sudo 代替
  • root 账户设置高强度密码,并且密码不和其他账户相同
  • 只允许 root 的 UID 为 0
  • 一个服务一个账号,且帐号不可登录
  • 禁用自动登录,比如在 Debian 中,注释掉 /etc/gdm3/daemon.conf 中以下配置:
AutomaticLoginEnable = true
AutomaticLogin = [帐号名]