使用Proftpd支持FTP/SFTP权限管控
简介
FTP
文件传输协议,FTP由FTP服务器(存储文件)和FTP客户端(通过FTP协议访问FTP服务器上的资源)组成
传输方式
- 主动模式(Port)
- 客户端与服务器端的TCP 21端口建立连接 -> 登录
- 发送PORT命令告知服务器需要做什么操作,客户端使用哪个端口传输数据
- 服务器端通过TCP 20端口连接至客户端指定端口
- 进行数据传输
- 被动模式(Passive)
- 客户端与服务器端的TCP 21端口建立连接 -> 登录
- 客户端发送Pasv命令到服务器端
- 服务器端收到Pasv命令后随机打开一个端口,并通知客户端在此端口传输数据
- 进行数据传输
- 主动模式:将服务器21、20端口打开后仍然有问题,可能是客户端防火墙拦截
- 被动模式:服务器端的数据传输端口是随机打开的,可能会被防火墙拦截
SFTP
安全文件传输协议,基于 SSH2 协议建立安全连接来传输文件。与FTP不同,SFTP不区分数据通道与命令通道,而是数据和命令都会通过单个连接以特殊格式的数据包进行传输,配置时可以指定端口。可以通过用户名密码认证、RSA认证、DSA认证等方式管理用户登录
配置工具
- 大多数Linux系统自带的openssh除了提供ssh连接外还提供sftp功能,使用方便、配置简单,但是无法做到像samba那样细粒度的权限管控,只能对不同的用户配置不同的家目录以及文件夹权限
- proftpd可高度配置权限管控,设置用户和组,同时支持FTP与SFTP的使用,但是配置相对繁琐很多
下面介绍proftpd的配置使用
proftpd使用
FTP基本配置
使用ftpasswd工具创建用户和组
- 添加用户和组
# 创建galen用户,并设置家目录为/vol/galen
ftpasswd --passwd --file=/etc/ftpd/ftpd.passwd --name=galen --uid=1001 \
--home=/vol/galen --shell=/bin/bash
# 创建user1
ftpasswd --passwd --file=/etc/ftpd/ftpd.passwd --name=user1 --uid=1002 \
--home=/vol/user1 --shell=/bin/bash
# 添加用户组group1,添加galen和user1作为组成员
ftpasswd --group --file=/etc/ftpd/ftpd.group --name=group1 --gid=2001 \
--member=galen,user1
- 写入相关配置到/etc/proftpd/proftpd.conf
# 设置FTP用户登录根目录为/vol
DefaultRoot /vol
# 设置用户和组文件路径
AuthUserFile /etc/ftpd/ftpd.passwd
AuthGroupFile /etc/proftpd/ftpd.group
# 资源控制,对处理FTP session的子进程限制内存
<IfModule mod_rlimit.c>
RLimitMemory session 4G
</IfModule>
启用SFTP
使用VirtualHost配置一个独立的SFTP服务器,该配置快的作用是在同一个物理机上虚拟出多个FTP服务器。具体示例如下:
<IfModule mod_sftp.c>
<VirtualHost 0.0.0.0>
ServerName "SFTP Server"
DefaultRoot /vol
SFTPEngine on
# SFTP使用的端口配置为2222
Port 2222
SFTPLog /var/log/proftpd/sftp.log
AllowOverwrite yes
# SFTPHostKey需要提供rsa、dsa以及可选的ECDSA key
# 注意:这些文件需要与SSH2使用的key文件完全相同,所以直接加入ssh的key文件路径
SFTPHostKey /etc/ssh/ssh_host_rsa_key
SFTPHostKey /etc/ssh/ssh_host_dsa_key
# 使用用户名密码的认证方式
SFTPAuthMethods password
# 同以上FTP设置的用户一样
AuthUserFile /etc/proftpd/ftpd.passwd
AuthGroupFile /etc/proftpd/ftpd.group
MaxLoginAttempts 6
SFTPCompression delayed
</VirtualHost>
</IfModule>
以上可以做到用户和组同时通过SFTP与FTP访问服务器,下面简单配置登录限制与权限管控
权限管控
proftpd的 提供了强大权限控制功能,通过向该块添加不同的FTP原生指令(指令列表),配合AllowUser、AllowGroup、AllowAll、DenyAll可以实现非常细粒度的权限控制
Limit
Proftpd将以上FTP原生指令组合成为指令组:
- ALL
Covering: all FTP commands (but not LOGIN) - DIRS
Covering: CDUP, CWD, LIST, MDTM, MLSD, MLST, NLST, PWD, RNFR, STAT, XCUP, XCWD, XPWD - LOGIN
Covering: client logins - READ
Covering: RETR, SIZE - WRITE
Covering: APPE, DELE, MKD, RMD, RNTO, STOR, STOU, XMKD, XRMD
如果指令组和原生指令同时添加到配置,那么原生指令的优先级最高 -> 次优先的是命令组 -> 其他命令组优先级大于带ALL关键字
Umask
linux权限参考如下
| Mode | Label | Description |
|---|---|---|
| 0777 | rwxrwxrwx | read/write/execute permissions for user owner, group owner, and other |
| 0666 | rw-rw-rw- | read/write permissions for user owner, group owner, and other |
| 0755 | rwxr-xr-x | read/write/execute permissions for user owner, read/execute permissions for group owner and other |
| 0750 | rwxr-x--- | read/write/execute permissions for user owner, read permission for group owner, no permissions for other |
| 0644 | rw-r--r-- | read/write permissions for user owner, read permission for group owner and other |
| 0511 | r-x--x--x | read/execute permissions for user owner, execute permission for group owner and other |
- 对于新建文件或目录的权限控制使用umask,即:新文件或目录的权限 = 基本权限与umask按位异或,举例:
基本权限为777,如果我们想将创建的文件设置为创建用户可读写执行,同组用户与其他用户只读,那么设置umask为022,最终得到新建文件或目录的权限为755
7 ^ 0 = 7
7 ^ 2 = 5
7 ^ 2 = 5
- proftpd的基本权限没有执行位,及base-mode = 666
- 我们想设置ftp目录 /vol/share1 为创建者可读写、同组只读、其他用户只读,第一个022为新建文件的umask,第二个022为新建目录的umask
<Directory "/vol/share1">
Umask 022 022
<Limit DIRS WRITE>
AllowAll
</Limit>
</Directory>
详细示例
该配置实现了:
- 用户、组的配置
- 某个目录允许某个组或用户读写
- 用户、组、其他用户对文件的使用权限
- 通过配置目录禁止访问变相实现FTP、SFTP可以一同使用,或者单独使用某一个
- user
# /etc/proftpd/ftpd.passwd
# 将家目录设为不存在的目录,后续使用<Limit>进行统一控制
u1:$1$uWROkZWh$FzA2bjAqX8WXSyahNuhLV0:2000:2000::/nonexistent:/bin/bash
galen:$1$vzCnaVih$cbSGH3balmW7K44PILuCB/:2001:2003::/nonexistent:/bin/bash
otheruser:$1$3QmQ7wF3$qRJE9nC8t8w4n7qtyshE1/:2004:2004::/nonexistent:/bin/bash
user1:$1$XMQbJG3S$4BUxe9VbBCWrItfE2AjuH0:2002:2003::/nonexistent:/bin/bash
- group
# /etc/proftpd/ftpd.group
samba_group_group1:x:2003:galen,user1
- proftpd.conf
Include /etc/proftpd/conf.d/
DefaultRoot /vol
AllowForeignAddress OFF
AuthUserFile /etc/proftpd/ftpd.passwd
AuthGroupFile /etc/proftpd/ftpd.group
<IfModule mod_rlimit.c>
RLimitMemory session 4G
</IfModule>
# 禁止所有人操作根目录
<Directory "/vol">
<Limit WRITE>
DenyAll
</Limit>
</Directory>
# 允许操作根目录的子目录
<Directory "/vol/*/*">
<Limit ALL>
AllowAll
</Limit>
</Directory>
# /vol/share1目录允许属于samba_group_group1组的用户读写
<Directory "/vol/share1">
Umask 022 022
<Limit DIRS WRITE>
AllowGroup samba_group_group1
AllowUser None
DenyAll
</Limit>
</Directory>
# /vol/share3禁止所有ftp登录的用户使用
<Directory "/vol/share3">
Umask 777 777
<Limit DIRS WRITE READ>
AllowGroup None
AllowUser None
DenyAll
</Limit>
</Directory>
# /vol/share2目录允许otheruser使用,创建的文件与目录权限为666(proftpd没有执行位)
<Directory "/vol/share2">
Umask 000 000
<Limit DIRS WRITE>
AllowGroup None
AllowUser otheruser
DenyAll
</Limit>
</Directory>
# 以上为使用FTP登录的设置
# 以下为使用SFTP登录的设置
<IfModule mod_sftp.c>
<VirtualHost 0.0.0.0>
ServerName "SFTP Server"
DefaultRoot /vol
SFTPEngine on
Port 2222
SFTPLog /var/log/proftpd/sftp.log
AllowOverwrite yes
SFTPHostKey /etc/ssh/ssh_host_rsa_key
SFTPHostKey /etc/ssh/ssh_host_dsa_key
SFTPAuthMethods password
AuthUserFile /etc/proftpd/ftpd.passwd
AuthGroupFile /etc/proftpd/ftpd.group
MaxLoginAttempts 6
SFTPCompression delayed
<Directory "/vol">
<Limit WRITE>
DenyAll
</Limit>
</Directory>
<Directory "/vol/*/*">
<Limit ALL>
AllowAll
</Limit>
</Directory>
<Directory "/vol/share1">
Umask 022 022
<Limit DIRS WRITE>
AllowGroup samba_group_group1
AllowUser None
DenyAll
</Limit>
</Directory>
# 使用SFTP登录的任何用户都可以操作/vol/share3
<Directory "/vol/share3">
Umask 000 000
<Limit DIRS WRITE>
AllowGroup samba_group_group1
AllowUser otheruser
DenyAll
</Limit>
</Directory>
# 不允许使用SFTP登录的用户操作/vol/share2
<Directory "/vol/share2">
Umask 777 777
<Limit DIRS WRITE READ>
AllowGroup None
AllowUser None
DenyAll
</Limit>
</Directory>
</VirtualHost>
</IfModule>
总结
proftpd实现的feature还有很多,比如:匿名用户、匿名FTP服务器、隐藏目录或文件、过期帐号等设置,有需要可以研究官网
使用Proftpd支持FTP/SFTP权限管控的更多相关文章
- 开源FTP/SFTP客户端 FileZilla v3.31.0 绿色便携版
下载地址:点我 基本介绍 FileZilla是一种快速.可信赖的FTP客户端以及服务器端开放源代码程式,具有多种特色.直觉的接口.可控性.有条理的界面和管理多站点的简化方式使得Filezilla客户端 ...
- linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)(zz)
linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl) 分类: linux2011-10-10 13:21 8773人阅读 评论(1) 收藏 举 ...
- linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)
因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...
- [转帖]使用Gnome文件管理器连接到服务器:FTP/SFTP、Samba、NFS的方法
使用Gnome文件管理器连接到服务器:FTP/SFTP.Samba.NFS的方法 2019-05-09 16:28:44作者:雷增线稿源:云网牛站 https://ywnz.com/linuxyffq ...
- Web文件管理:elFinder.Net(支持FTP)
elFinder 是一个基于 Web 的文件管理器,灵感来自 Mac OS X 的 Finder 程序. elFinder.Net是.Net版本的一个Demo,使用ASP.NET MVC 4集成,可以 ...
- ftp sftp vsftp
ftp sftp (secure) 是文件传输 协议 vsftp(very secure) 是 ftp 服务端 sftp 是 ssh 的一部分
- 让thinkphp 支持ftp上传到远程,ftp删除
让thinkphp真正的支持FTP上传.删除. 原创by default7#zbphp.com,如需转载请保留作者信息. /** * This is not a free software, All ...
- Quick BI独创千人千面的行级权限管控机制
摘要 就数据访问权限而言,阿里巴巴以“被动式授权”为主,你需要什么权限就申请什么权限.但是,在客户交流过程中,我们发现绝大多数企业都是集中式授权,尤其是面向个人的行级权限管控,管理复杂度往往呈几何增长 ...
- gitlab用户,组,项目权限管控
前言:gitlab上的权限管控是非常重要的,尤其是很多研发人员开发一个项目.这个是我总结的权限管控. 1.这个是创建项目时开放权限设置 2.这个创建用户设置的权限 3.用户权限,5种类型用户是 ...
随机推荐
- Java9至17的新特性总结
总览 讲讲Java 9-17 的一些语法糖和一些新发布的jeps, 重点讲讲JVM的垃圾回收器 时间线 SpringBoot 为什么选择Java17这个版本.我估计跟下面这个图有关系. Java 8 ...
- 使用Web Deploy自动打包发布
在内部测试阶段,经常改一点小东西需要更新给测试继续测试.然后就需要频繁的找到对应更改的视图/JS文件,或者是编译的dll文件,再打开测试服务器找到对应站点替换进去,整套流程下来就非常的繁琐费时. 使用 ...
- 怎么清屏?怎么退出当前命令?怎么执行睡眠?怎么查看当前用户 id?查看指定帮助用什么命令?
清屏:clear 退出当前命令:ctrl+c 彻底退出 执行睡眠 :ctrl+z 挂起当前进程 fg 恢复后台 查看当前用户 id:"id":查看显示目前登陆账户的 uid 和 g ...
- JVM 内存 (堆(heap)、栈(stack)和方法区(method) )
JVM 内存初学 (堆(heap).栈(stack)和方法区(method) ) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令)2.jv ...
- ZAB 和 Paxos 算法的联系与区别?
相同点: 1.两者都存在一个类似于 Leader 进程的角色,由其负责协调多个 Follower 进程的运行 2.Leader 进程都会等待超过半数的 Follower 做出正确的反馈后,才会将一个提 ...
- MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如 何保证 redis 中的数据都是热点数据?
Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略. 相关知识:Redis 提供 6 种数据淘汰策略: volatile-lru:从已设置过期时间的数据集(server.db[i]. ...
- js技术之如何在JS中获取input的值
在JavaScript中获取input元素value的值: 方法一:var variations_number = $("#input的id名").val(); 1 <!DO ...
- 微信小程序从注册到上线系列
为了帮助同学们了解注册及上线的整个流程,所以在开发之外,我专门制作了这个从注册到上线流程:本专辑不涉及任何跟开发有关的事情,开发专辑请看:实战开发宝典 以下为具体内容: 从注册到上线系列<一&g ...
- 利用AudioContext来实现网易云音乐的鲸鱼音效
一直觉得网易云音乐的用户体验是很不错的,很早就注意到了里面的鲸鱼音效,如下图,就是一个环形的跟着音乐节拍跳动的特效. gif动图可能效果不太理想,可以直接在手机上体验 身为前端凭着本能的好奇心和探索心 ...
- EMS已有用户分配邮箱方法
案例任务:已有域用户"test100",为该用户分配邮箱. 分配邮箱前,使用"get-user"命令确认用户类型.域用户"test100"的 ...