一、ftp 服务器的选择
上文我们配置好了LDAP服务,既然配置了这个服务,想要用的自然是它的统一认证功能。那么,安装FTP服务器自然优先选择支持LDAP认证的软件了。
vsftpd 本身并不支持 LDAP 认证,而是通过 PAM 认证提供和 LDAP 的整合。PAM?如果搞砸了,Linux 登录都会出现困难。所以首先将 vsftpd 排除。
Pure-FTPd 本身支持 LDAP 认证,在 Debian 中,甚至有 pure-ftpd-ldap 包是专门支持 LDAP 认证的 Pure-FTPd 编译。PureFTPd 其现有的 LDAP 支持比较弱。
要求 LDAP 的用户帐号必须包含 posixAccount 作为 objectClass
也就是说必须在 LDAP 中指定用户的用户ID和组ID(数字形式)
必须在 LDAP 中设定用户主目录
为了安全计,往往需要将所有登录帐号映射为一个低权限的系统帐号。Pure-FTPd 的LDAP认证在以前的版本是不能实现的,但是在新版本中,pureftpd.schema里面的FTPuid and FTPgid 属性已经支持这个功能。
有了这个功能,那么对于我来说已经够用了。
ProFTPD 对 LDAP 的支持相当的完善,几乎堪称完美。但是自己对ProFTPD不太熟悉,而且ProFTPD相对来说漏洞较多发,所以弃用。
二、Pure-ftpd的安装配置
在Debian 中安装非常容易,执行以下命令安装。
apt-get install pure-ftpd-ldap
修改配置文件:
创建文件/etc/pure-ftpd/conf/ChrootEveryone ,其中只包含字符串yes :
echo "yes" > /etc/pure-ftpd/conf/ChrootEveryone
这将使PureFTPd在其主目录中的每个虚拟用户都chroot,因此他将无法浏览其主目录之外的目录和文件。
还要创建文件/etc/pure-ftpd/conf/CreateHomeDir ,它再次只包含字符串yes :
echo "yes" > /etc/pure-ftpd/conf/CreateHomeDir
这将使PureFTPd在用户登录并且主目录不存在时创建用户的主目录。
创建文件/etc/pure-ftpd/conf/DontResolve ,它再次只包含字符串yes :
echo "yes" > /etc/pure-ftpd/conf/DontResolve
这将使PureFTPd不会查找可以显着加速连接并减少带宽使用的主机名。
修改文件/etc/pure-ftpd/conf/DontResolve ,它再次只包含字符串"HIGH:MEDIUM:+TLSv1:!SSLv2:+SSLv3" :
echo "HIGH:MEDIUM:+TLSv1:!SSLv2:+SSLv3" > /etc/pure-ftpd/conf/TLSCipherSuite
这将使PureFTPd可以兼容一些较老的客户端(在开启TLS加密的时候)
创建文件/etc/pure-ftpd/conf/TLS ,它再次只包含字符串2 :
echo "2" > /etc/pure-ftpd/conf/TLS
这将使PureFTPd强制启用TLS加密连接,这样密码就不会明文在网络上传输。
/etc/pure-ftpd/conf/PassivePortRange 可以修改Passive模式开的端口范围,可以根据需要修改。
然后,生成TLS加密连接需要的文件。
sudo openssl req -x509 -nodes -days 7200 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem
sudo openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 2048
接下来,我们配置pure-ftpd的ldap.conf文件:
/etc/pure-ftpd/db/ldap.conf
主要修改下面三项,修改成上文的配置:
LDAPBaseDN cn=People,dc=lostend,dc=com
LDAPBindDN cn=admin,dc=lostend,dc=com
LDAPBindPW admin'sPassword
其它选项可以看说明酌情修改。
修改完成以后重启 pure-ftpd
/etc/init.d/pure-ftpd-ldap restart
接下来,配置pureftpd.schema
首先拷贝/usr/share/doc/pure-ftpd-common/pureftpd.schema 文件至/etc/ldap/schema/pureftpd.schema
然后建立文件/etc/ldap/schema/pureftpd.ldif ,内容如下:
dn: cn=pureftpd,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: pureftpd
olcAttributeTypes: {0}( 1.3.6.1.4.1.6981.11.3.1 NAME 'FTPQuotaFiles' DESC 'Q
uota (in number of files) for an FTP user' EQUALITY integerMatch SYNTAX 1.3
.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {1}( 1.3.6.1.4.1.6981.11.3.2 NAME 'FTPQuotaMBytes' DESC '
Quota (in megabytes) for an FTP user' EQUALITY integerMatch SYNTAX 1.3.6.1.
4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {2}( 1.3.6.1.4.1.6981.11.3.3 NAME 'FTPUploadRatio' DESC '
Ratio (compared with FTPRatioDown) for uploaded files' EQUALITY integerMatc
h SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {3}( 1.3.6.1.4.1.6981.11.3.4 NAME 'FTPDownloadRatio' DESC
'Ratio (compared with FTPRatioUp) for downloaded files' EQUALITY integerMa
tch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {4}( 1.3.6.1.4.1.6981.11.3.5 NAME 'FTPUploadBandwidth' DE
SC 'Bandwidth (in KB/s) to limit upload speeds to' EQUALITY integerMatch SY
NTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {5}( 1.3.6.1.4.1.6981.11.3.6 NAME 'FTPDownloadBandwidth'
DESC 'Bandwidth (in KB/s) to limit download speeds to' EQUALITY integerMatc
h SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {6}( 1.3.6.1.4.1.6981.11.3.7 NAME 'FTPStatus' DESC 'Accou
nt status: enabled or disabled' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.
4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {7}( 1.3.6.1.4.1.6981.11.3.8 NAME 'FTPuid' DESC 'System u
id (overrides uidNumber if present)' EQUALITY integerMatch SYNTAX 1.3.6.1.4
.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {8}( 1.3.6.1.4.1.6981.11.3.9 NAME 'FTPgid' DESC 'System u
id (overrides gidNumber if present)' EQUALITY integerMatch SYNTAX 1.3.6.1.4
.1.1466.115.121.1.27 SINGLE-VALUE )
olcObjectClasses: {0}( 1.3.6.1.4.1.6981.11.2.3 NAME 'PureFTPdUser' DESC 'Pur
eFTPd user with optional quota, throttling and ratio' SUP top AUXILIARY MAY
( FTPStatus $ FTPQuotaFiles $ FTPQuotaMBytes $ FTPUploadRatio $ FTPDownloa
dRatio $ FTPUploadBandwidth $ FTPDownloadBandwidth $ FTPuid $ FTPgid ) )
以上文件内容只是展示用。具体生成方法如下:
首先建立一个文件 pureftpd.txt :
include /etc/ldap/schema/pureftpd.schema
现在我们将转换schema:
mkdir ldif
slaptest -f pureftpd.txt -F ldif
现在我们更改到包含转换模式的目录:
cd ldif/cn\=config/cn\=schema
该目录应包含以下文件:
cn={0}pureftpd.ldif
更改:
dn: cn={0}pureftpd
objectClass: olcSchemaConfig
cn: {0}pureftpd
至:
dn: cn=pureftpd,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: pureftpd
并删除:
structuralObjectClass: olcSchemaConfig
entryUUID: 18f5d9c2-5b7f-1039-91ac-0f367d4f1c38
creatorsName: cn=config
createTimestamp: 20190825122458Z
entryCSN: 20190825122458.522936Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20190825122458Z
现在我们将ldif文件复制到/etc/ldap/schema目录中(这是必要的,但是当需要ldif时,很方便找到)。
cp cn\=\{0\}pureftpd.ldif /etc/ldap/schema/pureftpd.ldif
现在我们将模式添加到OpenLDAP。
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/pureftpd.ldif
这样,我们就完成了pureftpd.schema 往LDAP里添加。
三、LAM 里面配置PureFTPdUser
在下图中,我们可以看到刚才添加的 PureFTPdUser objectClass。
然后,可以在用户信息那添加PureFTPdUser objectClass 和属性。
可以通过 FTPuid和FTPgid属性,将FTP账户登陆时映射成一个低权限的系统账号。一般会建立一个专属的 ftpuser和 ftpgroup,然后映射成对应的uid和gid。具体想映射成哪个,自己根据需要决定就可以了。
当然还有一些容量配额、上下载带宽配置的属性等。可根据需要开启。
具体可以参考官方文档:
https://download.pureftpd.org/pub/pure-ftpd/doc/README.LDAP
如果事先已经建立了比较多的账号,可能一个个的修改很累人,可以执行批量修改操作: