文件共享服务---ftp

==============================================================================

概述:

   本章将主要介绍文件共享服务中的ftp服务,内容包括:ftp的程序环境,配置文件的相关介绍,以及如何配置基于虚拟用户的vsftpd服务

==============================================================================

文件服务

 1.介绍

ftp:file transfer protocol

  • 应用层,C/S架构,文件共享;

nfs,cifs:

 文件系统接口,网络文件系统;

nfs:(network file system )

  • 是Unix和类Unix系统上常见的基于内核的网络文件共享服务;

cifs:(common internet file system),是Windows上常见的网络文件共享服务;

  • samba:是在Linux之上实现cifs(SMA)协议来解决跨平台的文件共享服务

网络存储:

NASNetwork Attached Storage

  • 网络附加存储,是一台文件服务器,通过网络文件的形式来提供文件共享存储(通常通过nfs或cifs协议来实现),文件级别(已经有文件系统了,直接挂载使用即可);

SANStorage Area Network,

  • 块级别共享服务,分区-->格式化-->创建文件系统;常用协议:IPSAN, FCSAN;

FTP

 1.ftp

C/S架构的:

Client --> ftp(协议)-->Server

  • Client:Connect (客户端发起连接请求)

  • Server:Listen  服务器监听在21号端口,接受客户端请求

连接:

  • 命令连接命令传输,连接将一直存在,直到用户显示退出或意外终止为止;

  • 数据连接数据传输,按需创建;

数据连接的建立模式:

主动模式:

  • 服务器通过20/tcp主动连接客户端的命令连接端口向后最近一个空闲端口;PORT模式;

被动模式:

  • 客户端发出数据请求后,服务端会响应一个打开的临时使用的随机端口,客户端对此端口进行请求;PASV模式;

数据传输模式:

  • 文本格式ASCII

  • 二进制格式:BINARY

协议安全:

明文数据、认证时传输账号和密码均是明文 ;

安全增强

  • ftp over ssl/tls:ftps

  • ftp over ssh:sftp 

虚拟用户账号;

c/s:

Server:

 Windows:Serv-U, IIS, ...

 开源解决方案:

  • wuftpd:Washington University ftp daemon

  • vsftpd:Very Secure ftp daemon

  • proftpd, pureftpd, ...

Client:

  • GUI:flashfxp, cute, filezilla, gftp, ..

  • CLI:ftp, lftp,wget,get,mget,curl ...

vsftpd

 1.程序环境:

主程序:/usr/sbin/vsftpd

  • Unit File:/usr/lib/systemd/system/vsftpd.service(CentOS 7)

配置文件

  • /etc/vsftpd/vsftpd.conf

文档路径映射:

  • fedora用户:/home/fedora/pub/a.txt --> ftp://HOST:PORT/pub/a.txt

用户的家目录映射:

  • 访问vsftpd服务必须以某个系统用户的身份进行;此用户的家目录即为文档映射的根目录;

匿名用户:

  • anonymous,映射为一个系统用户,此用户为 ftp,其目录为 /var/ftp

安装启动服务

  • # yum install vsftpd -y

  • # systemctl start vsftpd

演示:

 1.启动ftp服务并查看端口

[root@centos7 vsftpd]# systemctl start vsftpd # 启动服务
[root@centos7 vsftpd]# ss -tnl     # 查看21号端口
State       Recv-Q Send-Q                                      Local Address:Port                                                     Peer Address:Port              
LISTEN      0      50                                                      *:3306                                                                *:*                  
LISTEN      0      128                                                     *:22                                                                  *:*                  
LISTEN      0      128                                             127.0.0.1:631                                                                 *:*                  
LISTEN      0      100                                             127.0.0.1:25                                                                  *:*                  
LISTEN      0      128                                             127.0.0.1:6010                                                                *:*                  
LISTEN      0      128                                             127.0.0.1:6011                                                                *:*                  
LISTEN      0      128                                                    :::8080                                                               :::*                  
LISTEN      0      128                                                    :::80                                                                 :::*                  
LISTEN      0      32                                                     :::21                                                                 :::*                  
LISTEN      0      128                                                    :::22                                                                 :::*                  
LISTEN      0      128                                                   ::1:631                                                                :::*                  
LISTEN      0      128                                                    :::8088                                                               :::*                  
LISTEN      0      100                                                   ::1:25                                                                 :::*                  
LISTEN      0      128                                                   ::1:6010                                                               :::*                  
LISTEN      0      128                                                   ::1:6011                                                               :::*                  
LISTEN      0      128                                                    :::443                                                                :::*

2.本地用户登录ftp文档路径会映射为用户自己的家目录

[root@centos7 ~]# id tao
uid=1000(tao) gid=1000(tao) groups=1000(tao)
[root@centos7 ~]# cd /home/tao

# 在用户tao的家目录下创建pub和upload目录
[root@centos7 tao]# mkdir upload  
[root@centos7 tao]# mkdir pub  
[root@centos7 tao]# ls
pub  upload
[root@centos7 tao]# cd

[root@centos7 ~]# ftp 10.1.252.161 # 用tao用户登录ftp服务
Connected to 10.1.252.161 (10.1.252.161).
220 (vsFTPd 3.0.2)
Name (10.1.252.161:root): tao # 输入用户名
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 (10,1,252,161,26,148).
150 Here comes the directory listing.  # 查看当前目录下的内容
drwxr-xr-x    2 0        0               6 Oct 18 01:16 pub
drwxr-xr-x    2 0        0               6 Oct 18 01:20 upload
226 Directory send OK.
ftp> pwd # 查看当前目录
257 "/home/tao"  # 发现为tao的家目录,所以本地用户登录文档路径回会映射为用户自己的家目录

 1)在tao的家目录下再创建一个名叫xiu的目录

[root@centos7 ~]# mkdir /home/tao/xiu

   计算机登录如下

Linux 中的文件共享服务---ftp_第1张图片


 3.匿名用户登录会映射为ftp用户,文档路径为/var/ftp

[root@centos7 ~]# grep -i "^ftp\>" /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@centos7 ~]# mkdir /var/ftp/upload

[root@centos7 ~]# ftp 10.1.252.161
Connected to 10.1.252.161 (10.1.252.161).
220 (vsFTPd 3.0.2)
Name (10.1.252.161:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls
227 Entering Passive Mode (10,1,252,161,108,51).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Nov 20  2015 pub
drwxr-xr-x    2 0        0               6 Oct 18 01:29 upload
226 Directory send OK.

 浏览器访问如下

Linux 中的文件共享服务---ftp_第2张图片

 4.使用lftp本地用户登录发现可上传可删除文件,如下:

[root@centos7 ~]# lftp -u tao,134296 10.1.252.161 # tao用户登录
lftp [email protected]:~> pwd
 # 在tao用户自己的家目录下 
lftp [email protected]:~> ls          
drwxr-xr-x    2 0        0               6 Oct 18 01:16 pub
drwxr-xr-x    2 0        0               6 Oct 18 01:20 upload
drwxr-xr-x    2 0        0               6 Oct 18 01:36 xiu
lftp [email protected]:~> put /etc/fstab # 可以上传文件
690 bytes transferred
lftp [email protected]:~> ls
-rw-r--r--    1 1000     1000          690 Oct 18 01:49 fstab
drwxr-xr-x    2 0        0               6 Oct 18 01:16 pub
drwxr-xr-x    2 0        0               6 Oct 18 01:20 upload
drwxr-xr-x    2 0        0               6 Oct 18 01:36 xiu

lftp [email protected]:~> rm fstab  # 删除文件
rm ok, `fstab' removed
lftp [email protected]:~> ls
drwxr-xr-x    2 0        0               6 Oct 18 01:16 pub
drwxr-xr-x    2 0        0               6 Oct 18 01:20 upload
drwxr-xr-x    2 0        0               6 Oct 18 01:36 xiu

 使用lftp匿名用户登录,发现不能上传删除文件,如下:

[root@centos7 ~]# lftp 10.1.252.161
lftp 10.1.252.161:~> ls
drwxr-xr-x    2 0        0               6 Nov 20  2015 pub
drwxr-xr-x    2 0        0               6 Oct 18 01:29 upload
lftp 10.1.252.161:/> pwd
ftp://10.1.252.161/
lftp 10.1.252.161:/> put /etc/fstab #上传文件失败,没有权限
put: Access failed: 550 Permission denied. (fstab)

# 匿名用户登录默认是使用ftp用户,目录对ftp用用户没有写权限,所以不能上传,删除文件
[root@centos7 ~]# ll -d /var/ftp   
drwxr-xr-x 4 root root 29 Oct 18 09:29 /var/ftp

 这里要注意匿名用户登录很危险,所以必须不能有写权限,如果想有写权限的话建议对一个子目录进行修改,如下:

[root@centos7 ~]# cd /var/ftp
[root@centos7 ftp]# ls
pub  upload
[root@centos7 ftp]# ll
total 0
drwxr-xr-x 2 root root 6 Nov 21  2015 pub
drwxr-xr-x 2 root root 6 Oct 18 09:29 upload

# 设定访问控制列表,只对ftp用户针对upload目录设定读写执行权限
[root@centos7 ftp]# setfacl -m u:ftp:rwx upload/ 
[root@centos7 ftp]# getfacl upload/  # 查看acl权限
# file: upload/
# owner: root
# group: root
user::rwx
user:ftp:rwx
group::r-x
mask::rwx
other::r-x

[root@centos7 ftp]# lftp 10.1.252.161 # 再次匿名登录
lftp 10.1.252.161:~> ls              
drwxr-xr-x    2 0        0               6 Nov 20  2015 pub
drwxrwxr-x    2 0        0               6 Oct 18 01:29 upload
lftp 10.1.252.161:/> cd upload/ # 进到授权的子目录中
lftp 10.1.252.161:/upload> ls

# 上传,发现还是不可以,这是因为我们虽然设定了文件系统的写入权限,但是匿名用户的上传权限还没有开启,所以同样不能上传
lftp 10.1.252.161:/upload> put /etc/fstab  
put: Access failed: 550 Permission denied. (fstab)
lftp 10.1.252.161:/upload>

 2.配置文件:vsftpd.conf

格式:directive VALUE,...

  • directive:指令之前不能存在任何字符,包括空白(即顶格写);

匿名用户:

  • anonymous_enable=YES             启用匿名用户

  • anon_upload_enable=YES           匿名用户上传权限

  • anon_mkdir_write_enable=YES    匿名用户创建目录权限

  • anon_other_write_enable=YES     匿名用户写权限(删除)

本地用户

  • local_enable=YES  启用本地系统用户

  • write_enable=YES  允许本地用户写操作

pam认证服务:pluggable authencate module 插入式认证模块

pam_service_name=vsftpd  表示调用pam的vsftpd配置文件

  • /etc/pam.d/vsftpd 通过此文件定义了该如何认证系统用户账号来访问ftp服务

切换目录时的提示信息:

  • dirmessage_enable=YES

      文件要为 .messages (隐藏文件

修改上传文件的属主:默认为ftp用户

  • chown_uploads=YES

  • chown_username=USERNAME

禁锢用户于自己的家目录:

  会引入别的风险,因此,要求用户对自己的家目录不能有写权限;

禁锢所有用户于自己的家目录

  • chroot_local_user=YES

禁锢部分用户

白名单:名单中的用户不被禁锢;

  • chroot_local_user=YES

  • chroot_list_enable=YES

  • chroot_list_file=/etc/vsftpd/chroot_list

黑名单:名单中的用户被禁锢

  • chroot_local_user=NO

  • chroot_list_enable=YES

  • chroot_list_file=/etc/vsftpd/chroot_list

注意:

  • 只用写进禁锢文件中的用户才可以正常访问,没写进去的要想访问就必须把自己的写权限去掉之后才可以访问。

user_list控制用户访问vsftpd:

白名单

  • userlist_enable=YES

  • userlist_deny=NO 

黑名单,默认

  • userlist_enable=YES

  • userlist_deny=YES

其他相关配置详见 man vsftpd.conf

演示:

[root@centos7 ~]# cd /etc/vsftpd/ # 配置文件主目录
[root@centos7 vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
[root@centos7 vsftpd]# cp vsftpd.conf{,.bak} # 对主配置文件做备份
[root@centos7 vsftpd]# ls
ftpusers   vsftpd.conf      vsftpd_conf_migrate.sh
user_list  vsftpd.conf.bak

1.匿名用户设置 

 1)修改配置文件使匿名用户拥有上传权限:anon_upload_enable=YES 

[root@centos7 ~]# cd  /etc/vsftpd/
[root@centos7 vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh

# 编辑配置文件
[root@centos7 vsftpd]# vim vsftpd.conf 
 anon_upload_enable=YES

# 重启服务 
[root@centos7 ~]# systemctl restart vsftpd 

[root@centos7 ~]# lftp 10.1.252.161
lftp 10.1.252.161:~> ls
drwxr-xr-x    2 0        0               6 Nov 20  2015 pub
drwxrwxr-x    2 0        0               6 Oct 18 01:29 upload
lftp 10.1.252.161:/> cd upload/
lftp 10.1.252.161:/upload> ls
lftp 10.1.252.161:/upload> put /etc/fstab # 可以上传文件了
690 bytes transferred
lftp 10.1.252.161:/upload> ls
-rw-------    1 14       50            690 Oct 18 02:28 fstab
lftp 10.1.252.161:/upload> ls
-rw-------    1 14       50            690 Oct 18 02:28 fstab

 2)anon_other_write_enable=YES  其他写权限

lftp 10.1.252.161:/upload> rm fstab 
rm: Access failed: 550 Permission denied. (fstab) # 没有权限

# 修改配置文件添加如下内容
[root@centos7 vsftpd]# vim vsftpd.conf 
 anon_other_write_enable=YES

[root@centos7 ~]# systemctl restart vsftpd # 重启服务
[root@centos7 ~]# lftp 10.1.252.161
lftp 10.1.252.161:~> ls
drwxr-xr-x    2 0        0               6 Nov 20  2015 pub
drwxrwxr-x    2 0        0              18 Oct 18 02:28 upload
lftp 10.1.252.161:/> cd upload/
lftp 10.1.252.161:/upload> ls
-rw-------    1 14       50            690 Oct 18 02:28 fstab
lftp 10.1.252.161:/upload> rm -f fstab 
rm ok, `fstab' removed  # 删除成功
lftp 10.1.252.161:/upload> ls
lftp 10.1.252.161:/upload>

2.认证服务

  1)使用root用户登录如下

