Linux Encryption HOWTO 怎样制作一个加密的文件系统
发布时间:2025-05-11 21:07:03 发布人:远客网络
一、Linux Encryption HOWTO 怎样制作一个加密的文件系统
您的硬盘(hda)最少应该包含三个分区:
hda1:这个小的没加密的分区应该要求一个口令为了加载加密的根文件系统
hda2:这个分区应该包含你的加密根文件系统;确保它足够大
hda3:这个分区就是你的当前的GNU/Linux系统
在这时,hda1和hda2没有使用。hda3就是当前你安装的linux发行版;/usr和/boot不能另外分区装载。
你的分区分布也许会像下面这样:
Disk/dev/hda: 255 heads, 63 sectors, 2432 cylinders
Units= cylinders of 16065* 512 bytes
Device Boot Start End Blocks Id System
/dev/hda2 2 263 2104515 83 Linux
/dev/hda3 264 525 2104515 83 Linux
/dev/hda4 526 2047 12225465 83 Linux
有两种主要的方案可用于在内核上添加 loopback加密支持:cryptoloop和 loop-AES。本文是基于loop-AES方案的,因为因为它的特点是非常快和非常优化实行 of Rijndael用汇编语言。如果你有一个IA-32(x86) CPU,它将为您提供最大的性能。另外,还有一些关于cryptoloop的安全关切.
首先,下载和解压 loop-AES软件包:
wget
tar-xvjf loop-AES-v2.2b.tar.bz2
然后再下载内核源代码和补丁并为内核源码打上补丁:
wget
rm include/linux/loop.h drivers/block/loop.c
patch-Np1-i../loop-AES-v2.2b/kernel-2.4.27.diff
dumpkeys| loadkeys-m-> drivers/char/defkeymap.c
下一步,配置你的内核;确定下面的选项你已经选上了:
<*> Loopback device support
[*] AES encrypted loop device support(NEW)
(4096) Default RAM disk size(NEW)
[*] Initial RAM disk(initrd) support
<*> Ext3 journalling file system support
<*> Second extended fs support
(important note: do not enable/dev file system support)
cp arch/i386/boot/bzImage/boot/vmlinuz
如果你的启动器是grub,更新你的/boot/grub/menu.lst或/boot/grub/grub.conf文件:
cat>/boot/grub/menu.lst<< EOF
color green/black light-green/black
kernel/boot/vmlinuz ro root=/dev/hda3
启动器是lilo的话就更新/etc/lilo.conf并运行 lilo:
cat>/etc/lilo.conf<< EOF
像之前所说的那样进行前面的部分,所用补丁是loop-aes'kernel-2.6.8.1.diff。要注意的是你要安装module-init-tools软件包以便你的系统支持模块。
这个losetup程序包含在util-linux-2.12b软件包中。必须打补丁并重新编译以使它支持加密。下载,解压并打为util-linux打补丁:
wget
tar-xvjf util-linux-2.12b.tar.bz2
patch-Np1-i../loop-AES-v2.2b/util-linux-2.12c.diff
使用少于20个字符的密码,键入:
CFLAGS="-O2-DLOOP_PASSWORD_MIN_LENGTH=8"; export CFLAGS
安全可能是你主要关心的一个问题。为此,请不要使您的密码少于20个字符。数据保密性不是免费的,你必须以‘支付’的形式使用长的密码。
使用root用户编译安装 losetup程序:
mv-f/sbin/losetup/sbin/losetup~
rm-f/usr/share/man/man8/losetup.8*
cp losetup.8.gz/usr/share/man/man8/
losetup-e aes256-S xxxxxx/dev/loop0/dev/hda2
为防止比较快的字典攻击,推荐加上-S xxxxxx选项,"xxxxxx"是你随机选取的种子(例如,你可能选择"gPk4lA")。同样,为了防止启动时的键盘映射问题,在密码中不要使用非ASCII字符(方言,等)。Diceware站点提供了一种简单的的方法去创建强大并容易记住的密码。
losetup-e aes256-S xxxxxx/dev/loop0/dev/hda2
你可以比较已加密的和未加密的数据:
现在是时候安装你的加密的linux系统了。如果你使用的是GNU/Linux发行版(譬如Debian, Slackware, Gentoo, Mandrake, RedHat/Fedora, SuSE, etc.),运行下面的命令:
如果你使用是Linux From Scratch手册,照着lfs手册上所说的那样进行配置,但要做以下修改:
Chapter 6- Installing util-linux:
在解压源代码后打上 loop-AES的补丁。
Chapter 8- Making the LFS system bootable:
指向我们的下一章(创建启动设备)。
--------------------------------------------------------
在开始时,先用chroot命令进入你的加密分区并创建启动设备的挂载点:
然后创建 initial ramdisk(initrd),它将会在以后用到:
dd if=/dev/zero of=initrd bs=1k count=4096
如果您使用 grsecurity.您可能会收到"Permission denied"的提示错误的信息;如果是这样你将必须在chroot命令之前运行 mount命令。
创建文件系统的目录组织并复制所需要的的文件进去:
mkdir ramdisk/{bin,dev,lib,mnt,sbin}
cp/bin/{bash,mount} ramdisk/bin/
mknod-m 600 ramdisk/dev/console c 5 1
mknod-m 600 ramdisk/dev/hda2 b 3 2
mknod-m 600 ramdisk/dev/loop0 b 7 0
cp/lib/{ld-linux.so.2,libc.so.6,libdl.so.2} ramdisk/lib/
cp/lib/{libncurses.so.5,libtermcap.so.2} ramdisk/lib/
cp/sbin/{losetup,pivot_root} ramdisk/sbin/
如果你看到像"/lib/libncurses.so.5: No such file or directory","/lib/libtermcap.so.2: No such file or directory"的信息,这是正常的。bash只要求用这两个库中的其中一个。你可以检测哪一个才是你实际所需要的:
编译sleep程序,它将防止密码提示被内核信息所淹没(例如当usb设备注册时)。
int main( int argc, char*argv[])
gcc-s sleep.c-o ramdisk/bin/sleep
创建初始化脚本(不要忘记替换掉你之前报选的种子"xxxxxx"):
cat> ramdisk/sbin/init<<"EOF"
/sbin/losetup-e aes256-S xxxxxx/dev/loop0/dev/hda2
/bin/mount-r-n-t ext3/dev/loop0/mnt
/sbin/losetup-e aes256-S xxxxxx/dev/loop0/dev/hda2
/bin/mount-r-n-t ext3/dev/loop0/mnt
exec/usr/sbin/chroot./sbin/init
卸载 loopback设备并压缩initrd:
我强烈建议您从只读的媒体里启动您的系统,例如可启动的光盘。
wget
tar-xvjf syslinux-2.10.tar.bz2
cp/boot/{vmlinuz,initrd.gz} syslinux-2.10/isolinux.bin bootcd
echo"DEFAULT/vmlinuz initrd=initrd.gz ro root=/dev/ram0"\
mkisofs-o bootcd.iso-b isolinux.bin-c boot.cat\
-no-emul-boot-boot-load-size 4-boot-info-table\
cdrecord-dev 0,0,0-speed 4-v bootcd.iso
当你丢失了你的可启动光盘时,启动分区就可以派上用场了。请记住hda1是个可写分区,因而并不是很可靠的,只有当你遇到紧急的情况时才使用它!
dd if=/dev/zero of=/dev/hda1 bs=8192
cp/boot/{vmlinuz,initrd.gz}/loader
cat>/loader/boot/grub/menu.lst<< EOF
color green/black light-green/black
kernel/vmlinuz ro root=/dev/ram0
grub-install--root-directory=/loader/dev/hda
mknod-m 600/loader/dev/hda b 3 0
mknod-m 600/loader/dev/hda1 b 3 1
mknod-m 600/loader/dev/ram0 b 1 0
cat>/loader/etc/lilo.conf<< EOF
最后一步仍然保持chroot的状态,修改/etc/fstab增加以下选项:
去除/etc/mtab并从chroot中退出。最后,运行"umount-d/mnt/efs"命令然后重启系统。如果有某些错误发生,你仍然可以在 LILO提示中用"Linux root=/dev/hda3"来启动你未加密的分区。
如果一切都顺利,你就可以重新分区你的硬盘和继续加密你的hda3或hda4分区。在下面的脚本中,我们假设 hda3将挂载swap设备,hda4挂载/home目录;你应该先初始化这两个分区:
losetup-e aes256-S xxxxxx/dev/loop1/dev/hda3
losetup-e aes256-S xxxxxx/dev/loop2/dev/hda4
然后在系统的启动目录里创建一个脚本并更新/etc/fstab:
cat>/etc/init.d/loop<<"EOF"
if ["`/usr/bin/md5sum/dev/hda1`"!=\
"5671cebdb3bed87c3b3c345f0101d016/dev/hda1" ]
echo-n"WARNING! hda1 integrity verification FAILED- press enter."
echo"1st password chosen above"|\
/sbin/losetup-p 0-e aes256-S xxxxxx/dev/loop1/dev/hda3
echo"2nd password chosen above"|\
/sbin/losetup-p 0-e aes256-S xxxxxx/dev/loop2/dev/hda4
echo-n-e"\33[10;10]\33[11;10]">/dev/tty$i
ln-s../init.d/loop/etc/rcS.d/S00loop
/dev/loop2/home ext3 defaults 0 2
二、linuxso文件反编译linux.so文件
linux生成文件中.so文件和.out文件的区别?
在链接的时候指定入口是可以制造可以运行的.so文件的典型的例子:/lib64/ld-linux-x86-64.so.2/lib64/libc.so.6因为它们都是ELF(ExecutableandLinkingFormat)文件顾名思义就知道这种文件同时兼具可执行于可连接的作用。Windows上我不熟悉,当时考虑到DLL于EXE都是PE文件,链接器那边做好入口理论上是可以执行的。但是如果Windows上有什么泾渭分明的区分就无解了
so文件是Linux系统的可执行文件,相当于windows上的exe执行文件,只可以在Linux系统运行。so文件就是常说的动态链接库,都是C或C++编译出来的。与Java比较就是:它通常是用的Class文件(字节码).//Linux下的.so文件时不能直接运行的。一般来讲,.so文件称为共享库.//。
主要是gcc编译时候选择是静态库还是动态库。如下
gcc-fPIC-sharedtest.c-otest.so生成动态库
自己生成的动态库为了能够让ld找到,必须要修改连接路径或者把动态库放到指定的目录里面。这样so文件就修改好了。
安卓类库so文件与linux类库类库文件区别?
本质上都是一样的,都是Linux的动态链接库
三、linux 除了.o so a 还有哪些二进制文件
Linux下文件的类型是不依赖于其后缀名的,但一般来讲:
.o,是目标文件,相当于windows中的.obj文件
.so为共享库,是shared object,用于动态连接的,和dll差不多
.a为静态库,是好多个.o合在一起,用于静态连接
.la为libtool自动生成的一些共享库,vi编辑查看,主要记录了一些配置信息。可以用如下命令查看
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
[yufei@localhost perl_c2]$ pwd
[yufei@localhost perl_c2]$ cat mylib.c
printf("success call from perl to c library\n");
[yufei@localhost perl_c2]$ cat mylib.h
[yufei@localhost perl_c2]$ gcc-c mylib.c
[yufei@localhost perl_c2]$ dir
[yufei@localhost perl_c2]$ ar-r mylib.a mylib.o
[yufei@localhost perl_c2]$ dir
mylib.a mylib.c mylib.h mylib.o
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
动态库*.so在Linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链
接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟
下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:
test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。
printf("this is in test_a...\n");
printf("this is in test_b...\n");
printf("this is in test_c...\n");
将这几个文件编译成一个动态库:libtest.so
$ gcc test_a.c test_b.c test_c.c-fPIC-shared-o libtest.so
在1、中,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这
个库里的函数。程序的源文件为:test.c。
l将test.c与动态库libtest.so链接生成执行文件test:
l测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
l执行test,可以看到它是如何调用动态库中的函数的。
最主要的是GCC命令行的一个选项:
-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成
弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
l-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动
态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
l-L.:表示要连接的库在当前目录中
l-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后
l LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
l当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用/sbin/ldconfig来
达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。
调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录通过“-I
” include进来了,库所在文件通过“-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,
就是死活找不到你指定链接的so文件,这时你要作的就是通过修改LD_LIBRARY_PATH或
者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。
makefile里面怎么正确的编译和连接生成.so库文件,然后又是在其他程序的makefile里面如何编译
和连接才能调用这个库文件的函数????
你需要告诉动态链接器、加载器ld.so在哪里才能找到这个共享库,可以设置环境变量把库的
路径添加到库目录/lib和/usr/lib,LD_LIBRARY_PATH=$(pwd),这种方法采用命令行方法不太方便,一种替
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^注释^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LD_LIBRARY_PATH可以在/etc/profile还是~/.profile还是./bash_profile里设置,或者.bashrc里
改完后运行source/etc/profile或./etc/profile
更好的办法是添入/etc/ld.so.conf,然后执行/sbin/ldconfig
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^注释^^^^^^^^^^^^^^^^^^^^^^^^^^^^
是把库路径添加到/etc/ld.so.conf,然后以root身份运行ldconfig
也可以在连接的时候指定文件路径和名称-I-L.
$(GCC)-shared-Wl,-soname,libfunc.so.1-o libfunc.so.1.1$<
ln-sf libfunc.so.1.1 libfunc.so.1
ln-sf libfunc.so.1 libfunc.so
***********************************************注释
************************************************
ln-s是用来创建软链接,也就相当于windows中的快捷方式,在当前目录中创建上一级目录中的文件
ttt的命名为ttt2软链接的命令是ln-s../ttt ttt2,如果原文件也就是ttt文件删除的话,ttt2也变成了
ln-d是用来创建硬链接,也就相当于windows中文件的副本,当原文件删除的时候,并不影响“副本
编译目标文件时使用gcc的-fPIC选项,产生与位置无关的代码并能被加载到任何地址:
gcc–fPIC–g–c liberr.c–o liberr.o
使用gcc的-shared和-soname选项;
使用gcc的-Wl选项把参数传递给连接器ld;
使用gcc的-l选项显示的连接C库,以保证可以得到所需的启动(startup)代码,从而避免程序在使
用不同的,可能不兼容版本的C库的系统上不能启动执行。
gcc–g–shared–Wl,-soname,liberr.so–o liberr.so.1.0.0 liberr.o–lc
ln–s liberr.so.1.0.0 liberr.so.1;
ln–s liberr.so.1.0.0 liberr.so;
表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式
仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",
那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目标不是函数库文件(Unix下是[.a],Windows下是
依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模
式的一系列的文件集。注意,其是一个一个取出来的。
所有比目标新的依赖目标的集合。以空格分隔。
所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重
*********************************************注释
***********************************************************************
要生成.so文件,cc要带-shared参数;要调用.so的文件,比如libfunc.so,可以在cc命令最后加上
-lfunc,还要视情况加上-L/usr/xxx指出libfunc.so的路径;这样,在你要编译的源文件中就可以调用
前面的都说的差不多了,最后提醒一下最好提供一个接口头文件
动态加载,用dlopen,dlclose,dlsym