Linux安装使用Jailkit来管理用户shell操作的教程

受限shell(Jailed Shell)是一类被限制的shell,它看起来非常像真实的Shell,但是它不允许查看和修改真实的文件系统的任何部分。Shell内的文件系统不同于底层的文件系统。这种功能是通过chroot和其他多种程序实现的。举例来说,给用户建立一个linux shell去让他“玩玩”,或者在一个限定的环境里运行一些程序的所有功能等等。
在这个教程里我们将会探讨在Ubuntu下用jailkit建立一个受限shell。Jailkit是一个让你快速建立一个受限shell的工具,将受限用户放到里面,并配置那些要在受限制环境里运行的程序。

安装jailkit

代码如下:

cd /tmp
wget http://olivier.sessink.nl/jailkit/jailkit-2.16.tar.gz
tar xzf jailkit-2.16.tar.gz
cd jailkit-2.16
./configure
make
make install
cp extra/jailkit /etc/init.d/jailkit
chmod u+x /etc/init.d/jailkit
chkconfig jailkit on

初始化chroot环境

代码如下:

jk_init -v -j /home/chroot sftp scp jk_lsh netutils extendedshell
service jailkit start

配置Jailed Shell

配置受限环境:

我们需要建立一个目录来存放所有受限环境的配置。目录随便放在什么地方,比如我们可以创建个/opt/jail的目录。

代码如下:

$ sudo mkdir /opt/jail

这个目录应为Root所有。用chown改变属主。

代码如下:

$ sudo chown root:root /opt/jail

设置在受限环境中可用的程序

任何程序想要在受限环境中执行则必须用jk_init命令拷贝到目录中。

例如:

代码如下:

$ sudo jk_init -v /jail basicshell
$ sudo jk_init -v /jail editors
$ sudo jk_init -v /jail extendedshell
$ sudo jk_init -v /jail netutils
$ sudo jk_init -v /jail ssh
$ sudo jk_init -v /jail sftp
$ sudo jk_init -v /jail jk_lsh

或一次性解决:

代码如下:

$ sudo jk_init -v /opt/jail netutils basicshell jk_lsh openvpn ssh sftp

像basicshell, editors, netutils是一些组名,其中包含多个程序。复制到jail shell中的每个组都是可执行文件、库文件等的集合。比如basicshell就在jail提供有bash, ls, cat, chmod, mkdir, cp, cpio, date, dd, echo, egrep等程序。

完整的程序列表设置,你可以在/etc/jailkit/jk_init.ini中查看。

代码如下:

jk_lsh (Jailkit limited shell) - 这是一个重要的部分,必须添加到受限环境中。

创建将被监禁的用户

需要将一个用户放入jail里。可以先创建一个

代码如下:

$ sudo adduser robber
Adding user `robber' ...
Adding new group `robber' (1005) ...
Adding new user `robber' (1006) with group `robber' ...
Creating home directory `/home/robber' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for robber
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y

注意:目前创建的是一个在实际文件系统中的普通用户,并没有添加到受限环境中。

在下一步这个用户会被放到受限环境里。

这时候如果你查看/etc/passwd文件,你会在文件最后看到跟下面差不多的一个条目。

代码如下:

robber:x:1006:1005:,,,:/home/robber:/bin/bash

这是我们新创建的用户,最后部分的/bin/bash指示了这个用户如果登入了那么它可以在系统上正常的Shell访问

限制用户

现在是时候将用户限制

代码如下:

$ sudo jk_jailuser -m -j /opt/jail/ robber

执行上列命令后,用户robber将会被限制。

如果你现在再观察/etc/passwd文件,会发现类似下面的最后条目。

代码如下:

robber:x:1006:1005:,,,:/opt/jail/./home/robber:/usr/sbin/jk_chrootsh

注意:最后两部分表明用户主目录和shell类型已经被改变了。现在用户的主目录在/opt/jail(受限环境)中。用户的Shell是一个名叫jk_chrootsh的特殊程序,会提供Jailed Shell。

jk_chrootsh这是个特殊的shell,每当用户登入系统时,它都会将用户放入受限环境中。

到目前为止受限配置已经几乎完成了。但是如果你试图用ssh连接,那么注定会失败,像这样:

代码如下:

$ ssh robber@localhost
robber@localhost's password:
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-25-generic x86_64)
* Documentation: https://help.ubuntu.com/
13 packages can be updated.
0 updates are security updates.
*** /dev/sda7 will be checked for errors at next reboot ***
*** /dev/sda8 will be checked for errors at next reboot ***
Last login: Sat Jun 23 12:45:13 2012 from localhost
Connection to localhost closed.
$

连接会立马关闭,这意味着用户已经活动在一个受限制的shell中。

给在jail中的用户Bash Shell

下个重要的事情是给用户在限制环境中的一个正确的bash shell。

打开下面的文件

/opt/jail/etc/passwd
这是个jail中的password文件。类似如下

代码如下:

root:x:0:0:root:/root:/bin/bash
robber:x:1006:1005:,,,:/home/robber:/usr/sbin/jk_lsh

将/usr/sbin/jk_lsh改为/bin/bash

代码如下:

root:x:0:0:root:/root:/bin/bash
robber:x:1006:1005:,,,:/home/robber:/bin/bash

保存文件并退出。

登入限制环境

现在让我们再次登入受限环境

代码如下:

$ ssh robber@localhost
robber@localhost's password:
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-25-generic x86_64)
* Documentation: https://help.ubuntu.com/
13 packages can be updated.
0 updates are security updates.
*** /dev/sda7 will be checked for errors at next reboot ***
*** /dev/sda8 will be checked for errors at next reboot ***
Last login: Sat Jun 23 12:46:01 2012 from localhost
bash: groups: command not found
I have no name!@desktop:~$

受限环境说'I have no name!',哈哈。现在我们在受限环境中有了个完整功能的bash shell。

现在看看实际的环境。受限环境中的根目录实际就是真实文件系统中的/opt/jail。但这只有我们自己知道,受限用户并不知情。

代码如下:

I have no name!@desktop:~$ cd /
I have no name!@desktop:/$ ls
bin dev etc home lib lib64 run usr var
I have no name!@desktop:/$

也只有我们通过jk_cp拷贝到jail中的命令能使用。

如果登入失败,请检查一下/var/log/auth.log的错误信息。

现在尝试运行一些网络命令,类似wget的命令。

代码如下:

$ wget http://www.google.com/

如果你获得类似的错误提示:

代码如下:

$ wget http://www.google.com/
--2012-06-23 12:56:43-- http://www.google.com/
Resolving www.google.com (www.google.com)... failed: Name or service not known.
wget: unable to resolve host address `www.google.com'

