星期三, 五月 08, 2013


构造服务监禁让你的系统更安全


《黑防》我是从总期第4期开始看的,一直到现在一本也没有缺过,唯一感到无奈的是黑防的其他刊物总是杂志的重复,除了增刊有点新鲜以外很少其他都是无谓的重复,浪费了不少RMB。不过老大的解释让我觉得舒服多了,其他的是给那些不能买全的人出的。其实回忆起来自己也真的很懒,很多都是看了没有人真的实践过,学习的都很浅。很早就有写一些东西支持一下黑防的想法了,遗憾的是至今才写了一篇荣幸和高手们的文章一起发表。不过发现了一些问题进攻方面的份额大增,但是完整的关于安全配置的文章比例大减。所以有有了些一篇文章的想法(一直在玩游戏让我的计划搁浅严重………………大家不要bs我啊-_-)好了进入正题。
在安全至上的今天,针对系统部署安全方案是必不可少的,chroot服务监禁便是其中的一种。服务监禁就是把运行在Linux主机上的各种服务,比如DNS、PHP、MySQL、Web等放置在一个特定的环境chroot中运行,从而把这些服务同整个系统隔离开来。这样,即使黑客利用服务的漏洞攻破了应用,也很难突破该chroot环境而危害到系统本身。那么,服务监禁到底有多安全?? 如何在chroot环境中配置应用服务呢?

配置chroot基本环境


首先,需要创建一些必要的目录:
#mkdir –p /chroot/soft
#mkdir –p /tmp/rpm/basic
#mkdir –p /tmp/rpm/compile
目录分别用来存放chroot环境下安装应用所需要的包、构建chroot环境思所需要的RPM包和编译chroot环境所需要的RPM包。
为了构造基本的choot环境,需要一些RPM包,这些包可以从Red Hat9.0光盘获得,并存放在basic目录中
除了这些包以外,因为在chroot环境中还需要编译环境,所以还需要一下包,存放在compile目录中。
aspe11-0.33.7.1-21.i386.rpm
asell-devel-0.33.7.1-21.i386.rpm
binutils-2.13.90.0.18-9.i386.rpm
bison-1.35-6.i386.rpm
byacc-1.99-25.i386.rpm
cdecl-2.5-27.i386.rpm
cpp-3.2.2-5.i386.rpm
cproto-4.6-15.i386.rpm
ctags-5.4-2.i386.rpm
db4-devel-4.0.14-20.i386.rpm
dev86-0.16.3-8.i386.rpm
flex-2.5.4a-29.i386.rpm
freetype-2.1.3-6.i386.rpm
freetype-devel-2.1.3-6.i386.rpm
gcc-3.2.2-5.i386.rpm
gcc-c++-3.2.2-5.i386.rpm
gd-1.8.4-11.i386.rpm
gdbm-devel-1.8.0-20.i386.rpm
gd-devel-1.8.4-11.i386.rpm
libgcc-3.2.2-5.i386.rpm
libjpeg-6b-26.i386.rpm
libjpeg-devel-7b-2.i386.rpm
libpng10-1.-.13-8.i386.rpm
llibpng-1.2.2-16.i386.rpm
libpng-devel-1.2.2-16.i386.rpm
libstdc++-3.2.2-5.i386.rpm
listdc++-devel-3.2.2-5.i386.rpm
libtool-libs-1.4.3-5.i386.rpm
m4-11.4.-13.i386.rpm
make-3.79.1-17.i386.rpm
ncurses-devel-5.3.-4.i386.rpm
pam-devel-0.75-48.i386.rpm
pspell-0.12.2-16.i386.rpm
pspell-devel-0.12.2-16.i386.rpm
readline-4.3-5.i386.rpm
zlib-devel-1.1.4-8.i386.rpm
接下来,简单的劫杀安装基本的chroot环境。安装basic目录中的各包:
#rpm –ivh –root=/chroot/tmp/rmp/basic/*.rpm
注意,命令中的—root=/chroot参数,目的是以"/chroot"目录作为"/"目录来安装rpm包。用同样的方法安装编译需要的包:
#rpm –ivh –root=/chroot –nodeps /tmp/rpm/compile/*.rpm
在启动chroot前,需要对chroot中的系统做必要的配置。为了简便,可以直接把配置文件复制到/chroot下的相应目录:
#cp /etc/hosts /chroot/etc
#cp /etc/resolv.conf /chroot/etc
#cp /etc/fstab /chroot/etc
其中,hosts文件用于名称解析,resolv.conf用于指定DNS服务器,fstab中是需要mount的文件系统。至此,一个基本的服务。因为chroot环境中没有安装tar、gzip等工具,所以对于.tar.gz包需要时下进行解压缩。这里没有将解压缩工具安装进去的原因是,考虑到如果在chroot环境中安装过多工具,这个环境恐怕会太大了。所以,如上所述的那些rmp包已经足够构建一个可以编译程序chroot环境了。
将安装服务所需要的包复制到/chroot/soft目录中,具体包括如下包:
httpd-2.0.46.tar.gz
php-4.3.3.tar.gz
mysql-4.0.15a.tar.gz
proftpd-1.2.8.tar.gz
proftpd-mod-quotatab-1.2.7.tar.gz
下面尝试启动chroot:
#chroot /chroot
bash-2.05b#
注意提示符前面的信息变化,这表示已经成功安装并启动。由于下面编辑安装MySQL、Apache等服务时需要查看/proc文件系统内容,所以,先将/proc文件系统mount上去:
bash-2.05b#mount /proc

