ftp

1. ftp简介

  • 网络文件共享服务主流的主要有三种,分别是ftp、nfs、samba。
  • FTP是File Transfer Protocol(文件传输协议)的简称,用于internet上的控制文件的双向传输。
  • FTP也是一个应用程序,基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。
    在FTP的使用当中,用户经常遇到两种概念:下载和上传
下载(Download)上传(Upload)
从远程主机拷贝文件至自己的计算机上将文件从自己的计算机上拷贝至远程主机上

在windows搭建一个FTP服务器
在这里插入图片描述

2. ftp架构

  • FTP工作于应用层,监听于tcp的21号端口,是一种C/S架构的应用程序。其有多种客户端和服务端的应用程序
客户端工具服务端软件
ftp
lftp,lftpget
wget,curl
filezilla
gftp(Linux GUI)
商业软件(flashfxp,cuteftp)
wu-ftpd
proftpd(提供web接口的一种,ftp服务端程序)
pureftp
vsftpd(Very Secure)
ServU(windows平台的一种强大ftp服务端程序)

3. ftp数据连接模式

ftp有2种数据连接模式:命令连接和数据连接

  • 命令连接:是指文件管理类命令,始终在线的持久性连接,直到用户退出登录为止
  • 数据连接:是指数据传输,按需创建及关闭的连接

其中数据连接需要关注的有2点,一是数据传输格式,二是数据传输模式

数据传输格式有以下两种:

  • 文件传输
  • 二进制传输

数据传输模式也有2种:

  • 主动模式:由服务器端创建数据连接
  • 被动模式:由客户端创建数据连接

两种数据传输模式的建立过程:

传输
模式
建立过程
主动
模式
命令连接:
Client(1025)–> Server(21)
客户端以一个随机端口(大于1023)来连服务器端的21号端口
数据连接:
Server(20/tcp) --> Client(1025+1)
服务器端以自己的20号端口去连客户端创建命令连接时使用的随机端口+1的端口号
被动
模式
命令连接:
Client(1110) --> Server(21)
客户端以一个随机端口来连成服务器端的21号端口
数据连接:
Client(1110+1) --> Server(随机端口)
客户端以创建命令连接的端口+1的端口号去连服务器端通过命令连接告知自己的一个随机端口号来创建数据连接

主动模式有个弊端,因为客户端的端口是随机的,客户端如果开了防火墙,
则服务器端去连客户端创建数据连接时可能会被拒绝

4. 用户认证

ftp的用户主要有三种:

  • 虚拟用户:仅用于访问某特定服务中的资源
  • 系统用户:可以登录系统的真实用户
  • 匿名用户

5. vsftpd

5.1 安装vsftpd

[root@localhost ~]# 
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
[root@localhost yum.repos.d]# vi xx.repo                    配置本地源
[BaseOS]
name=baseos
baseurl=file:///mnt/BaseOS
gpgcheck=0
enabled=1
[AppStream]
name=kkkkk
baseurl=file:///mnt/AppStream
gpgcheck=0
enabled=1
[root@localhost yum.repos.d]# mount /dev/cdrom /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.
[root@localhost yum.repos.d]# yum -y install vsftpd

5.2 vsftpd配置

  1. vsftpd用户认证配置文件
[root@localhost vsftpd]# cat /etc/pam.d/vsftpd 
#%PAM-1.0
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
该文件不能动,保持原样
  1. /etc/vsftpd/ :配置文件目录
  2. /etc/vsftpd/vsftpd.conf : 主配置文件
//匿名用户(映射为ftp用户)的共享资源位置是/var/ftp
//系统用户通过ftp访问的资源位置为用户的家目录
//虚拟用户通过ftp访问的资源位置为给虚拟用户指定的映射成为的系统用户的家目录

vsftpd常见的配置参数:

参数作用
anonymous_enable=YES启用匿名用户登录
anon_upload_enable=YES允许匿名用户上传
anon_mkdir_write_enable=YES允许匿名用户创建目录,但是不能删除
anon_other_write_enable=YES允许匿名用户创建和删除目录
local_enable=YES启用本地用户登录
write_enable=YES允许本地用户有写权限
local_umask=022通过ftp上传文件的默认遮罩码
chroot_local_user=YES禁锢所有的ftp本地用户于其家目录中
chroot_list_enable=YES开启禁锢文件列表
需要与chroot_list_file参数一起使用
chroot_list_file=/etc/vsftpd/chroot_list指定禁锢列表文件路径
在此文件里面的用户将被禁锢在其家目录中
allow_writeable_chroot=YES允许被禁锢的用户家目录有写权限
xferlog_enable=YES是否启用传输日志,记录ftp传输过程
xferlog_std_format=YES传输日志是否使用标准格式
xferlog_file=/var/log/xferlog指定传输日志存储的位置
chown_uploads=YES是否启用改变上传文件属主的功能
chown_username=whoever指定要将上传的文件的属主改为哪个用户
此用户必须在系统中存
pam_service_name=vsftpd指定vsftpd使用/etc/pam.d下的
哪个pam配置文件进行用户认证
userlist_enable=YES是否启用控制用户登录的列表文件:
默认为/etc/vsftpd/user_list文件
userlist_deny=YES是否拒绝userlist指定的列表文件中存在的用户登录ftp
max_clients=#最大并发连接数
max_per_ip=#每个IP可同时发起的并发请求数
anon_max_rate匿名用户的最大传输速率,单位是“字节/秒”
local_max_rate本地用户的最大传输速率,单位是“字节/秒”
dirmessage_enable=YES启用某目录下的.message描述信息
假定有一个目录为/upload,在其下创建一个文件名为.message,
在文件内写入一些描述信息,则当用户切换至/upload目录下时会自动显示.message文件中的内容
message_file设置访问一个目录时获得的目录信息文件的文件名,默认是.message
idle_session_timeout=600设置默认的断开不活跃session的时间
data_connection_timeout=120设置数据传输超时时间
ftpd_banner=“Welcome to chenlf FTP service.”定制欢迎信息,登录ftp时自动显示

5.2.1 local_enable=YES

5.2.2 write_enable=YES

5.2.3local_umask=022