你可以通过运行下列两条命令来解决这个问题:

代码如下:

$ sudo jk_cp -v -j /opt/jail /lib/x86_64-linux-gnu/libnss_files.so.2
$ sudo jk_cp -v -j /opt/jail /lib/x86_64-linux-gnu/libnss_dns.so.2

这样才能正确的定位到libnssfiles.so和libnssdns.so

在限制环境中运行程序或服务

现在配置已经完成了。可以在限制/安全的环境里运行程序或服务。要在限制环境中启动一个程序或守护进程可以用jk_chrootlaunch命令。

代码如下:

$ sudo jk_chrootlaunch -j /opt/jail -u robber -x /some/command/in/jail

jk_chrootlaunch工具可以在限制环境中启动一个特殊的进程同时指定用户特权。如果守护进程启动失败,请检查/var/log/syslog/错误信息。

在限制环境中运行程序之前,该程序必须已经用jk_cp命令复制到jail中。

(0)

相关推荐

  • Linux中基本的模式切换与用户登陆操作讲解

    <1> X Window 与 命令行模式的切换[Ctrl]+[Alt] +[F1]~[F6]:文字界面登录tty1~tty6[Ctrl]+[Alt] +[F7]:图形界面桌面注意:若是以纯 ...

  • Linux下使用quota命令管理磁盘空间的实例教程

    Linux下使用quota命令管理磁盘空间的实例教程

  • Linux系统中管理用户和用户组的相关配置文件简介

    Linux 是一个多用户.多任务的操作系统,理解Linux的单用户多任务,多用户多任务; 用户的角色区分: 用户在系统中是分角色的,在Linux 系统中,由于角色不同,权限和所完成的任务也不同;值得注 ...

  • Linux系统下禁止非WHEEL用户使用SU命命的两种实现方法

    通常情况下,一般用户通过执行“su -”命令、输入正确的root密码,可以登录为root用户来对系统进行管理员级别的配置。 但是,为了更进一步加强系统的安全性,有必要建立一个管理员的 组,只允许这个组 ...

  • Linux Shell脚本系列教程(一):Shell入门

    这篇文章主要介绍了Linux Shell脚本系列教程(一):Shell入门,本文讲解了Shell简介、Shell基本操作、如何打开Shell终端、Shell脚本的概念、如何运行Shell脚本、Shel ...

  • Ubuntu15.04安装Enpass安全密码管理器教程

    Enpass 桌面版完全免费,如果要使用移动版本的话,会有相应的购买费用.默认情况下 Enpass 采用 256-bit AES 算法对用户数据进行加密存储,提供了从其它密码管理应用导入数据的导向功能 ...

  • redhat linux 安装 gcc编译器

    分两种情况: 先看这篇转过来的文章,俺老孙懒得写了。 Linux软件安装通用思路 在Linux系统中,软件安装程序比较纷繁复杂,不过最常见的有两种: 1)一种是软件的源代码,您需要自己动手编译它。这种 ...

  • Linux Shell脚本系列教程(四):使用函数添加环境变量

    这篇文章主要介绍了Linux Shell脚本系列教程(四):使用函数添加环境变量,本文对环境变量的一知识作了介绍,并给出普通添加环境变量和使用函数添加环境变量的方法,需要的朋友可以参考下 一、简介 环 ...

  • Linux Shell脚本系列教程(三):变量和环境变量

    这篇文章主要介绍了Linux Shell脚本系列教程(三):变量和环境变量,本文讲解了普通变量、获取字符串的长度、环境变量等内容,需要的朋友可以参考下 一、玩转变量和环境变量 变量是任何一种编程语言都 ...