需要将ftp服务器的日志存入数据库备查, 比较了一下 vsftpd、proftpd、pure-ftpd三种ftp服务器实现,决定修改 pure-ftpd 源码,达到将写入日志文件的信息同时写入数据库。
*********************
* 1. 安装数据库
*********************
下载源码:
postgresql-9.1.3.tar.bz2
添加用户
# useradd postgres (自动建立 postgres 组)
# vi ~postgres/.bash_profile
添加:
PGLIB=/usr/local/pgsql/lib
PGDATA=$HOME/data
PATH=$PATH:/usr/local/pgsql/bin
MANPATH=$MANPATH:/usr/local/pgsql/man
export PGLIB PGDATA PATH MANPATH
以 postgres 用户登录,
# su - postgres
建立数据库目录:
$ mkdir data
编译安装源码:
以postgres用户登录
tar jxvf postgresql-9.1.3.tar.bz2
./configure --prefix=/usr/local/pgsql
gmake
以root用户登录
gmake install
拷贝 contrib 目录下 start-scripts 下的linux文件到 /etc/init.d,并改名为 postgres,此乃启动文件,需要修改其中的PG_DATA到实际路径。
[root@HS22_blade11 postgresql-9.1.3]# cp contrib/start-scripts/linux /etc/init.d/postgres
[root@HS22_blade11 init.d]# chmod +x postgres
初始化数据库
su - postgres
#/usr/local/pgsql/bin/initdb --locale=C --encoding=EUC_CN -D /home/postgres/data
#/usr/local/pgsql/bin/initdb --locale=C --encoding=WIN -D /home/postgres/data
[postgres@hpserv postgres]$ initdb -D /home/postgres/data --locale=C -E UTF-8
启动数据库
/et/init.d/postgres start
修改超级用户postgres的密码
[root@HS22_blade11 init.d]# su - postgres
[postgres@HS22_blade11 ~]$ psql
psql (9.1.3)
Type "help" for help.
postgres=# alter user postgres with password '超级口令';
ALTER ROLE
postgres=#
配置数据库:
vi /home/postgres/data/postgresql.conf
去掉下面两行注释
#listen_addresses = 'localhost'
#port = 5432
修改 log_min_messages = error 否则日志太多
vi /home/postgres/data/pg_hba.conf
将行
host all all 127.0.0.1/32 trust
改成
host all all 127.0.0.1/32 md5
若要被除本机外的其他机器访问,则需要添加相应的行,例如:
host all all 192.168.154.0 255.255.255.0 md5
且修改 postgresql.conf 中的 listen_addresses = 'localhost' 为 listen_addresses = '*'
若要增加 sharemem,请设置:
vi /etc/sysctl.conf
kernel.shmmax=2147483648
kernel.shmmni=4096
kernel.shmall=2097152
kernel.sem=250 32000 100 128
fs.file-max=65536
net.ipv4.ip_local_port_range=1024 65000
[postgres@hpserv postgres]$ psql -h127.0.0.1 -p5432
psql (8.4.8)
Type "help" for help.
postgres=# show client_encoding;
client_encoding
-----------------
UTF8
(1 row)
postgres=# CREATE USER pureftpd WITH PASSWORD 'ftp库口令';
postgres=# CREATE DATABASE pureftpd WITH OWNER=pureftpd TEMPLATE=template0 ENCODING='UTF-8';
postgres=# \q
[postgres@hpserv postgres]$ psql -l
创建表, pureftpd 用户登录
[postgres@hpserv postgres]$ psql -h127.0.0.1 -p5432 -Upureftpd pureftpd
CREATE TABLE admin (
Username varchar(35) NOT NULL default '',
Password char(32) NOT NULL default '',
PRIMARY KEY (Username)
);
INSERT INTO admin VALUES ('admin',MD5('admin口令'));
CREATE TABLE users (
Username varchar(16) NOT NULL,
Password varchar(32) NOT NULL,
Uid int NOT NULL,
Gid int NOT NULL,
Dir varchar(128) NOT NULL,
QuotaFiles int NOT NULL default 500,
QuotaSize int NOT NULL default 30,
ULBandwidth int NOT NULL default 80,
DLBandwidth int NOT NULL default 80,
Ipaddress varchar(15) NOT NULL default '*',
Comment varchar(256),
Status char(1) NOT NULL default '1',
ULRatio int NOT NULL default 1,
DLRatio int NOT NULL default 1,
PRIMARY KEY (Username)
);
INSERT INTO users (Username, status, Password, Uid, Gid, Dir, ULBandwidth, DLBandwidth, comment, Ipaddress, QuotaSize, QuotaFiles)
VALUES ('testuser', '1', MD5('secret'), '2001', '2001', '/home/ftpdir/testuser', '100', '100', '', '*', '50', '0');
create table ftplog
(
action varchar(20),
username varchar(20),
host varchar(20),
time varchar(20),
size varchar(20),
msg varchar(512)
);
说明:
ftplog 记录日志的表名
action ftp动作, U/D
msg 记录日志信息的列
user 登录用户
host 登录主机
time 登录时间
size 处理该用户连接的进程pid
*****************
* 2. 创建ftp用户
*****************
#Then we create an ftp group ("pftpgroup") and user ("pftpuser") that all our virtual users will be mapped to.
#Replace the group- and userid 2001 with a number that is free on your system:
groupadd -g 2001 pftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "pureftpd user" -g pftpgroup pftpuser
mkdir /home/ftpdir
*********************************************************************************************************
* 3. pure-ftpd 源码编译安装
*
* 修改的源文件: log_mysql_p.h log_mysql.h log_mysql.c ftpd.c log_pgsql.h log_pgsql_p.h log_pgsql.c ftpd_p.h
**********************************************************************************************************
[root]$ ./configure --prefix=/usr/local/pureftpd --with-pgsql=/usr/local/pgsql --without-ascii --with-everything
[root]$ make && make install
mkdir /usr/local/pureftpd/etc
cp pureftpd-pgsql.conf /usr/local/pureftpd/etc
cp configuration-file/pure-config.pl /usr/local/pureftpd/bin
cp configuration-file/pure-ftpd.conf /usr/local/pureftpd/etc
chmod 755 /usr/local/pureftpd/bin/pure-config.pl
cp contrib/redhat.init /etc/init.d/pureftpd
[root]$ vi pure-ftpd.conf
ChrootEveryone yes
#TrustedGID 2001 #根据实际Gid修改
DisplayDotFiles no
PGSQLConfigFile /usr/local/pureftpd/etc/pureftpd-pgsql.conf
Umask 111:007 #同组可删改, <文件掩码>:<目录掩码>
CreateHomeDir yes
Bind *,21 #端口
IPV4Only yes
SyslogFacility none #不往 /var/log/message 里记录日志
AltLog clf:/var/log/pureftpd.log
[root]$ vi pureftpd-pgsql.conf
PGSQLServer 127.0.0.1 此处不能用 localhost! 否则日志无法写入
PGSQLPort 5432
PGSQLUser pureftpd
PGSQLPassword ftpdpass
PGSQLCrypt md5
PGSQLInsertLog INSERT INTO ftplog (action,msg,username,host,time,size) VALUES ('%s','%s','%s','%s','%s','%s')
PGSQLGetPW User -> Username
后面的User 都要改为 Username
[root]$ vi /etc/init.d/pureftpd
fullpath=/usr/local/pureftpd/bin/$prog
pureftpwho=/usr/local/pureftpd/sbin/pure-ftpwho
$fullpath /usr/local/pureftpd/etc/pure-ftpd.conf --daemonize
status)
status pure-ftpd
*************************************************************
* 4. pure-ftpd RPM安装
*
export PATH=$PATH:/usr/local/pgsql/bin
rpmbuild -tb pure-ftpd-1.0.36.tar.gz --define 'with_pgsql 1'
pure-ftpd-1.0.36.tar.gz 中已修改的项:
%define con_ascii 0 避免二进制文件被修改
*************************************************************
4.1 rpm -ivh --nodeps pure-ftpd-1.0.36-1.x86_64.rpm
4.2 修改配置文件
[root]# cd /etc
[root]# vi pure-ftpd.conf
ChrootEveryone yes
#TrustedGID 2001 #根据实际Gid修改
DisplayDotFiles no
PGSQLConfigFile /etc/pureftpd-pgsql.conf
Umask 111:007 #同组可删改, <文件掩码>:<目录掩码>
CreateHomeDir yes
Bind *,21 #端口
IPV4Only yes
SyslogFacility none #不往 /var/log/message 里记录日志
# AltLog clf:/var/log/pureftpd.log #urlencode汉字
AltLog xferlog:/var/log/pureftpd.log #正常显示汉字
[root]$ vi pureftpd-pgsql.conf
PGSQLServer 127.0.0.1 此处不能用 localhost! 否则日志无法写入
PGSQLPort 5432
PGSQLUser pureftpd
PGSQLPassword ftpdpass
PGSQLCrypt md5
PGSQLInsertLog INSERT INTO ftplog (action,msg,username,host,time,size) VALUES ('%s','%s','%s','%s','%s','%s')
PGSQLGetPW User -> Username
后面的User 都要改为 Username
4.4 环境变量
若服务器端字符编码为 UTF-8, 需要指定客户端的字符编码为 GBK, 否则汉字不能入库.
修改 /etc/init.d/pure-ftpd :
[root]$ vi /etc/init.d/pureftpd
export PGCLIENTENCODING=GBK
export LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH
status)
status pure-ftpd
******************************************************************************************
阅读(3506) | 评论(1) | 转发(0) |