在chroot中配置各种应用


启动chroot后,如何在其中间里各种应用呢?答案是和没有chroot环境一样。下面以配置一个基于名称的虚拟主机为例,演示应用的建立过程。虚拟主机服务是在一台主机上提供不同域名的web服务。如果是多个域名对应一个IP地址,则称为基于名称的虚拟主机;如果是多个域名对应多个IP地址,则称为基于IP的虚拟主机。
  1. MySQL数据库的安装、配置和安全调整
    1. 安装和配置MySQL(这里的屏幕输出基本略去)
#chroot /chroot //启动chroot
bash-2.05b#useradd normal //建立一个普通权限用户,用于对源码configure
bash-2.05b#passwd normal
bash-2.05b#useradd mysql //创立一个mysql用户,用于mysql进程运行
bash-2.05b#passwd mysql
bash-2.05b#su normal //现在切换到普通用户
$cd /soft/mysql-4.-.15a
$./configure –prefix=/usr/local/mysql \ --with-mysqld-user=mysql \ --with-unix-socket-path=/usr/local/mysql/var/mysql.sock \ --with-mysqd-ldflags=-all-static
$make
$exit
exit
bash-2.05b#make intall
bash-2.05b#strip /usr/local/mysql/libexec/mysqld
bash-2.05b#chown –R root /usr/local/mysql
bash-2.05b#chown –R mysql /usr/local/mysql/var
bash-2.05b#chgrp –R mysql /usr/local/mysql
bash-2.05b#cp support-files/my-medium.cnf /etc/my.cnf
#chown root:sys /etc/my.cnf
#chmod 644 /etc/my.cnf
(2)修改配置文件
为了增强安全性,需要禁止远程访问。添加"skip-networking"到/chroot/etc/my.cnf的[mysqld]一节,并注解掉"port=3306"。这样,在重启mysqld进程时就会产生成mysql.sock,用于同PHP程序通信。添加"set-variable=local-infile=0"到/chroot/etc/my.cnf的[mysqld]节可以提高本地安全性。
修改管理员密码,以防止黑客的空密码连接:
hash-2.05b#/usr/local/mysql/bin/mysql –u root
mysql>SET PASSWORD FOR root@mylinux=PASSWORD('DB23#RT5!);
删除默认用户数据库:
mysql>drop database test;
mysql>use mysql;
mysql>delete form db;
mysql>delete form user where not (host="mylinux" and user="root");
mysql>flush privileges;
给管理员改名,防止猜测root帐户密码:
mysql>updateuser set user ="vdata" where user ="root";
mysql>flush privileges;
把历史纪录扔到黑洞里面:
bash-2.05b#cat /de/null> ~/.mysql_history
关闭服务:
bash-2.05b#/usr/local/mysql/bin/mysqladmin –u vdata –p shutdown
Enter password:
031006 08:27:37 mysqld ended
2.Apache的安装、配置和安全调度
(1)编译安装
#chroot /chroot
bash-2.05b#groupadd apache
bash-2.05b#useradd apache –c "Apache server" –d /dev/null –g apache –s /sbin/nologin
bash-2.05b#makdir –p /www/vhosts/he
bash-2.05b#cd /soft/httpd..
bash-2.05b# ./configure –prefix==/usr/local/apache –enable-so –disable-info –disable-autoindex –disable-status –disable-cgi –disable-dav –disable-include –disable-env –disable-setenvif –disable-negotiation –disable-imap –disable-actions –disable-userdir –disable-alias –disable-asis
bash-2.05b#make;make install
(2)修改配置文件/chroot/usr/local/apache/conf/httpd.conf部分配置文件:
###Section 1:Global Environment
#Basic settings
ServerName 192.168.0.99:80
User apache
Group apache
ServerRoot "/usr/local/apache"
…………….
#General settings
Listen 80
ServerAdmin kinggkl@yahoo.com.cn
UseCanonicalName Off
ServerSignature Off
HostnameLookups Off
ServerTokens Prod
……….
#Virtual hosts
NameVirtualHost *
<VirtualHost *>
ServerAdmin admin@hotmail.com

DocumentRoot /www/vhosts/he
DirectoryIndex index.php
ServerName he.example.com
ErrorLog logs/he.example.com-error_log
CustomLog logs/he.example.com-access_log common
</VirtualHost>
<VirtualHost *>
ServerAdmin admin@hotmail.com

DocumentRoot /www/vhosts/digico
DirectoryIndex index.php
ServerName she.example.com
ErrorLog logs/she.example.com-error_log
CustomLog logs/she.example.com-access_log common
</VirtualHost>
#Dynamic Shared Object (DSO) Support
#LoadModule foo modules/foo.so
注意,必须有LoadModule一行,否则PHP编译出错。
(3)Apache服务的开启和关闭
bash-2.05b# /usr/local/apache/bin/httpd –k start
bash-2.05b# /usr/local/apache/bin/httpd –k stop
3.PHP安装配置
(1)编译安装
#chroot /chroot
#cd /soft/php…
#./configure –with-apxs2=/usr/local/apache/bin/apxs \ --with-mysql=/usr/local/mysql \ --with=config=file-path=/usr/local/apache/conf \ --enable-safe-mode
#make;make install
(2)修改配置文件php.ini
bash-2.05b#cp php.ini-dist /usr/local/apache/conf/php.ini
bash-2.05b#exit
exit
#vi /chroot/usr/local/apache/conf/php.ini
safe_mode = On
safe_mode_gid =Off
disply_errors = Off
log_errors = On
error_log = /usr/local/apache/logs/php.log
这样,一个虚拟主机服务器便配置完成,可以提供基于名称的虚拟主机,用户也可以使用FTP上传和下载自己的Web页面。初学者如果对变异所使用的参数,以及修改配置的过程有疑问,可以参看Apache、MySQL和PHP说明文件或主页。
4.综合测试
配置完成后,可以联合测试chroot环境下Apache、MySQL和PHP的工作情况。
#cd /chroot/www/vhosts/he
#vi index.php
<?php
$link =mysql_connect("localhost","vdata","DB23#RT5!")
or die;
pint "HE IS OK!";
mysql_close($link);
?>
</body?></html>
#vi /etc/hosts
192.168.0.99 he.example.com
#lynx http://he.example.com

HE IS OK!

防止黑客突破chroot环境


回顾在文章开始提出的chroot到底有多少安全问题,事实上,chroot环境并非不能突破。虽然非root身份运行的进程将永远无法逃离chroot环境,但以root身份运行的进程却可以"越狱"。所以,这些服务不能以root身份运行,chroot中也不能存在setuid=0的进程,因为黑客可以利用有漏洞的setuid=0的程序获取root权限。
检查一下刚才搭建的chroot环境及其中的服务是否安全。先看看有哪些编译器:
bash-2.05b#rpm –qa|grep gcc
gcc-3.2.2-5
libgcc-3.2.2-5
gcc-c++-3.2.2-5
这里用到了c编译器gcc,这是必须要删除的,因为gcc编译c程序源代码需要root权限。
bash-2.05b#rpm –e nodeps gcc
bash-2.05b#rpm –e nodeps gcc-c++
其实,完全可以将编译需要的RPM包都卸载,因为chroot环境里的RPM包越少越好。chroot中运行的服务不同,需要删除的包和必须保留的包也不一样。
接下来,检查有哪些以root身份运行的应用;
#ps –aux|grep mysql
#510 6920 0.0 0.9 5392 1152 pts/1 S 23:16 0:00 /bin/sh/usr/local/mysql/bin/mysqld_safe - -user=mysql
#510 6938 0.0 9.1 52940 11584 pts/1 S 23:16 0:00 /usr/local/mysql/libexec/mysqld –basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --pid-file=/usr/local/mysql/var/ASONE.pad --skip-locking –socket=/tmp/mysql.sock

测试图片外连

孤岛

事实上屏蔽在继续,虽然已经能上了。但是这里对于中国来说依然是个信息孤岛。

星期一, 七月 30, 2007

真的快失去信心了

不知道为什么总是屏蔽blogger

星期一, 六月 04, 2007

终于可以浏览了

前一段时间因为不小心发了某长城的文章结果被被第一次和谐了。超郁闷。
Google接手后果然不一样了。我越来越喜欢blogger了。 开始把以前在spaces的东西转移过来。