root@centos7 ~]# ftp 10.1.252.161
Connected to 10.1.252.161 (10.1.252.161).
220 (vsFTPd 3.0.2)
Name (10.1.252.161:root): root # 使用root用户登录
530 Permission denied.
Login failed.  # 登录失败
ftp>
# 其实不只是root用户不允许登录,/etc/vsftpd/ftpusers下的用户都不允许登录,这写用户都为系统级用户

[root@centos7 vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh
[root@centos7 vsftpd]# cat ftpusers 
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync        
shutdown
halt
mail
news
uucp
operator
games
nobody

# 我们可以尝试把tao用户加进去,看能否登陆ftp服务
[root@centos7 vsftpd]# echo "tao" >> ftpusers  

# 重启服务,发现使用lftp和ftp都不能访问
[root@centos7 vsftpd]# systemctl restart vsftpd 
[root@centos7 vsftpd]# lftp -u tao,134296 10.1.252.161
lftp [email protected]:~> ls
ls: Login failed: 530 Login incorrect.          
lftp [email protected]:~> exit
[root@centos7 vsftpd]# ftp 10.1.252.161  
Connected to 10.1.252.161 (10.1.252.161).
220 (vsFTPd 3.0.2)
Name (10.1.252.161:root): tao
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.

  2)pam认证机制

[root@centos7 vsftpd]# ls /usr/lib64/security/  # pam 机制的认证模块
pam_access.so    pam_env.so        pam_gnome_keyring.so  pam_loginuid.so          pam_postgresok.so      pam_sepermit.so    pam_timestamp.so     pam_userdb.so
pam_cap.so       pam_exec.so       pam_group.so          pam_mail.so              pam_pwhistory.so       pam_shells.so      pam_tty_audit.so     pam_warn.so
pam_chroot.so    pam_faildelay.so  pam_issue.so          pam_mkhomedir.so         pam_pwquality.so       pam_sss.so         pam_umask.so         pam_wheel.so
pam_console.so   pam_faillock.so   pam_keyinit.so        pam_motd.so              pam_rhosts.so          pam_stress.so      pam_unix_acct.so     pam_xauth.so
pam_cracklib.so  pam_filter        pam_lastlog.so        pam_namespace.so         pam_rootok.so          pam_succeed_if.so  pam_unix_auth.so
pam_debug.so     pam_filter.so     pam_limits.so         pam_nologin.so           pam_securetty.so       pam_systemd.so     pam_unix_passwd.so
pam_deny.so      pam_fprintd.so    pam_listfile.so       pam_oddjob_mkhomedir.so  pam_selinux_permit.so  pam_tally2.so      pam_unix_session.so
pam_echo.so      pam_ftp.so        pam_localuser.so      pam_permit.so            pam_selinux.so         pam_time.so        pam_unix.so
[root@centos7 vsftpd]# ls /etc/pam.d/  # 模块对应的文件
atd          cups                 gdm-launch-environment  kscreensaver  password-auth     ppp        screen             smtp.postfix  su-l                    vlock
chfn         fingerprint-auth     gdm-password            liveinst      password-auth-ac  remote     setup              sshd          system-auth             vsftpd
chsh         fingerprint-auth-ac  gdm-pin                 login         polkit-1          runuser    smartcard-auth     su            system-auth-ac          xserver
config-util  gdm-autologin        gdm-smartcard           other         postlogin         runuser-l  smartcard-auth-ac  sudo          system-config-language
crond        gdm-fingerprint      kcheckpass              passwd        postlogin-ac      samba      smtp               sudo-i        systemd-user

[root@centos7 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

3.禁锢用户于自己的家目录

[root@centos7 vsftpd]# ftp 10.1.252.161
Connected to 10.1.252.161 (10.1.252.161).
220 (vsFTPd 3.0.2)
Name (10.1.252.161:root): tao
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/tao"
ftp> cd /etc  # 我们发现系统用户登陆后,可以随意切换到其他的目录中去,这样是很危险的
250 Directory successfully changed.
ftp> exit
221 Goodbye.

  1)编辑配置文件开启chroot_local_user=YES

[root@centos7 vsftpd]# ftp 10.1.252.161
Connected to 10.1.252.161 (10.1.252.161).
220 (vsFTPd 3.0.2)
Name (10.1.252.161:root): tao
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
# 如上,提示错误,原因是如果要禁锢于自己的家目录下,会有风险存在,所以必须要禁用用户的写权限,才可以登录

Linux 中的文件共享服务---ftp_第3张图片

# 把用户家目录的写权限去掉
[root@centos7 vsftpd]# chmod a-w /home/tao
[root@centos7 vsftpd]# ll -d /home/tao
dr-x------ 8 tao tao 4096 Oct 18 09:52 /home/tao

# 再次登录
[root@centos7 vsftpd]# ftp 10.1.252.161
Connected to 10.1.252.161 (10.1.252.161).
220 (vsFTPd 3.0.2)
Name (10.1.252.161:root): tao
331 Please specify the password.
Password:
230 Login successful. # 登陆成功
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" # 在用户的家目录下
ftp> put /etc/fstab # 因为没有写权限了所以不能上传文件了
local: /etc/fstab remote: /etc/fstab
227 Entering Passive Mode (10,1,252,161,34,219).
553 Could not create file.

2)禁锢除文件中指定的ftp本地用户于其家目录中(设置白名单)

Linux 中的文件共享服务---ftp_第4张图片

[root@centos7 vsftpd]# ftp 10.1.252.161
Connected to 10.1.252.161 (10.1.252.161).
220 (vsFTPd 3.0.2)
Name (10.1.252.161:root): tao
331 Please specify the password.
Password:
500 OOPS: could not read chroot() list file:/etc/vsftpd/chroot_list
Login failed. # 提示没有找到文件

