Linux 中的文件共享服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 中的文件共享服务相关的知识,希望对你有一定的参考价值。

Linux 中的文件共享服务

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

概述:

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




文件服务

1)介绍

ftp:

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

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:file transfer protocol,21/tcp

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;

安装启动服务

  • # yum install vsftpd -y

  • # systemctl start vsftpd

命令演示:

 启动ftp服务并查看端口

[[email protected] vsftpd]# systemctl start vsftpd # 启动服务
[[email protected] 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                                                                :::*

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

[[email protected] ~]# id tao
uid=1000(tao) gid=1000(tao) groups=1000(tao)
[[email protected] ~]# cd /home/tao
[[email protected] tao]# mkdir upload  # 在用户tao的家目录下创建pub和upload目录
[[email protected] tao]# mkdir pub  
[[email protected] tao]# ls
pub  upload
[[email protected] tao]# cd
[[email protected] ~]# 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的家目录,所以本地用户登录文档路径回会映射为用户自己的家目录

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

[[email protected] ~]# mkdir /home/tao/xiu

 计算机登录如下

技术分享

技术分享


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

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

[[email protected] ~]# 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.

 浏览器访问如下

技术分享

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

[[email protected] ~]# 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匿名用户登录,发现不能上传删除文件,如下:

[[email protected] ~]# 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用用户没有写权限,所以不能上传,删除文件
[[email protected] ~]# ll -d /var/ftp  # 
drwxr-xr-x 4 root root 29 Oct 18 09:29 /var/ftp

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

[[email protected] ~]# cd /var/ftp
[[email protected] ftp]# ls
pub  upload
[[email protected] 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目录设定读写执行权限
[[email protected] ftp]# setfacl -m u:ftp:rwx upload/ 
[[email protected] ftp]# getfacl upload/  # 查看acl权限
# file: upload/
# owner: root
# group: root
user::rwx
user:ftp:rwx
group::r-x
mask::rwx
other::r-x

[roo[email protected] 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认证服务:

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

        /etc/pam.d/vsftpd  

     通过此文件定义了该如何认证系统用户账号来访问ftp服务

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


切换目录时的提示信息:

  •  dirmessage_enable=YES

      文件要为 .messages (隐藏文件

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

  • chown_uploads=YES

  • chown_username=USERNAME


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

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

  • 禁锢所有用户

      chroot_local_user=YES

  • 禁锢部分用户

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

           chroot_local_user=YES

           chroot_list_enable=YES

           chroot_list_file=/etc/vsftpd/chroot_list

      (b)黑名单:名单中的用户被禁锢

           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


命令演示:

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

1.匿名用户设置 

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

[[email protected] ~]# cd  /etc/vsftpd/
[[email protected] vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh
[[email protected] vsftpd]# vim vsftpd.conf # 编辑配置文件
 anon_upload_enable=YES
[[email protected] ~]# systemctl restart vsftpd # 重启服务
[[email protected] ~]# 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) # 没有权限

[[email protected] vsftpd]# vim vsftpd.conf # 修改配置文件添加如下内容
 anon_other_write_enable=YES
[[email protected] ~]# systemctl restart vsftpd # 重启服务
[[email protected] ~]# 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用户登录如下

[email protected] ~]# 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下的用户都不允许登录,这写用户都为系统级用户

[[email protected] vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh
[[email protected] 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服务
[[email protected] vsftpd]# echo "tao" >> ftpusers  
[[email protected] vsftpd]# systemctl restart vsftpd # 重启服务
[[email protected] vsftpd]# lftp -u tao,134296 10.1.252.161
lftp [email protected]:~> ls
ls: Login failed: 530 Login incorrect.          
lftp [email protected]:~> exit
[[email protected] vsftpd]# ftp 10.1.252.161  # 发现使用lftp和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:
530 Login incorrect.
Login failed.

  2)pam认证机制

[[email protected] 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
[[email protected] 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
[[email protected] 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.禁锢用户于自己的家目录

[[email protected] 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.

  编辑配置文件开启chroot_local_user=YES

[[email protected] 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
# 如上,提示错误,原因是如果要禁锢于自己的家目录下,会有风险存在,所以必须要禁用用户的写权限,才可以登录

技术分享

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

# 再次登录
[[email protected] 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.

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

技术分享

[[email protected] 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用户写到文件中去,重启服务
[[email protected] vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh
[[email protected] vsftpd]# touch chroot_list
[[email protected] vsftpd]# ls
chroot_list  ftpusers  user_list  vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh
[[email protected] vsftpd]# echo "tao" > chroot_list 
[[email protected] vsftpd]# systemctl restart vsftpd

# 再次使用tao用户登录如下:
[[email protected] 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登录发现登陆不进去
[[email protected] 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:

[[email protected] vsftpd]# ls
chroot_list  ftpusers  test.sql  user_list  vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh
[[email protected] 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,如下图

技术分享

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

[[email protected] 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.

[[email protected] 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

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

命令演示:

 1.首选编译安装pam_mysql

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

# 解决依赖关系
[[email protected] ~]# yum install marriadb-devel pam-devel -y

#启动mariadb,确保可以登录
[[email protected] ~]# systemctl start mariadb
[[email protected] ~]# 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    
[[email protected] ~]# ls
  pam_mysql-0.7RC1.tar.gz # pam_mysql包  Pictures  select.sh  test.sql  
  
 # 解压缩,并进入其目录中
 [[email protected] ~]# tar xf pam_mysql-0.7RC1.tar.gz   
 [[email protected] ~]# cd pam_mysql-0.7RC1 
 [[email protected] 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编译
[[email protected] pam_mysql-0.7RC1]# ./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security/
# 执行make install
[[email protected] pam_mysql-0.7RC1]# make install

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

[[email protected] ~]# 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.准备要映射成为的系统账号

 这个家目录将成为虚拟用户访问登录时的家目录

[[email protected] ~]# mkdir -pv /ftproot/{pub,upload}
mkdir: 已创建目录 "/ftproot"
mkdir: 已创建目录 "/ftproot/pub"
mkdir: 已创建目录 "/ftproot/upload"
[[email protected] ~]# useradd -d /ftproot vuser
useradd:警告:此主目录已经存在。
不从 skel 目录里向其中复制任何文件。
[[email protected] ~]# ll -d /ftproot/
drwxr-xr-x 4 root root 4096 10月 18 15:58 /ftproot/
[[email protected] ~]# setfacl -m u:vuser:rwx /ftproot/upload # 仅对用户设置对/ftproot/upload拥有rwx权限
[[email protected] ~]# 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

 [[email protected] ~]# vim /etc/pam.d/vsftp.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

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

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

[[email protected] ~]# 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配置文件名称不符

[[email protected] 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

[[email protected] ~]# cd /etc/vsftpd/
[[email protected] vsftpd]# vim vsftpd.conf
  user_config_dir=/etc/vsftpd/vusers_conf
 
 # 创建此目录
[[email protected] vsftpd]# mkdir  vusers_conf
[[email protected] vsftpd]# ls 
ftpusers   vsftpd.conf      vsftpd_conf_migrate.sh
user_list  vsftpd.conf.bak  vusers_conf
[[email protected] vsftpd]# cd vusers_conf/
[[email protected] vusers_conf]# vim tom
 anon_upload_enable=YES # 允许上传
 anon_other_write_enable=YES # 允许写操作
 
 [[email protected] ~]# 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 中的文件共享服务的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 文件共享服务器工具 - chfs

使用Linux搭建FTP服务器实现文件共享

Samba服务创建共享文件系统

Linux 服务器之间如何进行文件目录共享

FragmentNavigator 共享过渡不起作用

linux 文件共享技巧