赞
踩
配置环境: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
说明:
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.
-
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,密码为空(直接回车即可)。
vsftp默认采用本地用户模式,需要配置的参数默认已设置好,因而配置相对简单。本地用户模式的常用配置参数如下表所示。
强调一下,本地模式的FTP主目录为各用户自己的家目录,比如zhangsan用户的FTP主目录默认为/home/zhangsan
参数 | 作用 |
local_enable=yes|no | 是否允许本地用户模式 |
write_enable=yes|no | 是否允许写入 |
local_umask=022 | 本地用户模式创建文件的umask值 |
userlist_deny=yes|no | 是否启用黑名单,默认为yes,不允许黑名单中的账号登录 |
userlist_deny=yes|no | 是否启用白名单 |
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服务器的账号,它在服务器/etc/passwd用户文件中并不存在,因而也就无法远程登录服务器。
1、创建虚拟用户账号及其数据库文件
由于创建的虚拟账号列表文件不能被vsftpd服务程序直接加载,而是利用db_load命令对该文件进行处理并生成一个hash数据库文件,如下所示,将虚拟用户文件列表文件users生成为数据库文件users.db。
- # 利用gdbmtool工具创建并打开虚拟用户数据库vusers.db
- [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)被动模式
如果需要开启被动模式,则需要设置被动模式地址,开启监听这个地址的请求,同时还要在防火墙上开启被动模式允许连接的端口范围。示例如下
在/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命令帮助 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。