# 创建chroot_list文件,并把tao用户写到文件中去,重启服务
[root@centos7 vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh
[root@centos7 vsftpd]# touch chroot_list
[root@centos7 vsftpd]# ls
chroot_list  ftpusers  user_list  vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh
[root@centos7 vsftpd]# echo "tao" > chroot_list 
[root@centos7 vsftpd]# systemctl restart vsftpd

# 再次使用tao用户登录如下:
[root@centos7 vsftpd]# ftp 10.1.252.161
Connected to 10.1.252.161 (10.1.252.161).
220 (vsFTPd 3.0.2)
Name (10.1.252.161:root): tao
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 (10,1,252,161,200,222).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Oct 18 01:16 pub
drwxr-xr-x    2 0        0               6 Oct 18 01:20 upload
drwxr-xr-x    2 0        0               6 Oct 18 01:36 xiu
226 Directory send OK.
ftp> pwd
257 "/home/tao"
ftp> exit
221 Goodbye.

# 使用没有写进去的用户xiu登录发现登陆不进去
[root@centos7 vsftpd]# ftp 10.1.252.161
Connected to 10.1.252.161 (10.1.252.161).
220 (vsFTPd 3.0.2)
Name (10.1.252.161:root): xiu
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
ftp> 

# 总结:只用写进禁锢文件中的用户才可以正常访问,没写进去的要想访问就必须把自己的写权限去掉之后才可以访问。

 4.user_list控制用户访问vsftpd:

[root@centos7 vsftpd]# ls
chroot_list  ftpusers  test.sql  user_list  vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh
[root@centos7 vsftpd]# cat user_list # 查看用户限制文件
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file  # 如果userlist_deny=NO,就允许文件中的用户登录
# If userlist_deny=YES (default), never allow users in this file, and # 如果userlist_deny=YES 默认的,就不允许文件中的用户登录
# 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
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

    设置白名单,注意这里的userlist_enable会和 禁锢用户文件chroot_local_user=YES 冲突,所以启用前先把禁锢文件注释掉;

    在配置文件中添加userlist_deny=NO,如下图

wKiom1gFuBKB1CibAAANS1gPI-0629.png

[root@centos7 vsftpd]# echo tao > user_list # 仅把tao用户加进去,没在名单里的用户都不允许访问
[root@centos7 vsftpd]# !sys # 重启服务
systemctl restart vsftpd

[root@centos7 vsftpd]# ftp 10.1.252.161 # tao用户登录,可以正常访问
Connected to 10.1.252.161 (10.1.252.161).
220 (vsFTPd 3.0.2)
Name (10.1.252.161:root): tao                        
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 (10,1,252,161,148,32).
150 Here comes the directory listing.
-rw-r--r--    1 1000     1000           13 Oct 18 05:09 f1
drwxr-xr-x    2 0        0               6 Oct 18 01:16 pub
drwxr-xr-x    2 0        0               6 Oct 18 01:20 upload
drwxr-xr-x    2 0        0               6 Oct 18 01:36 xiu
226 Directory send OK.
ftp> pwd
257 "/home/tao"
ftp> exit
221 Goodbye.

[root@centos7 vsftpd]# ftp 10.1.252.161 # 用户秀不可以正常登录
Connected to 10.1.252.161 (10.1.252.161).
220 (vsFTPd 3.0.2)
Name (10.1.252.161:root): xiu
530 Permission denied.
Login failed.

基于虚拟用户的vsftpd

       虚拟用户就是系统不存在的实体用户,他只能访问服务器为其提供的ftp服务,但不能访问其他的额外资源信息。所以如果想让一些用户可以对ftp服务中的内容具有写权限,但又不允许访问其他系统资源,那我们就可以通过使用虚拟用户来提高系统的安全性。在vsftpd中,虚拟用户的认证方式是单独的口令库文件(pam_userdb),有可插入式认证模块来完成认证,使用这种方式配置更加灵活也更加安全。具体过程如下:

vsftpd依赖pam完成认证,pam存储支持的认证方式,vsftpd都可调用;

账号密码存储于何处?

  • 文件、MySQL、ldap、redis、...

pam_mysql模块

  pam默认是不支持myaql的,要想让pam利用mysql认证,要先安装pam_mysql驱动模块

  • CentOS 6:epel源

  • CentOS 7:编译安装

编译:

(1)编译环境;

(2)依赖关系:mariadb-devel, pam-devel

(3)执行过程  

  • # ./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security/

  • # make install 

准备要映射成为的系统账号:

  • # mkdir -pv /ftproot/{pub,upload}

  • # useradd -d /ftproot vuser

  • # setfacl -m u:vuser:rwx /ftproot/upload

准备基于mysql认证的pam配置文件:/etc/pam.d/vsftpd.mysql

配置vsftpd启用虚拟用户,并使用指定的pam service:vsftpd.conf

  • pam_service_name=vsftpd.mysql

  • guest_enable=YES

  • guest_username=vuser

配置每虚拟用户拥有不同的权限:vsftpd.conf

  • user_config_dir=/etc/vsftpd/vusers_conf

创建此文件

  • # mkdir /etc/vsftpd/vusers_conf

  • # touch USERNAME

权限配置指令

  • anon_upload_enable

  • anon_mkdir_write_enable

  • anon_other_write_enable

演示:

 1.首选编译安装pam_mysql

# 准备开发环境
[root@centos7 ~]# yum groupinstall "Development Tools" "Sever Platform Dvelopment" -y

# 解决依赖关系
[root@centos7 ~]# yum install marriadb-devel pam-devel -y

#启动mariadb,确保可以登录
[root@centos7 ~]# systemctl start mariadb
[root@centos7 ~]# mysql -p134296
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.44-MariaDB MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

# 下载源码包
lftp 10.1.0.1:/pub/Sources/sources/pam> ls
-rw-r--r--    1 0        0          335240 Apr 21 03:54 pam_mysql-0.7RC1.tar.gz
lftp 10.1.0.1:/pub/Sources/sources/pam> get pam_mysql-0.7RC1.tar.gz 
335240 bytes transferred    
[root@centos7 ~]# ls
  pam_mysql-0.7RC1.tar.gz # pam_mysql包  Pictures  select.sh  test.sql  
  
# 解压缩,并进入其目录中
[root@centos7 ~]# tar xf pam_mysql-0.7RC1.tar.gz   
[root@centos7 ~]# cd pam_mysql-0.7RC1 
[root@centos7 pam_mysql-0.7RC1]# ls
acinclude.m4  config.sub    INSTALL # 安装方法      missing         pam_mysql.spec.in
aclocal.m4    configure     install-sh   mkinstalldirs   pkg.m4
ChangeLog     configure.in  ltmain.sh    NEWS            README
config.guess  COPYING       Makefile.am  pam_mysql.c     stamp-h.in
config.h.in   CREDITS       Makefile.in  pam_mysql.spec      

# 执行./configure编译
[root@localhost pam_mysql-0.7RC1]# ./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security/

# 执行make install
[root@localhost pam_mysql-0.7RC1]# make install

 2.编译完成后,启用数据库,创建一个名叫vsftpd的数据库,授权一个用户,并在库中创建表和数据

[root@localhost ~]# mysql -p134296
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.44-MariaDB MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database vsftpd; # 创建vsftpd数据
Query OK, 1 row affected (0.00 sec)

# 授权一个用户和密码
MariaDB [(none)]> GRANT ALL ON vsftpd.* TO 'vsftpd'@127.0.0.1 IDENTIFIED BY '134296';
Query OK, 0 rows affected (0.00 sec)
# 刷新授权表
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

# 创建表
MariaDB [(none)]> use vsftpd;
Database changed
MariaDB [vsftpd]> CREATE TABLE vsftpd.users (uid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE KEY,name VARCHAR(100) NOT NULL PRIMARY KEY,password CHAR(48) NOT NULL);
Query OK, 0 rows affected (0.06 sec)

MariaDB [vsftpd]> desc users;
+----------+----------------------+------+-----+---------+----------------+
| Field    | Type                 | Null | Key | Default | Extra          |
+----------+----------------------+------+-----+---------+----------------+
| uid      | smallint(5) unsigned | NO   | UNI | NULL    | auto_increment |
| name     | varchar(100)         | NO   | PRI | NULL    |                |
| password | char(48)             | NO   |     | NULL    |                |
+----------+----------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

#向表中插入数据
MariaDB [vsftpd]> INSERT INTO users (name,password) VALUES ('tom',PASSWORD('123456')),('jerry',PASSWORD('123456')),('lucy',PASSWORD('123456'));
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB [vsftpd]> select * from users;
+-----+-------+-------------------------------------------+
| uid | name  | password                                  |
+-----+-------+-------------------------------------------+
|   2 | jerry | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
|   3 | lucy  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
|   1 | tom   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----+-------+-------------------------------------------+
3 rows in set (0.00 sec)

MariaDB [vsftpd]>

3.准备要映射成为的系统账号,这个家目录将成为虚拟用户访问登录时的家目录

[root@localhost ~]# mkdir -pv /ftproot/{pub,upload}
mkdir: 已创建目录 "/ftproot"
mkdir: 已创建目录 "/ftproot/pub"
mkdir: 已创建目录 "/ftproot/upload"

一定要先创建目录,再创建用户并指定其家目录为其创建的目录;这样的话属主和属组就不为vuser
[root@centos7 Source]# useradd -d /ftproot vuser
useradd: warning: the home directory already exists.   #警告:此主目录已经存在,不从 skel 目录里向其中复制任何文件。
Not copying any file from skel directory into it.

[root@centos7 Source]# ll /ftproot/
total 0
drwxr-xr-x 2 root root 6 Mar  9 10:59 pub
drwxr-xr-x 2 root root 6 Mar  9 10:59 upload

[root@localhost ~]# setfacl -m u:vuser:rwx /ftproot/upload # 仅对用户设置对/ftproot/upload拥有rwx权限
[root@localhost ~]# getfacl /ftproot/upload/
getfacl: Removing leading '/' from absolute path names
# file: ftproot/upload/
# owner: root
# group: root
user::rwx
user:vuser:rwx
group::r-x
mask::rwx
other::r-x

4.准备基于mysql认证的pam配置文件:/etc/pam.d/vsftpd.mysql

 [root@localhost ~]# vim /etc/pam.d/vsftpd.mysql 
  # auth为账号认证,account为账号审计
  1 auth required pam_mysql.so host=127.0.0.1 user=vsftpd passwd=mageedu db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
  2 account required pam_mysql.so host=127.0.0.1 user=vsftpd passwd=mageedu db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

5.配置vsftpd启用虚拟用户,并使用指定的pam service:vsftpd.conf

[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# vim vsftpd.conf
 pam_service_name=vsftpd.mysql
 guest_enable=YES
 guest_username=vuser
 
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# ss -tnl

6.使用ftp登录ftp服务,验证能否登陆成功

[root@localhost ~]# ftp 10.1.252.37
Connected to 10.1.252.37 (10.1.252.37).
220 (vsFTPd 3.0.2)
Name (10.1.252.37: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 (10,1,252,37,226,225).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0            4096 Oct 18 07:58 pub
drwxr-xr-x    2 0        0            4096 Oct 18 07:58 upload
226 Directory send OK.
ftp> pwd
257 "/"

  认证登录失败可查看认证日志,我这里此前登录失败过两次,是因为粗心导致/etc/vsftpd/vsftpd.conf中pam_service_name=vsftpd.mysql和创建的pam配置文件名称不符

[root@localhost vsftpd]# tail /var/log/secure
Oct 18 16:28:31 localhost polkitd[1042]: Registered Authentication Agent for unix-process:20596:459399 (system bus name :1.54 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale zh_CN.UTF-8)
Oct 18 16:28:31 localhost polkitd[1042]: Unregistered Authentication Agent for unix-process:20596:459399 (system bus name :1.54, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale zh_CN.UTF-8) (disconnected from bus)

7.配置每虚拟用户拥有不同的权限:vsftpd.conf

[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# vim vsftpd.conf
  user_config_dir=/etc/vsftpd/vusers_conf
 
 # 创建此目录
[root@localhost vsftpd]# mkdir  vusers_conf
[root@localhost vsftpd]# ls 
ftpusers   vsftpd.conf      vsftpd_conf_migrate.sh
user_list  vsftpd.conf.bak  vusers_conf

[root@localhost vsftpd]# cd vusers_conf/
[root@localhost vusers_conf]# vim tom
 anon_upload_enable=YES # 允许上传
 anon_other_write_enable=YES # 允许写操作
 
 [root@localhost ~]# lftp -u tom,123456 10.1.252.37
lftp [email protected]:~> ls
drwxr-xr-x    2 0        0            4096 Oct 18 07:58 pub
drwxrwxr-x    2 0        0            4096 Oct 18 07:58 upload
lftp [email protected]:/> cd upload/
lftp [email protected]:/upload> ls
lftp [email protected]:/upload> put /etc/fstab
595 bytes transferred
lftp [email protected]:/upload> ls
-rw-------    1 1001     1001          595 Oct 18 09:01 fstab
lftp [email protected]:/upload> rm -f fstab 
rm 成功, 删除 `fstab'

总结:

Linux 中的文件共享服务---ftp_第5张图片