文章目录
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配置
- 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
该文件不能动,保持原样
- /etc/vsftpd/ :配置文件目录
- /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 匿名账户的配置
- 将配置文件里的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
-
但是没有删除文件的权限
-
上传文件(把文件拖进去)时被告知没有上传权限
-
具有下载(把文件拖出去)权限
- 打开上传权限,写权限,添加其他人的写权限
[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