文章目录
- 0. VSFTP 简介
- 1. 安装准备
- 2. 匿名用户验证
- 2.1. 修改配置文件
- 2.2. 登陆
- 3. 本地用户验证
- 3.1. 配置文件
- 3.2. 目录管理(可选)
- 3.3. 用户管理
- 3.4. 权限配置
- 3.5. 登陆
- 3.6. 用户配置文件(可选)
- 4. 虚拟用户验证
- 4.1. 建立用户
- 4.2. 加密
- 4.3. 添加pam.d文件
- 4.4. 配置文件
- 4.5. 个性化配置
- 4.6. 登陆
- 5. 本地用户和虚拟用户共存
- 5.1. 原因分析
- 5.2. 配置
0. VSFTP 简介
FTP 是 File Transfer Protocol(文件传输协议)的英文简称,用于 Internet 上的文件的双向传输。使用 FTP 来传输时,是具有一定程度的危险性, 因为数据在因特网上面是完全没有受到保护的明文传输方式!
VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP, 从名称定义上基本可以看出,这是为了解决 ftp 传输安全性问题的。
-
VSFTP 特点
vsftp 程序的运行者一般是普通用户,降低了相对应进程的权限,提高了安全性。
任何需要执行较高权限的指令都需要配置许可。
ftp 所需要使用的绝大多数命令都被整合到了 vsftp 中,基本不需要系统额外提供命令。
拥有 chroot 功能,可以改变用户的根目录,限制用户只能在自己的家目录。 -
VSFTP 连接类型
控制连接(持续连接) → TCP 21(命令信道) → 用户收发FTP命令
数据连接(按需连接) → TCP 20(数据信道) → 用于上传下载数据 -
VSFTP 工作模式
-
主动模式
客户端向服务器的 ftp 端口(默认是 21)发送连接请求,服务器接受连接,建立一条命令链路;
当需要传送数据时,客户端在命令链路上用 port 命令告诉服务器:”我打开了 xxxx 端口,你过来连接我”;
于是服务器从 20 端口向客户端的 xxxx 端口发送连接请求,建立一条数据链路来传送数据。 -
被动模式
客户端向服务器的 ftp 端口(默认是 21)发送连接请求,服务器接受连接,建立一条命令链路;
当需要传送数据时,服务器在命令链路上用 pasv 命令告诉客户端:”我打开了 xxxx 端口,你过来连接我”;
于是客户端向服务器的 xxxx 端口发送连接请求,建立一条数据链路来传送数据。 -
优缺点
主动模式很容易受到防火墙的限制,因为大多数客户端都是在 NAT 环境中上网的,因此服务器无法向客户端的 xxx 端口发起连接;
被动模式则不会受到防火墙的限制,因为这就是一个普通的 NAT 操作,这是完全允许的,并且被动模式的安全性相对来说更高一些。
-
-
VSFTP 传输模式
- ASCII模式:进行文本传输时,自动适应目标操作系统的结束符,如回车符等
- Binary模式:不对数据进行任何处理,适合进行可执行文件、压缩文件、图片等,Linux的红帽发行版中VSFTP默认采用的是Binary模式,这样能保证绝大多数文件传输后能正常使用 。
- 切换方式:在ftp>提示符下输入ascii即转换到ACSII方式,输入bin,即转换到Binary方式。
-
VSFTP 相关软件名
服务端软件名:vsftpd
客户端软件名:ftp
服务名:vsftpd
端口号:20、21、指定范围内随机端口相关目录:
# vsftp配置文件 /etc/vsftpd/vsftpd.conf # PAM认证文件 /etc/pam.d/vsftpd # 匿名用户默认目录 /var/ftp # 匿名用户的下载目录 /var/ftp/pub # 不能访问 ftp server 的用户列表 /etc/vsftpd/ftpusers # 允许访问 ftp server 的用户列表 /etc/vsftpd/user_list # ftp 的上传下载日志 /var/log/xferlog
-
VSFTP 登陆方式:在 vsftpd 服务器中支持匿名用户,本地用户,和虚拟用户3类用户账号,用途及区别如下:
- 匿名用户验证:是名为anonymous或ftp的用户,匿名FTP用户登录后将FTP服务器中的/var/ftp作为FTP根目录。
- 本地用户验证: 是 Linux 系统用户账号,使用本地用户账号登录FTP服务器后,登录目录为本地用户的宿主目录。
- 虚拟用户验证:为了保证FTP服务器的安全性,由vsftpd服务器提供的非系统用户账号。虚拟用户FTP登录后将把指定的目录作为FTP根目录。虚拟用户与本地用户具有类似的功能,由于虚拟用户相对安全,因此正逐步替代本地用户账号的使用。
1. 安装准备
# 安装|卸载 vsftpd
yum install -y vsftpd
yum remove vsftpd
# 检查|启动|停止|重启
systemctl status vsftpd
systemctl start vsftpd
systemctl stop vsftpd
systemctl restart vsftpd
# 设置开机自启动
systemctl enable vsftpd.service
# 让防火墙开启 FTP 服务
firewall-cmd --add-service=ftp --permanent
firewall-cmd --reload
# SE状态
sestatus
# 临时关闭SE
getenforce
setenforce 0
# 永久设置SE权限
getsebool -a | grep ftp
setsebool -P ftpd_full_access on
# 备份配置文件
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
2. 匿名用户验证
用户账号名称:ftp或anonymous
用户账号密码:无密码
工作目录:/var/ftp
默认权限:默认可下载不可上传,上传权限由两部分组成(主配置文件和文件系统,配置文件中配置上传权限,对该目录具有写权限。)
2.1. 修改配置文件
# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
# 运行匿名用户模式
anonymous_enable=YES
local_enable=YES
# 基础设定
write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
# 上传
anon_upload_enable=YES
# 权限掩码,匿名上传的文件权限为755、644
anon_umask=022
# 建立文件夹
anon_mkdir_write_enable=YES
# 删除
anon_other_write_enable=YES
# 用户目录
anon_root=/var/ftp/
# 被动
pasv_enable=YES
pasv_min_port=12000
pasv_max_port=12199
2.2. 登陆
非常重要的点:
- 默认目录的权限不能上传下载,想要获得上传下载权限,需要在根下面新建子目录并赋权。
- 根目录,默认
anon_root=/var/ftp
,所属必需为root
,读写权限755
- 如果需要自定义根目录,必需符合条件2,通常情况下,使用root直接创建目录就OK
# 新建子目录
mkdir -p /var/ftp/upload
# 修改权限
chown -R ftp /var/ftp/upload/
chmod -R 755 /var/ftp/upload/
# 重启服务
systemctl restart vsftpd
# 查询服务器IP
ip addr
# 登陆
ftp://192.168.210.201/
3. 本地用户验证
用户账号名称:本地用户(/etc/passwd)
用户账号密码:用户密码(/etc/shadow)
工作目录:登录用户的宿主目录
权限:最大权限(drwx------)
3.1. 配置文件
重难点:
- 锁定主目录和设定主目录最好配套使用。
- 推荐使用被动访问模式。
- 本地用户掩码为
local_umask
,虚拟用户掩码为anon_umsak
,一定注意区分。 - vsftpd从2.3.5版本开始,增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
错误。解决方式不止一种,其中通过配置allow_writeable_chroot=YES
的方式最省事、也最正规。
# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
# 运行匿名用户模式
anonymous_enable=NO
local_enable=YES
# 基础设定
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
# 锁定主目录
chroot_local_user=YES
# 设定登陆主目录
local_root=/home
# 允许用户对于主目录具有读写权限
allow_writeable_chroot=YES
# 被动
pasv_enable=YES
pasv_min_port=12000
pasv_max_port=12199
3.2. 目录管理(可选)
重难点
- 自定义根目录,所属必须为
root
,权限为755
,一般情况下,root
用户创建的目录就符合要求。 - 子目录,所属必须为对应建立的用户,权限为
700
,这样保证自身对于文件夹有所有权限,但是其他用户无法进入。 - 如果在新建用户的时候指定其用户主目录为子目录,则可以跳过子目录创建阶段。
mkdir /home/FTP
chown -R root:root /home/FTP
chmod -R 755 /home/FTP
# 新增子目录(可选)
mkdir -p /home/FTP/admin_files
chown -R admin:admin /home/FTP/admin_files
chmod -R 700 /home/FTP/admin_files
3.3. 用户管理
重难点
- 如果新建用户不指定用户主目录,则需要返回
3.2. 目录管理
创建对应主目录和权限。 - 用户推荐
nologin
模式,这样可以放置用户登陆系统。 - 使用
nologin
模式后,还需允许nologin
用户登陆FTP
# 新建用户
useradd -s /sbin/nologin -d /home/FTP/admin admin
passwd admin
# 禁止用户登陆(可跳过)
usermod -s /sbin/nologin admin
# 更改用户配置(可跳过)
usermod -s /bin/bash admin
usermod -d /home/FTP/admin admin
# 允许 nologin 用户登陆FTP
sed -i '$a /sbin/nologin' /etc/shells
cat /etc/shells
[root@ftp home]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
/sbin/nologin
3.4. 权限配置
使用ll
命令可以方便的查看系统文件目录的权限
[root@centos_7 home]# ll
总用量 0
drwx------. 3 nandi nandi 78 7月 16 09:10 nandi
-rwxrw-r--. 1 root root 0 7月 16 09:45 readme
drwx------. 3 test test 78 7月 16 09:09 test
上面的信息解读:
- 以
readme
为例,可以看到其所属用户为root
(第一个表示用户),所属用户组为root
(第二个表示组) -rw-r--r--
,一共10个字符,可以分为四段来解读:字符长度为1-3-3-3
- 第一段:
d
表示nandi
和test
是目录,-
表示readme
是文件 - 第二段:
rwx
,对于二进制码111
,十进制为7
,表示所属用户对于该文件(夹)具有读r
写w
执行x
的权限。 - 第三段:
rw-
,对于二进制码110
,十进制为6
,表示所属用户对于该文件(夹)具有读r
写w
的权限。 - 第四段:
r--
,对于二进制码100
,十进制为4
,表示所属用户对于该文件(夹)具有读r
的权限。
掌握规则以后,我们要改变权限也简单了
试验:
目的:将readme
权限更改为:700
分析:700
对应二进制111000000
,对应权限为rwx------
,由于他本身是文件,所以第一个符号是-
,完整的权限为-rwx------
代码:
[root@centos_7 home]# chmod -R 700 readme
[root@centos_7 home]# ll
总用量 0
drwx------. 3 nandi nandi 78 7月 16 09:10 nandi
-rwx------. 1 root root 0 7月 16 09:45 readme
drwx------. 3 test test 78 7月 16 09:09 test
3.5. 登陆
# 重启服务
systemctl restart vsftpd
# 查询服务器IP
ip addr
# 登陆
ftp://192.168.210.201/
3.6. 用户配置文件(可选)
上一步完成以后,就已经成功完成FTP服务器的搭建,但是由于所有本地用户共用一个配置文件,导致很多配置不能根据不同用户的需求来灵活配置。比如,我们想针对不同用户建立不同的根目录,这时用户配置文件就能起到作用:
启用用户配置目录
在/etc/vsftpd/vsftpd.conf
里面添加语句
# 启用用户配置目录
user_config_dir=/etc/vsftpd/user_conf
建立用户配置目录
# 建立用户配置目录
mkdir -p /etc/vsftpd/user_conf
建立用户配置文件
vim /etc/vsftpd/user_conf/test
# 设定登陆主目录
local_root=/home/test
如此反复,注意用户配置文件名和用户名要一样,重启服务以后,不同用户登陆就会进入到各自的根目录当中。
4. 虚拟用户验证
创建虚拟用户用来代替本地用户,减少本地用户曝光率
使用本地用户作为虚拟用户的映射用户,为虚拟用户提供工作目录和权限控制
能够设置严格的权限
4.1. 建立用户
系统映射用户(可选)
虚拟用户为映射到这个用户,以该用户的身份登陆服务器
一般情况下,可以直接使用系统默认的ftp
用户,当然也可以自己定义映射用户,映射用户不用修改密码
useradd -s /sbin/nologin vftpuser
虚拟用户
vim /etc/vsftpd/vusers
test
123
test1
123
test2
123
test3
123
对应的主目录
这里一定要把文件所有权改为映射用户。
mkdir /home/test1
mkdir /home/test2
mkdir /home/test3
chown -R ftp:ftp /home/test*
4.2. 加密
安装数据库(必备)
yum install db4 db4_utils
加密
db_load -T -t hash -f /etc/vsftpd/vusers /etc/vsftpd/vusers.db
4.3. 添加pam.d文件
重点:
- 修改
pam.d
文件以后,本地用户就无法登陆FTP服务器了,因为本地用户使用的验证文件发生了改变。 - 想要保证本地用户和虚拟用户可以同时登陆FTP,请查看
5. 本地用户和虚拟用户共存
vim /etc/pam.d/vusers.db
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
4.4. 配置文件
# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
# 启用虚拟用户
anonymous_enable=NO
local_enable=YES
guest_enable=YES
# 映射账户
guest_username=ftp
pam_service_name=vusers.db
anon_umask=022
# 基础设定
write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
userlist_enable=YES
tcp_wrappers=YES
# 锁定主目录、允许主目录拥有写权限
chroot_local_user=YES
allow_writeable_chroot=YES
# 上传权限
anon_upload_enable=YES
# 建立文件夹权限
anon_mkdir_write_enable=YES
# 删除权限
anon_other_write_enable=YES
# 添加账户配置目录
user_config_dir=/etc/vsftpd/user_conf
# 被动
pasv_enable=YES
pasv_min_port=12000
pasv_max_port=12199
4.5. 个性化配置
配置文件夹(可跳过)
mkdir /etc/vsftpd/user_conf
配置个性化用户
vim /etc/vsftpd/user_conf/test
# 个性化根目录
local_root=/home/ftpfile/000002000000002
# 不可创建目录
anon_mkdir_write_enable=NO
# 不可编辑文件
anon_other_write_enable=NO
# 不可上传文件
anon_upload_enable=NO
4.6. 登陆
# 重启服务
systemctl restart vsftpd
# 查询服务器IP
ip addr
# 登陆
ftp://192.168.210.201/
5. 本地用户和虚拟用户共存
5.1. 原因分析
-
Required:
堆栈中的所有 Required 模块必须看作一个成功的结果。如果一个或多个 Required 模块失败,则实现堆栈中的所有 Required 模块,但是将返回第一个错误。也就意味着,required需要所有内容都满足才行,当我们前两条配置虚拟用户登录验证通过后,继续向下面的配置条目进行验证,验证是否是本地用户时结果发现不是,又因为,验证本地用户的control_flag(见上网址中解释)也为required,所以这时候,就会返回错误,也即验证不成功。所以我们不能同时设置虚拟用户和本地用户的control_flag为required。 -
Sufficient:
如果标记为 sufficient 的模块成功并且先前没有 Required 或 sufficient 模块失败,则忽略堆栈中的所有其余模块并返回成功。我们可以把虚拟用户的验证配置放在最前面,且把control_flag设为sufficient。这样的话,如果遇到是虚拟用户,那么可以通过验证,如果是本地用户,忽略掉sufficient的两条配置规则,只要满足required就行,所以也能通过验证。
5.2. 配置
vim /etc/pam.d/vusers.db
#%PAM-1.0
auth sufficient pam_userdb.so db=/etc/vsftpd/vusers
account sufficient pam_userdb.so db=/etc/vsftpd/vusers
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
更多推荐
Linux使用笔记:配置FTP服务器(vsftp)
发布评论