博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

hahaaj 开往网络安全领域的地铁

未来一年内的目标:将自己的轮滑鞋变成上下班、溜街的交通工具~~~
   hahaaj.cublog.cn
关于作者  
姓名:呵呵嘿嘿
职业:IT
年龄:22
位置:北京
个性介绍:工作学习时爱静,穿上轮滑鞋便好动

我的分类  




在linux下从源码包安装libmysqlclient、snort
系统环境:
采用宿主机+虚拟机构建一个微型网络,以便实现IDS与数据库分离。
宿主机:windows xp sp2 + apache-2.0 + mysql-5.0.15 + php-5.0(装好apache与php以便将来做数据分析)
虚拟机:Red Hat Linux Enterprise 4 + libpcap + snort-2.0.5 + libmysqlclient + libpthread
 
由于之前做网站时已经在XP上安装好apache-2.0 + mysql-5.0.15 + php-5.0, 学习多线程编程时在linux中装好了libpcap和libpthread,这里记录的主要是libmysqlclient及snort的安装。
 
一、从RPM包安装libmysqlclient:

由于数据库服务器安装在xp上,因此,在linux中只需安装mysql的客户端库就可以了。
根据snort.org上的《Snort Installation Manual - Snort, MySQL, Redhat 7.3 》中
《snort Installation》小节的指导下过来两个包:
 
MySQL-client-5.0.22-0.i386.rpm
MySQL-devel-5.0.22-0.i386.rpm
 
键入以下命令安装:
 
#rpm -ivh MySQL-client-5.0.22-0.i386.rpm
#rpm -ivh MySQL-devel-5.0.22-0.i386.rpm
 
安装好以后,在 /usr/include/mysql/ 目录中存放有libmysqlclient的头文件mysql.h,在 /usr/lib/mysql/ 目录中存放有mysql的库文件,但只有.a结尾的(即静态库)库文件(包括libmysqlclient.a),没有.so(共享库)文件。
 
使用如下命令编译一个简单的测试程序(代码在本文结尾处给出):
 
#gcc -c -I/usr/include/mysql mysql-test.c
 
此命令成功生成了目标文件mysql-test.o。
继续键入以下命令。
 
#gcc -o --static mysql-test mysql-test.o -L/usr/lib/mysql -lmysqlclient
 
注意参数的顺序,gcc有时会因为某些参数顺序不对而报错,某些相关参数的具体顺序应该如何,还望高人指点。
以上命令确给出了数不清的“引用未定义符号”的错误信息,引用未定义符号的是libmysqlclient.a
带着希望折腾了许久,最后决定从源码包安装mysql客户端程序库。
 
卸载MySQL-client与MySQL-devel:
 
#rpm -e MySQL-client
#rpm -e MySQL-devel
 
以上两条命令将直接删除rpm -ivh 所释放的所有文件及其创建的文件夹。
 
二、从源码包安装mysql客户端程序库。
 
#tar -zxvf mysql-5.0.22.tar.gz (mysql-5.0.22.tar.gz位于/root目录)
#cd mysql-5.0.22
 
进入mysql-5.0.22目录,阅读 INSTALL-SOURCES 文件,并看到几个关键选项:
 
1、--without-server
只编译安装客户端程序库,不编译mysql服务器程序,这在本机只需要libmysqlclient时很有用。
 
2、--enable-thread-safe-client
让libmysqlclient中的例程具有线程安全性,要编写多线程的mysql客户端程序时就少不了了,这要求本地拥有多线程库。
 
3、--prefix 指定安装目录
 
启动configure脚本:
 
#mkdir /usr/local/mysql
#./configure --without-server --enable-thread-safe-client --prefix=/usr/local/mysql
 
大概6分钟后,configure脚本生成好所有的Makefile后退出。
当前目录下执行make进行编译:
 
#make
 
这个过程除了时间长一点以外没有别的,大概一个钟头后make完成编译任务。
安装:
 
#make install
 
这个过程也比较快,约两三分钟。
 
安装完成以后,mysql.h文件在 /usr/local/mysql/include/mysql/目录中(这里include目录中还有一个mysql子目录)。
以lib开头的库文件在/usr/local/mysql/lib/mysql/目录中(与mysql.h的情况一样,这里lib目录中还有一个mysql子目录)。
 
此时再来链接测试程序的目标文件:
 
#gcc -o mysql-test mysql-test.o -L/usr/lib/mysql -lmysqlclient
 
OK,一切正常,链接成功。
执行一下:
 
#./mysql-test
 
系统这时又发出错误提示:Loading libmysqlclient.so.15 Error; No Such File!
将/usr/local/mysql/lib/mysql/目录中的libmysqlclient.so.15.0.0复制到/usr/lib/目录下:
 
#cp /usr/local/mysql/lib/mysql/libmysqlclient.so.15.0.0 /usr/lib/libmysqlclient.so.15
#./mysql-test
 
屏幕打印出:mysql_init() successed.后就不动了.
约莫90秒后打印libmysqlclient的提示信息:Can not connect to mysql server(110)
这时在windows xp的msdos控制台键入:
 
>netstat -na
 
看到了系统已经打开了3306端口,即mysql server确实在运行。
最后注意到xp中启用了系统防火墙, 禁用系统防火墙后回到linux的ppty键入:
 
#./mysql-test
 
这时,黎明的曙光终于出现了,提示信息告诉我,它已经连接上了XP中的mysql server。
 
三、从源码包安装snort2.0
 
目前snort最新版本为2.8,比2.0复杂一些,感觉刚入门的学习或是研究还是2.0好些,结构清晰且功能齐全。
进入snort2.0源码目录之后执行:
 
#./configure --enable-debug --with-mysql=/usr/local/mysql
 
--enable-debug 选项将snort编译到调试模式,这对于学习或研究都很有帮助。
--with-mysql=/usr/local/mysql 选项将使snort对mysql提供支持。

注意:--with-mysql的值是编译msyql时--prefix指定的路径,而非libmysqlclient.so所在的路径。
接着执行:
 
#make
#make install
 
这两个过程很顺利,总时间在10分钟之内。
 
四、创建snort数据库
 
在phpmyadmin中创建数据库snort2_0,然后import /snort-2.0.5/contrib/create_mysql.
phpmyadmin的控制台居然提示说sql脚本有语法错误!错误的语句为:
CREATE TABLE schema ( vseq        INT      UNSIGNED NOT NULL,
                      ctime       DATETIME NOT NULL,
                      PRIMARY KEY (vseq));
INSERT INTO schema  (vseq, ctime) VALUES ('107', now());
 
错误的地方在表名“schema”附近。查看snort-2.8.1的create_mysql脚本发现其对schema的使用
加了“``”号("`"为1左边的键),即修改如下:
CREATE TABLE `schema` ( vseq        INT      UNSIGNED NOT NULL,
                      ctime       DATETIME NOT NULL,
                      PRIMARY KEY (vseq));
INSERT INTO `schema`  (vseq, ctime) VALUES ('107', now());
  
修改完后再试一次,果然成功了。但其它的表并没有这样,如:
CREATE TABLE event  ( sid    INT     UNSIGNED NOT NULL,
                      cid    INT     UNSIGNED NOT NULL,
                      signature   INT      UNSIGNED NOT NULL,
                      timestamp     DATETIME NOT NULL,
                      PRIMARY KEY (sid,cid),
                      INDEX       sig (signature),
                      INDEX       time (timestamp));
                     
却没有报错。"schema"是mysql的保留字吗?在查找中。
这个问题在snort2.0.5的输出插件中也存在。如下述方式启动snort:
#snort -l /root/snort2.0_log -c /root/snort-2.0.5/etc/snort.conf

 snort.conf输出插件配置:
 #
 output database: alert, mysql, user=root dbname=snort2_0 host=172.16.178.87
 # password
 注意:如果user指定的数据库用户名没有设置密码的话,要将password关键字去掉,否则会出错。
)
结果snort在初使化过程中测试数据库时提示说schema_VERSION=0,不符合要求,即刻退出。
而查看schema表中的vseq明明是106。
最后在snort源码文件spo_database.c的CheckDBVersion函数中看到以下代码:
 
snprintf(select0, MAX_QUERY_LENGTH, "SELECT vseq FROM schema");
 
将其改成:
 
snprintf(select0, MAX_QUERY_LENGTH, "SELECT vseq FROM `schema`");
 
然后回到snort-2.0.5目录中执行 make uninstall, make, make install
(如果想再从头开始编译,需要执行以下几条命令
#make uninstall
#make clean
#rm config.cache 或 rm config.status (根据你的./configure脚本生成的文件确定)
#./configure
)
再执行:
#snort -l /root/snort2.0_log -c /root/snort-2.0.5/etc/snort.conf
 
这下snort终于在IDS模式中运行起来了。几分钟后查看snort2_0数据库,发现snort写入了许多数据。
 
五、仍然存在的疑问:
 
1、mysql server 处理表名为 schema 的查询时所发生的现象。
2、linux中如何查询从源码包安装的软件。
比如:这里的snort,rmp -q snort只提示“並未安裝套件 snort”
 
附:
1、用C语言编写mysql客户端程序教程
文件: ch06-3ed-Writing MySQL Programs Using C.pdf
大小: 297KB
下载: 下载
 
2、mysql server 连接测试文件
===========================================================================
/*******************************************************
**       mysql-test.c
********************************************************/
#include<stdio.h>
#include<mysql.h>
static char *opt_host_name = "172.16.178.87"; /* server host (default=localhost) */
static char *opt_user_name = "root"; /* username (default=login name) */
static char *opt_password = NULL; /* password (default=none) */
static unsigned int opt_port_num = 3306; /* port number (use built-in value) */
static char *opt_socket_name = NULL; /* socket name (use built-in value) */
static char *opt_db_name = "snort2_0"; /* database name (default=none) */
static unsigned int opt_flags = 0; /* connection flags (none) */
static MYSQL *conn; /* pointer to connection handler */
int
main (int argc, char *argv[])
{
/* initialize connection handler */
conn = mysql_init (NULL);
if (conn == NULL)
{
fprintf (stderr, "mysql_init() failed (probably out of memory)\n");
exit (1);
}else printf("mysql_init() successed.\n");
/* connect to server */
if (mysql_real_connect (conn, opt_host_name, opt_user_name, opt_password,
opt_db_name, opt_port_num, opt_socket_name, opt_flags) == NULL)
{
fprintf (stderr, "mysql_real_connect() failed\n");
mysql_close (conn);
exit (1);
}else printf("mysql_real_connect() successed.\n");
/* disconnect from server */
mysql_close (conn);
exit (0);
}
 
3、成功运行snort-2.0.5的屏幕信息
===================================================================================
[root@linux bin]# ./snort -l /root/snort2.0_log -c /root/snort-2.0.5/etc/snort.conf
Running in IDS mode
Log directory = /root/snort2.0_log
Initializing Network Interface eth0
        --== Initializing Snort ==--
Initializing Output Plugins!
Decoding Ethernet on interface eth0
Initializing Preprocessors!
Initializing Plug-ins!
-------------------------------------------------
 Keyword     |       Preprocessor @
-------------------------------------------------
http_decode  :       0x8086b5b
http_decode_ignore:       0x8086c9b
portscan     :       0x8089344
portscan-ignorehosts:       0x8089e09
rpc_decode   :       0x808a40a
bo           :       0x8084047
telnet_decode:       0x8093e53
stream4      :       0x808be58
stream4_reassemble:       0x808c990
frag2        :       0x8084c96
arpspoof     :       0x80835a4
arpspoof_detect_host:       0x80836ad
conversation :       0x8095627
portscan2    :       0x8098411
portscan2-ignorehosts:       0x8096e93
portscan2-ignoreports-from:       0x80972c8
portscan2-ignoreports-to:       0x80972e8
HttpFlow     :       0x80943df
PerfMonitor  :       0x8094953
-------------------------------------------------
-------------------------------------------------
 Keyword     |      Plugin Registered @
-------------------------------------------------
content      :      0x807e24d
content-list :      0x807e182
offset       :      0x807e39d
depth        :      0x807e4dc
nocase       :      0x807e631
rawbytes     :      0x807e6e0
regex        :      0x807e9ba
uricontent   :      0x807e2f5
distance     :      0x807e732
within       :      0x807e876
flags        :      0x8080d53
itype        :      0x807c363
icode        :      0x807bd47
ttl          :      0x8081847
id           :      0x807cdef
ack          :      0x8080b93
seq          :      0x8081427
dsize        :      0x807b8af
ipopts       :      0x807d63b
rpc          :      0x807fdeb
icmp_id      :      0x807bf53
icmp_seq     :      0x807c15b
session      :      0x8080487
tos          :      0x807d3d7
fragbits     :      0x807c59b
fragoffset   :      0x807cac1
window       :      0x80815c1
ip_proto     :      0x807cfa3
sameip       :      0x807d25b
flow         :      0x8081d53
byte_test    :      0x8082449
byte_jump    :      0x8082e05
-------------------------------------------------
-------------------------------------------------
 Keyword     |          Output @
-------------------------------------------------
alert_syslog :       0x80741d9
log_tcpdump  :       0x8078ae1
database     :       0x8075de1
alert_fast   :       0x8073679
alert_full   :       0x8073ca5
alert_unixsock:       0x8074c29
alert_CSV    :       0x8075089
log_null     :       0x8078a1d
log_unified  :       0x807a057
alert_unified:       0x8079db4
unified      :       0x807908f
log_ascii    :       0x807a615
alert_sf_socket:       0x807b0b8
alert_sf_socket_sid:       0x807b1bc
-------------------------------------------------
Parsing Rules file /root/snort-2.0.5/etc/snort.conf
+++++++++++++++++++++++++++++++++++++++++++++++++++
Initializing rule chains...
No arguments to frag2 directive, setting defaults to:
    Fragment timeout: 60 seconds
    Fragment memory cap: 4194304 bytes
    Fragment min_ttl:   0
    Fragment ttl_limit: 5
    Fragment Problems: 0
    Self preservation threshold: 500
    Self preservation period: 90
    Suspend threshold: 1000
    Suspend period: 30
Stream4 config:
    Stateful inspection: ACTIVE
    Session statistics: INACTIVE
    Session timeout: 30 seconds
    Session memory cap: 8388608 bytes
    State alerts: INACTIVE
    Evasion alerts: INACTIVE
    Scan alerts: ACTIVE
    Log Flushed Streams: INACTIVE
    MinTTL: 1
    TTL Limit: 5
    Async Link: 0
    State Protection: 0
    Self preservation threshold: 50
    Self preservation period: 90
    Suspend threshold: 200
    Suspend period: 30
Stream4_reassemble config:
    Server reassembly: INACTIVE
    Client reassembly: ACTIVE
    Reassembler alerts: ACTIVE
    Zero out flushed packets: INACTIVE
    flush_data_diff_size: 500
    Ports: 21 23 25 53 80 110 111 143 513 1433
    Emergency Ports: 21 23 25 53 80 110 111 143 513 1433
http_decode arguments:
    Unicode decoding
    IIS alternate Unicode decoding
    IIS double encoding vuln
    Flip backslash to slash
    Include additional whitespace separators
    Ports to decode http on: 80
rpc_decode arguments:
    Ports to decode RPC on: 111 32771
    alert_fragments: INACTIVE
    alert_large_fragments: ACTIVE
    alert_incomplete: ACTIVE
    alert_multiple_requests: ACTIVE
database: compiled support for ( mysql )
database: configured to use mysql
database:          user = root
database: database name = snort2_0
database:          host = 172.16.178.87
database:   sensor name = 172.16.178.252
database:     sensor id = 1
database: schema version = 107
database: using the "alert" facility
1025 Snort rules read...
1025 Option Chains linked into 44 Chain Headers
0 Dynamic rules
+++++++++++++++++++++++++++++++++++++++++++++++++++
Rule application order: ->activation->dynamic->alert->pass->log
        --== Initialization Complete ==--
-*> Snort! <*-
Version 2.0.5 (Build 98)
By Martin Roesch (roesch@sourcefire.com, www.snort.org)
(到此snort停止了输出,几分钟后 ctrl+c, snort输出以下信息后退出。 )
===============================================================================
Snort analyzed 27878 out of 28458 packets, dropping 580(2.038%) packets
Breakdown by protocol:                Action Stats:
    TCP: 25776      (90.576%)         ALERTS: 8
    UDP: 978        (3.437%)          LOGGED: 8
   ICMP: 13         (0.046%)          PASSED: 0
    ARP: 420        (1.476%)
  EAPOL: 0          (0.000%)
   IPv6: 0          (0.000%)
    IPX: 0          (0.000%)
  OTHER: 75         (0.264%)
DISCARD: 0          (0.000%)
===============================================================================
Wireless Stats:
Breakdown by type:
    Management Packets: 0          (0.000%)
    Control Packets:    0          (0.000%)
    Data Packets:       0          (0.000%)
===============================================================================
Fragmentation Stats:
Fragmented IP Packets: 0          (0.000%)
    Fragment Trackers: 0
   Rebuilt IP Packets: 0
   Frag elements used: 0
Discarded(incomplete): 0
   Discarded(timeout): 0
  Frag2 memory faults: 0
===============================================================================
TCP Stream Reassembly Stats:
        TCP Packets Used: 25776      (90.576%)
         Stream Trackers: 285
          Stream flushes: 394
           Segments used: 691
   Stream4 Memory Faults: 0
===============================================================================
database: Closing connection to database "snort2_0"
Snort exiting

 发表于: 2007-01-07,修改于: 2008-01-07 10:26 已浏览660次,有评论0条 推荐 投诉

  网友评论

  发表评论



Copyright © 2001-2006 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们
页面生成时间:0.15772

京ICP证041476号