当使用Unionfs和Chroot登录时进入安全镜像

使用Unionfs和Chroot登录时进入安全镜像

介绍

LinuxFromScratch网站上阅读“提示”时,我发现了unionfs的特殊功能,特别是与chroot结合使用。 后来我在Gentoo的wikiwebsite上看到一个HowTo,关于在使用特殊脚本作为shell时输入chrooted的homedirectory。 结合这两个使我可以使用一个chroot环境,当您以特殊用户身份登录时输入。 此环境是您正在处理的系统的精确副本(镜像)。 因为你是真正的系统的安全拷贝,你可以做任何你喜欢的任务,它永远不会改变系统,一切都保持在缓存内(readwrite分支)。

链接:
TRIP,一个用于LFS的TRIvial Packager(和其他linux系统) - LFS网站上的原始提示
Home_directory_jail - 在Gentoo设置chroot监狱的指南

基本技巧

做任何你喜欢的,安装,更改和删除文件从系统,没有任何伤害。 您的真实系统保持不变。 这可能听起来像是魔术,但实际上只有通过结合所有可用于Linux的技术才可能。
通过使用文件系统Unionfs,chroot和一些精心挑选的重新安装的目录,您可以设置此虚拟系统。

2.1联盟

最重要的部分是使用unionfs。 Unionfs可以让您创建一个文件系统,这是至少两个其他的联合。 有关更多信息,请访问www.unionfs.org 。 现在,通过让新文件系统成为只读模式的原始文件系统(根),以及readwrite模式下的临时文件系统(缓存),您将拥有一个与原始文件系统完全相同的文件系统,但是您可以在其中修改,删除和/或添加文件,而无需对原始系统执行任何操作。 这是不可能的,因为根是唯一的安装。 每个修改都是由存储在缓存中的unionfs。
原始系统和新创建的系统之间的唯一区别是路径:在新系统中,它始终以联合的挂载点的路径开始。 这就是为什么下一步是必要的。

一个特别的说明:今天[2007年6月]看来,unionfs将被包含在内核中。 此时,Unionfs正在大力发展。 看网站了解更多信息。

在网站上,您将找到有关如何启用unionfs的信息。 对于最新的内核(早于2.6.19),内核源码有一个补丁,因为最近的内核没有一个外部模块。

2.2(Re)安装

您需要做的另外一件事是(重新)安装诸如/ dev,/ proc和/ sys之类的几个关键目录。 这是因为联合文件系统不保留现有的装入点。
还建议重新安装一些特殊目录,如/ tmp和您正在构建软件的目录。

2.3 Chroot

通过chrooting到此挂载点,您输入绝对是您的系统的副本的环境。 你可以做任何你喜欢的,甚至删除关键的目录和文件。 测试吧 看看你的系统卡住之前可以走多远。

2.4登录到此环境

像在Home_directory_jail中解释的概念一样,可以通过创建一个特殊的登录键来进入使用unionfs和chroot创建的环境。
这里解释的想法是创建一个特殊的用户,一个特殊的shell。 此shell将在进入交互式shell之前首先执行必要步骤,如安装unionfilesystem,重新安装一些重要目录并执行chroot。

准备

3.1缓存分区

启动具有足够空间的分区作为缓存。 这不一定是一个物理分区,它可能是一个虚拟驱动器。

创建此驱动器:

dd if=/dev/zero of=/mnt/cache.img bs=1M count=500
mkfs.ext2 /mnt/cache.img
mkdir /mnt/cache
mount /mnt/cache.img /mnt/cache -o loop
chmod 777 /mnt/cache
mkdir /mnt/union

这将创建一个500M的虚拟分区(或驱动器)。

(注意:你的内核必须支持环回设备,大多数发行版的内核都可以)

3.2特殊登录

创建一个shellscript chroot-union ,它将执行所有必要的步骤:

/ bin中chroot-union脚本:

#!/bin/bash
function mount_unionfs {
# mount temporary filesystems
if [ -z "$(mount -t unionfs | grep -w /mnt/union )" ]; then
    sudo /bin/mount -t unionfs -o dirs=/mnt/cache:/=ro unionfs /mnt/union
	
fi
if [ -n "$(mount -t unionfs | grep -w /mnt/union )" ]; then
    # basic system mounts
    if [ -z "$(mount | grep -w /mnt/union/dev)" ]; then
	sudo /bin/mount --bind /dev /mnt/union/dev 2> /dev/null
    fi
    
    if [ -z "$(mount -t devpts | grep -w /mnt/union/dev/pts)" ]; then
	sudo /bin/mount -t devpts devpts /mnt/union/dev/pts 2> /dev/null
    fi
    if [ -z "$(mount -t tmpfs | grep -w /mnt/union/dev/shm)" ]; then
	sudo /bin/mount -t tmpfs shm /mnt/union/dev/shm 2> /dev/null
    fi
    
    if [ -z "$(mount -t sysfs | grep -w /mnt/union/sys)" ]; then
	sudo /bin/mount -t sysfs sysfs /mnt/union/sys 2> /dev/null
    fi
    
    if [ -z "$(mount -t proc | grep -w /mnt/union/proc)" ]; then
	sudo /bin/mount -t proc proc /mnt/union/proc 2> /dev/null
    fi
    if [ -z "$(mount | grep -w /mnt/union/tmp)" ]; then
	sudo /bin/mount --bind /tmp /mnt/union/tmp 2> /dev/null
    fi
    
    
    
else
    echo "Mount of /mnt/union failed."
    
    exit 2
fi
    
}
function umount_unionfs {
#
# unmount /tmp
#
if [ -n "$(mount | grep -w /mnt/union/tmp)" ]; then
    sudo /bin/umount /mnt/union/tmp 2> /dev/null
fi
#
# unmount /proc
#
if [ -n "$(mount -t proc | grep -w /mnt/union/proc)" ]; then
    sudo /bin/umount /mnt/union/proc 2> /dev/null
fi
#
# unmount /sys
#
if [ -n "$(mount -t sysfs | grep -w /mnt/union/sys)" ]; then
    sudo /bin/umount /mnt/union/sys 2> /dev/null
fi
#
# unmount /dev/shm
#
if [ -n "$(mount -t tmpfs | grep -w /mnt/union/dev/shm)" ]; then
    sudo /bin/umount /mnt/union/dev/shm 2> /dev/null
fi
#
# unmount /dev/pts
#
if [ -n "$(mount -t devpts | grep -w /mnt/union/dev/pts)" ]; then
    sudo /bin/umount /mnt/union/dev/pts 2> /dev/null
fi
#
# unmount /dev
#
if [ -n "$(mount | grep -w /mnt/union/dev)" ]; then    
    sudo /bin/umount /mnt/union/dev 2> /dev/null
fi
if [ -n "$(mount | grep -w /mnt/union )" ]; then  
    sudo /bin/umount /mnt/union 2> /dev/null
fi
}
mount_unionfs
# enter the chroot
sudo /usr/sbin/chroot /mnt/union /bin/su --shell /bin/bash --login $USER
# umount temporary filesystems
umount_unionfs
EOF

将新的登录信息添加到/ etc / shells文件中。 当PAM将检查shell时,您必须这样做。

3.3创建用户和组。

使用此脚本创建一个新的组和用户作为shell:

groupadd -g 27 uniongroup
useradd -c "Test user for chrooted union." -d /home/unionuser \
-m -s /bin/chroot-union -g uniongroup -u 27 unionuser
passwd unionuser

3.4给用户足够的权限

用sudo给新用户更多的权限。 将以下行添加到sudo的配置文件/ etc / sudoers中

 
unionuser ALL=(ALL) ALL

注意:还有其他方式给予该用户权限。 我正在看着他们。

注意:给予这些完全权限对于普通用户来说太多了。 但是对于将安装软件并修改系统的用户来说,这是必要的。

有什么可能的

一般用户安全可靠的环境

这种结构非常适合不能信任的访客用户。 我尝试的第一件事是开始一个图形会话。 我没有任何问题。

以此用户身份安装软件

另一个可能的用途是安装这个用户的软件。 这可以做到如下:

  • 因为这个用户安装你的软件。 由于特殊的构造,所有的更改都转到缓存。
  • 注销后,将缓存的内容与实际系统进行比较。
  • 控制用户(root)可以通过将内容从缓存移动到根目录来选择进行真正的安装

例如编译和安装一个小包,audiofile-0.2.6。 假定源是/ tmp 。 首次登录:

[root@hostname ]# login
hostname login: unionuser
Password:
Last login: Wed Jun 20 19:58:32 CEST 2007 on pts/0
[unionuser@hostname ]$

现在编译安装包:

[unionuser @ hostname] $ cd /tmp/audiofile-0.2.6
[unionuser @ hostname] $ ./configure --prefix = / usr
[unionuser @ hostname] $ make
[unionuser @ hostname] $ sudo make install

现在退出会话并检查缓存的内容:

[unionuser @ hostname] $ exit
[root @ hostname]#cd / mnt / cache
[root @ hostname]#ls -Al
drwxr-xr-x 3 root root 1024 2007-06-05 17:32 home
drwxr-xr-x 6 root root 1024 2007-06-05 17:37 usr
drwxr-xr-x 3 root root 1024 2007-06-05 17:32 var
[root @ hostname]#

主目录出现在这里,因为shell Bash更改文件.bash_history; 由于文件/ var / run / utmp和目录/ var / run / sudo中的更改,var目录显示。 这证明它的作用就像它应该。

现在,当我看到de / usr目录中我已经安装了这个软件的变化时:

[root @ hostname]#find usr -type f
usr / lib / pkgconfig / audiofile.pc
usr / lib / libaudiofile.la
usr / lib / libaudiofile.a
usr / lib / libaudiofile.so.0.0.2
usr / include / audiofile.h
usr / include / aupvlist.h
usr / include / af_vfs.h
usr / bin / audiofile-config
usr / bin / sfconvert
usr / bin / sfinfo
usr / share / aclocal / audiofile.m4
[root @ hostname]#find usr -type d
用户
usr / lib
usr / lib / pkgconfig
usr / include
usr / bin
usr / share
usr / share / aclocal

您可以看到所有内容都在/ mnt / cache / usr目录中。

你可以备份这个:

[root@hostname ]# find usr | sort -u > /tmp/filelist-audiofile-0.2.6

[root@hostname ]# tar --create --files-from=/tmp/filelist-audiofile-0.2.6 \
                      --file=/tmp/install-audiofile-0.2.6.tar --directory=/mnt/cache \
                      --no-recursion --absolute-names --preserve-permissions

还可以备份将被覆盖的所有文件:

[root@hostname ]# for installfile in $(cat /tmp/filelist-audiofile-0.2.6); do \
                    if [ -e "/$installfile ]; then \
                      echo "/$installfile" >> /tmp/backup-audiofile-0.2.6 \
                    fi \
                  done
[root@hostname ]# tar --create --files-from=/tmp/backup-audiofile-0.2.6 \
                      --file=/tmp/backup-audiofile-0.2.6.tar --directory=/mnt/cache \
                      --no-recursion --absolute-names --preserve-permissions

现在通过将所有文件复制到根目录进行真正的安装:

[root@hostname ]# for installfile in $(cat /tmp/filelist-audiofile-0.2.6); do \
                   cp --verbose --force --recursive --parents --no-dereference \
                      --preserve --target-directory=/ $installfile \
                  done

注意:上面的命令是为了说明这个想法。 我创建了脚本进行备份,检查和安装,它的工作非常好。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