在linux下从源码包安装libmysqlclient、snort
auhtcode
|
1#
auhtcode 发表于 2008-01-09 00:18
在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?BR>继续键入以下命令。 #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” |