Linux下利用LUKS对Ramdisk磁盘加密
我知道对于Ramdisk的加密是没有意义并且很荒谬的,因为种种原因还是写了这篇文章,也算是把加密磁盘和Ramdisk的内容进行了汇总。
00 名词解释
a.Ramdisk
RAM磁盘也称为RAM驱动器。它是使用文件系统格式化的 RAM 的一部分。您可以将其挂载到 Linux 系统上的目录,并将其用作磁盘分区。
b.LUKS
LUKS(Linux Unified Key Setup)为linux硬盘加密提供了一种标准,它不仅能通用于不同的Linux发行版本,还支持多用户/口令。因为它的加密密钥独立于口令,所以如果口令失密,我们可以迅速改变口令而无需重新加密真个硬盘。通过提供一个标准的磁盘上的格式,它不仅方便之间分布的兼容性,而且还提供了多个用户密码的安全管理。必须首先对加密的卷进行解密,才能挂载其中的文件系统。这个磁盘加密是最底层加密,如果强力去暴力破解,得到的结果就是文件损坏,将得不到自己想要得到的信息。(无法暴力破解)
01 创建Ramdisk
第一种就是传统固定大小,需要指定文件系统并进行格式化的ramdisk,第二种是可变大小,直接使用VFS(Virtual file system, 虚拟文件系统)来操作文件而无需格式化的ramfs。第三种如同第二种的ramfs,但它能使用的空间不只限于RAM内,还可以使用交换分区(SWAP),称作tmpfs。
以下将针对这三者分别介绍:
a.Ramdisk
ramdisk的配置存在于Linux的Kernel(内核),Linux缺省提供8个或16个ramdisk让用户挂载使用,每个ramdisk的路径可以使用以下指令来查看:
ls /dev/ram*
root@debian:~# ls /dev/ram*
/dev/ram0 /dev/ram1 /dev/ram11 /dev/ram13 /dev/ram15 /dev/ram3 /dev/ram5 /dev/ram7 /dev/ram9
/dev/ram10 /dev/ram12 /dev/ram14 /dev/ram2 /dev/ram4 /dev/ram6 /dev/ram8
如果没看到/dev/ram
相关设备,可能是因为你的Linux Kernel并没有加载brd
(block ram disk)模块。可以运行sudo modprobe brd
指令来加载。
每个ramdisk默认的大小在不同的Linux系统上似乎都不太一样,但普遍不大,小于128MB,ramdisk的大小可以借由GRUB开机管理程序来设置Linux Kernel的参数来改变。可以使用文本编辑器打开/etc/default/grub
,在GRUB_CMDLINE_LINUX
中加入ramdisk_size
参数,并设置ramdisk的大小的数值,以KB为单位。如果还有其他参数,以空隔分隔。如以下设置方式,可以让每个ramdisk拥有512MB的空间:
GRUB_CMDLINE_LINUX="ramdisk_size=512000"
修改完毕后保存文件,再使用以下指令来更新GRUB。
sudo grub-mkconfig -o /boot/grub/grub.cfg
ramdisk必须要经过格式化之后来挂载使用,本文对磁盘加密用该方式进行,所以格式化和挂载在后面叙述。
**注意:**无论ramdisk是挂载还是卸载状态,一旦ramdisk经过格式化,就会占用掉文件系统所需的内存空间,如果有放置文件,会占用更多用来存放文件的内存空间。换句话说,ramdisk并不会在一开始格式化时就配置等量的内存空间,而是随着使用情况来慢慢增加。
b.ramfs
ramfs不像ramdisk那样一定得固定大小,在这里所讲的固定大小是指Linux缺省的16个ramdisk的大小都是固定的,用户可以自由挂载任意数量的ramfs,它们的大小会动态增长。且又因为ramfs是直接使用VFS(Virtual file system, 虚拟文件系统)来操作文件,因此无需格式化。
如果要挂载ramfs,必须要使用一个目录,以/mnt/ramfs
为例,先使用mkdir
指令来创建目录:
mkdir /mnt/ramfs
接着再使用mount
指令来将ramfs挂载到/mnt/ramfs
,可以使用以下指令:
mount -t ramfs ramfs /mnt/ramfs
ramfs似乎是无法限制大小,请小心使用。
卸载ramfs的方式和ramdisk一样,都可以使用umount
指令,例如要卸载/mnt/ramfs
目录:
sudo umount /mnt/ramfs
卸载后,ramfs所占用的内存会自动释放出来。ramfs挂载的目录使用df指令无法正常显示,不太受控制,建议还是使用下面要提的tmpfs。
c.tmpfs
tmpfs和ramfs类似,只不过tmpfs还可以使用到交换分区(SWAP)的空间,这样就不用太担心tmpfs占用空间太大会使得RAM吃满造成系统出问题。
1、如果要挂载tmpfs,必须要使用一个目录,以/mnt/tmpfs
为例,先使用mkdir
指令来创建目录:
sudo mkdir /mnt/ramdisk
2、给这个目录足够的权限
sudo chmod 777 /mnt/ramdisk
3、接着再使用mount
指令来将tmpfs挂载到/mnt/tmpfs
,可以使用以下指令:
sudo mount -t tmpfs myramdisk /mnt/ramdisk
4、默认的tmpfs大小为总RAM的一半,如果要自订tmpfs的大小,可以加上-o size
参数,例如以下将tmpfs指定为5GB:
sudo mount -t tmpfs -o size=5120m myramdisk /mnt/ramdisk
6、检查是挂载成功
mount | tail -n 1
7、卸载tmpfs的方式和ramdisk一样,都可以使用umount
指令,例如要卸载/mnt/tmpfs
目录:
umount /mnt/ramdisk
8、可以使用以下指令来查看目前系统的挂载状况:
df -h -T
如果tmpfs有放置文件,才会配置内存空间来存放文件。换句话说,tmpfs并不会在一开始挂载时就配置等量的内存空间,而是随着使用情况来慢慢增加。tmpfs似乎是使用内存的Cache空间,因此会造成tmpfs里明明就放置了愈来愈多的文件,但是系统所显示的可用内存量却没有减少,这点在使用tmpfs时需要注意。tmpfs所占掉的Cache空间,并不能够让其他进程拿去使用,也不会主动释放,除非将tmpfs内的文件删除,或是卸载tmpfs,才可以释放内存。
02 创建LUKS加密磁盘
1、创建RAM磁盘并划分分区
使用以下命令创建一个大小为1GB的RAM磁盘**(对应01节的创建Ramdisk,如果已经创建好固定大小的ramdisk则第一条命令无需执行)**,然后在其上创建分区:
sudo modprobe brd rd_size=1048576
使用fdisk /dev/ram0
命令查看待分区磁盘,使用fdisk命令对该磁盘进行分区,分区可以根据自己情况在默认的16个分区选择,本次演示以ram0展示,命令如下:
sudo fdisk /dev/ram0
选择m可以查看具体的操作
root@debian:~# fdisk /dev/ram0
Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): m
Help:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition
Misc
m print this menu
u change display/entry units
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table
我们选择n
,剩下的选择默认即可:
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-2097151, default 2048): 2048
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-2097151, default 2097151):
完成之后输入w
进行保存
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
2、使用cryptsetup命令创建LUKS容器
假设要将/dev/ram0p1分区加密并命名为myluksdisk(这个时候要输入大写的YES确认):(cryptsetup可以直接apt install)
sudo cryptsetup luksFormat /dev/ram0p1
3、打开LUKS容器以使其可用
sudo cryptsetup open /dev/ram0p1 myluksdisk
4、创建文件系统并挂载该磁盘
sudo mkfs.ext4 /dev/mapper/myluksdisk
sudo mkdir /mnt/myluksdisk
sudo mount /dev/mapper/myluksdisk /mnt/myluksdisk
5、进行读写操作并卸载磁盘
sudo touch /mnt/myluksdisk/test.txt
sudo umount -l /mnt/myluksdisk
sudo cryptsetup close myluksdisk
03 将docker运行在ramdisk
1、查找docker运行的目录
docker info | grep "Docker Root Dir"
2、停掉docker
systemctl stop docker
3、输出的结果进入到对应容器的目录
cd /var/lib/docker (这个是步骤一获取到的)
cd ..
4、移动容器内的内容到ramdisk
mv docker/ /mnt/myluksdisk
5、与原始位置建立软连接
ln -s /mnt/myluksdisk/docker/ /var/lib/docker
6、启动docker
systemctl start docker
04、将mysql运行在内存中
1、下载
docker pull mysql:8.0.21
2、运行
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.21
3、进入容器
docker exec -it xxx /bin/bash
4、登录,输入刚才的密码123456
mysql -u root -p
5、开启远程访问
use mysql;
grant all privileges on *.* to 'root'@'%';
flush privileges;