预期目标

  1. FTP/FTPS协议文件传输

  2. 基于AD或LDAP的统一身份认证登录

  3. 用户登录自动进入自己的home目录

  4. 所有用户可访问指定公共目录(读写)

  5. 用户不可访问除以上目录外的所有其他目录(Deny)

  6. 用户空间及速率配额(Quota)

  7. 镜像和公共目录使用smaba协议实现匿名访问

方案一、Proftpd+LDAP/AD

安装依赖

yum install epel-release -y
yum update -y
yum install proftpd proftpd-ldap

准备本地用户和共享目录

useradd -s /sbin/nologin proftpd
mkdir -p /data/ftp/home
mkdir -p /data/ftp/isos
mkdir -p /data/ftp/public
chown -R proftpd:proftpd /data/ftp/home
chown -R proftpd:proftpd /data/ftp/isos
chown -R proftpd:proftpd /data/ftp/public
chmod 750 /data/ftp/

准备Quota配额表和计数表

#这里需要使用ftpquota工具,进入到源码目录,编译安装后即可获取:
./configure --with-modules=mod_quotatab:mod_quotatab_file
make
make install
​
#创建空的配额表和计数表用于后续工作
ftpquota --create-table --type=limit --table-path=/root/ftpquota.limittab
ftpquota --create-table --type=tally --table-path=/root/ftpquota.tallytab
​
#如果后续有特殊配额需求,也可使用ftpquota工具对配额表手动增加配额条目

proftpd.conf配置如下:

# 保持注释状态,取消注释后将指定ftp根目录,同时home变量会失效
#DefaultRoot                    ~
​
# 认证顺序,这里我们只允许ldap认证
AuthOrder                       mod_ldap.c
​
# 指定ftp进程映射在本地的用户(这里的用户必须在系统中真实存在)
User                            proftpd
Group                           proftpd
​
#########################LDAP/AD认证域配置##############################
#载入LDAP module
LoadModule mod_ldap.c
​
#配置LDAP/AD服务器地址(不用填写协议前缀)
LDAPServer 172.16.20.11
#设置LDAP/AD 管理员DN
LDAPBindDN "CN=xinchen.luan,OU=Domain Users,DC=transwarp,DC=io" "******"(这里填写管理密码)
#映射uid到AD中的sAMAccountName字段
LDAPAttr uid "sAMAccountName"
#设置用户BaseDN和filter
LDAPUsers "OU=Domain Users,DC=transwarp,DC=io" (&(objectClass=user)(sAMAccountName=%v)(mail=*))
#开启log,调试认证过程
LDAPLog /var/log/mod_ldap.log
LDAPSearchScope subtree
#若LDAP中查询不到UserID和GroupID字段,则默认赋值
LDAPDefaultUID 1000
LDAPDefaultGID 1000
#强制给UID和GID赋默认值
LDAPForceDefaultGID on
LDAPForceDefaultUID on
#允许在指定目录下生成用户home目录
LDAPGenerateHomedir on
LDAPGenerateHomedirPrefix /data/ftp/home
LDAPForceGeneratedHomedir on
#允许在指定目录下生成用户目录,如果设置为on,所有用户共享同一home目录
LDAPGenerateHomedirPrefixNoUsername off
#如果用户home目录不存在,则自动创建
CreateHome on
#允许用户没有合法 shell也可以登录,因为 LDAP 用户如果没有 posixAccount 扩展,是没有 shell 设置的
RequireValidShell off
​
#############################目录权限配置##############################
#下面目录权限配置分为四大块,秉承先Deny后Allow的原则
#根目录权限设置
  <Directory / >
    <Limit WRITE READ DIRS DELE> #禁止访问
      DenyAll
    </Limit>
  </Directory>
​
#允许访问ftp目录
  <Directory /data/ftp/ >
    <Limit DELE> #禁止删除文件
      DenyAll
    </Limit>
    <Limit DIRS> #允许查看文件
      AllowAll
    </Limit>
  </Directory>
​
#禁止访问其他用户的家目录
  <Directory /data/ftp/home/ >
    <Limit DELE DIRS> #禁止删除文件
      DenyAll
    </Limit>
  </Directory>
​
#公共目录权限设置
  <Directory /data/ftp/public/ >
    <Limit DELE> #禁止删除文件
      DenyAll
    </Limit>
    <Limit WRITE READ DIRS> #允许读写
      AllowAll
    </Limit>
  </Directory>
​
#ISO镜像目录权限设置
  <Directory /data/ftp/isos/ >
    <Limit DELE> #禁止删除文件
      DenyAll
    </Limit>
    <Limit WRITE READ DIRS> #允许读写
      AllowAll
    </Limit>
  </Directory>
​
#用户自己的家目录权限设置
  <Directory ~>
    <Limit WRITE READ DIRS DELE> #允许读写删除
      AllowAll
    </Limit>
  </Directory>
