文件共享服务---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)协议来解决跨平台的文件共享服务。
★网络存储:
☉NAS:Network Attached Storage
网络附加存储,是一台文件服务器,通过网络文件的形式来提供文件共享存储(通常通过nfs或cifs协议来实现),文件级别(已经有文件系统了,直接挂载使用即可);
☉SAN:Storage 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
计算机登录如下
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.
浏览器访问如下
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 # 如上,提示错误,原因是如果要禁锢于自己的家目录下,会有风险存在,所以必须要禁用用户的写权限,才可以登录
# 把用户家目录的写权限去掉 [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本地用户于其家目录中(设置白名单)
[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,如下图
[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'
总结: