1 最后由 tonyjun (2013-03-06 09:55:11) 编辑

主题: 交作业,基于iredmail的openldap建立的FTP服务器

==== 必填信息。没有填写将不予回复 ====
- iRedMail 版本: 0.8.3
- 使用的 Linux/BSD 发行版名称及版本号: CentOS 5.5
- 与您的问题相关的日志信息:
====


   ProFTPD 对 LDAP 的支持相当的完善,几乎堪称完美。而且也不对 LDAP 中的用户帐号有过多的限制。 和 LDAP 整合的关键设置, 本文建立的FTP服务和openldap 及iredmail 并不在同一个服务器,请注意。

   A。 首先安装:
    对版本说明一下,本文档基于1.3.2配置,其他版本配置项名称等会有变化,不保证一致。
    在安装前请准备源码编译环境, 这个就参考网上其他文档吧。

    开始安装proftpd:

    wget ftp://ftp.uk.proftpd.org/historic/sourc … 3.2.tar.gz
    tar xvzf proftpd-1.3.2.tar.gz
    cd proftpd-1.3.2
    ./configure --prefix=/usr/local/proftpd --with-modules=mod_ldap
    make
    make install

    检查一下有没有包括 mod_ldap 模块: /usr/local/sbin/proftpd -l

   B。编辑 /usr/local/proftpd/etc/proftpd.conf,
      以下是我的配置文档,根据你自己的情况修改:
        #Ldap 服务器地址
        LDAPServer 192.168.162.145
        #对ldap服务器读操作的用户与密码
    LDAPDNInfo cn=vmail,dc=gwsample,dc=net lMUw7irAIb4jdeM6AT68qCRjK5R8gV
    #BaseDN 以及 LDAP 查询的 filter 通过语句 LDAPDoAuth 提供
    LDAPDoAuth on "ou=Users,domainName=gwsample.net,o=domains,dc=gwsample,dc=net" "(&(uid=%u))"
    #使用用户提供的口令和搜索到的用户 DN 绑定 LDAP 服务器,来验证口令
    LDAPAuthBinds on
    #如果 LDAP 中没有用户ID和组ID,即没有 posixAccount 相关字段,使用缺省值。 注:下面的用户ID和组ID仅供参考,在我的机器上对应于 ftp:nogroup
    LDAPDefaultGID 65534
    LDAPDefaultUID 14
    LDAPForceDefaultGID on
    LDAPForceDefaultUID on
    LDAPDoUIDLookups off
    LDAPDoGIDLookups off
    #设置用户的主目录。设置为 /home/ftp 作为 LDAP 用户登录的主目录 注意:要事先创建 /home/ftp 目录,并正确授权,以便 proftpd 服务进程能够在其下创建子目录
    LDAPGenerateHomedir on
    LDAPGenerateHomedirPrefix /home/ftp
    LDAPForceGeneratedHomedir on
    # 在用户主目录下,创建用户个人目录。如果设置为 on,则所有用户共享同一主目录
    LDAPGenerateHomedirPrefixNoUsername off
    # 如果用户主目录不存在,创建它
    CreateHome on
    #允许用户没有合法 shell,也可以登录。因为 LDAP 用户如果没有 posixAccount 扩展,是没有 shell 设置的。而 ProFTPD 的 LDAP 指令集中没有缺省 shell 的设置。还好,可以设置为忽略
    RequireValidShell off

至此FTP就可以用了,只需要在iredadmin里增加用户,FTP就能登录,并且访问自己的目录。如果需要共用的FTP目录,根据LDAPDefaultUID设置权限即可。
 

C。以下是从原文档抄过来的,可能有用,自行研究吧。
LDAP 帐号和系统帐号和平共处
合并共处五项原则:

    LDAP 用户主目录位于 /data/ftp/home/<login> 下,每个用户能读写自己目录,不能写他人目录(可以读?)
    系统用户主目录位于 /home/<login> 下,只能访问自己目录,不能访问他人目录
    LDAP 用户的根相当于 /data/ftp,即 chroot 到 /data/ftp
    系统用户 FTP 登录后,能够访问整个文件系统
    LDAP 用户登录后,只读访问 /data/ftp/pub,但是系统用户可以向 pub 中写

要想实现上述五原则,真的要费很多周折。

    只对 nogroup 用户组用户设置 CHROOT

    DefaultRoot   /data/ftp   nogroup

    启用 PAM 认证(缺省启用)

    PersistentPasswd   on

    设置 /data/ftp 只读权限

    <Directory /data/ftp>
     Umask             022  022
     HideNoAccess on
     <Limit READ DIRS>
       AllowAll
     </Limit>
     <Limit WRITE>
       DenyAll
     </Limit>
    </Directory>

    设置用户主目录 /data/ftp/home 只读权限

    <Directory /data/ftp/home>
     Umask             022  022
     <Limit READ DIRS>
       AllowAll
     </Limit>
     <Limit WRITE >
       DenyAll
     </Limit>
    </Directory>

    设置用户对自己主目录的完全权限

    <Directory ~>
     Umask             022  022
     <Limit WRITE READ DIRS>
     AllowAll
     </Limit>
    </Directory>

    设置 /data/ftp/pub 目录权限:LDAP 用户只读,系统用户可写

    <Directory /data/ftp/pub>
     Umask             002  002
     <Limit WRITE>
       DenyGroup nogroup
       AllowGroup !nogroup
     </Limit>
     <Limit READ DIRS>
       AllowAll
     </Limit>
    </Directory>

至此,FTP 服务器和 LDAP 整合完毕。 FTP 协议因为明文传输口令,并不安全,架设 FTPS 可以提供更安全的 FTP 服务。

D。补充个Proftpd的启动脚本
   以源码方式编译安装的Proftpd是没有启动脚本的,也就是说用户不能通过简单的Server profptd start/stop/restart等操作。为了使用简便,我们建立一个Proftpd的启动脚本,把Proftpd加入系统SysV服务。
1. 建立启动脚本

    1. # vi /etc/rc.d/init.d/proftpd  
    2.  
脚本代码:
#!/bin/bashsh 

FTPD_BIN=/usr/local/proftpd/sbin/proftpd 

FTPD_CONF=/usr/local/proftpd/etc/proftpd.conf 

PIDFILE=/usr/local/proftpd/var/proftpd.pid 

if [ -f $PIDFILE ]; then 

pid=`cat $PIDFILE` 

fi 

if [ ! -x $FTPD_BIN ]; then 

echo "$0: $FTPD_BIN: cannot execute" 

exit 1 

fi 

case $1 in 

start) 

if [ -n "$pid" ]; then 

echo "$0: proftpd [PID $pid] already running" 

exit 

fi 

if [ -r $FTPD_CONF ]; then 

echo "Starting proftpd..." 

$FTPD_BIN -c $FTPD_CONF 

else 

echo "$0: cannot start proftpd -- $FTPD_CONF missing" 

fi 

;; 

stop) 

if [ -n "$pid" ]; then 

echo "Stopping proftpd..." 

kill -TERM $pid 

else 

echo "$0: proftpd not running" 

exit 1 

fi 

;; 

restart) 

if [ -n "$pid" ]; then 

echo "Rehashing proftpd configuration" 

kill -HUP $pid 

else 

echo "$0: proftpd not running" 

exit 1 

fi 

;; 

*) 

echo "usage: $0 {start|stop|restart}" 

exit 1 

;; 

esac 

exit 0 


Proftpd启动脚本中注意文件的

    1. FTPD_BIN=/usr/local/proftpd/sbin/proftpd  
    2.  
    3. FTPD_CONF=/usr/local/proftpd/etc/proftpd.conf  
    4.  
    5. PIDFILE=/usr/local/proftpd/var/proftpd.pid  
    6.  
三行,如果您的Proftpd不是安装在/usr/local/proftpd,请根据情况更改以上三行中Proftpd的路径!
2. 授予proftpd运行权限

    1. # chmod 755 /etc/rc.d/init.d/proftpd  
    2.  
3. 将httpd加入系统SysV服务并设置其开机自启动

    1. # chkconfig --add proftpd  
    2.  
    3. # chkconfig --level 3 proftpd on  
    4.  
这样,今后如需启动、停止、重启Proftpd就可以用以下方式了:

    1. # service profptd start  
    2.  
    3. # service proftpd stop  
    4.  
    5. # service proftpd restar

回复: 交作业,基于iredmail的openldap建立的FTP服务器

我这个文档比较简单,没有在openldap 里对ftp进行管理,ftp的配额及ldap组对ftp访问的管理等都没有涉及,可参考proftpd的文档进行配置。

回复: 交作业,基于iredmail的openldap建立的FTP服务器

谢谢分享(就是排版有点乱)。
不过你之前的帖子讨论的是 VsFTPd,又换成 ProFTPd 啦?做运营用的还是公司内部使用?

4 最后由 tonyjun (2013-03-05 17:19:20) 编辑

回复: 交作业,基于iredmail的openldap建立的FTP服务器

其实我就是要基于iredmail 建立 ftp服务器,之前vsftpd有一些依赖等,较麻烦。现在是proftpd配置好且比较简单。
公司内部用的。
文档是基于网上的一些文档加上我的理解及配置信息整理的,可操作度达90%, 乱了点,见谅.

回复: 交作业,基于iredmail的openldap建立的FTP服务器

谢谢tonyjun大大的分享
改天试试看

回复: 交作业,基于iredmail的openldap建立的FTP服务器

为何不用 ? 方便很多.

apt-get install proftpd-mod-ldap proftpd

回复: 交作业,基于iredmail的openldap建立的FTP服务器

centos 5.5 没有 proftpd , 非官方库不知有没有