打造Ubuntu下的SLAMP

Web、Mail、Ftp、DNS、Proxy、VPN、Samba、LDAP 等基础网络服务
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
送出感谢: 0
接收感谢: 2 次
联系:

打造Ubuntu下的SLAMP

#1

帖子 firehare » 2005-07-15 18:18

本来是想利用makejail包做一个chroot环境的。但做到后面才发现makejail包只在基于Debian woody的Apache 1.3.22 的,再改的话,又要重头再来一遍,于是就偷了点懒,没写makejail这部分了。嘻嘻!不过由于以前打算是要用makejail的,所以后来做了不用这部分的修改,不知有没什么遗漏的错误,如果有的话,还望告知!
===========================================
现在LAMP(Linux+Apache+Mysql+PHP)架站模式是越来越流行了,几乎都可以说是成为了架站的时尚了。但常言道树大招风,相应的安全问题也就随之而来了,象层出不穷的SQL脚本注入(SQL Injection)及CSS跨站脚本攻击(Cross Site Script)等让人不厌其烦。那么有没有什么好的方法来尽量减少这方面的危险呢?甚至在事发之后可以有效的进行日志反查以明白其攻击手法为日后响应做准备呢?答案是肯定的!其实这已经不再属于局限于架站而更多属于安全的范畴了,也就是如标题所言要如何建立一个SLAMP(Security)服务器了。
本来是想利用makejail包做一个chroot环境的。但由于makejail包只在基于Debian woody的Apache 1.3.22 上做过测试,而由于没有时间,本人暂时也还没做过基于Ubuntu 5.04上的Apache2的测试,所以不敢妄语,有哪位朋友做过或有类似方式的话,还请不吝赐教!好了废话少说,下面就开始我们的安全架站之旅了。本文的所有操作在Ubuntu 5.04发行版上测试通过。具体步骤如下:
1.将系统更新到最新状态,在做任何操作之前都要做这一步,以确保系统的稳定,同时也不会有一些莫名其妙的现象出现。
$sudo apt-get update
$sudo apt-get upgrade-dist
2.架设LAMP服务器
$sudo apt-get apache2 mysql-server php4 php4-gd php4-mysql
3.配置LAMP服务
a) 我们编辑/etc/php4/apache2/php.ini文件,先做一般配置,在改动之前,请先将该配置文件做个备份。以便在出错的时候可以恢复。
>memory_limit = 8M =>修改成你所需的内存大小
>upload_max_filesize = 2M =>修改文件最大上传尺寸
>extension=mysql.so
>extension=gd.so =>将你要用到模块前面的注释给去掉
b) 这样LAMP服务就算是架设完成了,下面就要对该架构进行安全加固了。
4.编辑/etc/apache2/apache2.conf文件,在改动之前,请先将该配置文件做个备份。以便在出错的时候可以恢复。
>AddDefaultCharset ISO-8859-1 =>AddDefaultCharset GB2312
6.然后开始加固php,我们再次编辑/etc/php4/apache2/php.ini文件,之所以没有一次改完,主要是为了给大家一个清晰的思路。
>#打开安全模式,打开他的好处就是PHP文件只能访问所有者和PHP文件所有着一样的文件,即使在chroot环境下也无法访问jail中属主不一样的 文件,类似于php shell这样的后门就没用武之地了哦,phpshell是很流行的php后门,他可以执行系统命令,就象他的名字一样,和shell很接近。
>safe_mode = On

>#上面的设置就限制了fopen(), file()等函数可以操作的目录范围,避免了入侵者非法读取文件,一定要在/var/www后面加"/",否则/var/wwww下的文件也能被访问 。
>open_basedir = /var/www/

>#禁止使用phpinfo和get_cfg_var函数,这样可以避免泄露服务信息,一般在在确认PHP能正常工作之后再使之关闭
>disable_functions = phpinfo,get_cfg_var

>#设置php程序错误日志
>error_reporting = E_ALL
>log_errors = On
>error_log = /var/log/php_err.log

>#如果php程序没有指明需要register_globals的话,最好把register_globals设置为Off,这样可以避免很多安全问题的。注意,如果你的程序是需要register_globals的话,可千万别关。Ubuntu默认是关闭的。
>register_globals = Off

