一、说明
配置环境:VMware虚拟机中安装openEuler 22.03 LTS系统,并确保该Linux服务器能访问Internet。
FTP服务器的身份认证模式
vsftpd服务提供以下3种身份认证模式,前两种模式比较常见,第3种模式是vsftpd的特有的服务模式。
(1)匿名模式
该模式允许任何人访问,且无需登录账号和密码,是最不安全的模式,常用于提供普通文件和软件下载的场景。
(2)本地用户模式
该模式是将Linux系统中的用户账号作为登录FTP服务器的凭证,相对匿名模式有一定的安全性,但由于FTP报文是明文传输,用户密码存在被监听和泄露的安全风险,从而会直接威胁Linux服务器系统安全。
(3)虚拟用户模式
该模式下的FTP登录账号不是Linux系统的用户账号,而是一种虚拟账户,这些虚拟账户仅用于FTP服务登录认证,即使这些账户密码被泄露,也无法登录和控制Linux服务器,因而是相对更安全的一种认证模式。
本文将分别对上述三种模式的FTP服务器配置过程进行简要介绍,需要哪种模式就可以直接跳转到对应节查看。
二、配置基础
1、安装软件包
[root@ftp-server ~]# dnf -y install vsftpd
2、配置文件说明
[root@ftp-server ~]# cd /etc/vsftpd [root@ftp-server vsftpd]# ll total 20 -rw-------. 1 root root 125 Dec 28 14:36 ftpusers -rw-------. 1 root root 361 Dec 28 14:36 user_list -rw-------. 1 root root 5039 Dec 28 14:36 vsftpd.conf -rwxr--r--. 1 root root 348 Dec 28 14:36 vsftpd_conf_migrate.sh
说明:
- /etc/vsftpd/ftpusers:黑名单文件,在此文件中的用户不允许访问FTP服务器。
- /etc/vsftpd/user_list:白名单文件,在此文件中的用户允许访问FTP 服务器。
- /etc/vsftpd/vsftpd.conf:ftp服务的核心配置文件。
- /etc/vsftpd/vsftpd_conf_migrate.sh:vsftpd操作的一些变量和设置
3、vsftp服务的常用操作
(1)服务开机自启动
安装完成vsftpd软件包后,通常建议将vsftpd服务设置为开机自启动,命令如下:
[root@ftp-server ~]# systemctl enable vsftpd
(2)重户服务
只要修改了/etc/vsftpd/vsftpd.conf配置文件,都要求重启vsftpd服务以使修改生效,重启服务的命令如下:
[root@ftp-server ~]# systemctl restart vsftpd
(3)查看服务状态
服务启动后,可以执行以下命令查看服务状态是否正常。
[root@ftp-server ~]# systemctl status vsftpd
(4)查看服务监听端口
服务启动后,若要查看该服务的监听端口,可以执行以下命令查看
[root@ftp-server ~]# netstat -antup | grep ftp
(5)查看ftp日志
当服务工作状态不正常时,可以查看服务日志,以便错误排查,命令如下:
[root@ftp-server ~]# journalctl -xu vsftpd
(6)测试访问
在另一台Linux系统中,可以安装ftp客户端软件包,就可以测试访问FTP服务器了
#安装ftp客户端软件包 [root@client ~]# dnf -y install ftp #测试访问FTP服务器 [root@client ~]# ftp 192.168.0.218 Connected to 192.168.0.218 (192.168.0.218). 220 (vsFTPd 3.0.3) Name (192.168.0.218:root): anonymous 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (192,168,0,218,215,250). 150 Here comes the directory listing. drwxr-xr-x 2 0 0 4096 Dec 28 06:36 pub 226 Directory send OK.
三、配置匿名模式的FTP服务器
1、编辑配置文件
与匿名用户有关ftp配置参数如下表所示,可根据需要自行配置
参数 | 作用 |
anonymous_enable=YES | 允许匿名访问模式 |
anon_root | 匿名用户根目录,默认为/var/ftp/pub |
anon_umask=022 | 匿名用户上传文件的umask值 |
anon_upload_enable=YES | 允许匿名用户上传文件 |
anon_mkdir_write_enable=YES | 允许匿名用户创建目录 |
anon_other_write_enable=YES | 允许匿名用户修改目录名称或删除目录 |
比如,如果允许匿名用户上传文件,则在配置文件末尾添加anon_upload_enable=YES的配置项。
若要配置成纯粹的匿名服务器,即只允许匿名访问,禁止本地用户登录访问,则可按以下方式进行配置。
[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf #……此处省略文件其它内容,找到以下配置行,并其值修改成如下…… #允许匿名访问 anonymous_enable=YES # 禁止本地用户登录访问 local_enable=NO # 禁止向服务器写入 write_enable=no # 指定匿名用户主目录 anon_root=/opt/data
2、创建匿名用户主目录
[root@ftp-server ~]# mkdir -p /opt/data
3、重启vsftp服务
[root@ftp-server ~]# systemctl enable vsftpd [root@ftp-server ~]# systemctl restart vsftpd
4、配置SELinux规则
由于SELinux的ftpd_full_access布尔型规则不允许匿名用户上传、创建和删除文件,如果允许匿名用户上传、创建和删除文件等权限,则执行本操作,否则可跳过。
[root@ftp-server ~]# setsebool -P ftpd_full_access on
5、配置防火墙
openEuler默认防火墙为firewalld,默认不允许访问FTP服务,可执行以下命令,永久允许访问FTP服务器。
# 添加ftp服务 [root@ftp-server ~]# firewall-cmd --permanent --zone=public --add-service=ftp # 重新加载规则,以使规则立即生效 [root@ftp-server ~]# firewall-cmd --reload
6、测试访问
可参见前面的测试访问FTP服务器,匿名用户名为anonymous,密码为空(直接回车即可)。
四、配置本地用户模式的FTP服务器
vsftp默认采用本地用户模式,需要配置的参数默认已设置好,因而配置相对简单。本地用户模式的常用配置参数如下表所示。
强调一下,本地模式的FTP主目录为各用户自己的家目录,比如zhangsan用户的FTP主目录默认为/home/zhangsan
参数 | 作用 |
local_enable=yes|no | 是否允许本地用户模式 |
write_enable=yes|no | 是否允许写入 |
local_umask=022 | 本地用户模式创建文件的umask值 |
userlist_deny=yes|no | 是否启用黑名单,默认为yes,不允许黑名单中的账号登录 |
userlist_enable=yes|no | 是否开启用户作用名单文件功能 |
chroot_local_user=yes|no | 是否将用户锁定在主目录 |
chroot_list_enable=yes|no | 是否允许例外 |
chroot_list_file=文件位置 | 例外的用户存放在该指定文件中 |
allow_writeable_chroot=yes|no | 是否将本地用户锁定在自己的主目录中,且不拒绝用户的登录请求 |
关于chroot的几个参数说明如下:
情况1:chroot_local_user=yes,表示开启用户锁定主目录,所有ftp用户限制主目录
chroot_list_enable=yes时表示允许有例外,例外的用户名在chroot_list_file指定的文件中,该文件中的用户不受限制。
情况2:chroot_local_user=no,表示关闭锁定主目录,所有ftp用户不限制主目录
当chroot_list_enable=yes时表示允许有例外,例外的用户名在chroot_list_file指定的文件中,该文件中的用户将被锁定在其主目录。
当chroot_local_user=yes时,allow_writeable_chroot必须设置为yes,否则因主目录权限为root权限而无法登录。
1、修改配置文件
修改配置文件,以允许本地用户登录访问。以下示例中,找到并修改或在文件末尾添加以下配置行(其它默认不变),将FTP服务器配置成本地用户模式,禁止匿名登录,并启用白名单功能,只允许白名单中的用户登录访问,且所有用户锁定主目录(即只允许访问自己主目录下的文件)。
[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf #……此处省略文件其它内容,找到以下配置行,并其值修改成如下…… #禁止匿名访问 anonymous_enable=no # 允许本地用户登录访问 local_enable=yes # 允许向服务器写入 write_enable=yes # 开户用户作用名单功能 userlist_enable=YES # 启用白名单功能 userlist_deny=NO #锁定用户主目录 chroot_local_user=yes #允许主目录可写 allow_writeable_chroot=yes
注:userlist_deny=yes时,/etc/vsftpd/ftpusers和/etc/vsftpd/user_list文件均为黑名单,其中的用户名均不允许访问FTP服务器。
但当userlist_deny=no时,/etc/vsftpd/user_list则为白名单,允许其中的用户访问FTP服务器,但同时位于/etc/vsftpd/ftpusers和/etc/vsftpd/user_list文件中的用户则不允许访问FTP服务器,比如root同时存在于这两个文件中,则不能登录FTP服务器。
2、修改白名单文件
在白名单文件中添加允许登录访问FTP服务器的用户账号名,比如允许wangwu登录访问。
[root@ftp-server ~]# vim /etc/vsftpd/user_list #……此处省略文件其它内容,在文件末尾添加以下一行用户名…… wangwu
3、重启vsftpd服务
[root@ftp-server ~]# systemctl enable vsftpd [root@ftp-server ~]# systemctl restart vsftpd
4、配置防火墙
openEuler默认防火墙为firewalld,默认不允许访问FTP服务,可执行以下命令,永久允许访问FTP服务器。
# 添加ftp服务 [root@ftp-server ~]# firewall-cmd --permanent --zone=public --add-service=ftp # 重新加载规则,以使规则立即生效 [root@ftp-server ~]# firewall-cmd --reload
5、添加本地用户账号
# 添加本地用户账户名 [root@ftp-server ~]# useradd wangwu # 为指定用户账号设置登录密码 [root@ftp-server ~]# echo "Huawei12#$" | passwd --stdin wangwu
6、测试访问
在另一台Linux系统中,使用前面创建的用户账号登录访问FTP服务器,示例如下。
# 安装客户端软件包 [root@client ~]# dnf -y install ftp # 远程访问FTP服务器 [root@client ~]# ftp 192.168.0.218 Connected to 192.168.0.218 (192.168.0.218). 220 (vsFTPd 3.0.3) Name (192.168.0.218:root): wangwu 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> mkdir test1 257 "/home/wangwu/test1" created ftp>
五、配置虚拟用户模式的FTP服务器
虚拟用户模式是最安全的一种认证模式,虚拟用户是专门设置的用于登录FTP服务器的账号,它在服务器/etc/passwd用户文件中并不存在,因而也就无法远程登录服务器。
1、创建虚拟用户账号及其数据库文件
由于创建的虚拟账号列表文件不能被vsftpd服务程序直接加载,而是利用db_load命令对该文件进行处理并生成一个hash数据库文件,如下所示,将虚拟用户文件列表文件users生成为数据库文件users.db。
# 利用gdbmtool工具创建并打开虚拟用户数据库vusers.pag [root@ftp-server ~]# gdbmtool -n /etc/vsftpd/vusers.pag open # 在虚拟用户数据库中添加虚拟用户账号及密码,可以多添加几个 [root@ftp-server ~]# gdbmtool /etc/vsftpd/vusers.pag store vuser1 Huawei12#$ [root@ftp-server ~]# gdbmtool /etc/vsftpd/vusers.pag store vuser2 Mima1234# # 安全起见,修改虚拟数据库文件访问权限,只允许root用户读写 [root@ftp-server ~]# chmod 600 /etc/vsftpd/vusers.pag
注:这里与CentOS和RedHat系列系统不太一样,红帽系采用db_load工具将虚拟用户列表文件生成db数据库文件,而openEuler的pam_userdb使用的数据库由bdb换成了gdbm,因而需要作出相应改动。
2、创建虚拟用户的映射账号及家目录
由于Linux中的所有文件必须归属于一个用户账号,因此需要创建一个本地账号,并将虚拟账号与该本地账号建立映射关系。其中该本地账号的家目录指定为/var/vdir,并将shell指定为/sbin/nologin禁止该账号登录系统。
另外,/var/vdir目录就是虚拟用户的FTP主目录,其默认权限为700,为便于他人访问,可将权限修改为755。
# 创建一个本地账号 [root@ftp-server ~]# useradd -d /var/vdir -s /sbin/nologin ftpmapuser # 修改目录权限,以允许其它用户访问 [root@ftp-server ~]# chmod -R 755 /var/vdir
3、建立用于支持虚拟用户的PAM认证文件
利用PAM认证FTP登录的过程简要描述如下:
(1)用户在登录FTP服务器时,系统将调用passwd程序提示输入账号和密码;
(2)passwd程序调用PAM模块,PAM模块根据管理员设置的PAM认证文件中指定的认证模块对用户进行验证。
(3)passwd程序根据回传的验证结果决定下一步动作(提示验证通过或重新输入密码)。
PAM认证文件默认在/etc/pam.d/目录中,该目录下存有各种应用模块专用的认证文件,包括vsftpd默认的PAM认证文件vsftpd。
备份默认的vsftpd文件,然后将该PAM文件内容修改成如下所示的内容。
[root@ftp-server ~]# cd /etc/pam.d # 备份默认的vsftpd认证文件 [root@ftp-server pam.d]# cp vsftpd vsftpd_bak # 删除pam认证文件原内容,然后添加以下内容 [root@ftp-server pam.d]# vim vsftpd auth required pam_userdb.so db=/etc/vsftpd/vusers account required pam_userdb.so db=/etc/vsftpd/vusers
注:其中的 /etc/vsftpd/vusers是指/etc/vsftpd/vusers.pag数据库文件,但后面扩展名.pag不需要加,否则会出现以下错误:
pam_userdb(vsftpd:auth): user_lookup: could not open database `/etc/vsftpd/vusers.pag': No such file or directory
4、编辑vsftpd服务配置文件
在配置文件/etc/vsftpd/vsftpd.conf中,与虚拟用户模式有关的常用配置参数如下表所示:
参数 | 作用 |
local_enable=YES | 允许本地用户模式 |
guest_enable=YES | 开启虚拟用户模式 |
guest_username=ftpmapuser | 指定与虚拟用户相映射的本地账户名 |
allow_writeable_chroot=yes | 允许用户主目录可写 |
pam_service_name=vsftpd | 指定PAM认证文件名 |
user_config_dir | 虚拟用户配置目录 |
添加或开启设置虚拟用户模式所需要的参数。以下示例中,找到并修改或在文件末尾添加以下配置行(其它默认不变),将FTP服务器配置成匿名用户模式,禁止匿名登录,指定PAM认证文件名和虚拟用户映射的本地账号名,同时设置allow_writeable_chroot=yes将所有用户锁定在自己的家目 录,且允许登录。
[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf #……此处省略文件其它内容,找到以下配置行,并其值修改成如下…… #禁止匿名访问 anonymous_enable=no # 允许本地用户登录访问 local_enable=yes # 允许向服务器写入 write_enable=yes # 开户用户作用名单功能 userlist_enable=yes # 默认采用黑名单功能 userlist_deny=yes #指定PAM认证文件 pam_service_name=vsftpd #开启虚拟用户模式 guest_enable=yes #指定与虚拟用户映射的本地账户 guest_username=ftpmapuser #允许用户主目录可写 allow_writeable_chroot=yes # 设置虚拟用户配置目录 user_config_dir=/etc/vsftpd/auth
5、设置虚拟用户访问权限
可以为不同虚拟用户设置不同的访问权限,默认访问权限为只读,作为对比,以下示例将vuser1虚拟账号的权限保持默认的只读不变,而将vuser2用户权限设置为具有上传、创建、修改和删除等权限。
在/etc/vsftpd/下新建一个目录auth作为虚拟用户的配置目录,虚拟用户的权限配置文件就可以存放在该目录,各虚拟用户的权限配置文件名与用户名相同,文件内容为匿名用户的配置参数,空文件表示只读权限,示例如下。
# 创建虚拟用户配置目录 [root@ftp-server ~]# mkdir /etc/vsftpd/auth # 创建虚拟用户vuser1的权限配置文件(空文件表示只读权限) [root@ftp-server ~]# touch /etc/vsftpd/auth/vuser1 # 创建虚拟用户vuser2的权限配置文件 [root@ftp-server ~]# vim /etc/vsftpd/auth/vuser2 # ……文件内容如下…… #允许上传文件 anon_upload_enable=YES #允许创建目录 anon_mkdir_write_enable=YES #允许修改和删除目录 anon_other_write_enable=YES
6、配置SELinux规则
由于为虚拟用户配置的权限是按匿名模式参数指定的,因此需要和匿名模式一样,开启ftpd_full_access布尔规则。
# 开启ftpd_full_access on规则 [root@ftp-server ~]# setsebool -P ftpd_full_access on # 查看规则状态 [root@ftp-server ~]# getsebool -a | grep ftpd_full_access ftpd_full_access --> on
7、配置防火墙
# 添加ftp服务 [root@ftp-server ~]# firewall-cmd --permanent --zone=public --add-service=ftp # 重新加载规则,以使规则立即生效 [root@ftp-server ~]# firewall-cmd --reload
8、重启vsftpd服务
[root@ftp-server ~]# systemctl restart vsftpd
9、测试访问
在另一台Linux主机上测试访问FTP服务器。
(1)用vuser1访问
可见,vuser1没有创建目录的权限
[root@Client ~]# ftp 192.168.0.218 Connected to 192.168.0.218 (192.168.0.218). 220 (vsFTPd 3.0.3) Name (192.168.0.218:root): vuser1 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> mkdir test2 550 Permission denied. ftp>
(2)用vuser2访问
测试可见,vuser2拥有创建和修改等权限。
[root@Client ~]# ftp 192.168.0.218 Connected to 192.168.0.218 (192.168.0.218). 220 (vsFTPd 3.0.3) Name (192.168.0.218:root): vuser2 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> mkdir test3 257 "/test3" created ftp> rename test3 dir3 350 Ready for RNTO. 250 Rename successful. ftp> ls 227 Entering Passive Mode (192,168,0,218,29,179). 150 Here comes the directory listing. drwx------ 2 1002 1002 4096 Feb 25 11:49 dir3 226 Directory send OK.
六、补充知识
1、FTP连接基础知识
FTP服务器与客户机之间的网络连接是TCP连接,一般包括两个TCP连接,其中一个为控制连接,服务器端的默认端口号为21,用于传输客户端程序和服务器之间的控制命令,另一个为数据连接,用于传送用户数据,服务器端的默认端口号为20。
FTP服务程序一般支持两种不同的数据连接模式,一种是Port模式,又称主动模式(Active Mode),另一种是Passive模式(Pasv Mode),这两种连接模式的区别如下。
(1)Port模式
当客户端C与服务端S成功建立控制连接后,客户端C就随机开启一个大于1024的端口N向服务器的21号端口发起连接请求,同时开放N+1号端口进行监听,并向服务器发出PORT N+1命令。服务器接收到命令后,会用其本地的FTP数据端口(通常是20)主动连接客户端指定的端口N+1,然后进行数据传输。
(2)Pasv模式
当客户端C与服务端S成功建立控制连接后,客户端C随机开启一个大于1024的端口N向服务器的21号端口发起连接,同时会开启N+1号端口,并向服务器发送PASV命令,服务器收到命令后,会开放一个大于1024的端口P进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。
小结:主动模式是指服务器主动连接客户端的数据端口,被动模式是指服务器被动地等待客户端连接自己的数据端口。
被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTP服务器的情况,因为在这种情况下,防火墙通常配置为不允许外界访问防火墙之后的主机,而只允许由防火墙之后的主机发起的连接请求通过。因此,在这种情况下不能使用主动模式的FTP传输,而被动模式的FTP可以良好的工作。
2、配置vsftpd的连接模式
(1)主动模式
在vsftpd服务中,vsftpd默认开启了Port模式,其配置参数为connect_from_port_20,其值默认为yes。
[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf # ……省略文件其它内容…… # Make sure PORT transfer connections originate from port 20 (ftp-data). # port传输连接源自20端口 connect_from_port_20=YES # 默认开启Port模式 port_enable=yes
(2)被动模式
如果需要开启被动模式,则需要设置被动模式地址,开启监听这个地址的请求,同时还要在防火墙上开启被动模式允许连接的端口范围。示例如下
- 修改vsftpd配置文件
在/etc/vsftpd/vsftpd.conf中,找到并修改或添加以下配置行。
[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf # ……省略文件其它内容…… #开启 IPV4的地址监听 listen=yes #开启被动模式 pasv_enable=yes #指定被动模式允许连接的最大端口 pasv_max_port=21888 #指定被动模式允许连接的最小端口 pasv_min_port=21688 # 配置FTP服务器外网IP地址,默认为空 pasv_address= # 禁用Port模式 port_enable=no
- 重启服务
[root@ftp-server ~]# systemctl restart vsftpd
- 配置防火墙
在FTP服务器的防火墙中添加被动模式允连接连接的端口范围,如下所示。
[root@ftp-server ~]# firewall-cmd --permanent --zone=public --add-port=21688-21888/tcp success [root@ftp-server ~]# firewall-cmd --reload success
- 测试访问
被动模式还需要客户端支持,现在主流客户端都支持该模式,部分客户端可以通过执行pass on指令切换被动模式命令,或者在连接FTP时指定连接类型是被动模式。
Linux下的ftp命令行工具使用passive命令进行连接模式的切换,如下所示。
[root@Client ~]# ftp 192.168.0.218 Connected to 192.168.0.218 (192.168.0.218). 220 (vsFTPd 3.0.3) Name (192.168.0.218:root): vuser2 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (192,168,0,218,85,85). 150 Here comes the directory listing. drwx------ 2 1002 1002 4096 Feb 25 11:49 dir3 226 Directory send OK. ftp> passive Passive mode off. ftp> ls 550 Permission denied. ftp: bind: Address already in use
3、常用ftp命令行客户端命令
在ftp命令行工具下,可用help命令查看其所有ftp命令,如下所示。
ftp> help Commands may be abbreviated. Commands are: ! debug mdir sendport site $ dir mget put size account disconnect mkdir pwd status append exit mls quit struct ascii form mode quote system bell get modtime recv sunique binary glob mput reget tenex bye hash newer rstatus tick case help nmap rhelp trace cd idle nlist rename type cdup image ntrans reset user chmod lcd open restart umask close ls prompt rmdir verbose cr macdef passive runique ? delete mdelete proxy send
如果某个命令功能不清楚,也可以通过help命令查看该命令的功能,如下所示
ftp> help ascii ascii set ascii transfer type ftp> help passive passive enter passive transfer mode ftp> help mkdir mkdir make directory on the remote machine
下面列出一些常用的命令及其功能
命令 | 功能 |
ls | 显示服务器简易的文件列表 |
mkdir | 在服务器上新建目录 |
cd | 进入服务器指定的目录 |
ascii | 设定传输方式为ASCII码方式 |
binary | 设定传输方式为二进制方式 |
get | 下载指定文件 |
put | 上传指定文件 |
delete | 删除FTP服务器上的文件 |
quit | 结束与服务器的FTP会话并退出FTP环境 |
help | 查看ftp命令帮助 |