by Mark Nielsen
介绍
什么是chroot?chroot基本上重定义了一个程序的运行环境更确切地说它重定义了一个程序(或登录会话)的ROOT目录或/也就是说对于chroot了的程序或shell来说chroot环境之外的目录是不存在的
那这样又有什么用呢?如果入侵者入侵了你的电脑他们就不能看见你系统里所有的文件了这样就限制了入侵者可能执行的命令从而禁止了他们溢出不安全文件的机会但唯一的缺点是我认为这不能阻止他们察看网络连接和其他资料因此你应做一些本文未深入涉及的事情
保护网络端口
察看是否所有的服务都以非root权限运行另外是否所有的服务都进行了chroot?
把系统日志转移到其他电脑
分析日志文件
分析那些试图探测你的计算机的随机端口的人们
限制服务所占用的cpu和内存资源
激活用户配额
我认为(把以非root权限运行的服务进行)chroot可以作为一道安全防线的原因是 如果入侵者得到了一个非root账户但没有使他们得到root权限的文件的话那么他们只能对所入侵的区域造成破坏 而且如果root账户是入侵区域大部分文件的拥有者的话入侵者是没有多少攻击的选择的显然如果你的账户被入侵 那一定是某些地方出问题了但最好能减少入侵者所能造成的破坏
请记住 我所做的并不是%正确的这是我第一次尝试这样做就算只是部分有效的话也应该是很容易完成基本的配置的我想做一个chroot的HOWTO现在所说的只是一些基本的东西
怎样把所有的服务都chroot呢?
好的让我们先创建一个目录/chroot然后以下面的格式把我们的所有服务都放在它下面
Syslogd 分别和每一个服务一起运行在hroot环境下
Apache 运行在/chroot/httpd下
Ssh 运行在/chroot/sshd下
PostgreSQL 运行在/chroot/postmaster下
Sendmail 运行在 chroot环境下但不幸的是它必须以root权限运行
ntpd 运行在 /chroot/ntpd下
named 运行在 /chroot/named 下
每一个服务都是完全与外界隔离的
我用来创建chroot环境的Perl脚本
下载Config_Chrootpltxt并更名为 Config_Chrootpl 这个Perl脚本让你列出所有已安装的服务查看配置文件配置服务并启动和停止服务通常这就是你应该做的
创建chroot目录
mkdir p /chroot/Config/Backup
下载Config_Chrootpltxt 并更名为 /chroot/Config_Chrootpl
如果你的家目录(home directory)不是/chroot请把Perl脚本里的$Home 变量作相应的改变
下载我的配置文件
现在重要的是我只在 RedHat 和 RedHat 上测试过
请在Perl脚本里作相应的改变以适应你的发行版
关于chroot我写了一遍很长的文章但有了我的脚本它变得短了很多在chroot了很多服务之后我注意到这些服务中需要被chroot的文件和配置都很相似对一个特定的服务来说判断哪些文件需要拷贝的最容易的方法是查看man如果程序要用到库文件就再键入ldd /usr/bin/file你还可以把你正在安装的服务进行chroot并手动启动 看看出了什么错或查一查它的日志文件
通常要安装一个服务可以这样做
cd /chroot
/Config_Chrootpl config SERVICE
/Config_Chrootpl install SERVICE
/Config_Chrootpl start SERVICE
对 Ntpd 进行 Chroot
Ntpd 是一个时间服务它使你的计算机以及其它计算机和实际时间同步把它chroot是很简单的
cd /chroot
# 如果你没有使用我的配置文件请把下一行的注释去掉
#/Config_Chrootpl config ntpd
/Config_Chrootpl install ntpd
/Config_Chrootpl start ntpd
对 DNS 和 named 进行 Chroot
已经有了howto文件请看
或
如果你想用我的脚本
cd /chroot
# 如果你没有使用我的配置文件请把下一行的注释去掉
#/Config_Chrootpl config named
/Config_Chrootpl install named
/Config_Chrootpl start named
把 Syslog 和其他服务一起进行chroot以及我所遇到的困难
我想把syslogd进行chroot我遇到的困难是syslogd默认使用/dev/log目录而chroot了的服务是看不见这个目录的因此用syslogd做日志记录就不是很方便了下面是可能的解决方案
把syslogd分别和每一个服务进行chroot我实际上就是这样测试的而且记录了一些日志我不喜欢这样做因为我有一个以root权限运行的服务
看看我们是否能连接到外部日志记录设备
直接把日志记录到文件上而不是通过syslogd这可能是最好的安全选择了尽管如果被入侵入侵者可以随意改动日志
配置syslogd来查看几个地方从而得到所有的服务你可以用syslogd的a选项来做到
我的唯一的解决方案是确保syslogd分别和每一个服务进行chroot我喜欢这样的解决方案它以非root权限在自己的chroot环境(有些像网络端口)下记录日志这也许是可行的但我正在停止我所做的然后寻求一个更好的解决方案
如果你不想为每一个服务都配备一个独立的syslogd那么当你的系统运行syslogd时请在syslogd开始时运行下面命令
syslogd a /chroot/SERVICE/dev/log
如果有ssh和dns要运行那么看上去应该像这样
syslogd a /chroot/ssh/dev/log a /chroot/named/dev/log a /dev/log
关于syslogd我最后想说的是我希望它能运行在非root账户下我试了几个简单的东西但都没有成功于是就放弃了如果能让syslogd和每一个服务一起运行在非root账户下我就会对我的安全措施感到满意了如果可能的话最好将日志记录到外部设备上
对 Apache 进行 Chroot
很简单一旦我运行它就可以执行Perl脚本现在我的配置文件是很长的因为我必须在chroot环境下包括Perl和PostgreSQL函数库有一件事要注意如果你要连接到数据库上请确保你的数据库服务运行在 回环设备上并在关于DBI的Perl脚本中指定主机为 下面是我怎样把apache永久连接到一个数据库上的例子
$dbh ||= DBI>connect(dbi:Pg:dbname=DATABASE {PrintError=>});
if ($dbh ) {$dbh>{PrintError} = ;}
else
{$dbh ||= DBI>connect(dbi:Pg:dbname=DATABASE;host=
{PrintError=>});}
源地址:
把apache编译并安装在你系统的/usr/local/apache目录下然后运行Perl脚本
cd /chroot
# 如果你没有使用我的配置文件请把下一行的注释去掉
# /Config_Chrootpl config httpd
/Config_Chrootpl install httpd
/Config_Chrootpl start httpd
在文件里包含以下几行:
ExtendedStatus On
status> SetHandler serverstatus
Order denyallow
Deny from all
Allow from
info> SetHandler serverinfo
Order denyallow
Deny from all
Allow from
然后在你的浏览器里输入 或 并检查!
对 Ssh 进行 Chroot
首先如果把ssh从端口重定向到就理想了然后当你启动ssh时让它在一个非root账户下监听端口在初始化ssh连接时我们只想让有密码的安全账户连进来但不做其他任何事情在他们登录之后运行在端口: 的第二个ssh程序让它们连接到真正的系统 这第二个ssh程序应该只在回环设备上监听这才是你应该做的现在我们不打算去做我们要做的唯一的事情是以这个chroot的ssh做个例子上面提到的一个练习就请读者自己完成让sshd运行在非root账户下再安装第二个监听回环设备的sshd以使人们连进真正的系统
此外我们只要把ssh进行chroot并让你看一看那样做的结果(如果你只做了这些你不必观察整个系统)当然如果能把日志记录在外部设备上就更好了我们应该用OpenSSH但为了方便(这好像不是一个好的借口)我用的是一个商业的SSH
源地址:
在/usr/local/ssh_chroot下安装ssh并运行脚本
cd /chroot
# 如果你没有使用我的配置文件请把下一行的注释去掉
# /Config_Chrootpl config sshd
/Config_Chrootpl install sshd
/Config_Chrootpl start sshd
我觉得把ssh放在chroot环境下的一个真正有