Linux chroot Shell —— 简单chroot指定用户

对于Linux服务器,有时需要开放登录权限给一部分用户,但并非所有用户都愿意安分守己,也无法知道谁是不安分守己的,给多一个这些用户开放登录权限,系统的威胁就多了一分。

目前来说比较好的方案是chroot,调用了chroot(),就能把的根目录改成指定的根目录。何为根目录?顾名思义,“根”就是所有目录的“根”,一切目录均从“根”而生,没有“根”就没有其他目录,换句话说,“根目录”就是最原始的目录。你无法访问“根”之前前的数据,没有“根”的时候,怎么可以发展数据呢?

二进制程序chroot乃GNU的核心程序中的一个,Linux发行版本一般都有Coreutils,不过二进制版的chroot在这种情况下帮不上忙,因为仅有特权用户(root)才能调用chroot(),why?想想如果任何人都能调用chroot,如果用户自建了一个自定义了root密码的根文件系统,那他岂不是可以chroot进去后把自己提升为root?

SSH自带chroot功能,不过也仅仅是帮你chroot,如果让所有用户共享一个chroot文件系统,一个用户的数据可能会泄露到其他用户手上,要让不同用户使用不同chroot文件系统,管理和配置起来又麻烦。不仅如此,每chroot一个用户,就需要更改SSH的配置文件,记录多了异常麻烦。

如何简单地管理chroot文件系统,还方便地chroot用户?

Linux-CHROOT-SHELL就是为了解决此问题而生的。

拥有了Linux-CHROOT-SHELL,你只需要建立且维护一个chroot根文件系统。

拥有了Linux-CHROOT-SHELL,你可以让所有用户使用的chroot环境相互隔离。

拥有了Linux-CHROOT-SHELL,你不再需要维护多余的配置文件,繁杂的配置记录。

多说没用,下面让我来告诉大家如何使用Linux-CHROOT-SHELL。

 

Linux-CHROOT-SHELL由C语言编写,代码托管在GIT服务器上,因此需要安装gcc与git:

从GIT服务器上获取源码,并进入源码目录:

编译Linux-CHROOT-SHELL:

一切无误后,编译完毕的二进制文件将会存放到/usr/bin/chroot_shell。

 

由于调用chroot(),内核的要求是特权用户身份,因此需要给予用户临时的root权限,不过不用担心,一旦chroot完毕后,本shell将会自动把身份更改为原用户的身份:

执行这条命令后,程序将会获得set uid和set gid属性,所有执行本程序的用户都可以取得文件所有者和所属群组的权限,所以必须确保本文件的所有者和所属群组为root。不过,既然你编译的时候能把文件输出到/usr/bin/,那你一定是以用root身份操作的,那么本文件的所有者和所属群组也必定是root。

 

接下来构建chroot文件系统:

为了简单起见,这里直接使用了OpenVZ的模板构建chroot文件系统。

构建完毕后,可以对根文件系统进行设置:

例如更改/etc/resolv.conf中所设置的DNS服务器。

设置完毕后,执行exit退出:

 

最后一步,创建用户:

创建用户的方法和平常差不多,只不过需要把用户的Shell指定为/usr/bin/chroot_shell:

添加用户成功后,更改用户密码:

如果要更改原有用户的Shell,使用usermod即可:

别忘了,还要同步passwd的记录到chroot文件系统:

可以把这个命令写到cron任务中,实现周期性同步。

 

接下来,你可以尝试使用指定了chroot_shell的用户登录:

user1

user2

可以看到,chroot_user和chroot_user2互相无法访问对方的目录,根据下图,可以看出两个chroot的用户无法访问原根存在的文件,说明chroot成功:

root

不仅如此,chroot后,用户还能访问自己家目录原有的数据,此外,除了用户自己的家目录和/tmp,所有其他目录均为只读模式,/tmp也实现了隔离,所有用户使用的/tmp不相干扰,相互独立。

 

由于没有挂载/proc和/dev,用户自然无法调用程序查看系统信息。

 

有了chroot shell,chroot用户变得简单起来,再也不用担心给了用户登录权限后,给服务器增加安全隐患了。

Debian与Ubuntu下配置LDAP登录身份验证

前几天在两个使用Ubuntu Server 12.04的 VPS上搭建了LDAP环境。