​
##########################Quota配置##################################
#在此之前需要弄清Quota的原理,Quota主要通过配额表和计数表实现
#若要为每个用户提供不通的配额方案,需要在LDAP/AD用户信息中添加自定义字段
#这里我们没有提供每个用户的自定义配额表,所以使用了本地配额表进行统一配额
LoadModule mod_quotatab.c
LoadModule mod_quotatab_file.c
​
<IfModule mod_quotatab.c>
        QuotaEngine on
        #开启限额调试日志
        QuotaLog /var/log/proftpd/quota.log
        #未查询到配额的用户默认使用以下策略,这里默认限制上传空间50G
        #配额类型、单次会话限制、限制策略、上传配额、下载配额、传输速率、上传数量、下载数量、传输数量(Byte)
        QuotaDefault user false hard 53687091200 0 0 0 0 0
        QuotaDisplayUnits Mb
        QuotaOptions ScanOnLogin
        QuotaDirectoryTally off
        <IfModule mod_quotatab_file.c>
        #分别引入之前生成的本地配额表和计数表
        QuotaLimitTable file:/root/ftpquota.limittab
        QuotaTallyTable file:/root/ftpquota.tallytab
        </IfModule>
</IfModule>
​
##############################显式TLS配置################################
<IfModule mod_tls.c>
  TLSEngine                     on
  #是否强制请求证书
  TLSRequired                   off
  TLSProtocol                   TLSv1.1 TLSv1.2
  #证书路径
  TLSRSACertificateFile         /root/cert/transwarp.io.pem
  TLSRSACertificateKeyFile      /root/cert/transwarp.io.key
  TLSCipherSuite               ALL:!ADH:!DES
  TLSOptions                    NoCertRequest
  TLSVerifyClient               off
  TLSRenegotiate               ctrl 3600 data 512000 required off timeout 300
  TLSLog                        /var/log/proftpd/tls.log
</Ifmodule>
​
##############################被动模式配置##############################
​
#指定被动模式端口范围
PassivePorts 60022 60023
​
#启用TLS后会默认使用被动模式,未指定MasqueradeAddress的话会导致返回内网IP
#这里启用ifsession判断来源IP
LoadModule mod_ifsession.c
  <IfModule mod_ifsession.c>
    #定义内网对象
    <Class internal>
      From 172.18.0.0/16
    </Class>
​
    #来源session为IDC内网,返回FTP内网地址
    <IfClass internal>
      MasqueradeAddress 172.18.31.11
    </IfClass>
​
    #来源session为公网,返回公网IP地址
    <IfClass !internal>
      MasqueradeAddress 103.28.213.234
    </IfClass>
  </IfModule>
​
##################################################################
#除此之外的其他设置请参考proftpd官方文档进行设置,这里保持默认即可#

附Samba共享配置:

[global]
        log file = /var/log/samba/log.%m
        workgroup = SAMBA
        security = user
        map to guest = bad user #开启匿名访问
        passdb backend = tdbsam
        printing = cups
        printcap name = cups
        load printers = yes
        cups options = raw
[isos]
comment = iso share
path = /data/ftp/isos   #isos路径
browsable = yes         #读取权限
writable = no           #写入权限
guest ok = yes          #匿名访问身份为guest
public = yes            #允许匿名访问
force user = proftpd    #指定ftp用户
​
[public]
comment = public share
path = /data/ftp/public #public路径
browsable = yes         #读取权限
writable = no           #写入权限
guest ok = yes          #匿名访问身份为guest
public = yes            #允许匿名访问
force user = proftpd    #指定ftp用户

最终效果

所有用户使用统一账户登陆,登录后自动进入用户home目录,此外用户还可访问public和isos两个公共目录,目录路径和权限如下表:

目录名称

描述

路径

权限

home

用户家目录

/data/ftp/home/{username}

完全控制

public

公共目录

/data/ftp/public

读写

isos

镜像目录

/data/ftp/isos

只读

用户连接FTP后使用quote SITE QUOTA命令查看配额空间: 如图,总空间为51200MB,已用38.41MB。

方案二、Vsftp+LDAP

由于vsftp对于LDAP权限管理较弱,该方案已弃用,仅做参考。

#安装依赖
yum install vsftpd nss-pam-ldapd
​
#配置LDAP
#cat /etc/nslcd.conf
uri ldap://172.16.2.17:10389
base ou=People,dc=tdh
binddn uid=admin,ou=People,dc=tdh
bindpw ***
​
#cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES
guest_username=ftp
local_root=/opt/data
allow_writeable_chroot=YES
​
​
#systemctl start nslcd
#systemctl start vsftpd
​
#至此用户可以使用ldap账号登陆ftp

最后,Have a nice day~