打造Ubuntu下的SLAMP

现在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 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

你可能感兴趣的:(Debian,职场,休闲,woody,makejail,chroot环境)