Linux和Solaris建立Apache的虚拟根环境
上一篇 / 下一篇 2007-09-28 15:13:12 / 个人分类:Solaris學習
介绍
?7~2j @~ u)] E/L0IXPUB技术博客0X_ _A8|Q%L"fL我曾经利用CERN httpd安装和使用了已经虚拟根环境下的Web服务器。对Web服务器建立虚拟根环境有各种各样的优点和缺点。在Web发展的早期阶段,这种技术还提供了额外的有价值的安全机制。但是在这个apache的领域中,这种技术似乎没有太大的用处,可它仍旧很有趣。IXPUB技术博客-dh;C]C@}s)}
;Y%xE/L3v0我提供对apache在linux和soloris环境下实现虚拟根环境的安装的例子,它既可以做标准的编辑(在必要的时候被标记为non-DSO)或者做动态共享对象编辑(在必要时它将被标记为DSO)。选项为DSO的Solaris的例子还没有进行文档化,所以我没有测试它(我打算在测试时使用Solaris 8)。IXPUB技术博客#h:sz:EYz#_
IXPUB技术博客G NT1vob+^7D sJ在Linux上安装一个虚拟根环境化的Apache目录树是相当的简单的。这个例子使用的是Red Hat 6.*和Apache 1.3.12。同时,它也包含PHP4(作为一个Apache模块),以及在虚拟根环境化的目录树上的perl5的安装。另外还安装了mod-ssl和mod-perl。IXPUB技术博客d*uLP8u7j&yK(N
R(p.D*S8dI }N0该例也假定Red Hat 安装比较完整 (即:有足够的文件、库和开发工具)。注意,如果你安装Red Hat时用了custom(prefered)的配置,并且选择了development选项;或者你就是使用了服务器(server)配置,你都会有一个完全的开发环境。IXPUB技术博客*LK5`Urj
C5e3y e5Xwi-E0Mysql3.22.27并没有安装在实现了虚拟根环境目录树中,但是为了完整性我们在此将它包含进去。
1Y3Zmz"z\5@(S0JuwJEa`&j0声明IXPUB技术博客{}:l7aFmm1w
3n Hf*]pp{0我并不是个专家:),尤其在加密方面(openssl、mod-ssl和company)我的水平更是有限。我也是个普通的人,也会犯错误,所以,如果你发现了什么或是有什么建设性的意见,请告诉我。IXPUB技术博客C"O7x^ JY;emZ
1JW;g"| `0我写这篇文章只是希望,你能从中学到一些东西,获得一些帮助。我也可以经常提供一些RPM,但如果你知道你可以从草图开始,独立的建一个自己的现代Web网站,那恐怕会更有趣些。但是,在当前的Internet上,学习、理解关于运行一个Web网站各种问题以及所冒的风险,都要靠你自己了。IXPUB技术博客:h` OsAZ0^i
IXPUB技术博客1BO _u h]LSolaris 例子IXPUB技术博客Z3~;e4T"g
e;^-\@e
对Web目录树进行虚拟根环境化的solaris的例子与Linux的例子十分相似。当然,如果你没有安装GNU开发环境,solaris的例子就不可能像Linux例子那样容易。
Solaris的例子文档在另一个web页中。IXPUB技术博客'W]i4@$M
b/@FC8JYX0附加的注释IXPUB技术博客PG-M6vjHi$HI`
6Mkss:Sn-r.PhjW0使用工具ldd来发掘必要的共享库。IXPUB技术博客'Y@/{3gm6J'v pc,W
在这个例子中,用户有这样的提示:IXPUB技术博客5vs-] c#VD]8W'v!c
j
root user:IXPUB技术博客t6s:q}]]C#T
ROOT#IXPUB技术博客6kw"^7B9rA$t
ordinary user:
,@ Y#W.u;w_2p0$IXPUB技术博客f4BGds0Q,n
我基本上都是作为普通用户而不是root用户来编译和安装各种软件的。这有助于避免对文件系统(尤其是在使用不熟悉的软件时)造成的不必要的破坏。这也有助于在进行危险操作前给以警示,例如在已经安装的二进制文件上的“setuid"操作,以及在不寻常的地方安装文件的操作等危险操作前的警示。IXPUB技术博客u!u3S"T1y5l wc
在这个例子中,我作为用户soft:soft来进行编译和安装等操作。
6VU:J,g5ef0v!u0其实,只要保证软件的所有者的身份ID与Apache目录树用户的ID(在本例中我们用的是888)不同就可以了。IXPUB技术博客Fl#k.w5e.K'w
IXPUB技术博客 {!D&[$~:{+~SRed Hat的缺省root环境中,有一个交互式的开关-I被加在命令cp、mv和rm上。如果你的root环境中没有这些设置,建议你最好将它加上。你可以检查下面的文件:IXPUB技术博客 }[!ZY-bT+}#M
y%`9{};h2b$P_I0ROOT# alias |grep '-i'
+Y:[2d L+XO0alias cp='cp -i'
B6t Ik`}wd
c%I(E3[0alias mv='mv -i'
b8z_~#wVX0alias rm='rm -i'IXPUB技术博客P
p9uJw ZL
7qr-U0B3j-I"AWl0你应当使你的配置尽量的简单——不要安装那些用不到或根本不必要的模块。一般说来,一个标准的non-DSO(非动态共享对象)Apache,在安装一个perl,对大多数人都是足够的。
'g,BZZ,Z7XU1U0关于DSO和mod-ssl需要注意的地方:IXPUB技术博客oIfA{ YB:i
如果你打算把任何东西都按照DSO模版进行编译,那你首先要建立mod-ssl,然后你确实要按照下面的顺序建立自己的Apache目录树。Mod-ssl会明显的修改Apache 建立的目录树,据我的经验,在使用我们刚才提到的软件版本的前提下,下面的顺序是做起来最简单的顺序:
建立Apache
w}9d1Fr j'@.Y0在Apache中建立和增加mod-sslIXPUB技术博客2g`k+?;ua+lP
在Apache中建立和增加php 和mod-perl。
0{ w
D\o{HA3f#Qq0你应该在适当的地方记录下来你是如何编译你的目录树的,以便再做时参考。(你可以将其打印出来,并加上注释)
,L*pS
|6a/o0安装了各种软件之后,最终的虚拟根环境化的目录树有23MB,其中包含了8MB的共享库和perl。下面是基于DSO安装的文件的总结(以KB表示):IXPUB技术博客~ec@zP#Qp1~z
ROOT# pwdIXPUB技术博客`o~7O(VI0_
/wwwIXPUB技术博客Jm}
\9C)c
ROOT# du -s .
3ao:fZ"{(E022737 .
I-Mfvx-d*]0ROOT# du -s *IXPUB技术博客B$D s+iW
6832apacheIXPUB技术博客\+w_;k:x
0 bin
}Q;uN|P W.n01 dev
y1gc0t*[07 etc
-o7y1Zw;C-}5x06679lib
%mk0eM:L$K6[9G01 tmpIXPUB技术博客I3w)U w
@A9t
9215usrIXPUB技术博客*J*\Dq^ic
1 webhomeIXPUB技术博客(t,];]|S'Rh
ROOT# du -s apache /*IXPUB技术博客I:p/X.[;Mt:~
600 apache /bin
OV5lWj0Qf4G*XPEt03 apache /cgi-bin
!wgG,GZ0125 apache /confIXPUB技术博客:K6Eq,uH:v?'b
1560apache /htdocs
cn&~eCY]t3d0133 apache /iconsIXPUB技术博客oIP'S)n&Hlc*y
392 apache /include
VpI}J'wFDG6@03925apache /libexecIXPUB技术博客+~N6dGr!s
64 apache /manIXPUB技术博客9Jy/Bn9Bt4c
29 apache /varIXPUB技术博客 \1s!~+|F+j
ROOT# du -s usr/*IXPUB技术博客*F V]
B7K0{\)k
8410usr/Local
FG*w:ud.F0336 usr/bin
Hv
|z SQ
kW T0340 usr/libIXPUB技术博客'aFwcXg#d)Zz
128 usr/shareIXPUB技术博客9f^ZW(@`}
1.获得源代码IXPUB技术博客T+lmi7|2I%S}
C P:Md'k{?*i0如果你想将一个包加入到你的虚拟根环境化的目录树中,那你必须获得这个包中任何一个文件的源代码。多数源文件都可以从相应的Linux版本的被称为SRPMs(RPM源代码包)的原码光盘中获取;当然也可从tarball文件(.tar.gz)中获取(这种方法很适合于你的带宽有限的情况)。IXPUB技术博客G%hvqZ$D7e
3[fc6At!K)w5xE0在Red Hat 系统中你作为root用户安装Source:
Y5wU,l5w0G0IXPUB技术博客 c)K g4U_ROOT# rpm -i /path/to/SRPMfile.src.rpm
1dR`JnK/eW0IXPUB技术博客3U9T/q*_d1I;T.ow然后,在/usr/src/redhat/SOURCES/目录中提取出源代码。
GQ#gE;uz.| }-o0IXPUB技术博客dJd0V;G-dY!p!{"f在我们的例子中我将指出,在Internet上你可从何处获取这些源代码:
qr~`:I;Q ^ H&{0IXPUB技术博客O(t:W^$b7M"S?$]软件包版本号源代码文档信息
$z~Z5?d)N*w^0Apache 1.3.12www.apache.org/dist/ www.apache.org/docs/IXPUB技术博客&Xm5PCtQEX[
MySQL3.22.27 www.mysql.com/downloads www.mysql.com/documentation/IXPUB技术博客'cy6^ aw/tlx
PHP 4.0.2 www.php.net/downloads.phpwww.php.net/docs.phpIXPUB技术博客'\ b&~$]7`ry
Perl 5.00503 www.cpan.org/src/www.cpan.org/doc/manual/html/index.htmlIXPUB技术博客I$j1P$Z
h}v,X
mod_perl1.24 perl.apache.org/dist/ perl.apache.org/#docsIXPUB技术博客O.s/frni
Hello.pm perl.apache.org/dist/contrib/
$z;G0]+V#Z0mod_ssl 2.6.6-1.3.12ftp://ftp.modssl.org/source/ www.modssl.org/docs/2.6/IXPUB技术博客#D e1l{;^9g
OpenSSL 0.9.5aftp://ftp.openssl.org/source/ www.openssl.org/support/faq.html
:}y9SPY^v0RSAref 2.0google search google searchIXPUB技术博客m'oy s@wM!p
:IO0C Vmt,jc4S$S02.步骤细节IXPUB技术博客?Ks~+v2k
$N/ok!d"{$XP0准备好一个虚拟根环境化后的文件系统IXPUB技术博客KNgS)F9ElL
\3k1BvOyY-u02.1 在任何一个地方安装目录树IXPUB技术博客'F C~;~.rtZ
IXPUB技术博客pC1vsWc6G `注意:最好是在另一个磁盘上,或是在非系统分区上安装,这样可以避免别人从Web目录树以外建立到文件的连接,但是你可以使用symlink(例如:/www)连接来找到这棵目录树。
n2Y{"b&[B-B"ZH0 \1A4f7I,i.Cl0\E0ROOT# mkdir /export/misc/www
P].N9Aw-N+P0ROOT# ln -s /export/misc/www /wwwIXPUB技术博客{*R.ef[&V L
2.2 生成基本的目录,bin将是usr/bin的连接IXPUB技术博客M4{4dH{*TI+?f'i`%{(k
IXPUB技术博客(`8L9mDBl5l注意: 在这些例子中(除了我直接从一般文件系统中拷贝的代码)我都省略了前导的“/”,所以,注意不要将你的虚拟根环境化的目录树与真正的“/”混淆。
Ks|7pHKPjM7M0\-O.]7p}0在下面我将用紫红色标记出虚拟根环境化的文件IXPUB技术博客0@+M4S'\#m ]$Qk*w
O&kLQ9a{pAU-x0ROOT# cd /wwwIXPUB技术博客5bv ~d;IY#G
ROOT# mkdir -p usr/bin usr/lib lib etc tmp dev webhome
1M$S(EU+IXk5F%O0ROOT# ln -s usr/bin bin
$fc^-y1a5}LVS02.3 /tmp是假定的专用permsIXPUB技术博客({C+tCOM~k
IXPUB技术博客U.k:k8Zq8d`%O0@ROOT# chmod 777 tmp
B,@T$jT&]#^/h]y n0ROOT# chmod +t tmpIXPUB技术博客p/A t4bj
0b+z(i8Vb*Yr3C#q02.4 构造特殊的装置 dev/null
Rjx(BM0IXPUB技术博客t;iP;\'f6|8W8aROOT# mknod -m 666 dev/null c 1 3
'|,m)@}8h\ l0IXPUB技术博客8y{1U$BqaV)Y)@7e2.5 为你自己的时区设定时区信息(这里使用的是MET)
uAE6\%r7c)A~0IXPUB技术博客b%Y.c3O?8x/QROOT# mkdir -p usr/share/zoneinfoIXPUB技术博客,p Nu-S4Vo6H
ROOT# cp -pi /usr/share/zoneinfo/MET usr/share/zoneinfo/
v?0G5b3v4x\6X(Ba0ROOT# cd etc
@ j5kT$JHL5r4w M0ROOT# ln -s ../usr/share/zoneinfo/MET localtime
-eOfl`$n,]{]0ROOT# cd ..
2.6 你会发现由于缺乏本地设置,perl和mod-perl多有不便,但你可以通过在实现了虚拟根环境目录树中安装本地文件来克服它:
3uO-NL)BG-E0IXPUB技术博客 ~.Ju5I1i*q&L]ROOT# set |grep LANGIXPUB技术博客U3v+zo oL2z
m
LANG=en_USIXPUB技术博客G:ura3Nq
ROOT# mkdir /www/usr/share/locale
~vEJk [0ROOT# cp -a /usr/share/locale/en_US /www/usr/share/locale/
;K$C!M[N8lZy02.7 现在,在可以提供非常基础的虚拟根环境化的文件系统的共享库IXPUB技术博客8c|,`w~
,eo1D L5HnF#`0ROOT# cp -pi /lib/libtermcap.so.2 /lib/ld-linux.so.2 /lib/libc.so.6 lib/
v~E(RTOZVE8~Q0U(g["h'p8o02.8 测试你的目录树(Apachect1后面将要用到“cat”,但也不是必需的)IXPUB技术博客,W-]P W1AW
#W c}fh;S0ROOT# cp -pi /bin/ls /bin/sh /bin/cat bin/
-ZKEw5tEM'H0ROOT# chroot /www /bin/ls -l /IXPUB技术博客)LTP(j {
Cz;d
G\;DZg,V"f6x v0lrwxrwxrwx 1 00 7 Jan 29 09:24 bin -> usr/bin
CB.g1@ A+fX6v0drwxr-xr-x 2 001024 Jan 29 09:28 devIXPUB技术博客J0cc9AR
drwxr-xr-x 2 003072 Jan 29 13:17 etcIXPUB技术博客|&hhE\
drwxr-xr-x 2 001024 Jan 29 13:12 lib
:Vm$el8[f'A'}0drwxrwxrwt 2 001024 Jan 29 09:23 tmp
)}$W1Nz+V:V$u0drwxr-xr-x 5 001024 Jan 29 09:23 usr
v ]C~(P0drwxr-xr-x 2 001024 Jan 29 10:41 webhomeIXPUB技术博客#hL r!g+f~rBI
/r f;o/C+J]6R02.9 你可以移动一下ls,它只是用于测试的。IXPUB技术博客J9U,h1r6H6a Q%Ag
8D*vJ5_xeF4D0ROOT# rm bin/lsIXPUB技术博客e5M6o| YQ.T:{j
IXPUB技术博客/RpE^l ?3.准备一个用户和名字服务器IXPUB技术博客.s,|M"Vz([
{*LvtG2Y0下面我们生成一个运行Apache的用户,下面是这种配置的必要的命名服务:
[&YZ-^ C0IXPUB技术博客1i:ghek F.V`3.1 生成一个不存在于系统上的新的用户,给他起一个特殊的名字和用户ID(例如888)。IXPUB技术博客qj]8MA)nn
.n A4m T,?6r0注意:对于存在真正的鉴定文件(/etc/passwd /etc/group)的user.group,这并不是必需的,完全有你决定:
h}1?_J6dW,V\2P0gxd0p"\M0jK'C1y2d0ROOT# cd /www
2aO7L/V;b[0ROOT# touch etc/passwd etc/group etc/shadow
.f~ Z_],[}0ROOT# chmod 400 etc/shadow
R%Y5H,i!y'BQ03.2 编辑三个文件,在这个例子中,我只是将数据再传回文件中:IXPUB技术博客F5H2b:gA't
IXPUB技术博客!Qrp_F9NJn.hrROOT# echo 'www:x:888:888:Web Account:/webhome:/usr/bin/False' > etc/passwdIXPUB技术博客io:he2g+@
ROOT# echo 'www:x:888:' > etc/group
5[T[s k4|q!I0ROOT# echo 'www:*:10882:-1:99999:-1:-1:-1:134537804' > etc/shadowIXPUB技术博客-Ik [Tj{Ha@:o
3.3 我没有给这个用户login或shell,只是为了完整,编译了一下称为false的no-go shell。IXPUB技术博客X}?+Nr9s8F W
6y]8Z9?([G3kT`0ROOT# echo 'int main(int argc, char *argv[]) { return(1); }' > /tmp/False.c
Hj(J4`T p#S0ROOT# cc -o /www/usr/bin/False /tmp/False.c
!UE7Q1x}Ra.o9Q03.4 下面让我们标记一下二进制流:
+HN2QLc(a0IXPUB技术博客'evmUs8iROOT# chmod 111 usr/bin/*
yp&t`ra H7f @0IXPUB技术博客fN,@TEP3.5 一些命名服务是必须的。但是由于glibc和命名服务转换库的存在,那些库是必不可少不是那么一目了然的。至于其中的细节,你可以使用命令“man nsswitch”来察看。尽管在我的机器上运行着网络信息服务(NIS),但我还是选择依赖于文件和域名服务(DNS)。注意:libresolve库也是必需的,在安装了PHP之后,这种需求就相当明显了。
E1Ob3W(D+w05w%q.y[Sjj0ROOT# cp -pi /lib/libnss_files.so.2 lib/IXPUB技术博客9[!F#id;Z8Va
ROOT# cp -pi /lib/libnss_dns.so.2 lib/
["gmx6Fonk:UP03.6 我们将需要三个文件来完成对命名服务的配置。IXPUB技术博客6GFT\ hV
IXPUB技术博客;fwT]f这些文件的内容决定于你IP和DNS设置。在这里我们假定web服务器的名字是ns.mynet.home,它的IP地址是:192.168.196.2(实际上它也是我的名字服务器)IXPUB技术博客 l;t"F8P kpQ*j
IXPUB技术博客$Xo\\3g\ V]# ---- Contents ofetc/nsswitch.conf ----#
y.k;~2y4p0passwd: filesIXPUB技术博客s3Os+[+Z2M0S/Y-yn/_
shadow: files
1E3c
B?y1[8K$Z|#P&{j0group: files
U,R3x,h
o1jlIS0hosts: files dns
yFLI TiY0# ---- Contents ofetc/resolv.conf ----#
\&C!TEz0domain mynet.home
Z7g:P)|[
D0## use the IP address of your naming server
fQ]
xkB `7|0## if bind is not installed on your web serverIXPUB技术博客+tHpBn/So!E
#nameserver 192.168.196.xxxIXPUB技术博客$h
qM:Ma%G7W
## use this if your web server is a (caching) name server
9Zr0f\ K6VA5Q0nameserver 127.0.0.1IXPUB技术博客$nz3J&{bl
# ---- Contents ofetc/hosts ----#IXPUB技术博客3O?i2Cu#qdOOs
127.0.0.1 localhost loopback
vqk#YPRY&xB"A0192.168.196.2 ns.mynet.home ns www
?,dwp-a3y l1O
N0IXPUB技术博客.['qm*u'q~\KV
4.编译和安装Apache
N1G/twRDj!v04.1 为Apache的安装建立顶层目录,并且在真正的目录树中生成到它的系统连接。IXPUB技术博客y#y9Oi,S
3F%qo*^5pgaY0ROOT# mkdir /www/apache
c'Pr:Z,u0ROOT# ln -s /www/apache /apache
4.2 我都是作为一般的用户来进行安装和编译的工作的(就像这个例子中的softs),
)q*s2xVjr0IXPUB技术博客 ?6y+Zr9i9y[jE注意:Apache的安装是需要root身份的。在这个例子中我是在usr/local/src/chr (该文件是属于softs:softs的)中进行源代码编译的IXPUB技术博客 N%c{eq[])Ey
IXPUB技术博客 `c#~]s$ cd /usr/local/src/chr
,Hv!knh0$ tar zxf /path/to/apache_1.3.12.tar.gz
0WB5wxXCt.mV0$ cd apache_1.3.12
\7RU$n?q5d&[+}04.3 编辑config.layout,这样它将包含一个称为chroot的特殊的设计(layout)。IXPUB技术博客 z2G)cELB}I9v-n/m
IXPUB技术博客?7ig.\d#PL},H7J# chroot layout.IXPUB技术博客 bw0t] dZi"D
IXPUB技术博客\ dS#m}X${&mprefix:/apacheIXPUB技术博客 X&e