歡迎您光臨本站 註冊首頁

Samba3.0伺服器實戰調試

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

Samba3.0伺服器實戰調試

原作者:張微波
現在做了部分改動,並添加了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的配置文件

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

comment = Home Directories
browseable = no
writable = yes
valid users = %S
create mode = 0664
directory mode = 0775
Veto files = /*.exe/*.com/*.dll/*.bat/

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/
《解決方案》

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 =====================================

   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 ==============================

   comment = %m:%u的IP-%I
   browseable = no
   writable = yes
   valid users = %S
   create mode = 0664
   directory mode = 0775
   Veto files = /*.exe/*.com/*.dll/*.bat/

  comment = All Printers
  path = /usr/spool/samba
  browseable = no
Set public = yes
   guest ok = no
   writable = no
   printable = yes
;
;   comment = Temporary file space
;   path = /tmp
;   read only = no
;   public = yes

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

安裝作測試
# smbclient -L \\192.168.8.18 -U sample
Password:
Domain= OS= Server=
        Sharename       Type      Comment
        ---------       ----      -------
        www             Disk      
        public          Disk      
        IPC$            IPC       IPC Service (Samba Server)
        sample          Disk      Home Directories
Domain= OS= Server=
        Server               Comment
        ---------            -------
        MAIL                 Samba Server
        Workgroup            Master
        ---------            -------
        DOMAIN               MAIL
# smbclient  \\\\192.168.8.18\\public -U sample
Password:
Domain= OS= Server=
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
再做測試.
《解決方案》

關於批量增加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;
#$sgid = $ARGV;
$slast_name = $ARGV;
$sfirst_name = $ARGV;
$slogin = $ARGV;
$spassword = $ARGV;
#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_name:$slogin,password is:$spassword\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"

(後面的腳本取自於網上,主要增加了對虛擬用戶的批量)
《解決方案》

以後我將要做的是把批量用戶方法用在pureftpd 中對虛擬用戶的增加,還有目錄的創建,許可權的設置,同時如何把samba和pureftpd用在同一個mysql表中,主目錄是一樣的,password的加密方式!
如果有php管理samba的管理工具(虛擬),那就更好了,就是沒有找到.
大家可以試試!
《解決方案》

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中的段落中,有對上面的使用的
      詳細說明.在這裡對常用的做簡略的解釋.
      --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(128) 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時就會彈出對話框,輸入用戶和密碼后才可登入。
《解決方案》

關於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 聯機。

而我設置了

   encrypt passwords = no
   update encrypted = no
那麼我們必需設定,windows 純文字密碼登陸才行,在mysql中我們已經加了密.

您必須使用『登入記錄編輯器』(regedit)對聯機密碼形式做設定:
  Windows 95/98 ==> samba_9x.reg
  REGEDIT4
  
  "EnablePlainTextPassword"=dword:00000001
 
 Windows NT ==> samba_nt.reg
  REGEDIT4
  
  "EnablePlainTextPassword"=dword:00000001
  Windows 2000,xp ==>samba_2000.reg
  REGEDIT4
  
  "EnablePlainTextPassword"=dword:00000001
  你可以手動用 regedit 改,也可以存成 *.reg 直接執行!!
同時為了解決」你無權登陸本網路」
我們要設置:
Windows 2000,xp ==>samba_2000.reg
REGEDIT4

"requiresignorseal"=dword:00000000
"signsecurechannel"=dword:00000000

重新啟動就可以訪問了.
剛剛結局,如果哪位有更好的,不需要更改windows註冊表的方法(samba + pam_mysql+ mysql),告訴我好嗎? 謝謝.
《解決方案》

大哥,一個字,強!!!
《解決方案》

回復 #1 wyckwemail 的帖子

好東東,這個學習了
實際上samba就是在企業里用,很多都是windows的風格和方式

[火星人 ] Samba3.0伺服器實戰調試已經有1085次圍觀

http://coctec.com/docs/service/show-post-26280.html