Ubuntu使用LDAP身份验证,仅需从更新源安装libpam-ldap nscd这两个DEB包,

然后根据引导一步步填入信息,再修改下pam的配置文件即可使用。

不过昨天在给两个个使用Debian的虚拟专用服务器使用同样的方法安装并配置LDAP身份验证客户端时,就一直弄不好,总是无法通过验证,从/var/log/auth.log文件可以读取到类似的信息:

谷歌了下有关的资料,但并未找到有效的解决方案。昨天尝尽各种方法折腾了好久……

今天早上起来用search从更新源看了下与ldap有关的DEB包,看到一个libnss-ldap,想起数天前弄pam_mysql时,也要安装一个libnss-mysql,于是尝试安装了这个包。

同样,根据引导一步步填入信息,然后修改pam的配置文件。

再次使用LDAP中已添加的账户登录,成功通过验证。

 

为何有如此差异?

先来看看Ubuntu下安装libpam-ldap nscd这两个包时输出的信息:

再看看Debian下安装libpam-ldap与nscd时输出的信息:

可见,Ubuntu自动安装了数个额外的DEB包,其中包括了libnss-ldap,而Debian是作为建议的DEB包出现,并没有自动安装。相信很多人都和我一样,除非出现错误信息,否则使用apt-get或yum安装东西肯定不会仔细看这些,自然也不会留意到有建议安装的包……

再来看看Debian下安装libnss-ldap时输出的信息:

这就充分说明,在Debian下配置LDAP验证,libnss-ldap这个包是最关键。

 

最后就是配置文件。

Debian下PAM的LDAP验证客户端的配置文件有两个,分别是pam-ldap和libnss-ldap的,他们在以下路径:

密码则在以下两个文件中:

Ubuntu应该是libnss-ldap与pam-ldap共用配置文件,其路径为:

密码文件在此:

 

WHMCS LDAP Modules

最近有人向我谈起一个与一账户信息在多个OpenSSH Server上同步的问题。

这两三天我抽时间测试了pam_mysql,pam_radius,以及OpenLDAP这三个东西。其中pam_mysql,pam_radius虽然可以用某个服务器验证登录信息,但是都需要在各个服务器上使用useradd添加该用户。

OpenLDAP最完美,仅需在LDAP上添加一个记录,就可使用已添加的用户的信息登录到各个服务器。

考虑到谈起这个问题的人是想使用WHMCS开通SSH账户的,于是我弄了个WHMCS的LDAP模块。

这模块需要PHP的LDAP扩展,你们可以通过phpinfo()函数查看是否有ldap扩展,如果没有,就到php.net下载你正在使用的版本的PHP源码,用phpize编译吧。

WHMCS LDAP模块下载地址:http://soft.yzs.me/ldapposixaccount.tar.bz2

使用方法:

首先得配置好你的LDAP Server与其他要使用LDAP验证的服务器,这些我就不多说啦,LDAP发展这么久,肯定不少人发过教程,发一个已经可以谷歌到答案的东西,那就没意义啦。

接下来要在WHMCS的服务器设置处添加服务器,模块当然是选择Ldapposixaccount了,你可以把各个服务器的IP填入到Assigned IP Addresses中,那样用户在服务信息处就可以看到各个服务器的IP了。用户名填写你的登陆DN(Login DN),例如cn=admin,dc=domain,dc=com,至于密码,你自己知道。接着创建服务器组。

进入产品设置页面,添加产品,Module Settings中选择Ldapposixaccount。

这里解释一下各项的设置。

Base Distinguished Name:最基础的dn,例如dc=domain,dc=com。

Initial uid&gid Number:填入一个数字,新添加的用户的uid和gid将会从这个数字开始递增,为了不要与/etc/passwd与/etc/group中的重复,建议设置到10000以上。

Users’s Home Directory Base:填入一个文件夹的路径,新建的用户的home目录将会以其用户名命名创建至此目录中,例如我设置为/home/,那么新建的用户的home目录将会是/home/用户名。

Login Shell:新建的用户的shell,例如/bin/bash,更多的shell可以查看/etc/shells。

Group Organisational Unit:在你LDAP Server中储存用户组的Organisational Unit。

User Organisational Unit:在你LDAP Server中储存用户的Organisational Unit。

Module Settings

 

如果你设置的信息无误的话,那么接下来就可以通过WHMCS创建用户了。

 

LDAP