先把之前虚拟用户的配置文件恢复原样
[root@localhost ~]# cd /etc/pam.d/
[root@localhost pam.d]# ls
config-util       remote                sudo
crond             rhn_register          sudo-i
fingerprint-auth  runuser               su-l
login             runuser-l             system-auth
other             smartcard-auth        systemd-user
passwd            sshd                  vlock
password-auth     sssd-shadowutils      vmtoolsd
polkit-1          su                    vsftpd
postlogin         subscription-manager  vsftpd-bak
[root@localhost pam.d]# \mv vsftpd-bak vsftpd                  将vsftpd覆盖,vsftpd-bak改名为vsftpd
[root@localhost pam.d]# ls
config-util       remote                sudo
crond             rhn_register          sudo-i
fingerprint-auth  runuser               su-l
login             runuser-l             system-auth
other             smartcard-auth        systemd-user
passwd            sshd                  vlock
password-auth     sssd-shadowutils      vmtoolsd
polkit-1          su                    vsftpd
postlogin         subscription-manager
[root@localhost pam.d]# cat vsftpd                 已恢复原样
#%PAM-1.0
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
关闭防火墙
[root@localhost ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# vim /etc/selinux/config 
SELINUX=diaabled
创建一个tom用户,并修改其密码
[root@localhost ~]# useradd tom
[root@localhost ~]# echo 'redhat' |passwd --stdin tom
Changing password for user tom.
passwd: all authentication tokens updated successfully.
将配置文件里的匿名访问打开,本地用户登陆关闭
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES                   匿名访问功能打开
local_enable=NO                             本地用户登陆动能关闭
重启服务
[root@localhost ~]# systemctl restart vsftpd
  • 此时可以匿名访问
    在这里插入图片描述

  • 不能使用tom用户登陆(因为把本地登录的功能关了)
    在这里插入图片描述

此时再把本地用户登陆功能打开,本地用户能写权限打开
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES                 匿名访问功能打开
local_enable=YES                       本地用户登陆功能打开
write_enable=YES                     本地用户能写权限打开
重启服务
[root@localhost ~]# systemctl restart vsftpd
  • 此时可以tom用户登陆,登陆进去就可以新建文件
    在这里插入图片描述
查看刚才新建的文件
[root@localhost ~]# ll /home/tom/
total 0
drwxr-xr-x. 2 tom tom 6 Oct 15 14:44 新文件夹                        此时文件权限是644
此时修改遮罩码权限,将其改为002
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf 
local_umask=002
重启服务
[root@localhost ~]# systemctl restart vsftpd
  • 此时上传一个abc文件
    在这里插入图片描述
查看文件权限是否为664
[root@localhost ~]# ll /home/tom/
total 0
-rw-rw-r--. 1 tom tom 0 Oct 15 14:50 abc                  上传的abc文件权限为664
drwxr-xr-x. 2 tom tom 6 Oct 15 14:44 新文件夹
此时把配置文件里的本地用户能写权限关闭则不能创建文件也不能删除文件
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES           匿名用户访问打开
local_enable=YES                     本地用户登陆功能打开
write_enable=NO                       本地用户能写功能关闭
local_umask=022
重启服务
[root@localhost ~]# systemctl restart vsftpd
  • 此时不能创建文件不能删除文件
    在这里插入图片描述
    在这里插入图片描述

5.2.4 ftp

安装
[root@localhost ~]# mount /dev/cdrom /mnt               本地源先挂载
mount: /mnt: WARNING: device write-protected, mounted read-only.
[root@localhost ~]# yum install -y ftp 

登陆
[root@localhost ~]# ftp 192.168.50.131
Connected to 192.168.50.131 (192.168.50.131).
220 (vsFTPd 3.0.3)
Name (192.168.50.131:root): tom
331 Please specify the password.
Password:                      密码redhat
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ?
Commands may be abbreviated.  Commands are:

!		debug		mdir		sendport	site
$		dir		mget		put size
account		disconnect	mkdir		pwd status
append		exit		mls		quitstruct
ascii		form		mode		quotsystem
bell		get		modtime		recvsunique
binary		glob		mput		regetenex
bye		hash		newer		rstatus		tick
case		help		nmap		rheltrace
cd		idle		nlist		rename		type
cdup		image		ntrans		reseuser
chmod		lcd		open		restart		umask
close		ls		prompt		rmdiverbose
cr		macdef		passive		runique		?
delete		mdelete		proxy		send
ftp> ls
227 Entering Passive Mode (192,168,50,131,105,231).
150 Here comes the directory listing.
-rw-rw-r--    1 1002     1002            0 Oct 15 06:50 abc
drwxr-xr-x    2 1002     1002            6 Oct 15 06:44 新文件夹
226 Directory send OK.
ftp> rm -rf 新文件夹                               不能删除文件
550 Remove directory operation failed.
  • 但是能在真机上登陆本地用户可以删除文件
  • 此时删除“新文件夹”
    在这里插入图片描述
  • 再次查看就没有了新文件夹
ftp> ls
227 Entering Passive Mode (192,168,50,131,103,77).
150 Here comes the directory listing.
-rw-rw-r--    1 1002     1002            0 Oct 15 06:50 abc
226 Directory send OK.
ftp> dir                  列出,相当于ls
227 Entering Passive Mode (192,168,50,131,27,137).
150 Here comes the directory listing.
-rw-rw-r--    1 1002     1002            0 Oct 15 06:50 abc
226 Directory send OK.
  • windows上也可以用dir列出目录
    在这里插入图片描述
get表示下载;mget表示下载多个文件
[root@localhost ~]# ls                          此时没有abc
anaconda-ks.cfg
[root@localhost ~]# ftp 192.168.50.131
Connected to 192.168.50.131 (192.168.50.131).
220 (vsFTPd 3.0.3)
Name (192.168.50.131:root): tom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> get abc                          下载abc
local: abc remote: abc
227 Entering Passive Mode (192,168,50,131,206,3).
150 Opening BINARY mode data connection for abc (0 bytes).
226 Transfer complete.
ftp> quit
221 Goodbye.
[root@localhost ~]# ls                  此时就有abc
abc  anaconda-ks.cfg


lcd表示当前系统里切换目录,cd表示在ftp里面切换目录
ftp> lcd /opt/                   从家目录切换到opt目录
Local directory now /opt
ftp> get abc                    此时下载abc就下载到/opt/下
local: abc remote: abc
227 Entering Passive Mode (192,168,50,131,235,167).
150 Opening BINARY mode data connection for abc (0 bytes).
226 Transfer complete.
ftp> quit
221 Goodbye.
[root@localhost ~]# ls /opt/                     opt下就有了abc 
abc  ftp



delete表示删除(只能删除文件,不能删除目录)
ftp> ls
227 Entering Passive Mode (192,168,50,131,62,59).
150 Here comes the directory listing.
-rw-rw-r--    1 1002     1002            0 Oct 15 06:50 abc
226 Directory send OK.
ftp> delete abc                      删除abc
250 Delete operation successful.
ftp> ls
227 Entering Passive Mode (192,168,50,131,138,239).
150 Here comes the directory listing.
226 Directory send OK.



rmdir表示删除目录(只能删除空目录,有内容的不能删除)
ftp> rmdir abc
250 Remove directory operation successful.



mkdir表示创建目录
ftp> mkdir abc
257 "/home/tom/abc" created
ftp> ls
227 Entering Passive Mode (192,168,50,131,229,46).
150 Here comes the directory listing.
drwxr-xr-x    2 1002     1002            6 Oct 15 07:27 abc
226 Directory send OK.


put表示上传文件(把本地文件上传过来);mput表示上传多个文件
ftp> put abc 
local: abc remote: abc
227 Entering Passive Mode (192,168,50,131,189,48).
150 Ok to send data.
226 Transfer complete.
ftp> ls
227 Entering Passive Mode (192,168,50,131,130,21).
150 Here comes the directory listing.
-rw-r--r--    1 1002     1002            0 Oct 15 07:34 abc
226 Directory send OK.

5.2.5 lftp

安装
[root@localhost ~]# yum install -y lftp


登陆当时与ftp不同
[root@localhost ~]# lftp -u tom,redhat 192.168.50.131
lftp tom@192.168.50.131:~> ls
-rw-r--r--    1 1002     1002            0 Oct 15 07:34 abc
 


-e 表示下载
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# 
[root@localhost ~]# lftp -u tom,redhat -e "get abc;exit" 192.168.50.131          下载后退出
[root@localhost ~]# ls            
abc  anaconda-ks.cfg


!表示在shell里执行命令
lftp tom@192.168.50.131:~> !echo 'hello world' > /tmp/abc
[root@localhost ~]# ll /tmp/
total 4
-rw-r--r--. 1 root root 12 Oct 15 15:51 abc
drwx------. 2 root root  6 Oct 14 16:09 vmware-root_957-3988097346
drwx------. 2 root root  6 Oct 15 14:06 vmware-root_961-4248090753
[root@localhost ~]# cat /tmp/abc
hello world


rm -f 只删除lftp里的文件,系统里的文件没有删除;若要删除前面加个!
lftp tom@192.168.50.131:~> rm -f abc        lftp里的abc删除成功
rm ok, `abc' removed
lftp tom@192.168.50.131:~> ls 
[root@localhost ~]# ls                      但是系统里的abc依然存在
abc  anaconda-ks.cfg
lftp tom@192.168.50.131:~> !rm -f abc                   此时前面加个!删除
[root@localhost ~]# ls                       系统里的abc就能删除
anaconda-ks.cfg

5.2.6 userlist_enable=YES

当在这个配置文件里的userlist_deny为yes时,该文件里存在的用户不能登陆lftp。该选项默认为yes

[root@localhost ~]# vim /etc/vsftpd/user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root                             该文件里有root没有tom
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
[root@localhost ~]# lftp -u tom,redhat 192.168.50.131     tom可以登陆
lftp tom@192.168.50.131:~> ls
-rw-r--r--    1 1002     1002            0 Oct 15 08:20 111
-rw-r--r--    1 1002     1002            0 Oct 15 08:20 abc
lftp tom@192.168.50.131:~> quit
[root@localhost ~]# lftp -u root,redhat 192.168.50.131        root不能登陆
lftp root@192.168.50.131:~> ls
ls: Login failed: 530 Permission denied.          
lftp root@192.168.50.131:~> 

5.2.7 message_file

[root@localhost ~]# 
[root@localhost ~]# su - tom       切入tom用户
[tom@localhost ~]$ ls
111  abc
[tom@localhost ~]$ mkdir hehe               创建一个目录
[tom@localhost ~]$ ls
111  abc  hehe
[tom@localhost ~]$ cd hehe
[tom@localhost hehe]$ echo "skhak" > .message                 在.message写入东西
[root@localhost ~]# ftp 192.168.50.131             用ftp登陆查看,用lftp登陆查看不了
Connected to 192.168.50.131 (192.168.50.131).
220 (vsFTPd 3.0.3)
Name (192.168.50.131:root): tom
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,50,131,99,111).
150 Here comes the directory listing.
-rw-r--r--    1 1002     1002            0 Oct 15 08:20 111
-rw-r--r--    1 1002     1002            0 Oct 15 08:20 abc
drwxrwxr-x    2 1002     1002           22 Oct 15 09:07 hehe
226 Directory send OK.
ftp> cd hehe/
250-skhak                                    此时能看到写入的东西
250 Directory successfully changed.
ftp> 

5.3 系统账户的配置

  • 在主机上生成一个tom用户
[root@localhost vsftpd]# id ftp              此时系统默认的匿名账户为ftp
uid=14(ftp) gid=50(ftp) groups=50(ftp)
[root@localhost vsftpd]# systemctl enable --now vsftpd                 直接启动服务
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/vsftpd.service.
[root@localhost vsftpd]# ss -antl                            会生成一个21端口号
State  Recv-Q Send-Q Local Address:Port  Peer Address:Port                                                  
LISTEN 0      128          0.0.0.0:22         0.0.0.0:*                                                     
LISTEN 0      32                 *:21               *:*                                                     
LISTEN 0      128             [::]:22            [::]:*                                                     
[root@localhost vsftpd]# systemctl stop firewalld                      关闭防火墙
[root@localhost vsftpd]# setenforce 0
[root@localhost vsftpd]# 
[root@localhost vsftpd]# useradd tom                 生成一个tom用户
[root@localhost vsftpd]# echo 'redhat'|passwd --stdin tom                修改密码
Changing password for user tom.
passwd: all authentication tokens updated successfully.
  • 在真机上用tom用户访问
    在这里插入图片描述
  • 输入密码后登陆进去
    在这里插入图片描述
  • 登陆进去没有东西,这时我们新建一个文件夹
    在这里插入图片描述
    在这里插入图片描述
  • 这个新建的文件夹在tom用户的家目录
[root@localhost vsftpd]# ls ~tom
新文件夹

5.4 匿名账户的配置

  1. 将配置文件里的no改为yes
[root@localhost vsftpd]# pwd
/etc/vsftpd
[root@localhost vsftpd]# ls
ftpusers   vsftpd.conf
user_list  vsftpd_conf_migrate.sh
[root@localhost vsftpd]# vim vsftpd.conf 
anonymous_enable=YES                    把原本的no改为yes,允许匿名访问
[root@localhost vsftpd]# systemctl restart vsftpd
  • 真机上访问(不需要密码),只能登上去访问,不能上传(没有上传权限)

在这里插入图片描述

  • pub的位置
[root@localhost vsftpd]# ls /var/ftp/
pub
  • 此时创建一个文件111,并在真机上查看
[root@localhost vsftpd]# touch /var/ftp/pub/111

在这里插入图片描述

  • 但是没有删除文件的权限
    在这里插入图片描述
    在这里插入图片描述

  • 上传文件(把文件拖进去)时被告知没有上传权限
    在这里插入图片描述

  • 具有下载(把文件拖出去)权限
    在这里插入图片描述

  1. 打开上传权限,写权限,添加其他人的写权限
[root@localhost vsftpd]# vim vsftpd.conf 
anon_upload_enable=YES     把注释取消掉就打开了
anon_mkdir_write_enable=YES
anon_other_write_enable=YES                    必须添加此行,否则只打开上传权限和写权限依然不能上传文件删除文件
[root@localhost vsftpd]# systemctl restart vsftpd   重启服务
[root@localhost vsftpd]# setfacl -m u:ftp:rwx /var/ftp/pub/                把pub目录让ftp有读写执行权限
[root@localhost vsftpd]# getfacl /var/ftp/pub/
getfacl: Removing leading '/' from absolute path names
# file: var/ftp/pub/
# owner: root
# group: root
user::rwx
user:ftp:rwx
group::r-x
mask::rwx
other::r-x
[root@localhost vsftpd]# systemctl restart vsftpd     再次重启服务
  • 此时能创建新文件夹
    在这里插入图片描述
  • 重启服务后再删除文件
    在这里插入图片描述
    在这里插入图片描述
  • 此时只开启上传权限,但目录有权限写,只能上传,不能删文件,不能创建文件,不能重命名
[root@localhost vsftpd]# vim vsftpd.conf 
anon_upload_enable=YES                      只给上传权限
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES
[root@localhost vsftpd]# systemctl restart vsftpd
[root@localhost vsftpd]# getfacl /var/ftp/pub/                 但是目录给其权限
getfacl: Removing leading '/' from absolute path names
# file: var/ftp/pub/
# owner: root
# group: root
user::rwx
user:ftp:rwx
group::r-x
mask::rwx
other::r-x

在这里插入图片描述

  • 此时开启写权限,则只能创建文件,不能删除文件
[root@localhost vsftpd]# vim vsftpd.conf 
anon_upload_enable=YES
anon_mkdir_write_enable=YES
#anon_other_write_enable=YES
[root@localhost vsftpd]# systemctl restart vsftpd

在这里插入图片描述

  • 此时将三个权限全部打开就能删除文件
[root@localhost vsftpd]# vim vsftpd.conf 
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@localhost vsftpd]# systemctl restart vsftpd

在这里插入图片描述
在这里插入图片描述
3. 利用遮罩码来给权限

[root@localhost vsftpd]# vim vsftpd.conf 
local_umask=022
anon_umask=022                   添加此行,文件的最大权限是666,减去遮罩码的022,就是644

[root@localhost vsftpd]# systemctl restart vsftpd
[root@localhost vsftpd]# ll /var/ftp/pub
total 100
-rw-r--r--. 1 root root     0 Oct 14 17:00 111                 所以该文件的权限是644
-rw-------. 1 ftp  ftp  99158 Oct 14 17:33 DHCP实验.docx
  • 此时可以上传文件
    在这里插入图片描述
    在这里插入图片描述

5.5 虚拟账户的配置

虚拟用户的配置:
* 所有的虚拟用户会被统一映射为一个指定的系统帐号,访问的共享位置即为此系统帐号的家目录
* 各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

虚拟用户帐号的存储方式:

1.文件:编辑文件,此文件需要被编码为hash格式。
    奇数行为用户名
    偶数行为密码
2.关系型数据库的表中:
    通过即时查询数据库完成用户认证
    mysql库:pam要依赖于pam_mysql软件,可以通过epel源yum安装
1. 把主配置文件恢复原样,只打开匿名访问功能
[root@localhost vsftpd]# vim vsftpd.conf 
anonymous_enable=YES                       打开匿名访问
#anon_upload_enable=YES                   权限功能全部注释
#anon_mkdir_write_enable=YES

2. 安装
[root@localhost yum.repos.d]# yum -y install vsftpd

3. 在vsftpd里写一个文件,该文件里放入密码
[root@localhost vsftpd]# pwd
/etc/vsftpd
[root@localhost vsftpd]# ls
ftpusers   vsftpd.conf
user_list  vsftpd_conf_migrate.sh
[root@localhost vsftpd]# vim mm.list                  此时该文件所有人都可以看

tom                                 里的用户名和密码是一一对应的,前面输的是帐号,后面跟的是密码
123456
jerry
098765


4. 安装db4工具(8.0版本有 db_load可以忽略此步骤)
[root@ localhost yum.repos.d]#wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
[root@ localhost ~]#sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@localhost ~]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@ localhost]# yum clean all
[root@ localhost]# yum -y install epel-release
[root@localhost vsftpd]# yum -y install db4*                  因为要安装db4*需要用163的源,所以需要安装163的源

5. 将刚创建的文本格式用户名、密码文件使用db4工具转换成数据库文件
[root@localhost vsftpd]# ls
ftpusers  user_list    vsftpd_conf_migrate.sh
mm.list   vsftpd.conf
[root@localhost vsftpd]# db_load -T -t hash -f mm.list  mm.db              -T表示转换,-t表示加密方式使用hash算法加密
[root@localhost vsftpd]# ls                         此时多了个mm.db文件,mm.list可以删除,但为了后面要用到暂时先不删
ftpusers  mm.list    vsftpd.conf
mm.db     user_list  vsftpd_conf_migrate.sh

6. 将文件权限设置为600,只为不让其他用户看见,避免数据外泄
[root@localhost vsftpd]# chmod 600 mm.*
[root@localhost vsftpd]# ll
total 36
-rw-------. 1 root root   125 Feb 17  2020 ftpusers
-rw-------. 1 root root 12288 Oct 14 18:48 mm.db
-rw-------. 1 root root    24 Oct 14 18:38 mm.list
-rw-------. 1 root root   361 Feb 17  2020 user_list
-rw-------. 1 root root  5099 Oct 14 18:31 vsftpd.conf
-rwxr--r--. 1 root root   348 Feb 17  2020 vsftpd_conf_migrate.sh

7. 添加虚拟用户的映射帐号、创建ftp根目录。并将其权限设置为755,让其他人能看见
[root@localhost vsftpd]# useradd -d /opt/ftp -s /sbin/nologin vftp
[root@localhost vsftpd]# chmod 755 /opt/ftp
[root@localhost vsftpd]# ll /opt/
total 0
drwxr-xr-x. 2 vftp vftp 62 Oct 14 18:56 ftp

8.为虚拟用户建立PAM认证
[root@localhost vsftpd]# cd /etc/pam.d/
[root@localhost pam.d]# ls
config-util       remote                sudo
crond             rhn_register          sudo-i
fingerprint-auth  runuser               su-l
login             runuser-l             system-auth
other             smartcard-auth        systemd-user
passwd            sshd                  vlock
password-auth     sssd-shadowutils      vmtoolsd
polkit-1          su                    vsftpd
postlogin         subscription-manager
[root@localhost pam.d]# mv vsftpd{,-bak}                      先给vsftpd备份,防止后面出错
[root@localhost pam.d]# ls
config-util       remote                sudo
crond             rhn_register          sudo-i
fingerprint-auth  runuser               su-l
login             runuser-l             system-auth
other             smartcard-auth        systemd-user
passwd            sshd                  vlock
password-auth     sssd-shadowutils      vmtoolsd
polkit-1          su                    vsftpd-bak
[root@localhost pam.d]# vim vsftpd                 编辑vsftpd, 第一行要有注释,后面两行不要注释,并且后面两行最后的名字要改

#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/mm
account required pam_userdb.so db=/etc/vsftpd/mm
[root@localhost pam.d]# pwd
/etc/pam.d
[root@localhost pam.d]# ls
config-util       remote                sudo
crond             rhn_register          sudo-i
fingerprint-auth  runuser               su-l
login             runuser-l             system-auth
other             smartcard-auth        systemd-user
passwd            sshd                  vlock
password-auth     sssd-shadowutils      vmtoolsd
polkit-1          su                    vsftpd
postlogin         subscription-manager  vsftpd-bak


9. 修改配置文件
10. [root@localhost ~]# vim /etc/vsftpd//vsftpd.conf        在该文件最后面添加以下内容  
guest_enable=YES                        匿名用户的功能打开
guest_username=vftp                     匿名账户映射vftp账户
 
11. 创建一个目录
[root@localhost vsftpd]# mkdir runtime
[root@localhost vsftpd]# ls
ftpusers  runtime      vsftpd_conf_migrate.sh
mm.db     user_list
mm.list   vsftpd.conf

12. 为不同的虚拟用户建立独立的配置文件
[root@localhost vsftpd]# vim vsftpd.conf 
user_config_dir=/etc/vsftpd/runtime
allow_writeable_chroot=YES

13. 删除系统账户,用虚拟账户登陆
[root@localhost runtime]# id tom
uid=1000(tom) gid=1000(tom) groups=1000(tom)
[root@localhost runtime]# userdel -r tom
[root@localhost runtime]# id tom
id: ‘tom’: no such user
[root@localhost runtime]# id jerry
id: ‘jerry’: no such user


14. 创建两个虚拟用户
[root@localhost runtime]# touch tom
[root@localhost runtime]# vim jerry

anon_umask=022
anon_upload_enable=YES               上传权限
anon_mkdir_write_enable=YES            创建文件权限
anon_other_write_enable=YES                删除文件权限
[root@localhost runtime]# ll
total 4
-rw-r--r--. 1 root root 94 Oct 14 19:24 jerry            可读可写
-rw-r--r--. 1 root root  0 Oct 14 19:19 tom             只可读

15. 重启服务
[root@localhost runtime]# systemctl restart vsftpd
  • 验证: 用tom用户登陆不能创建用户,不能上传文件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
16. 创建一个abc
[root@localhost runtime]# cd /opt/ftp/
[root@localhost ftp]# pwd
/opt/ftp
[root@localhost ftp]# ls
[root@localhost ftp]# touch abc
  • 此时在真机上可以查看到abc,可以下载abc
    在这里插入图片描述

在这里插入图片描述

  • 验证:用jerry登陆,可以创建文件,可以上传文件,可以删除文件
    在这里插入图片描述
  • 新建文件
    在这里插入图片描述
  • 上传
    在这里插入图片描述
  • 删除
    在这里插入图片描述
    在这里插入图片描述
17. 此时新建的文件权限是644,因为有遮罩码
[root@localhost ftp]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 14 19:34 abc
drwxr-xr-x. 2 vftp vftp 6 Oct 14 19:39 新文件夹           文件权限是644
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百慕卿君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值