>#禁止打开远程地址,记得最近出的php include的那个漏洞吗?就是在一个php程序中include了变量,那么入侵者就可以利用这个控制服务器在本地执行远程的一个php程序,例如phpshell,所以我们关闭这个。
>allow_url_fopen = Off

7.这样PHP的安全优化就做好了,下面做MySQL的安全优化。
a)在Ubuntu下用apt装的mysql默认是禁止从网络连接MySQL的,我们可以从/etc/mysql/my.cnf文件中看到有skip-networking语句的,如果你做的是MySQL服务器的话,那么是要将其注释掉的,这样其他机器才能访问你这台机器,如果该服务仅供本机使用的话,那么就保持原状,这样别的机器不能访问你这台机器的MySQL。由于这里是做在一起的,所以保持不变好了。

b)然后我们给mysql设置一个密码并修改管理员用户名(默认是root),但一定得记得,无论怎么样修改密码,都会有记录的,如果通过mysqladmin修改,shell的历史记录会有的,如果登陆了mysql之后再修改,在 ~/.mysql_history会记录的,所以我们一定得处理这两个历史记录文件,我们把他们删了,再从/dev/null做个软连接过来就可以解决问题了。注意由于我们会在SHELL下用的是sudo,所以该历史是保存在本用户目录下的,而不是在根用户目录下的。而mysql也是在本用户目录下使用的,所以也是保存在本用户目录下的。如果你觉得不能记忆历史记录麻烦的话,也可以在用到了MySQL的Root用户之后,进入这两个文件中,将相关语句删除。
$rm .bash_history
$rm .mysql_history
$ln -s /dev/null .bash_history
$ln -s /dev/null .mysql_history

c)然后我们删除多余的数据库并去掉匿名帐号
[root@debian ~]mysql -u root -p
Enter password:XXXXXX
mysql> drop database test;
mysql> use mysql;
mysql> delete from db;
mysql> delete from user where user = '';
mysql> delete from user where not(host="localhost") and user="root";
mysql> flush privileges;

d)然后修改默认的管理员帐号root为你喜欢的,我这里改成myadmin
mysql> update user set user="myadmin" where user="root";
mysql> flush privileges;
这样就可以通过myadmin而不是root用户名来访问MySQL数据库了!

8.现在我们安装mod-security。
a)首先安装libapache2-mod-security包
$sudo apt-get install libapache2-mod-security

b)该模块默认是没激活的,我们可以在/etc/apache2/mods-available目录下看到有mod-security.load文件,但在/etc/apache2/mods-enabled目录却没有它的软链接。我们现在激活它:
$sudo ln -s /etc/apache2/mods-available/mod-security.load /etc/apache2/mods-enabled/mod-security.load
$sudo cp /usr/share/doc/libapache2-mod-security/examples/httpd2.conf.example-full /etc/apache2/mods-available/mod-security.conf
$sudo vi /etc/apache2/mods-available/mod-security.conf,老规则改动之前先做好备份。
># 检测内容长度以避免堆溢出攻击
>SecFilterForceByteRange 32 254 =>SecFilterForceByteRange 32 126

># debug设置
>SecFilterDebugLevel 9 =>SecFilterDebugLevel 0

># 设置缺省的动作
>SecFilterDefaultAction "deny,log,status:499" =>SecFilterDefaultAction "deny,log,status:404"

># 把设置传递给子目录
>SecFilterInheritance Off

># Redirect user on filter match
># 当匹配sh的时候,重新定向到一个特殊的警告页面,该页面是自行编写的,写些警告的话让攻击者知难而退,该段先不要生效,等到相关配置配好之后再失效不迟。记住在配好之后要使之生效。
>#SecFilter sh redirect:http://localhost/hack/warning.htm

># Prevent OS specific keywords
>#过滤一些敏感的东西,我们使用*是为了攻击者使用/etc/./passwd来绕开检测
>SecFilter /etc/passwd =>SecFilter /etc/*passwd
>SecFilter /bin/*sh

># Very crude filters to prevent SQL injection attacks
># 防止SQL插入(SQL Injection)攻击
>SecFilter "delete[[:space:]]+from"
>SecFilter "insert[[:space:]]+into"
>SecFilter "select.+from"
>SecFilter "select[[:space:]]+from"
>SecFilter "union[[:space:]]+from"

$sudo ln -s /etc/apache2/mods-available/mod-security.conf /etc/apache2/mods-enabled/mod-security.conf

c)重启Apache2服务即可。
$sudo /etc/init.d/apache2 restart

希望对大家有所帮助!
上次由 firehare 在 2005-07-30 10:47,总共编辑 1 次。
我心无畏,源自于我心无知。
图片
yongyi
帖子: 3025
注册时间: 2005-05-07 23:57
送出感谢: 0
接收感谢: 0
联系:

#2

帖子 yongyi » 2005-07-15 18:22

哈哈,终于见到兄弟的大作了!
可惜我的breezy正处于动荡期呀 :P
独自看一看大海
总想起身边走在路上的朋友
Lenovo E290-420[Celeron-M420/256M/60G/Intel GMA950]
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
送出感谢: 0
接收感谢: 2 次
联系:

#3

帖子 firehare » 2005-07-15 18:31

呵呵,我可不敢象兄弟那样升到breezy,正在开发东东,怕出了问题不知是哪出错了!
我心无畏,源自于我心无知。
图片
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
送出感谢: 0
接收感谢: 2 次
联系:

#4

帖子 firehare » 2005-07-16 13:36

最近在源中找到了libapache2-mod-chroot,应该会有帮助!我再去看看,搞懂了之后接着写,呵呵!
我心无畏,源自于我心无知。
图片
头像
oneleaf
论坛管理员
帖子: 10423
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04
送出感谢: 7 次
接收感谢: 122 次

#5

帖子 oneleaf » 2005-07-16 13:53

期待。
当净其意如虚空,远离妄想及诸取,令心所向皆无碍
yongyi
帖子: 3025
注册时间: 2005-05-07 23:57
送出感谢: 0
接收感谢: 0
联系:

#6

帖子 yongyi » 2005-07-16 18:23

在Ubuntu下用apt装的mysql默认是禁止从网络连接MySQL的,我们可以从/etc/mysql/my.cnf文件中看到有skip-networking语句的
为什么我的没有?只有:

代码: 全选

# Instead of skip-networking the default is now to listen only on
:P
独自看一看大海
总想起身边走在路上的朋友
Lenovo E290-420[Celeron-M420/256M/60G/Intel GMA950]
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
送出感谢: 0
接收感谢: 2 次
联系:

#7

帖子 firehare » 2005-07-16 18:30

啊?奇怪呀!我的配置文件中有呀!
我心无畏,源自于我心无知。
图片
yongyi
帖子: 3025
注册时间: 2005-05-07 23:57
送出感谢: 0
接收感谢: 0
联系:

#8

帖子 yongyi » 2005-07-16 20:17

会不会是因为版本不同?我的是mysql-server4.0.24-10
原来想装PHP5的,后来还是作罢了。
已经按兄弟的,搞出个SLAMP了 :lol:
要学的东西还多着。 :P
独自看一看大海
总想起身边走在路上的朋友
Lenovo E290-420[Celeron-M420/256M/60G/Intel GMA950]
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
送出感谢: 0
接收感谢: 2 次
联系:

#9

帖子 firehare » 2005-07-16 20:24

是啊!进入了开源社区之后,才知道什么叫做学海无涯呀!
我心无畏,源自于我心无知。
图片
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
送出感谢: 0
接收感谢: 2 次
联系:

利用libapache2-mod-chroot包加固Apache2服务

#10

帖子 firehare » 2005-07-17 13:01

在做测试时改得我头都有点晕了,可能有些因素尚未考虑到,主要是chroot环境下的虚根目录,同apache2加载时的实根目录之间的问题。不过基本运行是没什么问题的,就怕日志什么有些可能会没有。所以一定要考虑清楚,如果不清楚的话,可以在正常运行之后,多看看Error.log日志。祝大家愉快!!
===================
今天继续写:
现在要安装Chroot环境了,为什么要安装Chroot环境呢?因为它安全,chroot可以把进程的根目录变成不是“/”目录的其他目录。这就意味着该进程被锁定到一个虚拟文件系统的根中。如果你再适当地配置你的chroot jail,Apache和它的子进程(比如CGI脚本)将除于chroot jail环境之外不能访问其他任何东西。同时,非根进程也不能离开chroot jail环境的。(注意:从上面描述我们不难看出把设备文件,被suid的二进制文件以及硬链接放入jail是十分不明智的。原因?因为它们可以破坏chroot jail环境)
使用chroot环境有两种方式:一则是常规方式,在该方式下你必须要十分小心地建立一个“虚拟根”,并将程序可能需要的文件给包含进来。一般说来有:
* C 语言库
* 其他的库 (如libssl、libm及libmysqlclient等)
* 解析配置文件(如/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 *
<VirtualHost *>
	ServerAdmin webmaster@localhost
	
#	DocumentRoot /var/www/
#	<Directory />
#		Options FollowSymLinks
#		AllowOverride None
#	</Directory>
#	<Directory /var/www/>
#		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/
#	</Directory>

	<Directory />
		Options FollowSymLinks
		AllowOverride None
	</Directory>
	<Directory /htdocs>
		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/
	</Directory>
    
#	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
#	<Directory "/usr/lib/cgi-bin">
#		AllowOverride None
#		Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
#		Order allow,deny
#		Allow from all
#	</Directory>

	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/"
#    <Directory "/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
#    </Directory>

</VirtualHost>

做完了之后,来个$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文件:
><?php
> phpinfo();
>?>
再使用Firefox,输入 http://localhost/test.php ,如果看到了信息就说明你成功了!(还记得我们在前面php.ini里对phpinfo()函数的限制吗?在测试时,请先把它打开,测试完了之后再行关闭)
我心无畏,源自于我心无知。
图片
holz
帖子: 188
注册时间: 2005-07-18 18:20
来自: http://www.gdgpi.com.cn
送出感谢: 0
接收感谢: 0
联系:

#11

帖子 holz » 2005-07-18 18:27

我使用ubuntu定制安装,按ubuntu.org.cn上的文档装了apache2, mysql,php4,然后按本话题配置了安全模块,结果我的drupal就不能使用了。

确切的说是可以正常浏览drupal生成的站点,但是不能进行任何编辑工作,添加文章、改站点设置也不行,会报告找不到index.php文件。

取消了mod-security又可以正常编辑了,不知道是不是这个模块限制的太严格?

此外,我想配置modrewrite,不知道如何,好象直接将rewrite.load连接过去mods-enable不可以。各位有使用modrewrite的吗?帮帮忙。
头像
oneleaf
论坛管理员
帖子: 10423
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04
送出感谢: 7 次
接收感谢: 122 次

#12

帖子 oneleaf » 2005-07-18 18:45

有,直接ln到mods-enabled就可以,不过先需要ln proxy.load
当净其意如虚空,远离妄想及诸取,令心所向皆无碍
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
送出感谢: 0
接收感谢: 2 次
联系:

#13

帖子 firehare » 2005-07-18 18:49

holz 写了:我使用ubuntu定制安装,按ubuntu.org.cn上的文档装了apache2, mysql,php4,然后按本话题配置了安全模块,结果我的drupal就不能使用了。

确切的说是可以正常浏览drupal生成的站点,但是不能进行任何编辑工作,添加文章、改站点设置也不行,会报告找不到index.php文件。

取消了mod-security又可以正常编辑了,不知道是不是这个模块限制的太严格?

此外,我想配置modrewrite,不知道如何,好象直接将rewrite.load连接过去mods-enable不可以。各位有使用modrewrite的吗?帮帮忙。
这个倒是有可能的,你可以看看是哪一条限制住了,把它注释掉就可以了!
我心无畏,源自于我心无知。
图片
holz
帖子: 188
注册时间: 2005-07-18 18:20
来自: http://www.gdgpi.com.cn
送出感谢: 0
接收感谢: 0
联系:

#14

帖子 holz » 2005-07-19 8:50

oneleaf 写了:有,直接ln到mods-enabled就可以,不过先需要ln proxy.load
还是不行阿,1叶能不能讲讲具体怎么实现阿?
头像
oneleaf
论坛管理员
帖子: 10423
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04
送出感谢: 7 次
接收感谢: 122 次

#15

帖子 oneleaf » 2005-07-19 9:15

# ls /etc/apache2/mods-enabled/
cgi.load php4.load proxy_connect.load proxy.load userdir.conf
php4.conf proxy.conf proxy_ftp.load rewrite.load userdir.load

就这些了。
当净其意如虚空,远离妄想及诸取,令心所向皆无碍
回复