一、vsftpd
1、vsftpd is a Very Secure FTP daemon. It was written completely from
2、URL:
a、SCHEME://username:password@HOST:PORT/PATH/TO/FILE
b、路径映射:
(1)、用户家目录:每个用户的URL的/映射到当前用户的家目录
3、vsftpd以ftp用户的身份运行进程,默认用户即为ftp用户,匿名用户的默认路径即ftp用户的家目录/var/ftp
a、ftp,anonymous
[root@www ~]# cat /etc/passwd|grep ftp ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
b、注意:一个用户通过文件共享服务访问文件系统上的文件的生效权限为此二者的交集
4、程序环境
a、主程序:/usr/sbin/vsftpd
b、主配置文件:/etc/vsftpd/vsftpd.conf
c、数据根目录:/var/ftp
d、Systemd Unit File:/usr/lib/systemd/system/vsftpd.service
5、配置vsftpd:
a、用户类别:
(1)、匿名用户:anonyous --> ftp,/var/ftp
(2)、系统用户:至少禁止系统用户访问ftp服务,/etc/vsftpd/ftpusers,PAM(/etc/pam.d/vsftpd)
[root@www ~]# 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 #认证时使用password-auth这个文件来进行认证 account include password-auth session required pam_loginuid.so session include password-auth
[root@www ~]# cat /etc/pam.d/password-auth #%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth required pam_faildelay.so delay=2000000 auth sufficient pam_unix.so nullok try_first_pass #使用此模块来提供功能 auth requisite pam_succeed_if.so uid >= 1000 quiet_success auth required pam_deny.so account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet account required pam_permit.so password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so -session optional pam_systemd.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so
1)、我们在192.168.10.13上创建用户fedora,并且设置密码为123456
[root@www ~]# useradd fedora [root@www ~]# echo "123456"|passwd --stdin fedora
2)、现在我们在192.168.10.14上通过fedora账号登陆
[root@node2 ~]# lftp -u fedora 192.168.10.13 Password: lftp fedora@192.168.10.13:~>
3)、然后我们在192.168.10.13 /home/fedora目录下创建一个文件,可以看到在192.168.10.14上能够看到
[root@www ~]# finger fedora Login: fedora Name: Directory: /home/fedora Shell: /bin/bash Never logged in. No mail. No Plan. [root@www ~]# touch /home/fedora/test.txt
lftp fedora@192.168.10.13:~> ls -rw-r--r-- 1 0 0 0 May 27 01:43 test.txt
4)、因此我们可以看到我们通过fedora登录时其路径映射为/home/fedora。其实匿名用户登录也是系统用户,只是其是默认的ftp用户。
(3)、虚拟用户:非系统用户,用户账号非为可登录操作系统的用户账号(非/etc/passwd);
(4)、用户通过vsftpd服务访问到的默认路径,是用户自己的家目录;默认可用自己有权限访问的所有路径间切换;禁锢用户于其家目录中
b、配置文件:
(1)、/etc/vsftpd/vsftpd.conf
directive value
(2)、注意:directive之前不能有多余字符
(3)、可用通过man vsftpd.conf命令进行查看
c、匿名用户
(1)、anonymous_enable=YES :是否支持启用匿名账号。默认为YES,这一项最多只能开启匿名用户的下载权限。
(2)、anon_world_readable_only=YES:匿名用户是否支持全局只读,默认为YES。
(3)、anon_upload_enable=YES :匿名用户是否有上传权限,默认只能创建文件不能创建目录,要想创建目录要使用anon_mkdir_write_enable这个选项
(4)、anon_mkdir_write_enable=YES
(5)、anon_other_write_enable=YES :所有删除和修改类的权限由此选项来设置,比如删除修改文件或目录
(6)、示例
1)、我们在192.168.10.13 /var/ftp目录中创建upload这个目录。(注意,我们/var/ftp目录的属主和数组是root权限这个是不能改的,而且不允许其他人有写权限,如果一改那么我们服务就启动不了了)
[root@www vsftpd]# ls -ld /var/ftp/ drwxr-xr-x 3 root root 17 5月 26 16:28 /var/ftp/ [root@www vsftpd]# mkdir /var/ftp/upload [root@www vsftpd]# ls -ld /var/ftp/* drwxr-xr-x 2 root root 6 8月 3 2017 /var/ftp/pub drwxr-xr-x 2 root root 6 5月 27 10:09 /var/ftp/upload
2)、然后我们修改upload的属主和属组。并且我们在配置文件中设置upload目录拥有共享权限。并且重启服务
[root@www vsftpd]# chown ftp.ftp /var/ftp/upload/ [root@www vsftpd]# ls -l /var/ftp/ 总用量 0 drwxr-xr-x 2 root root 6 8月 3 2017 pub drwxr-xr-x 2 ftp ftp 6 5月 27 10:09 upload [root@www vsftpd]# cat /etc/vsftpd/vsftpd.conf |grep anon_upload_enable anon_upload_enable=YES
[root@www vsftpd]# systemctl restart vsftpd
3)、现在我们尝试在192.168.10.14上通过匿名用户访问并上传文件到upload目录,发现可以成功
[root@node2 ~]# cd /etc/ [root@node2 etc]# lftp -u ftp 192.168.10.13 Password: lftp ftp@192.168.10.13:~> ls drwxr-xr-x 2 0 0 6 Aug 03 2017 pub drwxr-xr-x 2 14 50 6 May 27 02:09 upload lftp ftp@192.168.10.13:/> cd upload/ lftp ftp@192.168.10.13:/upload> put issue 23 bytes transferred lftp ftp@192.168.10.13:/upload> ls -rw------- 1 14 50 23 May 27 02:20 issue lftp ftp@192.168.10.13:/upload>
4)、我们现在在192.168.10.13中查看相应的文件,可以发现权限为600,其实我们可以在配置文件中定义上传文件的umask的
anon_umask=077 #默认是077
5)、此时我们还不能创建目录和删除文件,因此我们需要在192.168.10.13中配置相应参数然后重启服务。然后我们再尝试通过192.168.10.14登陆后创建目录和删除文件。
[root@www /]# cat /etc/vsftpd/vsftpd.conf |grep -E "anon_(mkdir|other)" anon_mkdir_write_enable=YES anon_other_write_enable=YES
[root@www /]# cat /etc/vsftpd/vsftpd.conf |grep -E "anon_(mkdir|other)" anon_mkdir_write_enable=YES anon_other_write_enable=YES [root@www /]# systemctl restart vsftpd
[root@node2 etc]# lftp -u ftp 192.168.10.13 Password: lftp ftp@192.168.10.13:~> ls drwxr-xr-x 2 0 0 6 Aug 03 2017 pub drwxr-xr-x 2 14 50 19 May 27 02:20 upload lftp ftp@192.168.10.13:/> cd upload/ lftp ftp@192.168.10.13:/upload> put fstab 465 bytes transferred lftp ftp@192.168.10.13:/upload> ls -rw------- 1 14 50 465 May 27 02:30 fstab -rw------- 1 14 50 23 May 27 02:20 issue lftp ftp@192.168.10.13:/upload> mkdir testdir mkdir ok, `testdir' created lftp ftp@192.168.10.13:/upload> ls -rw------- 1 14 50 465 May 27 02:30 fstab -rw------- 1 14 50 23 May 27 02:20 issue drwx------ 2 14 50 6 May 27 02:30 testdir lftp ftp@192.168.10.13:/upload> rm fstab rm ok, `fstab' removed lftp ftp@192.168.10.13:/upload> ls -rw------- 1 14 50 23 May 27 02:20 issue drwx------ 2 14 50 6 May 27 02:30 testdir lftp ftp@192.168.10.13:/upload> rmdir testdir rmdir ok, `testdir' removed lftp ftp@192.168.10.13:/upload> ls -rw------- 1 14 50 23 May 27 02:20 issue lftp ftp@192.168.10.13:/upload>
d、系统用户:
(1)、local_enable=YES :是否启用本地用户,即是否允许本地用户访问ftp服务。默认是启用的
(2)、write_ebable=YES:是否允许本地用户拥有写权限。默认是启用的。
[root@www /]# cat /etc/vsftpd/vsftpd.conf |grep -E "<(local|write)_enable" local_enable=YES write_enable=YES
(3)、local_umask=022:设定上传文件的反掩码
(4)、辅助配置文件:/etc/vsftpd/ftpusers。这个文件中是通过pam来进行认证实现的
列在此文件中的用户,均禁止使用ftp服务。因为我们ftp是明文传输的,我们可以通过抓包的方式查看到我们的密码。我们要禁止某个用户登录就可以将用户加入到该文件即可
[root@www /]# cat /etc/pam.d/vsftpd |grep ftpuser auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed [root@www /]# cat /etc/vsftpd/ftpusers # Users that are not allowed to login via ftp root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
我们可以通过tcpdump命令进行抓包
[root@www /]# tcpdump -i eno16777736 -nn -XX tcp port 21
上述意思是我们抓取eno16777736这个接口上的包,-nn表示数值格式显示端口和掩码地址。tcp port 21表示我们抓tcp端口为21的包
(5)、chroot_local_user=YES
禁锢所有本地用户于其家目录,需要事先去除用户对家目录的写权限。
(6)、chroot_list_enable=YES :禁锢部分用户
(7)、chroot_list_file=/etc/vsftpd/chroot_list
禁锢列表中文件存在的用户于其家目录中;需要事先去除用户对家目录的写权限
(8)、示例
1)、在192.168.10.13上创建5个用户
[root@www /]# for i in {1..5};do useradd user$i;echo "123456"|passwd --stdin user$i;done
2)、我们现在尝试锁定user1和user2
[root@www /]# chmod a-w /home/user1 [root@www /]# chmod a-w /home/user2 [root@www /]# ls -ld /home/user{1,2} dr-x------ 2 user1 user1 62 12月 23 15:45 /home/user1 dr-x------ 2 user2 user2 62 1月 2 11:45 /home/user2
3)、然后我们创建/etc/vsftpd/chroot_list文件并且在我们的/etc/vsftpd.d/vsftpd.conf中将相应的选项启动起来并且重启服务
[root@www /]# cat /etc/vsftpd/vsftpd.conf |grep -E "^chroot" chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list [root@www /]# cat /etc/vsftpd/chroot_list user1 user2 [root@www /]#
[root@www /]# systemctl restart vsftpd
4)、我们在192.168.10.14上来验证user1和user3,我们可以看到user1看到的是/,相当于将其禁锢在家目录了,而user3是/home/user3,他可以切换到/或/etc等目录下查看文件信息。
[root@node2 etc]# ftp 192.168.10.13 Connected to 192.168.10.13 (192.168.10.13). 220 (vsFTPd 3.0.2) Name (192.168.10.13:root): user1 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 "/" ftp> exit 221 Goodbye. [root@node2 etc]# ftp 192.168.10.13 Connected to 192.168.10.13 (192.168.10.13). 220 (vsFTPd 3.0.2) Name (192.168.10.13:root): user3 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 "/home/user3" ftp>
e、传输日志:是否开启上传下载日志
(1)、xferlog_enable=YES
(2)、xferlog_file=/var/log/xferlog
(3)、xferlog_std_format=YES
f、守护进程的类型
(1)、standalone:独立守护进程;由服务进程自动监听套接字,并接收用户访问请求
(2)、transient:瞬时守护进程;由受托管方代为监听套接字,服务进程没有访问请求时不启动;当托管方收到访问请求时,才启动服务进程;
CentOS 6:xinetd独立守护进程,/etc/xinetd.d/
CentOS 7:由systemd代为监听
g、控制可登录vsftpd服务的用户列表
(1)、userlist_enable=YES
启用/etc/vsftpd/user_list文件来控制可登录用户
(2)、userlist_deny=
YES:意味着此为黑名单。默认是等于YES的。即定义哪些用户不能访问,除此之外都可以访问。
NO:意味着此为白名单。即哪些用户可以访问,除此之外都没法访问。
(3)、示例
1)、在192.168.10.13中配置相应选项。我们将其配置为白名单,即只允许我们自己定义的用户登录。
[root@www ~]# cat /etc/vsftpd/vsftpd.conf|grep "userlist" userlist_enable=YES userlist_deny=NO
2)、我们在我们/etc/vsftpd/user_list文件中添加user1和user2然后重启服务
[root@www vsftpd]# cat 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. user1 user2
[root@www vsftpd]# systemctl restart vsftpd
3)、现在我们在192.168.10.14上进行登录,然后我们发现user1可以登陆,user3没法登陆
[root@node2 ~]# ftp 192.168.10.13 Connected to 192.168.10.13 (192.168.10.13). 220 (vsFTPd 3.0.2) Name (192.168.10.13:root): user1 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> exit 221 Goodbye. [root@node2 ~]# ftp 192.168.10.13 Connected to 192.168.10.13 (192.168.10.13). 220 (vsFTPd 3.0.2) Name (192.168.10.13:root): user3 530 Permission denied. Login failed.
h、上传下载速率
anon_max_rate=0 :默认为0,表示无限制
local_max_rate=0:本地上传下载速率,默认为0,表示无限制
i、并发连接数限制
max_clients=2000 :最大并发连接数,默认为2000个
max_per_ip=50 :最大单IP的连接数,默认为50
6、虚拟用户
a、用户账号存储于何处?
文件、MySQL、Redis、...
b、vsftpd:认证功能托管给pam
基于何种存储服务来存储用户信息,以及对存储服务的驱动要靠pam实现
c、pam_mysql:
yum install -y mariadb-devel pam-devel
./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security
make && make install
d、创建数据库,授权用户,创建账号和密码
auth字段:认证
account字段:账号检查
e、配置vsftpd,添加或修改以下选项
pam_service_name=vsftpd.vusers #为定义的用户名划一个配置文件来完成系统认证
guest_enable=YES #启用来宾账户
guest_username=vuser #将来宾账户映射为系统用户名
e、示例
(1)、安装maridb,mariadb-devel(开发环境),pam-devel
(2)、安装开发环境 yum groupinstall "Development Tools" "Server Platform Development" -y
(3)、下载程序包pam-mysql包
(4)、展开并编译
(5)、配置mysql并启动服务
(6)、连接至mysql并授权一个账号
(7)、创建相应的库和表,并插入对应数据
(8)、我们创建一个用户,家目录为/ftproot/vuser
(9)、然后创建我们的/ftproot/vuser/pub目录
(10)、我们创建一个pam配置文件/etc/pam.d/vsftpd.vusers
(11)、我们把/etc/vsftpd/vsftpd.conf还原到我们刚安装好服务时候的状态。然后修改相应的配置项。然后重启服务。
(12)、然后我们远程登录时提示我们的家目录不能拥有写权限,因此我们需要将家目录的写权限给干掉,然后重启服务
(13)、然后我们再远程登录
可以看到我们能登陆
(14)、我们创建/ftproot/vuser/upload目录并且给定相应的权限
(15)、然后配置用户的上传下载权限
1)、在/etc/vsftpd.d/vsftpd.conf中添加下面字段
2)、在该路径下添加一个和用户同名的文件,比如/etc/vsftpd/vusers_config/tom,添加如下配置。然后重启服务
(16)、然后我们尝试访问发现已经可以了
二、博客作业
pam_mysql认证ftp虚拟用户账号,且拥有不同的权限