虚拟机chroot环境构建+openssh登录


虚拟机chroot环境构建+openssh登录

 最近项目需要使用chroot环境,不了解chroot的可以自行google补脑,google做了一些了解后,发现一般有三种做法:
  1 使用宿主机系统现有的文件copy一个子系统出来,copy时容易遗漏重要的文件。

  2 使用makejail工具,快速生成一个chroot环境,初步了解了一下makejail工具,发现该工具是根据配置文件配置的服务生成一个环境,在软件包中自带了一些服务模版,应该可以生成能运行该服务的最小chroot环境吧。当然也可以利用多个配置文件生成一个复杂的环境。

  3 使用debootstrap工具,该工具是用来构建基本的debian系统的。也就是说利用该工具可以构建一个小型系统,那我们也就可以利用该软件快速的构建一个比较完整的chroot环境了。
  经过综合评估后,觉得第三种方法最适合我,虽然它构建的chroot环境会比较大,所以下面的实验就以debootstrap为基础来构建chroot环境。
物理服务器:10.1.6.235  Ubuntu 12.10
虚拟机:10.1.6.28  Ubuntu 12.10
1 安装debootstrap,它会下载并安装基本的系统组成部分
1
apt-get -y install debootstrap
2 安装schroot,它可以用来管理chroot环境
 
1
apt-get -y install schroot
3 /etc/default/schroot文件
  该文件是用来管理shcroot服务停止后的默认行为的,默认不需要修改。
4 schroot配置文件目录结构:
1
/etc/schroot
2
├── buildd
3
├── chroot.d
4
├── default
5
├── desktop
6
├── minimal
7
├── sbuild
8
├── schroot.conf
9
└── setup.d
  /etc/schroot/schroot.conf 这是chroot环境定义文件 
  /etc/schroot/chroot.d 该目录是额外的chroot环境的配置文件存放目录 
  /etc/schroot/setup.d 该目录是chroot建立过程的setup文件目录 
5 设置/etc/schroot/schroot.conf配置文件,在文件末尾追加如下:
1
[test]
2
description=user test chroot
3
type=directory
4
directory=/opt
5
users=test
6
groups=root
7
root-groups=root
6 检查配置文件是否有错误
1
schroot -l

可以看到名为test的chroot环境,说明是正确的。
7 利用debootstrap构建ubuntu12.10的chroot环境
1
debootstrap --variant=buildd --arch=amd64 quantal /opt/ http://10.1.1.187/ubuntu
  可以看到根据配置文件在/opt目录下已经有了一个类似小型系统的目录
8 安装完成后,登入chroot环境
1
schroot -c test -u root

  schroot会自动执行/etc/schroot/setup.d/底下所找到的scripts,当chroot启动时会用档名顺序并且以setup-start选项执行,而离开chroot时会用相反顺序并以setup-stop选项执行。可以在现有的配置文件中增加你想进行的动作,也可以自己建立新的script。
这样chroot环境就利用debootstrap安装完毕了,如果你认为这样就可以利用到生产环境,那就想的太简单了,我们还需要进行以下升级:
1 修改schroot的配置文件,上面我们建立了一个名为test的chroot环境,这个环境要使用到生产环境中,还需要添加一些配置参数:
01
[test]
02
description=user test chroot
03
type=directory
04
directory=/opt
05
users=root,test,guol
06
root-users=root,guol
07
groups=root
08
root-groups=root
09
setup.copyfiles=default/copyfiles
10
setup.fstab=default/fstab
11
setup.nssdatabases=default/nssdatabases
12
shell=/bin/bash
13
preserve-environment=true
简单的解释一下各个参数:

[test]:是该chroot环境的名称
description:是对该chroot环境的描述
type:可为plain、directory、file、loopback、block-device、btrfs-snapshot、lvm-snapshot之一。其中plain和directory都是资料夹,差别在于directory 会自动执行预设的setup script和挂载一些目录,而plain什么都不会做。使用file可以直接把archive当成chroot 目标。
directory:当type为plain或directory时,用来指定目标的位置。
file:当type为file时,用来指定目标的位置。
users:原系统中可以透过schroot进入此子系统的使用者。
root-users:原系统中可以透过schroot进入此子系统并取得root权限的使用者。
groups:原系统中可以透过schroot进入此子系统的group。
root-groups:原系统中可以透过schroot进入此子系统并取得root权限的group。
setup.copyfiles:指定每次进入子系统时,原系统中会被复制进子系统的文件。
setup.fstab:指定原系统当中会被挂载进子系统的目录,格式和系统的/etc/fstab一样。 注意在预设的情况下schroot会自动把host的/home给bind 进来,如果对子系统的/home做变更,原系统也会受到影响。如果没有必要,建议注释掉该行。
setup.nssdatabases:指定每次进入子系统时,原系统中会被复制进子系统的资料库,如passwd、shadow、group等等。注意每次进入都会重新复制一次,所以在子系统内对这些资料库做的变更都会被覆写掉。这个很重要,因为我们希望在原系统增加用户,然后让该用户登陆进chroot环境,所以如果你在chroot中增加一个用户后,再次进入chroot环境时,相关文件会被原系统的覆盖掉。
shell:指定登录chroot环境后使用的shell。
2 修改登入chroot环境时默认加载的文件:
01
#/etc/schroot/default/copyfiles
02
/etc/hosts
03
/etc/resolv.conf
04
/etc/network/interfaces
05
/etc/apt/sources.list
06
/etc/hostname
07
/etc/sudoers
08
#/etc/schroot/default/fstab
09
/proc   /proc   none  rw,bind   0   0
10
/sys  /sys  none  rw,bind   0   0
11
/dev   /dev  none  rw,bind   0   0
12
/dev/pts  /dev/pts  none  rw,bind  0   0
13
/tmp  /tmp  none  rw,bind  0  0
14
tmpfs   /dev/shm  tmpfs   defaults  0   0
15
/run  /run  none  rw,bind   0   0
16
/run/lock   /run/lock   none  rw,bind   0   0
17
/dev/shm  /dev/shm  none  rw,bind   0   0
18
/run/shm  /run/shm  none  rw,bind   0   0
19
#/etc/schroot/default/nssdatabases
20
passwd
21
shadow
22
group
23
gshadow
24
services
25
protocols
26
networks
27
hosts
3 修改ssh配置,让普通用户通过ssh可以直接登录进ssh环境,在openssh 4.9版本后就支持该功能了。在配置文件末尾添加如下:
1
#/etc/ssh/sshd_config
2
Match User test
3
  ChrootDirectory /opt/
4
  ForceCommand internal-sftp
5
  AllowTcpForwarding no
6
Match User guol
7
  ChrootDirectory /opt
8
  ForceCommand internal-sftp
9
  AllowTcpForwarding no
  为啥一定加到ssh配置文件的末尾呢,因为Match配置段的结束是以下一个Match配置开始为止的。Match除了可以匹配user还可以根据很多选项来匹配,具体信息可以man一下。

我们先测试一下目前改进的配置
  1 先测试在本机直接登录chroot环境。分别用test和guol用户测试

可以看到test用户登录进入怎么有warning提示,而guol用户登录却正常。根据提示使用--directory参数。man解释如下:
1
Change to directory inside the chroot before running the command or login shell.  If directory is not available, schroot will exit with an error status.
2
The default behaviour is as follows (all directory paths are inside the chroot).  A login shell is  run  in  the  current working  directory. If this is not available, it will try $HOME (when --preserve-environment is used), then the user's home directory, and / inside the chroot in turn.  A command is always run in the current  working  directory  inside  the chroot.  If none of the directories are available, schroot will exit with an error status.
  根据解释,在登录chroot环境的shell时,会给你选择一个登入时的目录,如果没有设置,默认选择当前执行进入chroot环境的目录,如果当前目录不可用,则会寻找你的家目录、然后寻找根目录。看来执行schroot登录chroot时还和当前上下文有关系。chroot环境重肯定没有/etc/schroot目录了,并且我们在fstab的bind时把/home目录给取消掉了,所以在chroot环境中并没有相关用户的家目录。

改进之后如下:

  2 测试通过ssh直接登陆进chroot环境


这样基本的配置就已经操作完毕,各位可以根据具体需求对chroot环境进行深度定制。
在chroot环境中使用apt-get时,遇到了以下一个错误:
1
dpkg: unrecoverable fatal error, aborting:
2
 syntax error: unknown group 'ssl-cert' in statoverride file
3
E: Sub-process /usr/bin/dpkg returned an error code (2)
  提示在使用dpkg时系统没有ssl-cert组,但是看了宿主系统的group文件,也没有该组,新键该组后就可以正常使用了。

相关内容

    暂无相关文章