FTP集成统一身份认证+Quota限额


预期目标

  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~


评论