LDAP 作为 FTP 认证源
有很多用户都提出把 LDAP 和内部的 FTP 服务器整合的需求。好吧,就说一说三个主要的 FTP 服务器:vsftpd, Pure-FTPd 和 ProFTPD 和 LDAP 的整合。
FTP服务器选型
vsftpd 本身并不支持 LDAP 认证,而是通过 PAM 认证提供和 LDAP 的整合。PAM?如果搞砸了,Linux 登录都会出现困难,还是不要这么干吧。所以首先将 vsftpd 排除。 Pure-FTPd 本身支持 LDAP 认证,在 Debian 中,甚至有 pure-ftpd-ldap 包是专门支持 LDAP 认证的 Pure-FTPd 编译。但是说实话,1.0.24 版本之后,PureFTPd 的 LDAP 支持就没见什么实质的改进,其现有的 LDAP 支持非常之弱。- 要求 LDAP 的用户帐号必须包含 posixAccount 作为 objectClass
- 也就是说必须在 LDAP 中指定用户的用户ID和组ID(数字形式)
- 必须在 LDAP 中设定用户主目录
- 系统帐号和LDAP的用户帐号,在实际应用中,绝对不是一一对应的 把Linux登录帐号和LDAP对应,没有太大意义,而且容易造成单点故障
- 为了安全计,往往需要将所有登录帐号映射为一个低权限的系统帐号。Pure-FTPd 的LDAP认证不能实现。
- 而且,对 LDAP 中用户帐号强制设定 posixAccount,造成管理负担。
ProFTPD 的 LDAP 配置要点
ProFTPD 对 LDAP 的支持相当的完善,几乎堪称完美。而且也不对 LDAP 中的用户帐号有过多的限制。 和 LDAP 整合的关键设置:- 编辑 /etc/proftpd/proftpd.conf,启用 LDAP 配置文件 /etc/proftpd/ldap.conf 的加载
Include /etc/proftpd/ldap.conf
- 编辑 /etc/proftpd/modules.conf,启用 LDAP 模组
LoadModule mod_ldap.c
- 配置 LDAPServer,注意不要使用 URI 或者域名,直接使用 IP,否则可能连接失败
LDAPServer 127.0.0.1
- 如果 LDAP 支持匿名绑定,下面配置中的绑定用户DN和口令设置为空
LDAPDNInfo "" ""
- BaseDN 以及 LDAP 查询的 filter 通过语句 LDAPDoAuth 提供
LDAPDoAuth on "dc=moon,dc=ossxp,dc=com" "(&(uid=%u)(authorizedService=ftp)(ossxpConfirmed=TRUE))"
- 使用用户提供的口令和搜索到的用户 DN 绑定 LDAP 服务器,来验证口令
LDAPAuthBinds on
- 如果 LDAP 中没有用户ID和组ID,即没有 posixAccount 相关字段,使用缺省值。
注:下面的用户ID和组ID仅供参考,在我的机器上对应于 ftp:nogroup
LDAPDefaultGID 65534 LDAPDefaultUID 500 LDAPForceDefaultGID on LDAPForceDefaultUID on LDAPDoUIDLookups off LDAPDoGIDLookups off
- 设置用户的主目录。为了避免和系统用户主目录混淆,设置为 /data/ftp/home 作为 LDAP 用户登录的主目录
注意:要事先创建 /data/ftp/home 目录,并正确授权,以便 proftpd 服务进程能够在其下创建子目录
LDAPGenerateHomedir on LDAPGenerateHomedirPrefix /data/ftp/home LDAPForceGeneratedHomedir on # 在用户主目录下,创建用户个人目录。如果设置为 on,则所有用户共享同一主目录 LDAPGenerateHomedirPrefixNoUsername off # 如果用户主目录不存在,创建它 CreateHome on
- 允许用户没有合法 shell,也可以登录。因为 LDAP 用户如果没有 posixAccount 扩展,是没有 shell 设置的。而 ProFTPD 的 LDAP 指令集中没有缺省 shell 的设置。还好,可以设置为忽略:
RequireValidShell off
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>
jiangxin@dawning:/etc/proftpd$ pftp localhost
ftp: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
220 ProFTPD 1.3.2e Server (RDCPS) [127.0.0.1]
Name (localhost:jiangxin):
234 AUTH SSL 成功执行
[SSL Cipher DHE-RSA-AES256-SHA]
331 需要为jiangxin提供密码
Password:
230 用户jiangxin登录
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls /
227 Entering Passive Mode (127,0,0,1,244,223).
150 打开ASCII模式的数据连接为file list
drwxr-x--- 5 proftpd nogroup 4096 Jun 29 10:52 home
drwxrwxr-x 2 jiangxin nogroup 4096 Jun 30 01:38 pub
226 传送完毕