免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6467 | 回复: 7
打印 上一主题 下一主题

[samba] Samba3.0服务器实战调试 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-06 09:05 |只看该作者 |倒序浏览
原作者:张微波
现在做了部分改动,并添加了mysql虚拟用户,还有补充了samba中批量增加用户的脚本.
<一>Samba3.0服务器实战调试
Centos5预装的samba已经是Samba版本3.0.23c,功能已经非常强大了,今天我们调试的重点不是samba3.0的新功能,我们还是先来实现他的基本功能,文件共享服务,至于域控制器功能我会在以后的调试手记中阐述。
我们今天要实现的环境是,公司有:采购,营运,人资,企化,工程,财务,电脑,总经理室,8个部门,我们分别为8个部门建立8个用户组为Purchase, Transport business, Manpower, Business, Project, Computer, General manager room
8个部门里各有3个用户,我们建用户分别为:部门领导(Leadership),文件夹管理者(Superintendent),使用者(User)
然后我们分别就公司的具体情况建立相应的目录及访问权限,通过以下的例子,希望大家能在平时的工作中灵活的应用samba的安全权限来设置你们的samba文件服务器。
1。首先服务器采用用户验证的方式,每个用户可以访问自己的宿主目录,并且只有该用户能访问宿主目录,并具有完全的权限,而其他人不能看到你的宿主目录。
2。建立一个电脑部的共享文件夹,希望Computer组和部门领导能看到,使用者也可以访问,但只有文件夹管理者有写的权限,还有一个部门文档交换目录public,所有部门员工都可读可写,但是每个用户只能删除自己创建的文件和目录,其他部门不可读写。
3。其他部门类似.全公司有一个全部门共享的资料库公共文档,所有部门只读,只有管理者可读可写.建议一个文件交换目录共享可写,所有人都能读写,包括guest用户,但每个人不能删除别人的文件。
前期的工作:
#groupadd –g 1100  purchase;groupadd –g 1200 transport;groupadd –g 1300 manpower; groupadd –g 1400 business; groupadd  -g 1500 project; groupadd  -g 1600 computer; groupadd –g 1700 manager;
#cd /var/samba;  mkdir ‘采购部’ ‘营运部’ ‘人资部’ ‘企化部’ ‘工程部’ ‘财务部’ ‘电脑部’ ‘总经理室’ ‘公共文档’ ‘共享可写’ ‘共享软件’
添加用户,使得普通用户不能登陆系统.
useradd -u 1602 -d  /var/samba/电脑部/nick nick -c “nick” -g computer
useradd -u 1100 -d /var/samba/采购部/purchase purchase -c “采购管理者” -g purchase -s /sbin/nologin;
useradd -u 1101 -d /var/samba/采购部/purone purone -c “采购员一” -g purchase -s /sbin/nologin;
useradd -u 1102 -d  /var/samba/采购部/purtwo purtwo -c “采购员二” -g purchase -s /sbin/nologin;
useradd -u 1103 -d /var/samba/采购部/purthree purthree -c “采购员三” -g purchase -s /sbin/nologin;
useradd -u 1104 -d /var/samba/采购部/purfour purfour -c “采购员四” -g purchase -s /sbin/nologin;
用户的管理:
#smbpasswd –a  purchase; smbpasswd –a  purone; smbpasswd –a  purtwo; smbpasswd –a  purthree; smbpasswd –a  purfour;

权限的分配:
# chown  -R nick:computer 公共文档 共享可写 共享软件
# chmod 1777 共享可写
#chmod 775 共享软件;chmod 775 公共文档
#chown nick:computer 电脑部/
#chown -R nick:computer电脑部/public/
#chmod -R 1770电脑部/public/
# chown purchase: purchase 采购部
# chown -R nick:computer采购部/public/
#chmod -R 1770采购部/public/
我们为了避免麻烦可以在这里把上面所有的文件夹的权限都设置成777,我们通过samba灵活的权限管理来设置上面的5点要求。
以下是我的smb.conf的配置文件
[global]
workgroup = domain
#我的网络工作组
server string = Frank's Samba File Server
#我的服务器名描述
security = user
os level = 33
encrypt passwords = yes
smb passwd file = /etc/samba/smbpasswd
#使用加密密码机制,在win95和winnt使用的是明文其他的基本上可以按照默认的来。
#支持中文环境
netbios name = fileserver
   display charset = cp936
   unix charset = cp936
   dos charset = cp936
[homes]
comment = Home Directories
browseable = no
writable = yes
valid users = %S
create mode = 0664
directory mode = 0775
Veto files = /*.exe/*.com/*.dll/*.bat/
[cdrom]
comment = %L’s DVDROM
path = /mnt/cdrom
public = yes
browseable = yes
root preexec = /bin/mount -t iso9660 -0 iocharset=cp936 /dev/cdrom /mnt/cdrom
root postexec = /bin/umount /mnt/cdrom

[电脑部]
        comment = 电脑部内部共享
        path = /var/samba/电脑部/public
        public = no
        valid users = nick,@computer
        write list = @computer
        printable = no
        #browseable = no
        create mode = 0660
        directory mode = 0770
        Veto files = /*.exe/*.com/*.dll/*.bat/
[共享软件]
        comment = 公司共享软件
        path = /var/samba/共享软件
        public = yes
        writable =no
        write list = nick
        printable = no
        Veto files = /*.exe/*.com/*.dll/*.bat/
[公共文档]
        comment = 公司公共文档
        path = /var/samba/公共文档
        public = yes
        writable = no
        read only = yes
        Veto files = /*.exe/*.com/*.dll/*.bat/
[共享可写]
       comment = 公司内部文档交换目录
       path = /var/samba/共享可写
       public = yes
       writable = yes
       Veto files = /*.exe/*.com/*.dll/*.bat/
[采购部]
        comment = 采购部内部共享       
        browseable = yes
        printable = no
        write list = @purchase
        path = /var/samba/采购部/public
        valid users = nick,@purchase
        create mode = 0660
        directory mode = 0770
        Veto files = /*.exe/*.com/*.dll/*.bat/

#共享可写段基本能满足我们的第4要求,但不能满足每个人不能删除别人的文件这个条件,即使里设置了mask也是没用,其实这个条件只要unix设置一个粘着位就行
chmod -R 1777 /var/samba/共享可写
注意这里权限是1777,类似的系统目录/tmp也具有相同的权限,这个权限能实现每个人能自由写文件,但不能删除别人的文件这个要求
到此为止我们的设置已经能实现我们的共享文件要求,记得重启服务哦
#service smb restart
如果大家没有winodws,不妨先用samba的cilent端命令来测试一下命令的用法我在这里只举几个例子,具体的大家去试验 :smbclient -L 192.168.8.250 -N
guest帐户查询你的服务器的samba共享情况,你可以检验一下是否carl目录时候能被guest帐户看到,应该是看不到的,当然你也可以以某个用户的名义查看
smbclient -L 192.168.8.250  -U nick
系统会提示密码,只要输入smb密码就行。
smbclient //192.168.8.250/nick-U nick
#以nick用户的名义登录nick目录
smbmount //192.168.8.250/nick/mnt/nick-o username=nick
#把服务器的财务目录映射到本地的/mnt/nick目录
简单的病毒防护: 如果想拒绝EXE文件,COM文件,或DLL文件,你可以象这样设置Veto files的属性:Veto files = /*.exe/*.com/*.dll/

论坛徽章:
0
2 [报告]
发表于 2007-12-06 09:09 |只看该作者

Samba3.0服务器基于MySql虚拟用户实战调试

系统环境:
    * centos 5
    * MySQL 5.0.22
    * pam_mysql-0.7pre3
Samba3.0.23c,mysql5.0.22是RedHat自带的。

前期的工作:我们与前面一样,这里就补写了.


建立用于存放samba虚拟用户的Schema的过程: 在mysql中
CREATE DATABASE samba_pamauth;
use samba_pamauth;
CREATE TABLE users (
  uid int(6) NOT NULL auto_increment,
  gid int(6) DEFAULT '0' NOT NULL,
  last_name varchar(80) NOT NULL,
  first_name varchar(80) NOT NULL,
  login varchar(16) NOT NULL,
  date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
  password varchar(16) NOT NULL,
  PRIMARY KEY (uid),
  KEY uid (uid),
  UNIQUE uid_2 (uid)
);
create table logs (msg varchar(255),
    user char(16),
   pid int,
     host char(32),
     rhost char(32),
     logtime timestamp
     );
describe logs;

INSERT INTO users VALUES (  '1', '1', 'account', 'root', 'root',  'NOW()', ENCRYPT('secretpw'));
INSERT INTO users VALUES ( '2', '2','account','sample','sample', 'NOW()', ENCRYPT('secretpw') );

INSERT INTO users VALUES (  '3', '3', 'account', 'nick', 'nick',  'NOW()', ENCRYPT('nick') );

这里,用户密码这个字段的长度是16。这是根据MySQL加密函数的返回值的长度确定的。关于PASSWORD函数返回值的长度,可以参考这个:
http://dev.mysql.com/doc/refman/4.1/en/password-hashing.html
mysql> select encrypt('foo');
mysql> select password('foo');
mysql> select md5('foo');

编译安装pam_mysql
# ./configure --with-openssl
# make
# make install
加上--with-openssl可以避免make时报有关md5.h的编译错误

建立/etc/pam.d/samba(因为只是想验证pam_mysql的安装过程,所以我不想覆盖原有的samba这个文件)。注意只有两行,auth是一行,account是一行。
auth   required      /lib/security/pam_mysql.so user=root passwd=123456 host=localhost db=samba_pamauth table=users usercolumn=login passwdcolumn=password crypt=1 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1

account  required      /lib/security/pam_mysql.so user=root passwd=123456 host=localhost db=samba_pamauth table=users usercolumn=login passwdcolumn=password crypt=1 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1

注意这里pam_mysql.so的路径是/lib/security;指定了sqllog;加密方式是1,也就是用MySQL encrypt ()函数;verbose=1,设置这个可以帮助调试,日志信息输出在/var/log/messages里。
配置/etc/samba/smb.conf
#vi /etc/samba/smb.conf
内容为:
#======================= Global Settings =====================================
[global]
   workgroup = domain
   netbios name = FilesServer
#display charset 根据LANG=zh_CN.UTF-8 为utf-8,LANG=zh_CN.GB2312 或 LANG=zh_CN.GB18030 时用cp936   
display charset = cp936
#unix charset 根据LANG=zh_CN.UTF-8 为utf-8,LANG=zh_CN.GB2312 或 LANG=zh_CN.GB18030 时用cp936  
   unix charset = utf-8
   dos charset = cp936
   server string = 文件服务器
   security = user
   hosts allow = 192.168.8. 192.168.9. 127.
   load printers = yes
cups options = raw
   log file = /var/log/samba/%m.log
   max log size = 50
   os level = 33
   dns proxy = no
# 下面四行为了pam_mysql用的
   encrypt passwords = no
   update encrypted = no
   allow trusted domains = yes
   null passwords = no
   socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
   idmap uid = 16777216-33554431
   idmap gid = 16777216-33554431
   template shell = /bin/false
   winbind use default domain = no

#============================ Share Definitions ==============================
[homes]
   comment = %m:%u的IP-%I
   browseable = no
   writable = yes
   valid users = %S
   create mode = 0664
   directory mode = 0775
   Veto files = /*.exe/*.com/*.dll/*.bat/
[printers]
  comment = All Printers
  path = /usr/spool/samba
  browseable = no
Set public = yes
   guest ok = no
   writable = no
   printable = yes
;[tmp]
;   comment = Temporary file space
;   path = /tmp
;   read only = no
;   public = yes
[cdrom]
comment = %L DVDROM
path = /mnt/cdrom
public = yes
browseable = yes
root preexec = /bin/mount -t iso9660  /dev/cdrom /mnt/cdrom
root postexec = /bin/umount /mnt/cdrom

[电脑部]
        comment = 电脑部内部共享
        path = /var/samba/电脑部/public
        public = no
        valid users = nick,@computer
        write list = @computer
        printable = no
        #browseable = no
        create mode = 0660
        directory mode = 0770
        Veto files = /*.exe/*.com/*.dll/*.bat/
[共享软件]
        comment = 公司共享软件
        path = /var/samba/共享软件
        public = yes
        writable =no
        write list = nick
        printable = no
        Veto files = /*.exe/*.com/*.dll/*.bat/
[公共文档]
        comment = 公司公共文档
        path = /var/samba/公共文档
        public = yes
        writable = no
        read only = yes
        Veto files = /*.exe/*.com/*.dll/*.bat/
[共享可写]
       comment = 公司内部文档交换目录
       path = /var/samba/共享可写
       public = yes
       writable = yes
       Veto files = /*.exe/*.com/*.dll/*.bat/
[采购部]
         comment = 采购部内部共享       
        browseable = yes
        printable = no
        write list = @purchase
        path = /var/samba/采购部/public
        valid users = nick,@purchase
        create mode = 0660
        directory mode = 0770
        Veto files = /*.exe/*.com/*.dll/*.bat/


启动samba服务,测试配置:
#service smb start

安装作测试
[root@mail ~]# smbclient -L \\192.168.8.18 -U sample
Password:
Domain=[DOMAIN] OS=[Unix] Server=[Samba 3.0.23c]
        Sharename       Type      Comment
        ---------       ----      -------
        www             Disk      
        public          Disk      
        IPC$            IPC       IPC Service (Samba Server)
        sample          Disk      Home Directories
Domain=[DOMAIN] OS=[Unix] Server=[Samba 3.0.23c]
        Server               Comment
        ---------            -------
        MAIL                 Samba Server
        Workgroup            Master
        ---------            -------
        DOMAIN               MAIL
# smbclient  \\\\192.168.8.18\\public -U sample
Password:
Domain=[DOMAIN] OS=[Unix] Server=[Samba 3.0.23c]
smb: \> ls
  .                                   D        0  Tue Dec  4 11:02:25 2007
  ..                                  D        0  Mon Dec  3 14:52:30 2007
  mailconf-071117.tar.gz                   30668  Tue Dec  4 11:02:25 2007
  spam_rule.tar.gz                        197756  Tue Dec  4 11:02:25 2007
  pam_mysql-0.7RC1.tar.gz                 335240  Tue Dec  4 11:02:25 2007
                46495 blocks of size 262144. 28452 blocks available
smb: \> mkdir a
smb: \> ls
  .                                   D        0  Tue Dec  4 11:18:03 2007
  ..                                  D        0  Mon Dec  3 14:52:30 2007
  a                                   D        0  Tue Dec  4 11:18:03 2007
  mailconf-071117.tar.gz                   30668  Tue Dec  4 11:02:25 2007
  spam_rule.tar.gz                        197756  Tue Dec  4 11:02:25 2007
  pam_mysql-0.7RC1.tar.gz                 335240  Tue Dec  4 11:02:25 2007
                46495 blocks of size 262144. 28447 blocks available
再登录,成功!换用其他加密方式,也都可以。
然后试验pam_mysql v0.7新加的config_file配置选项。这个选项用来指定一个配置文件,可以把所有pam_mysql的配置放在这个文件中。这样的话,/etc/pam.d/samba的内容变成这样:
auth    required        /usr/lib/security/pam_mysql.so config_file=/etc/samba/pam_mysql.conf

account required        /usr/lib/security/pam_mysql.so config_file=/etc/samba/pam_mysql.conf

/etc/samba/pam_mysql.conf的内容:
users.host=localhost
users.database=samba_pamauth
users.db_user=root
users.db_passwd=123456
users.table=users
users.user_column=login
users.password_column=password
users.password_crypt=1
verbose=1
log.enabled=1
log.table=logs
log.message_column=msg
log.pid_column=pid
log.user_column=user
log.host_column=host
log.rhost_column=rhost
log.time_column=logtime
再做测试.

论坛徽章:
0
3 [报告]
发表于 2007-12-06 09:12 |只看该作者

关于批量增加samba用户的方法

前提:你在安装系统时已经安装了PHP,MYSQL,quota ,DBD::MYSQL,perl-DBI….
A.        向mysql中samba_pamauth表insert data的perl脚本(后面adddeptment.sh要用):
内容为insertmysql.pl:
#!/usr/bin/perl
# ./app lastname firstnaem login passwod
#use DBI;
#建立samba/ftp/postfix 的mysql数据
#$suid = $ARGV[0];
#$sgid = $ARGV[1];
$slast_name = $ARGV[0];
$sfirst_name = $ARGV[1];
$slogin = $ARGV[2];
$spassword = $ARGV[3];
#print "$slast_name,$sfirst_name,$slogin,$spassword\n";
use DBI;
# Connect to target DB
my $dbh = DBI->connect("DBI:mysql:database=samba_pamauth;host=localhost","name","password", {'RaiseError' => 1});
# 查询最大的uid,gid
my $sqr = $dbh->prepare("SELECT max(uid) as uid,max(gid) as gid FROM users";
$sqr->execute();
while(my $ref = $sqr->fetchrow_hashref()) {
$suid = $ref->{'uid'} + 1,$sgid = $ref->{'gid'} + 1;
#print "$suid,$sgid\n";
}
# Insert 员工数据
my $rows = $dbh->do("INSERT INTO users (uid,gid,last_name,first_name,login,date,password) VALUES ('$suid', '$sgid', '$slast_name', '$sfirst_name', '$slogin','NOW()', ENCRYPT('$spassword') )";
# query
#my $sqr = $dbh->prepare("SELECT first_name,password,date FROM users";
#$sqr->execute();
#while(my $ref = $sqr->fetchrow_hashref()) {
#    print "$ref->{'first_name'},$ref->{'password'},$ref->{'date'}\n";
#  }
$dbh->disconnect();
print "$slast_nameslogin,password isspassword\n";

B.        向系统添加samba用户,该用户不可登陆.
内容为adddeptment.sh:
################################################################
# SAMBA 用户批量添加
################################################################
#./addclass gs 1 50(建立gs0101-gs0150用户)
#!/bin/sh
#(建立用户组,按部门)
groupadd purchase
#采购
#公司名称
gsname=times
#部门(组名称)名称(可以修改)
deptname=purchase
#gscode code(定义第一个参数为公司代码,赋予变量“gscode”)
gscode=$1
#class code(定义第二个参数为部门代码,赋予变量“num_dept”)
num_dept=`expr $2 + 0`
if (test $num_dept -le 9)
#以下代码是为了保证部门代码的位数为两位
then
num_dept="0"$num_dept
fi
#max user id(定义第三个参数为该部门员工的最大ID号,赋予变量“max_stid”)
max_stid=`expr $3 + 0`
# @init user id(该部门员工用户ID号从1开始)
num_stid=1
#@mkdir user home(在“/home”目录为所有员工建立名为"student"的公共目录)
if [ ! -x /soft/samba ]
then
mkdir /soft/samba
fi
#在员工公共目录下为每个部门建立以该公司命名的目录
if [ ! -x /soft/samba/$gsname ]
then
mkdir /soft/samba/$gsname
fi
#在员工公共目录下为每个部门建立以该部门命名的目录
if [ ! -x /soft/samba/$gsname/$deptname ]
then
mkdir /soft/samba/$gsname/$deptname
fi
#在员工公共目录下为每个部门建立以该班代码命名的目录)
#if [ ! -x /soft/samba/$gsname/$deptname/$1$num_dept ]
#then
# mkdir /soft/samba/$gsname/$deptname/$1$num_dept
#fi
#(从用户ID号1开始循环,直到最大ID号)
while ( test $num_stid -le $max_stid )
do
if (test $num_stid -le 9)
    #(以下保证员工代码的位数为两位)
then
num_stid="0"$num_stid
fi

user_name=$gscode$num_dept$num_stid  
#(把公司、部门、员工ID号三部分代码组合成用户名,并赋予变量user_name)

#@save user passwd to file user_pwlist(按“name:passwd”的格式逐行追加写入“user_pwlist”文件,以备初始化用户密码)
echo $user_name":"$user_name >> user_pwlist
#@add user(建立该用户,同时赋予“users”组,创建该用户目录,但不可以登录系统)
adduser -g $deptname -d /soft/samba/$gsname/$deptname/$user_name -s /sbin/nologin  $user_name
./insertmysql.pl $deptname $user_name $user_name $user_name
echo "$gsname-$deptname: $user_name haved adding! user limitquota is 20M"
# @set quota(为该用户设置配额,限制最大容量为20MB,没有文件数限制)
#为了用用户设置配额,请单独分区,并配置quota
setquota -u $user_name 10240 20480 0 0 /soft
# @set directory mode(设置该用户目录的权限为755)
chmod 755 /soft/samba/$gsname/$deptname/$user_name
#  @current user id add one(用户ID号加1,准备下一次循环,建立下一个用户)
num_stid=`expr $num_stid + 1`
done
#以下两行为刚才建立的所有用户设置密码)
chpasswd < user_pwlist
pwconv
#(删除“user_pwlist”文件)
rm user_pwlist -f
#echo "$gsname-$deptname: $user_name haved adding! user limitquota is 20M"

(后面的脚本取自于网上,主要增加了对虚拟用户的批量)

论坛徽章:
0
4 [报告]
发表于 2007-12-06 09:20 |只看该作者
以后我将要做的是把批量用户方法用在pureftpd 中对虚拟用户的增加,还有目录的创建,权限的设置,同时如何把samba和pureftpd用在同一个mysql表中,主目录是一样的,password的加密方式!
如果有php管理samba的管理工具(虚拟),那就更好了,就是没有找到.
大家可以试试!

论坛徽章:
0
5 [报告]
发表于 2007-12-06 09:49 |只看该作者

PureFTPd+Mysql+PHP_Manager实现虚拟用户磁盘限额

前几天为了让公司内的FTP,决定在centos5下装支持虚拟用户带磁盘限额的FTP软件。
在安装PureFTPd以前,要做好以下准备工作:

二、 安装PureFTPd
1.下面我们开始安装PureFTPd,同样以FreeBSD的Ports方式安装。
#tar zxfv pure-ftpd-1.0.21.tar.gz -C /usr/local/
#cd /usr/local/pure-ftpd-1.0.21/
#./configure \
--prefix=/usr/local/pureftpd \
--with-mysql \
--with-puredb \
--with-paranoidmsg \
--with-peruserlimits \
--with-shadow \
--with-welcomemsg \
--with-uploadscript \
--with-quotas \
--with-cookie \
--with-pam \
--with-virtualhosts \
--with-virtualroot \
--with-virtualchroot \
--with-diraliases \
--with-sysquotas \
--with-ratios \
--with-ftpwho \
--with-throttling \
--with-largefile \
--with-language=simplified-chinese \
--with-altlog \
--with-iplogging \
--without-usernames
#make
# make check
# make install  

下面配置pureftpd:
# mkdir –pv /usr/local/pureftpd/etc
#cp pureftpd-mysql.conf /usr/local/pureftpd/etc
# cp configuration-file/pure-config.pl /usr/local/pureftpd/sbin/ (生成配置文件)
# cp configuration-file/pure-ftpd.conf /usr/local/pureftpd/etc/
# chmod 755 /usr/local/pureftpd/sbin/pure-config.pl

# cd contrib
编辑 redhat.init 文件。找到语句
找到语句: "pureftpwho=/usr/local/sbin/pure-ftpwho",
将其改为: "pureftpwho=/usr/local/pureftpd/sbin/pure-ftpwho"
找到语句: ”$fullpath /usr/local/etc/pure-ftpd.conf –daemonize”
将其改为: ”$fullpath /usr/local/pureftpd/etc/pure-ftpd.conf –daemonize”
执行以下命令将文件 redhat.init 复制到 /etc 目录中重命名为 pure-ftpd,并将其设置为可执行。
# cp redhat.init /etc/rc.d/init.d/pureftpd
# chmod  u+x /etc/rc.d/init.d/pureftpd

# /sbin/chkconfig --add pureftpd  ( 将 pure-ftpd 服务添加到系统中 )
# /sbin/chkconfig –level 2345 pureftpd on
#serv        ice pureftpd start
解释:
注明:)
在README中[ADVANCED COMPILATION]的段落中,有对上面的使用的
      详细说明.在这里对常用的做简略的解释.
      --without-standalone 不能以standalone的方式执行ftpd.
      --without-inetd           不能以inetd的方式执行ftpd.
      --without-iplogging           做log時不将IP 地址给log下來.
      --without-shadow           不做shadow.除非是用PAM, LDAP or SQL.不然极不建议拿掉.
      --without-usernames           文件列表只会列出UID & GID,不列出实际user or group name.
      --without-humor           嘿嘿嘿....
      --without-ascii           不支持7-bits transfers(ASCII).
      --with-paranoidmsg           唔....不知该怎么说.算是可以给特定人的信息吧.
      --with-sysquotas           吃系统的quota设定.
      --with-minimal           最小化安裝.
      --with-pam
      --with-puredb
      --with-ldap
      --with-mysql
      --with-pgsql           以上五种都是存储资料的格式?.看你比较习惯什么.
      --with-altlog           留log了....
      --with-cookie           使用者进站看到的东东.类似进站画面.
      --with-ratios           上下传比.
      --with-throttling           频宽可设限.
      --with-ftpwho           可用pure-ftpwho來看线上使用者.像是Serv-u的线上状态.
      --with-uploadscript   当一个文件被完整上传完后自动呼叫某一script去对这个文件处理.当然.这个script得你自己写.
      --with-largefile           支持下载超过2G的文件.
      --with-virtualhosts           跟http的virtualhost有异曲同工之妙.
      --with-virtualchroot           配合上面的chroot.
      --with-diraliases           跟Serv-U上面的link功能一样.
      --with-nonroot           不需root权限.一般user即可启动ftpd.
      --with-quotas           使用quota.(非系统下的quota)
      --with-peruserlimits         每个账号最多可登入几次:Anonymous最多可同時登入几次
      --with-everything          所有功能全上.
      --with-language=simplified-chinese           显示出来的信息的语言.缺省为英语.
安装完后,就会在/usr/local目录下生成一个pureftpd目录,我们要使用的文件都在这个目录中。

2.下面我们开始配置pure-ftpd.conf文件
在这里我全使用默认值,修改下面内容以支持MYSQL。(注:Pureftpd可以同时支持ldap,mysql,pgsql,puredb认证)

# MySQL configuration file (see README.MySQL)
MySQLConfigFile /usr/local/pureftpd/etc/pureftpd-mysql.conf

修改不然无法执行 #service pureftpd stop)
# If your pure-ftpd has been compiled with standalone support, you can change
# the location of the pid file. The default is /var/run/pure-ftpd.pid
#PIDFile                     /var/run/pure-ftpd.pid
#去掉上面的注释
PIDFile                     /var/run/pure-ftpd.pid
修改不允许名登陆
NoAnonymous                 yes
# Allow FXP transfers for authenticated users.
AllowUserFXP                yes
# Allow users to resume and upload files, but *NOT* to delete them.
KeepAllFiles                yes
# Automatically create home directories if they are missing
CreateHomeDir               yes

3.配置文件详解(摘自网上陈景峰所著《Pure-FTPd + LDAP + MySQL + PGSQL + Virtual-Users + Quota How To》)
ChrootEveryone yes
chroot每一个用户,等同于Proftpd 中的DefaultRoot~ , 可以限制用户在某个地方活动,增强服务器的安全性。使用过wu-ftpd的使用都应该知道cd /会发生什么!
TrustedGID 50
#以上两者要一起用
BrokenClientsCompatibility no
MaxClientsNumber 50
#最大链接数
Daemonize yes
#Fork in background 以守护进程方式在后台运行
MaxClientsPerIP 5
#每个ip最多链接数,最好设小点。
VerboseLog no
#是否要把所有client端的指令都log下来
DisplayDotFiles no
#显示开头的文件
AnonymousOnly no
#是否只让匿名登录
NoAnonymous no
#不开放匿名登入
SyslogFacility ftp
#应该是对日志做一下过滤 (auth, authpriv, daemon, ftp, security, user, local*)可以让日志只记录想要的信息
DontResolve yes
#不反向解释客户端的ip
MaxIdleTime 5
#最大闲置時間
#LDAPConfigFile /usr/local/pureftpd/etc/pureftpd-ldap.conf
#使用LDAP认证,
MySQLConfigFile /usr/local/pureftpd/etc/pureftpd-mysql.conf
#使用MySQL认证
#PGSQLConfigFile /usr/local/pureftpd/etc/pureftpd-pgsql.conf
#使用PGSQL认证
#PureDB /ftp/etc/pureftpd.pdb
#使用者资料的DB存放地点 [由于我是用PureFTPD的內建DB.固有此选项]
#ExtAuth /var/run/ftpd.sock
#pure-authd socket 路径 (详细请看 README.Authentication-Modules)
#PAMAuthentication yes
#开启PAM认证
#UnixAuthentication yes
#如果你想要有简单的Unix(/etc/passwd)的认证的話
FortunesFile /usr/local/pureftpd/etc/.welcome
#显示的欢迎信息文件,你可以创建该文件,输入一些文字,然后你重启你的FTP服务,就会有意外的发现。
LimitRecursion 2000 8
#ls最多列出3000个文件.最深8层
AnonymousCanCreateDirs no
#匿名用户可以创建目录
MaxLoad 4
#当system load超过4時.使用者将不能再下载
PassivePortRange 30000 50000
#被动连接应答范围
ForcePassiveIP 192.168.0.1
#不会译:(
AnonymousRatio 1 10
#Anonymous连接上传/下载比率
UserRatio 1 10
#用户上传/下载比率(注:如果使用ldap,mysql,pgsql,pam不要启用该功能,否则你在ldap等中设置的Ratio无校)
AntiWarez no
#上传的文件不能被下载(owner is ftp).等到local admin确认
Bind 127.0.0.1,8021
#要绑定和ip/port,在你的系统中有两个FTP Server这样你其中一个FTP就要使用其它端口。
#格式-> 127.0.0.1,21 如果只写port表All ip,port
AnonymousBandwidth 8
#Anonymous 带宽,单位KB/s
UserBandwidth 8
#用户带宽,单位KB/s
Umask 133:022
#上传文件的Umask.(<umask for files>:<umask for dirs> )
MinUID 1000
# UID至少多少才能登录
AllowUserFXP yes
#支不支持FXP
AllowAnonymousFXP no
#Anonymous支不支持FXP
ProhibitDotFilesWrite no
ProhibitDotFilesRead no
#(”.”)开头的文件能不能被读/写,UNIX Like下以点开头的文件是隐藏文件ls –a才能列出
#Pureftpd Quota模式下做产生” .ftpquota”文件。
AutoRename no
#上传文件若有相同文件名自动改名(file.1,file.2...)
AnonymousCantUpload no
#匿名用户上传文件
#TrustedIP 10.1.1.1
#锁IP.
LogPID
#Log文件添加PID
AltLog stats:/ftp/etc/log/pureftpd.log
#log存放地点,注日志有几种常用的格式
#clf 类似apache格式,stats UNIX log格式,w3c 标准W3C格式,可能是HTML格式
NoChmod yes
#不给Chmod指令的权限
KeepAllFiles no
#使用者可续传.但不可刪除文件
CreateHomeDir yes
#如果user的home不存在自动建立(我把这个设为YES)
Quota 1000:10
#Quota <文件数>:<容量Megabytes >,FTP限制10M空间,可以上传1000个文件(注:如果使用ldap,mysql,pgsql,pam不要启用该功能,否则你在ldap等中设置的Quota无校)
PIDFile /ftp/etc/log/pure-ftpd.pid
#记录pure-ftpd的PID文件
CallUploadScript yes      
#呼叫UploadScript
MaxDiskUsage 99
#当硬盘使用率到多少時将停止上传
NoRename yes
#用户不能重命名文件名
CustomerProof yes
PerUserLimits 3:20
#<每个账号最多可登入几次:Anonymous最多可同時登入几次>

4. 创建Mysql数据库中的FTP虚拟用户管理数据库ftpusers
将以下内容存为script.mysql文件

INSERT INTO mysql.user (Host, User, Password, Select_priv, Insert_priv, Update
_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Proces
s_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv) VALUES
('127.0.0.1','ftp',PASSWORD('123456'),'Y','Y','Y','Y','N','N','N','N','N','N
','N','N','N','N');

FLUSH PRIVILEGES;

CREATE DATABASE ftpusers;

USE ftpusers;

CREATE TABLE admin (
Username varchar(35) NOT NULL default '',
Password char(32) binary NOT NULL default '',
PRIMARY KEY (Username)
) TYPE=MyISAM;

INSERT INTO admin VALUES ('Administrator',MD5('123456'));

CREATE TABLE users (
User char(16) NOT NULL default '',
Password char(32) binary NOT NULL default '',
Uid int(11) NOT NULL default '2000',
Gid int(11) NOT NULL default '2000',
Dir char(12 NOT NULL default '',
QuotaFiles int(10) NOT NULL default '500',
QuotaSize int(10) NOT NULL default '30',
ULBandwidth int(10) NOT NULL default '80',
DLBandwidth int(10) NOT NULL default '80',
status enum('0','1') NOT NULL default '1',
ipaccess varchar(15) NOT NULL default '*',
comment tinytext NOT NULL,
PRIMARY KEY (User),
UNIQUE KEY User (User)
) TYPE=MyISAM;

INSERT INTO `users` VALUES ('kevin',MD5('123456'),1001,2000,'/home/kevin',500,30,
80,5);

先在Mysql数据库建立一个对数据库有操作权限的用户ftp,密码为123456。
再创建新数据库ftpusers,并新建两个表admin和users,往admin表中加入管理用户帐号,往users表中加入新的FTP用户kevin,密码为123456。

然后我们运行以下命令来生成数据库ftpusers。

# mysql -u root -ppassword < script.mysql
注意,-p是输入密码,它和后面你输入的password中没有空格。

5.修改/usr/local/pureftpd/etc/pureftpd-mysql.conf配置文件
内容如下所示:

MYSQLServer localhost
#MYSQL服务器的IP
MYSQLPort 3306
#MYSQL 端口号
MYSQLSocket /var/lib/mysql/mysql.sock
#使用UNIX.sock本地连接
注:MYSQLServer 与 MYSQLSocket 选择一种即可

MYSQLUser ftp
#MYSQLUser 数据用户名
MYSQLPassword 123456
#MYSQL数据库用户的密码
MYSQLDatabase ftpusers
#FTP数据数据库
MYSQLCrypt md5
#密码加密方式"cleartext", "crypt", "md5" and "password"
# cleartext 明文,crypt,md5,password是Backend password(‘your-passwd’)函数(MYSQL数据库所使用的password()函数)
MYSQLGetPW SELECT Password FROM users WHERE User="\L"
# 密码字段,我使用users表中的Password做为密码字段
MYSQLGetUID SELECT Uid FROM users WHERE User="\L"
#UID用户ID字段
MYSQLDefaultUID 1000
#默认的UID (注:如何开启该选项,MYSQLGetUID将失去作用)
MYSQLGetGID SELECT Gid FROM users WHERE User="\L"
#GID组ID字段
MYSQLDefaultGID 1000
#默认的GID (注:如何开启该选项,MYSQLGetGID将失去作用)
MYSQLGetDir SELECT Dir FROM users WHERE User="\L"
#FTP用户目录如/home/web/www-9812-net
MySQLGetQTAFS SELECT QuotaFiles FROM users WHERE User="\L"
#磁盘限额,文件数限制。如1000,允许用户上传1千个文件
MySQLGetQTASZ SELECT QuotaSize FROM users WHERE User="\L"
#磁盘限额,FTP用户空间限制(单位为M),如:100M
MySQLGetRatioUL SELECT ULRatio FROM users WHERE User="\L"
MySQLGetRatioDL SELECT DLRatio FROM users WHERE User="\L"
#上传/下载比率。MySQLGetRatioUL为上传比,MySQLGetRatioDL下载比。如:1:5
MySQLGetBandwidthUL SELECT ULBandwidth FROM users WHERE User="\L"
MySQLGetBandwidthDL SELECT DLBandwidth FROM users WHERE User="\L"
#下传/下载带宽(单位KB/s)。MySQLGetBandwidthUL上传带宽,MySQLGetBandwidthDL下载带宽。如上传500KB/s,下载50KB/s
MySQLForceTildeExpansion 1
MySQLTransactions On
#不会翻译

修改好该配置文件后,我们继续。

6.运行PureFTPd
======== 配置匿名用户登录环境 ============

   由于 pure-ftpd 将 FTP 匿名用户(anonymous)映射到名为 ftp 的系统帐户,因此 ftp 系统帐户主目录就是 FTP 匿名用户的主目录。
如果需要 FTP 服务器允许匿名登录系统,就需要建立一个名为 ftp 的系统帐户,而且该帐户的主目录需要存在,否则使用匿名用户登录时会出现登录失败并提示“ No control connection for command:No such file or diretory”的错误。
   默认 pure-ftpd 安装的时候已经建立了 ftp 帐户,但该帐户默认的主目录 /var/ftp 不存在,所以还要使用命令为其建立目录,同时使得 ftp 系统帐户对主目录有写入权限。
#groupadd -g 1000 ftp
#ueradd -g ftp -u 1000 -s /sbin/nologin –d /var/ftp -M ftp
# mkdir /var/ftp
# chown ftp:ftp /var/ftp
操作完后我们就添加一个ftp帐号属于ftp组,用户id和组id都是1000

启动PureFTPd
# service pureftpd start
测试FTP是否正常了。
# ftp 你的IP
Connected to 127.0.0.1.
220---------- 欢迎来到 Pure-FTPd ----------
220-您是第1个使用者,最多可达50个连接
220-现在是本地时间 09:02。服务器端口: 21。
220 在15分钟内没有活动,您将被断线。
Name (127.0.0.1:kevin):kevin
Password:
230-使用者kevin 有以下组的权限: ftp
230-这个服务器支持FXP传输
230-OK. 目前限制的目录是 /
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

恭喜你,你的FTP服务已经正常工作了。

三、 使用PHP_Manager进行用户管理

下载最新的PHP_Manager软件
http://
# tar zxvf ftp_v2.5.tar.gz
# mv ftp_v2.5 /var/www/pureftpadmin
# cd  /var/www/pureftpadmin
# vim config.php
修改config.php配置文件

$LANG = “chinese”; //你的PHP_Manager所用的语言
$DBHost = “localhost”; //你的Mysql服务器的Host
$DBLogin = “ftp”; //登录数据库的用户
$DBPassword = “123456”; //登录数据库的用户密码
$DBDatabase = “ftpusers”; //实现虚拟用户管理的数据库的名字
$FTPAddress = “192.168.8.18:21”; //你的FTP服务的IP地址和端口号
#chown –R root.root /var/www/pureftpadmin
然后使用网页方式登录管理。

配置apache2:
#vim /etc/httpd/conf.d/pureftpdadmin.conf
内容为:
Alias /ftpadmin /var/www/pureftpd_manager
<Location /ftpdadmin>
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
    #Allow from ::1
    Allow from 192.168.8.0/24
    Allow from 192.168.9.0/24
</Location>
# service httpd reload
http://IP/ftpadmin

管理员是administrator,密码是123456,这在前面建数据库的时候可以修改的。进入之后全是中文(繁体)。
有关其他系统下的安装方法,可以参照陈景峰所著《Pure-FTPd + LDAP + MySQL + PGSQL + Virtual-Users + Quota How To》
http://home.9812.net/linux/article/pureftpd/pureftpd_II.htm
补:
============================= pure-ftpd 的简单改进 =============================
   pure-ftpd 是个很不错的 ftp server,不过在用IE直接进入FTP目录的时候,如果系统没有提供匿名登录,IE不会弹出登录界面,而是弹出不提供匿名登录的警告对话框,在这种情 况下,如何让IE能够直接弹出登录对话框呢?通过分析IE与pure-ftpd对话过程,发现原来简单更改就可以实现。找到 src/ftpd.c 文件, 修改如下:
if (broken_client_compat != 0) {
   addreply(331, MSG_USER_OK, username);
   return;
} else {
//    die(530, LOG_DEBUG, MSG_NO_ANONYMOUS_LOGIN);   // 注释掉该行
  addreply(331, MSG_USER_OK, account);           // 修改为这行
}


发现一个PureFTPd的缺点,就是使用了磁盘限额后,虽然已经起作用了,但是会有以下情况发生。
在连接后只能看到限的文件数,无法正常显示用了多少磁盘空间。
解决方法:
修改源代码
/src/quotas.c
在第71行有一条语句为:
*bufpnt=0;这一条语句会将用户根目录下的.ftpquota文件中得到的第二个使用空间数清为0,将该语句注释掉,不影响使用。
在第73行有一条语句为:
old_quota.size = quota->size = strtoull(bufpnt + 1, NULL, 10);
读出并传给quota->size的值有错误,不应该是bufpnt+1,而应该是buf+1,或者是bufpnt,修改好后,重新编译安装即可。

当然在网页上传时还是看不到,但是用命令行或者是FTP工具可以正常看到显示磁盘配额信息。

为了对访问http://ip/ftpadmin 限制,我们做如下修改:
前提条件是我们安装了:
#rpm –ivh auth_mysql…..
在mysql中运行:
    CREATE DATABASE auth;
    USE auth;
    CREATE TABLE users (
      user_name CHAR(30) NOT NULL,
      user_passwd CHAR(20) NOT NULL,
      PRIMARY KEY (user_name)
    );
    CREATE TABLE groups (
      user_name CHAR(30) NOT NULL,
      user_group CHAR(20) NOT NULL,
      PRIMARY KEY (user_name, user_group)
    );
    GRANT SELECT
      ON auth.users
      TO authuser@localhost
      IDENTIFIED BY 'PaSsW0Rd';
    GRANT SELECT
      ON auth.groups
      TO authuser@localhost
      IDENTIFIED BY 'PaSsW0Rd';

    INSERT INTO users VALUES ('testuser',  ENCRYPT('testpass'));
    INSERT INTO groups VALUES ('testuser', 'user');
    INSERT INTO users VALUES ('testadmin', ENCRYPT('testpass'));
    INSERT INTO groups VALUES ('testadmin', 'admin');
    INSERT INTO groups VALUES ('testadmin', 'user');


#vi /etc/httpd/conf.d/pureftpdadmin.conf
内容变为:
pureftpdadminAlias /ftpadmin /var/www/pureftpd_manager
<Location /ftpdadmin>
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
    Allow from ::1
    Allow from 192.168.8.0/24
Allow from 192.168.9.0/24
#加入对mysql的认证
AuthName "MySQL group authenticated zone"
    AuthType Basic
    AuthMYSQLEnable on
    AuthMySQLUser authuser
    AuthMySQLPassword PaSsW0Rd
    AuthMySQLDB auth
    AuthMySQLUserTable users
    AuthMySQLNameField user_name
    AuthMySQLPasswordField user_passwd
    AuthMySQLGroupTable groups
    AuthMySQLGroupField user_group
#
    require group user
</Location>

我们再次输入http://ip/ftpadmin时就会弹出对话框,输入用户和密码后才可登入。

论坛徽章:
0
6 [报告]
发表于 2007-12-07 09:57 |只看该作者

关于Samba3.0服务器基于MySql虚拟用户,xp无法查看的问题的解决

做完后,我在windows xp中的网上邻居查看domain工作组是,提示”你无权查看本网络”,把我都搞晕了,不得以,通过查资料,才知道.
若设定使用「Linux 主机的帐号与密码做为登入 Samba Server 的帐号与密码」时,由于 win95OSR2 之前版本及 NT SP3 之前版本的密码机制是不加密的纯文字密码,当登入 Samba Server 时可传送不加密的纯文字密码给 Samba,因而轻易认证登入。

  而 win98 及 NT SP3之后版本及 WIn2000 的密码机制是属于加过密的密码,当登入Samba Server 时所传送的是加密的密码给 Samba,因而无法认证登入,此时,必须为需要登入 Samba Server 的使用者帐号,利用 smbpasswd 这个工具程序建立登入Samba 的密码,当 windows Client 端登入 Samba 时,就可接受加过密的密码做为认证,不过此时就无需使用「Linux主机的帐号与密码做为登入Samba Server的帐号与密码」,因为已经为使用者建立属于登入 Samba 的密码。必须注意的是:登入Samba 的使用者帐号必须是已存在于 /etc/passwd 文件内的Linux系统帐号,唯有如此,才能确保能使用个人帐号目录。

不加密的联机
  由于 Samba 内定的接受密码机制属于纯文字密码,当设定好Samba Server 端后,此时若Client 端是 Windows 95 OSR2之前的版本或是 Win NT SP3 之前的版本,在登入本机时(假设使用 abc 帐号),直接使用『网上邻居』即可看「home」、「abc」、「works」三个分享目录,这是因为 Client 传送纯文字密码到Server端做为认证。
  若 Client 端是 Windows 95 OSR2以后的版本或是Win NT SP3以后或是 Win2000 ,windows xp的版本,因为 Client 传送加密码到 Samba Server 端做为认证,则需设定为纯文字密码才可以与 Samba Server 联机。

而我设置了
[global]
   encrypt passwords = no
   update encrypted = no
那么我们必需设定,windows 纯文字密码登陆才行,在mysql中我们已经加了密.

您必须使用『登入记录编辑器』(regedit)对联机密码形式做设定:
  Windows 95/98 ==> samba_9x.reg
  REGEDIT4
  [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VNETSUP]
  "EnablePlainTextPassword"=dword:00000001
 
 Windows NT ==> samba_nt.reg
  REGEDIT4
  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Rdr\Parameters]
  "EnablePlainTextPassword"=dword:00000001
  Windows 2000,xp ==>samba_2000.reg
  REGEDIT4
  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkStation\Parameters]
  "EnablePlainTextPassword"=dword:00000001
  你可以手动用 regedit 改,也可以存成 *.reg 直接执行!!
同时为了解决”你无权登陆本网络”
我们要设置:
Windows 2000,xp ==>samba_2000.reg
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters]
"requiresignorseal"=dword:00000000
"signsecurechannel"=dword:00000000

重新启动就可以访问了.
刚刚结局,如果哪位有更好的,不需要更改windows注册表的方法(samba + pam_mysql+ mysql),告诉我好吗? 谢谢.

论坛徽章:
0
7 [报告]
发表于 2007-12-07 14:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2008-11-14 11:17 |只看该作者

回复 #1 wyckwemail 的帖子

好东东,这个学习了
实际上samba就是在企业里用,很多都是windows的风格和方式
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP