打造Ubuntu下的SLAMP(续)

简介:

现在要安装Chroot环境了,为什么要安装Chroot环境呢?因为它安全,chroot可以把进程的根目录变成不是“/”目录的其他目录。这就意味着该进程被锁定到一个虚拟文件系统的根中。如果你再适当地配置你的chroot jailApache和它的子进程(比如CGI脚本)将除于chroot jail环境之外不能访问其他任何东西。同时,非根进程也不能离开chroot jail环境的。(注意:从上面描述我们不难看出把设备文件,被suid的二进制文件以及硬链接放入jail是十分不明智的。原因?因为它们可以破坏 chroot jail环境)

使用chroot环境有两种方式:一则是常规方式,在该方式下你必须要十分小心地建立一个“虚拟根”,并将程序可能需要的文件给包含进来。一般说来有:

* C 语言库

其他的库 (如libssllibmlibmysqlclient等)

解析配置文件(如/etc/nsswitch.conf/etc/resolv.conf等)

用户相关文件 /etc/passwd, /etc/group

 log 文件指定目录

程序所需的附加模块(如mod_php  其他模块)

然后,你得运行程序,读错误信息,拷贝错失的文件,拆腾一通之后,得以运行正常。但还没完,想一下升级时的情形吧,你将不得不保持你当前的“虚拟根”,如果在libssl中有一个Bug,那么你就必须要将新版本放在两个地方。是不是有点吓着了?所幸还有另一种mod_chroot方式。 mod_chroot允许你在一个chroot jail环境里运行Apache2,而无需附加任何文件。chroot()系统会在程序开始引导时是最后被调用,因为Apache2在开始引导期间需要访问整个文件系统那时所有的库文件已被引导并且日志文件也已经被打开。

运行chroot jail环境中的Apache(和CGI/Perl/PHP)是很需要些技巧的。我们下面开始构造我们的chroot环境。首先安装mod-chroot

$sudo apt-get install libapache2-mod-chroot

该包会在/etc/apache2/mod-available/目录中生成一个mod_chroot.load,然后我们制作mod_chroot.conf文件:

>ChrootDir /var/www

为使该模块能被引导,可以做该模块的软链接,如果想快点的话,可以用

$sudo a2enmod mod_chroot

然后为了使所有配置都得到改变,运行

$sudo /etc/init.d/apache2 force-reload

但如果这样的话,就存在一个问题,我们的DocumentRoot/var/www的,现在虚拟根已经指向了/var/www,这样我们就必须将DocumentRoot修改成“/”才算正确!所以要修改/etc/apache2/sites-enabled/000-default文件

代码:

NameVirtualHost *

ServerAdmin webmaster@localhost

# DocumentRoot /var/www/

#

# Options FollowSymLinks

# AllowOverride None

#

#

# Options Indexes FollowSymLinks MultiViews

# AllowOverride None

# Order allow,deny

# allow from all

# This directive allows us to have apache2's default start page

# in /apache2-default/, but still have / go to the right place

# Commented out for Ubuntu

#RedirectMatch ^/$ /apache2-default/

#

Options FollowSymLinks

AllowOverride None

Options Indexes FollowSymLinks MultiViews

AllowOverride None

Order allow,deny

allow from all

# This directive allows us to have apache2's default start page

# in /apache2-default/, but still have / go to the right place

# Commented out for Ubuntu

#RedirectMatch ^/$ /apache2-default/

# ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

#

# AllowOverride None

# Options ExecCGI -MultiViews +SymLinksIfOwnerMatch

# Order allow,deny

# Allow from all

#

ErrorLog /var/log/apache2/error.log

# Possible values include: debug, info, notice, warn, error, crit,

# alert, emerg.

LogLevel warn

CustomLog /var/log/apache2/access.log combined

ServerSignature On

# Alias /doc/ "/usr/share/doc/"

#

# Options Indexes MultiViews FollowSymLinks

# AllowOverride None

# Order deny,allow

# Deny from all

# Allow from 127.0.0.0/255.0.0.0 ::1/128

做完了之后,来个$sudo /etc/init.d/apache2 force-reload 重新引导Apache2,成功!高兴,再打开Firefox,地址栏中输入localhost,回答拒绝。??!!

$more /var/log/apache2/error.log

>[Sun Jul 17 11:41:35 2005] [error] (2)No such file or directory: could not create /var/run/apache2.pid

>[Sun Jul 17 11:41:35 2005] [error] apache2: could not log pid to file /var/run/apache2.pid

原来在Apache启动时,由于mod-chroot最后生效,所以apache2.pid的路径是对的,但在mod-chroot生效之后,根已指向了/var/www,那所谓的 /var/run/apache2.pid实际上指的是/var/www /var/run/apache2.pid了,而这个目录是不存在的。这个好办,没有的话创建好了!

$sudo mkdir -p /var/www/var/run

$sudo chown -R root.root /var/www/var/run

$sudo ln -s /var/www/var/run/apache2.pid /var/run/apache2.pid

第三步很重要,为的是保持一致性!

同样的,对LockFile也做相同处理

$sudo mkdir -p /var/www/var/lock/apache2

$sudo chown -R root.root /var/www/var/lock/apache2

$sudo ln -s /var/www//var/lock/apache2/accept.lock /var/lock/apache2/accept.lock

如果你还要用到其他的,请参照上面自行修改

然后创建网站的缺省目录

$sudo mkdir /var/www/htdocs

然后来重启一次:

$sudo /etc/init.d/apache2 force-reload

运行正常!再在/var/www/htdocs目录下创建一个test.php文件:

> > phpinfo();

>?>

再使用Firefox,输入 http://localhost/test.php ,如果看到了信息就说明你成功了!(还记得我们在前面php.ini里对phpinfo()函数的限制吗?在测试时,请先把它打开,测试完了之后再行关闭)




本文转自 firehare 51CTO博客,原文链接:http://blog.51cto.com/firehare/588240,如需转载请自行联系原作者

相关文章
|
安全 Ubuntu 关系型数据库
|
26天前
|
Ubuntu NoSQL 关系型数据库
Ubuntu系统下安装常用软件
Ubuntu系统下安装常用软件
57 0
Ubuntu系统下安装常用软件
|
1月前
|
Ubuntu Linux C语言
Ubuntu下安装vscode,并解决终端打不开vscode的问题
Ubuntu下安装vscode,并解决终端打不开vscode的问题
146 0
|
2月前
|
存储 Ubuntu 网络协议
|
1月前
|
Ubuntu Docker 容器
如何在Ubuntu上安装Docker?
【2月更文挑战第10天】
256 0
|
2月前
|
负载均衡 Ubuntu 应用服务中间件
|
27天前
|
Ubuntu 关系型数据库 MySQL
Ubuntu 中apt 安装MySQL数据库
Ubuntu 中apt 安装MySQL数据库
68 0
|
4天前
|
Ubuntu Docker 索引
ubuntu 20.04 安装docker教程和安装中遇到的问题解决方案(超详细 附加图文教程)
ubuntu 20.04 安装docker教程和安装中遇到的问题解决方案(超详细 附加图文教程)
27 0
|
6天前
|
Ubuntu 数据安全/隐私保护
在UBUNTU虚拟机上安装R软件包
在UBUNTU虚拟机上安装R软件包
|
7天前
|
存储 编解码 Ubuntu
0-零基础安装ubuntu(超详细安装步骤)
0-零基础安装ubuntu(超详细安装步骤)