FTP集成统一身份认证+Quota限额
预期目标
FTP/FTPS协议文件传输
基于AD或LDAP的统一身份认证登录
用户登录自动进入自己的home目录
所有用户可访问指定公共目录(读写)
用户不可访问除以上目录外的所有其他目录(Deny)
用户空间及速率配额(Quota)
镜像和公共目录使用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~