主题: 交作业,基于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