让apache进行ad认证

公司内网都是通过ad进行认证的,为了方便就想到直接用apache basic认证来做网页的认证,毕竟项目只是内网使用。

首先是要让apache支持perl,这个在ubuntu上很容易

apt-get install libapache2-mod-perl2

接着是安装相关perl认证的模块

cpan -i YAML
cpan -i Apache2::AuthenMSAD
cpan -i Apache2::AuthenNTLM
cpan -i Authen::Simple::Apached

最后在apache配置文件中具体网站配置项中添加如下


PerlAuthenHandler Apache2::AuthenMSAD
PerlSetVar MSADDomain xxxx-inc.com #AD认证域
PerlSetVar MSADServer ad.xxxx.com #AD认证服务器
PerlSetVar MSADBaseDN DC=xxxx-inc,DC=com
AuthName "xxxx-INC AD Authentication" #弹出窗口的显示名字
AuthType Basic
PerlSetVar MSADGroup 'xxxx-sysadmin'
PerlSetVar MSADUser timo
Require valid-user

###########################################

Best regards
Timo Seven
blog:http://www.timoseven.com
twitter: http://twitter.com/zauc
Linux System Admin & MySQL DBA

基于apache的反向代理和负载均衡

这个是apache2.2以后增加的新的特性。

首先我们这边有2个域名。一个是www.timo.com还有一个是mail.timo.com这两个域名。同时www.zauc.com内网有2台机器 (192.168.0.10和192.168.0.11),当然也可以是外网.mail.zauc.com这个域名的内网IP为 (192.168.0.20)

要使用proxy和blance一定要在编译的时候加入proxy和blance.

./configure --prefix=/usr/local/apache2 --enable-mods-shared=all --enable-modules=all --enable-proxy --enable-proxy-connect --enable-proxy-ftp --enable-proxy-http --enable-proxy-ajp --enable-proxy-balancer --enable-vhost-alias
make
make install

安装完成后在extra/httpd-vhosts.conf中进行如下配置。

    ServerAdmin timo@timo.com
    ServerName www.timo.com
    ProxyPass / balancer://www.timo.com/
    ErrorLog "logs/www.timo.com-error_log"
    CustomLog "logs/www.timo.com-access_log" common

   ServerAdmin timo@timo.com
    ServerName mail.timo.com
    ProxyPass / http://192.168.0.20/
    ProxyPassReverse / http://192.168.0.20/
    ErrorLog "logs/mail.timo.com-error_log"
    CustomLog "logs/mail.timo.com-access_log" common

而www.timo.com还需要在httpd.conf进行配置

ProxyRequests Off

    BalancerMember http://192.168.0.10 loadfactor=1<br />
    BalancerMember http://192.168.0.11 loadfactor=1

这里只是简单的一个配置。详细的可以参考下apache2.2中文文档中的说明

apache安全优化

作者:timo

联系方式: greycd ## gmail dot com

如何使web服务器安全(apache)

web服务器(apache)

一个像apache这样的web服务器,它最主要的功能是能让HTML页面在客户端浏览器上显现。

功能

web服务器需要能接入互联网,只需要对静态HTML页面提供支持

服务器能支持基于名字的虚拟主机

一些页面只能某些特殊的IP和用户才能访问(基本的认证)

服务器需要记录web请求的日志(包括浏览器的信息)

web服务器必须对PHP/Perl脚本语言支持

PHP/Perl组件必须能在本地MySQL数据库中读写用户信息

安全设想

1.

操作系统越坚固越好,包括低于本地和远程攻击
2.

服务器除了HTTP,最好不要提供其他任何网络服务
3.

远程访问服务器必须通过防火墙,关闭所有出去的连接,和只放过HTTP访问连接。
4.

在系统上必须只有一个有效的Apache服务
5.

只有完全必须的apache模块才被装载
6.

任何诊断web页面和自动目录索引服务必须被关闭
7.

服务器只能透露最少的关于自身的信息
8.

apache服务必须运行在一个单独的UID/GID下,不能使用其它任何的系统进程
9.

apache服务进程被续被限制访问文件系统(chrooting)
10.

不能有shell程序能在apache的chrooted环境中出现
11.

PHP配置必须内建的安全机制
12.

PHP脚本只能在chrooted环境中执行
13.

apache服务器必须拒绝所有请求(GET和POST),含有HTML标记(跨站攻击)或者“’”和”””(可能有SQL注入攻击)
14.

不能有PHP警告和错误信息显示给正式访问的用户
15.

记录进站的GET和PORT请求到一个日志文件。

操作系统

UNIX或者类UNIX例如Linux,FreeBSD等等对于Apache最合适,微软的windows只能提供非常有限的安全能力,对于apache并不合适

先决条件

1.

如果你需要apache和ssl安全认证支持,那OpenSSL就需要先被安装
2.

如何需要apache和postgresql数据库连接支持,那先要安装postgresql或者需要mysql数据库支持那就安装mysql
3.

如果需要LDAP目录支持那还要安装OpenLDAP
4.

如果需要IMAP和POP能力,那还要装IMAP和POP

软件准备

1.

UNIX兼容的命令
2.

含有/var/tmp目录
3.

RedHat Linux
4.

所有步骤使用root帐户
5.

apache版本为1.3
6.

Mod_SSL
7.

Mod_Perl
8.

Mod_PHP

Apache : http://www.apache.org/

Mod_Perl : http://perl.apache.org/

Mod_SSL : http://www.modssl.org/

Mod_PHP : http://www.php.net/

没有的话就去上述网站下载

安装步骤一

把所有tar包放在同一目录中


[root@localhost]/# cp apache_version.tar.gz /var/tmp

[root@localhost]/# cp mod_ssl-version-version.tar.gz /var/tmp

[root@localhost]/# cp mod_perl-version.tar.gz /var/tmp

[root@localhost]/# cp php-version.tar.gz /var/tmp

[root@localhost]/# cd /var/tmp/

解压包

[root@localhost]/tmp# tar xzpf apache_version.tar.gz

[root@localhost]/tmp# tar xzpf mod_ssl-version-version.tar.gz

[root@localhost]/tmp# tar xzpf mod_perl-version.tar.gz

[root@localhost]/tmp# tar xzpf php-version.tar.gz

Mod_SSL

[root@localhost]/# cd mod_ssl-version-version

[root@localhost]/# CC="egcs" CFLAGS="-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions" ./configure --with-apache=../apache_1.3.37 --with-crt=/etc/ssl/certs/server.crt --with-key=/etc/ssl/private/server.key

*CC – C 编译器

**egcs – 增强GNU边一起

***CFLAGS – O2 (i386), O3 (i586), O9 (i686) 优化选项

PHP 4

[root@localhost]# cd apache_1.3.37

Configure

[root@localhost]# CC="egcs" OPTIM="-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions" CFLAGS="-DDYNAMIC_MODULE_LIMIT=0"
./configure

--prefix=/home/httpd

--bindir=/usr/bin

--sbindir=/usr/sbin

--libexecdir=/usr/lib/apache

--includedir=/usr/include/apache

--sysconfdir=/etc/httpd/conf

--localstatedir=/var

--runtimedir=/var/run

--logfiledir=/var/log/httpd

--datadir=/home/httpd

--proxycachedir=/var/cache/httpd

--mandir=/usr/man

--proxycachedir=/var/cache/httpd

--mandir=/usr/man

[root@deep ]/php-4.0# make && make install

Mod_PERL

[root@localhost] cd ../mod_perl-version.version/

[root@localhost] perl Makefile.PL EVERYTHING=1 APACHE_SRC=../apache_1.3.37/src USE_APACI=1 PREP_HTTPD=1 DO_HTTPD=1

[root@localhost]/mod_perl-version.version# make && make install

Apache

1. [root@localhost]/apache1.3.37# SSL_BASE=SYSTEM EAPI_MM=SYSTEM CC="egcs" OPTIM="-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions" CFLAGS="- DDYNAMIC_MODULE_LIMIT=0"

./configure

--prefix=/home/httpd

--bindir=/usr/bin

--sbindir=/usr/sbin

--libexecdir=/usr/lib/apache

--includedir=/usr/include/apache

--sysconfdir=/etc/httpd/conf

--localstatedir=/var

--runtimedir=/var/run

--logfiledir=/var/log/httpd

--datadir=/home/httpd

--proxycachedir=/var/cache/httpd

--mandir=/usr/man

--add-module=src/modules/experimental/mod_mmap_static.c

--add-module=src/modules/standard/mod_auth_db.c

--enable-module=ssl

--enable-rule=SSL_SDBM

--disable-rule=SSL_COMPAT

--activate-module=src/modules/php4/libphp4.a

--enable-module=php4

--activate-module=src/modules/perl/libperl.a

--enable-module=perl

--disable-module=status

--disable-module=userdir

--disable-module=negotiation

--disable-module=autoindex

--disable-module=asis

--disable-module=imap

--disable-module=env

--disable-module=actions

[root@localhost]/apache1.3.37# make && make install

安装步骤二

Chroot Jail

chroot一个能让你改变一个系统的root权限到另外一个地方,所以从入侵者来说是一个事实的root系统将很安全。
优点

1.

apache默认是运行于一个非root帐户,作为一个拥有本地shell的普通帐户将限制一些危险的操作。
2.

主要的好处是,jail作为文件的一部分,后台程序在这个jail中将视作为根目录
3.

jail只需要支持apache,在jail中程序的有效性将被极大的限制。
4.

不再需要setuid-root程序。
5.

如果apache被侵害,攻击者将不能访问真实的文件系统
6.

允许访问你服务器的CGI脚本将不能执行
7.

有一些扩展的库你需要在chroot jail中为了使apache能够执行
8.

如果你使用任何Perl/CGI特性在apache中,你需要拷贝必须的二进制文件,Perl库和在chroot环境中适当的文件。如一些支持SSL,PHP,LDAP,PostgreSQL以及其他的第三方程序。

寻找依赖

[root@localhost]/# ldd /usr/sbin/httpd

libpam.so.0 =>/lib/libpam.so.0 (0x40016000)

libm.so.6 =>/lib/libm.so.6 (0x4001f000)

libdl.so.2 =>/lib/libdl.so.2 (0x4003b000)

libcrypt.so.1 =>/lib/libcrypt.so.1 (0x4003e000)

libnsl.so.1 =>/lib/libnsl.so.1 (0x4006b000)

libresolv.so.2 =>/lib/libresolv.so.2 (0x40081000)

libdb.so.3 =>/lib/libdb.so.3 (0x40090000)

libc.so.6 =>/lib/libc.so.6 (0x400cb000)

/lib/ld-linux.so.2 =>/lib/ld-linux.so.2 (0x40000000)

创建目录结构 (像依赖的一样)

[root@localhost ]/# mkdir /chroot/httpd

[root@localhost ]/# mkdir /chroot/httpd/dev

[root@localhost ]/# mkdir /chroot/httpd/lib

[root@localhost ]/# mkdir /chroot/httpd/etc

[root@localhost ]/# mkdir -p /chroot/httpd/usr/sbin

[root@localhost ]/# mkdir -p /chroot/httpd/var/run

[root@localhost ]/# mkdir -p /chroot/httpd/var/log/httpd

[root@localhost ]/# chmod 750

/chroot/httpd/var/log/httpd/

[root@localhost ]/# mkdir -p /chroot/httpd/home/httpd

拷贝所有发现的依赖文件(包括相应权限)到所创建的目录中

[root@localhost ]/# cp -r /etc/ssl /chroot/httpd/etc/ 如果你需要mod_ssl所必须的

[root@localhost ]/# chmod 600 /chroot/httpd/etc/ssl/certs/ca.crt 如果你需要mod_ssl所必须的

[root@localhost ]/# chmod 600 /chroot/httpd//etc/ssl/certs/server.crt 如果你需要mod_ssl所必须的

[root@localhost ]/# chmod 600 /chroot/httpd/etc/ssl/private/ca.key 如果你需要mod_ssl所必须的

[root@localhost ]/# chmod 600 /chroot/httpd/etc/ssl/private/server.key 如果你需要mod_ssl所必须的

使用.dbmpasswd密码文件进行用户认证

改变dbmmanage程序的权限,使用以下命令

[root@localhost ]/# chmod 750 /usr/bin/dbmmanage

创建一个用户名和密码使用以下命令

[root@deep ]/# /usr/bin/dbmmanage /etc/httpd/.dbmpasswd adduser username

New password:

Re-type new password:

User username added with password encrypted to l4jrdAL9MH0K.

拷贝/etc/passwd /etc/group文件到/chroot/httpd/etc下,同时移出所有帐户和组出了apache运行所依赖的

[root@localhost ]/# cp /etc/passwd /chroot/httpd/etc/

[root@localhost ]/# cp /etc/group /chroot/httpd/etc/

编辑passwd文件

vi /chroot/httpd/etc/passwd

www:x:80:80::/home/www:/bin/bash

编辑passwd文件

vi /chroot/httpd/etc/group

www:x:80:

你还需要/etc/resolv.conf文件和/etc/nsswitch.conf以及/etc/hosts文件在你的chroot jail中相同的目录结构来解析主机名。

第三步 安全的CGI应用程序

配置PHP

增加以下行到httpd.conf中

AddModule mod_php4.c

AddType application/x-httpd-php .php

AddType application/x-httpd-php .inc

AddType application/x-httpd-php .class

修改PHP配置文件(/chroot/httpd/usr/local/lib/php.ini)

Parameter Description

safe_mode = On

safe_mode_gid = Off

open_basedir = directory[:...] (只有这个目录脚本文件才能使用)

safe_mode_exec_dir = directory[:...] (apache拒绝执行程序目录)

expose_php = Off (不要显示php info)

register_globals = Off

display_errors = Off

log_errors = On

error_log = filename

修改文件扩展名

把所有*.php文件改为*.dhtml(举例),所以需要修改/chroot/httpd/usr/local/apache/conf/httpd.conf文件增加以下

AddType application/x-httpd-php .php

AddType application/x-httpd-php .dhtml

web用户将看不到*.php扩展名在url地址中,实际已经PHP技术已经被使用在服务器上。

The last step – Defending against CSS and SQL Injection attacks

In order to perform that, we will use the mod_security module, which we enable by

adding the following line into httpd.conf:

AddModule mod_security.c

To enable logging of the GET and POST requests, it suffices to add the following section

to httpd.conf:

AddHandler application/x-httpd-php .php

SecAuditEngine On

SecAuditLog logs/audit_log

SecFilterScanPOST On

SecFilterEngine On

最后一步--防御拒绝CSS和SQL注入攻击

为了实现这个功能,我们将使用mod_security模块,所以我们需要加入下面这行在httpd.conf中

AddModule mod_security.c

为了实现记录GET和POST请求,需要在httpd.conf增加下面这段

AddHandler application/x-httpd-php .php

SecAuditEngine On

SecAuditLog logs/audit_log

SecFilterScanPOST On

SecFilterEngine On

超出的命令需要audit引擎来记录,如登录请求;以及过滤POST引擎,它能记录POST请求到日志中。为了防止web应用程序被CSS攻击,以下这几行也要被加入到之前

SecFilterDefaultAction "deny,log,status:500"

SecFilter "“

第一行是用来当请求包含任何安全过滤变量的搜索断语将返回“服务器内部错误”

第二行在搜索HTML标记的GET和POST请求中建立过滤

一个标准的SQL注入攻击是在GET和POST请求中包含”‘”(单引号)和”””(双引号)。为了句句所有包含这些字符的请求,我们标记SQL注入技术非常困难。

SecFilter “‘”

SecFilter “””

尽管过滤像<,>,’,”这些字符让我们防护拒绝CSS和SQL注入攻击,它将导致PHP应用程序中不正确的函数。它的发生,是由于合法的用户将不能使用这些字符在HTML表单中。为了解决这个问题,JavaScript语言使得在客户端执行用来代替这些被禁止的特殊标记像< > ” 等等

小结

要在使用服务器段技术(PHP,ASP,JSP等)的服务器安全是非常困难的在实际中

理由如下:

1.

服务器自己不能反对糟糕的编程。
2.

服务器段技术(PHP,ASP,JSP)的弱点也能制造web服务器攻击倾向。
3.

为了web服务器更安全,打上所有的安全补丁和移出不必要的文件是必须的。
4.

我们不能忘记整个环境的安全不仅依赖apache和php的配置,更依赖于web应用程序的自身。
5.

程序员需要分析代码和程序在被实施到正式服务器之前。
6.

日志的合理监控和CGI行为必须在没有攻击的情况下长久运行在服务器上

rotatelogs的一个小问题

最近因为需要想分割一下apache日志,所以一直在测试各种apache日志工具。

什么cronolog,mog_log以及rotatelogs这个apache自带的工具。

http://blog.chinaunix.net/u/32831/showart_364596.html

这 里有详细介绍rotatelogs如何使用的问题。但是估计作者也没有自己测试过,其实这个工作虽然apache1.3里自带了,但是只能做到按日期来分 割,而做不到按大小进行分割,这个功能只能在apache2.0以上版本才可以。希望是我错了,毕竟我是不想使用cronolog的。

apache的一个bug

在apache1.3中,如果加载了fastcgi之后,会造成cronolog无法释放的问题,除非apachectl restart,不然cronolog对于日志的记录进程会一直存在并且会累计起来,这就造成了系统进程越来越多。

于是我们需要加载一个apache模块来解决这个问题。

fetch http://hexten.net/assets/apache13/mod_log_rotate.c

然后我们进行安装,apxs位于apache安装目录 apache/bin/下

perl apxs -i -a -c mod_log_rotate.c
这样执行完后该模块会自动增加到httpd.conf中
 并且添加
RotateLogs On (打开 log)

RotateLogsLocalTime On (用 local time 算,default 是用 UTC 時間)

RotateInterval 86400 (86400 是 default,也就是一天,这一行不加也可以)

原本用 cronolog 的地方CustomLog “|c:/bin/cronolog.exe logs/access_%Y%m%d.log” combined

改成

CustomLog logs/access_%Y%m%d.log combined

但是这个模块有个缺点,无法对于错误日志进行分割,官方网站的解释是:

Error Logs

Unfortunately Apache error logs are handled in such a way that we can’t work the same log rotation magic on them. Like transfer logs they support piped logging though so you can still use rotatelogs for them.