标签:来宾 分享图片 wrap 属性 监听端口 文件 外部 ever .so
一、FTP简介 在第1步中,客户端的命令端口与FTP服务器的命令端口建立连接,并发送命令“PORT 1027”。然后在第2步中,FTP服务器给客户端的命令端口返回一个"ACK"。在第3步中,FTP服务器发起一个从它自己的数据端口(20)到客户端先前指定的数据端口(1027)的连接,最后客户端在第4步中给服务器端返回一个"ACK"。
主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接,它只是简单的告诉服务器自己监听的端口号,服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的。
Pasv模式:被动模式 //当客户端通知服务器它处于被动模式时才启用。
当开启一个FTP连接时,c打开两个任意的非特权本地端口(N >; 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,c不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P >; 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
FTP服务器命令(21)端口接受客户端任意端口(客户端初始连接)
FTP服务器命令(21)端口到客户端端口(>1023)(服务器响应客户端命令)
FTP服务器数据端口(>1023)接受客户端端口(>1023)(客户端初始化数据连接到服务器指定的任意端口)
FTP服务器数据端口(>1023)到客户端端口(>1023)(服务器发送ACK响应和数据到客户端的数据端口)
如图二:
在第1步中,客户端的命令端口与服务器的命令端口建立连接,并发送命令“PASV”。然后在第2步中,服务器返回命令"PORT 2024",告诉客户端(服务器)用哪个端口侦听数据连接。在第3步中,客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务器在第4 步中给客户端的数据端口返回一个"ACK"响应。
被动方式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是,许多FTP守护程序,包括流行的WU-FTPD允许管理员指定FTP服务器使用的端口范围。详细内容参看附录1。
第二个问题是客户端有的支持被动模式,有的不支持被动模式,必须考虑如何能支持这些客户端,以及为他们提供解决办法。例如,Solaris提供的FTP命令行工具就不支持被动模式,需要第三方的FTP客户端,比如ncftp。
下面是主动与被动FTP优缺点的简要总结:
主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。
幸运的是,有折衷的办法。既然FTP服务器的管理员需要他们的服务器有最多的客户连接,那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险,但它大大减少了危险。
主动FTP:
命令连接:客户端 >1023端口 -> 服务器 21端口
数据连接:客户端 >1023端口 <- 服务器 20端口
被动FTP:
命令连接:客户端 >1023端口 -> 服务器 21端口
数据连接:客户端 >1023端口 -> 服务器 >1023端口
ftp缺陷:
1.支持系统用户,可能导致数据泄露
2.明文传输
二、vsftp介绍
vsftpd:very secure ftp daemon
用户:资源位于用户的家目录下
匿名用户(映射到某一固定的系统用户):例如ftp,vsftpd /目标访问的资源,就是用户的家目录,/var/ftp
本地用户(系统用户);root及系统用户(0-999);每个用户都可以通过ftp访问自己的家目录
虚拟用户()
中间框架:
名称解析:nsswitch(name service switch)名称服务转换 //数字名称和字符串名称中间的转换,例如uid和用户名的转换,port和protocol等
密码认证:pam(plugable authentication modules)
vsftpd实现的名称解析,借助于pam实现,但是httpd不是
ssh就支持pam,vsftpd也支持pam,不是必须得使用pam
1.安装
yum install vsftpd -y
id ftp //家目录是/var/ftp ,是系统用户
程序:/usr/sbin/vsftpd
配置文件:/etc/vsftpd/vsftpd.conf
CentOS 6:
/etc/rc.d/vsftpd
CentOS 7:
/usr/lib/systemd/system/vsftpd.service
systemctl enable vsftpd
systemctl start vsftpd
浏览器:ftp://192.168.4.118/
lftp:lftp -u wolf,wolf 192.168.4.118 //默认用户可以直接登录自己的家目录
lcd /etc/
put fstab //可以直接上传文件
配置:/etc/vsftpd/vsftpd.conf
1)匿名服务器的连接
anonymous_enable=yes (允许匿名登陆) dirmessage_enable=YES //切换目录显示的提示信息,默认该目录下的".message" message_file //可以手动指定消息文件,lftp命令不会显示,ftp命令可以显示 local_umask=022 (FTP上本地的文件权限,默认是077) connect_from_port_20=YES //服务器是否能够工作于主动模式,并不影响真正使用的模式,服务器工作于主动还是被动,取决于client端 * xferlog_enable=yes (激活上传和下传的日志) xferlog_std_format=yes (使用标准的日志格式) ftpd_banner=XXXXX (欢迎信息) pam_service_name=vsftpd (验证方式)* listen=yes (独立的VSFTPD服务器)* listen_ipv6=YES
功能:只能连接FTP服务器,不能上传和下传
注:其中所有和日志欢迎信息相关连的都是可选项,打了星号的无论什么帐户都要添加,是属于FTP的基本选项
2)开启匿名FTP服务器上传权限
Anon_upload_enable=yes (开放上传权限) //即使启用了也不会生效,因为/var/ftp/的属主和属组是root,只有属主有写权限 ,匿名使用的是ftp用户的权限 //修改fs权限,即可setfacl,或者修改目录的权限,//setfacl -m u:ftp:rwx /var/ftp/anon,或者 anon_mkdir_write_enable=yes (可创建目录的同时可以在此目录中上传文件) write_enable=yes (开放本地用户写的权限) anon_other_write_enable=yes (匿名帐号可以有删除的权限)
3)开启匿名服务器下传的权限
anon_world_readable_only=no //只读
注:要注意文件夹的属性,匿名帐户是其它(other)用户要开启它的读写执行的权限
(R)读-----下传 (W)写----上传 (X)执行----如果不开FTP的目录都进不去
4)普通用户FTP服务器的连接(独立服务器)
local_enble=yes (本地帐户能够登陆) //所有非匿名用户和虚拟用户,要想能使用,必须启用该项 write_enable=no (本地帐户登陆后无权删除和修改文件) local_umask=022 //本地用户上传文件的权限,匿名用户上传文件的权限默认是umask=077 write_enable=YES //全局配置
功能:可以用本地帐户登陆vsftpd服务器,有下载上传的权限
注:在禁止匿名登陆的信息后匿名服务器照样可以登陆但不可以上传下传
5)用户登陆限制进其它的目录,只能进它的主目录
chroot_local_user=yes (本地所有帐户都只能在自家目录) //禁锢所用本地用户,注意要求用户对家目录不能有写权限,ftp也是如此 设置指定用户执行chroot chroot_list_enable=yes (文件中的名单可以调用)// 这两项不用同时使用 chroot_list_file=/任意指定的路径/vsftpd.chroot_list #chroot_list_file=/etc/vsftpd/chroot_list //文件中,只需要写用户名即可
注意:vsftpd.chroot_list 是没有创建的需要自己添加,要想控制帐号就直接在文件中加帐号即可
6)限制本地用户访问FTP
userlist_enable=YES //启用时,vsftpd将加载一个由userlist_指令指定的用户列表文件;此文件中的用户是否能访问vsftpd服务取决于userlist_deny指令 //默认为NO userlist_deny=no (名单中的人不允许访问) userlist_file=/指定文件存放的路径/ (文件放置的路径)
注:开启userlist_enable=yes匿名帐号不能登陆
7)安全选项
idle_session_timeout=600(秒) (用户会话空闲后10分钟) data_connection_timeout=120(秒) (将数据连接空闲2分钟断) accept_timeout=60(秒) (将客户端空闲1分钟后断) connect_timeout=60(秒) (中断1分钟后又重新连接) local_max_rate=50000(bite) (本地用户传输率50K) //0表示不受限制 anon_max_rate=30000(bite) (匿名用户传输率30K) pasv_min_port=50000 (将客户端的数据连接端口改在 pasv_max_port=60000 50000—60000之间) max_clients=200 (FTP的最大连接数) max_per_ip=4 (每IP的最大连接数) listen_port=5555 (从5555端口进行数据连接)//默认21
8)修改匿名用户上传的文件属性
#chown_uploads=YES //是否更改 #chown_username=whoever //启用chown_uploads指令时,将文件的属主修改为指定的用户,默认是root用户 chown_uploads_mode //匿名用户上传的文件的权限,默认0600
9)日志信息:
xferlog_enable=YES//默认/var/log/vsftpd.log xferlog_file=/var/log/xferlog //指定日志目录,传输日志 xferlog_std_format=YES //是否使用,默认日志记录格式 vsftpd_log_file= 定义默认日志记录位置
10)其他
#nopriv_user=ftpsecure #nopriv_user=ftpsecure #async_abor_enable=YES #ascii_upload_enable=YES //设定以anscii上传,和下载 #ascii_download_enable=YES #deny_email_enable=YES //拒绝使用邮箱登录 #banned_email_file=/etc/vsftpd/banned_emails //邮箱登录的标语 #ls_recurse_enable=YES listen=NO //enable将使用独立守护进程 pam_service_name=vsftpd userlist_deny=YES //表示此列表(user_list)为黑名单,默认为YES,默认文件/etc/vsftpd/user_list userlist_deny=NO //表示此列表(user_list)为白名单 userlist_file //默认为/etc/vsftpd/user_list, # If userlist_deny=NO, only allow users in this file # If userlist_deny=YES (default), never allow users in this file 用户列表,/etc/vsftpd/user_list,和ftpusers //ftpuser:是黑名单,禁止用户登录名单,user_list:是允许登录的用户
tcp_wrappers=YES
查看man vsftpd.conf 查看所有配置指令
tcpwrapper
任何以xinetd管理的服务都可以通过TcpWrapper来设置防火墙。
ldd `which sshd ` | grep wrap
可以看出ssh服务确实添加了wrapper模块。
/etc/hosts.allow 、/etc/hosts.deny 这两个文件的关系为allow文件优先,
若分析到的没有记录在allow文件当中,则以deny文件来判断。
daemon list : client list [:option[:option]]
例如:telnet
in.telnetd(进程名字) : 10.0.0.66 : spawn echo 'date' %c to %s >/var/log/wra.log
三、实验
实验一:修改默认ftp监听端口号
1、编辑/etc/vsftpd/vsftpd.conf 文件,在该配置文件中添加此行:listen_port=811
2、编辑/etc/services 文件,将其中的
ftp 21/tcp 改为 ftp 811/tcp ,
ftp 21/udp 改为 ftp 811/tcp
3、执行/etc/init.d/vsftpd restart 重新启动vsftpd 服务。启动完成后可以使用
netstat -tnulp | grep vsftpd
实验二:匿名用户启用
anonymous_enable=yes
anon_upload_enable=YES
anon_mkdir_write_enable=YES
并且chmod a+wx 对其他人对该目录有写入的权限
实验三:Localuser
chroot_local_user=yes #是否将所有用户限制在主目录,YES为启用 NO禁用.(该项默认值是NO,即在安装vsftpd后不做配置的话,ftp用户是可以向上切换到要目录之外的)
或者如下两个指令都可以实现chroot本地用户,但是对于lcd命令无效,限制的是cd命令
chroot_list_enable #是否启动限制用户的名单 YES为启用 NO禁用(包括注释掉也为禁用)
chroot_list_file=/etc/vsftpd/chroot_list #是否限制在主目录下的用户名单,至于是限制名单还是排除名单,这取决于chroot_local_user的值,我们可以这样记忆: chroot_local_user总是一个全局性的设定,其为YES时,全部用户被锁定于主目录,其为NO时,全部用户不被锁定于主目录。那么我们势必需要在全局设定下能做出一些“微调”,即,我们总是需要一种“例外机制",所以当chroot_list_enable=YES时,表示我们“需要例外”。而”例外“的含义总是有一个上下文的,即,当”全部用户被锁定于主目录“时(即chroot_local_user=YES),"例外"就是:不被锁定的用户是哪些;当"全部用户不被锁定于主目录"时(即chroot_local_user=NO),"例外"“就是:要被锁定的用户是哪些。这样解释和记忆两者之间的关系就很清晰了!
如图:
问题:Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
allow_writeable_chroot=YES //添加这个选项
四、虚拟用户
虚拟用户:
1.基于db文件来存放
奇数行:用户名
偶数行:密码
2.基于mysql服务
//vsftpd实现用户认证,需要基于pam实现,但是pam不支持到mysql中
/lib64/security/目录中有很多pam模块,并没有pam关于mysql的库
pam-mysql.sourceforge.net
1.安装pam-mysql驱动
yum -y install pam-devel mariadb-server mariadb-devel openssl-devel
//pam链接msyql的时候,可能需要ssl进行链接
./configure --with-mysql=/usr/local/mysql --with-openssl --with-pam=/usr --with-pam-mods-dir=/usr/lib64/security/
make && make install
ls /usr/lib64/security/ //将会生成pam_mysql.so,pam_mysql.la
2.配置vsftpd
1)配置mariadb,
vsftpd库:
MariaDB [vsftpd]> create table users (
-> id int auto_increment not null primary key,
-> name char(30) not null,
-> password char(48) binary not null );
insert into users (name,password) value ('jerry',password('jerry'));
insert into users (name,password) value ('tom',password('tom'));
grant all privileges on vsftpd.* to 'vsftpd'@'127.0.0.1' identified by 'vsftpdusers';
flush privileges;
mysql -uvsftpd -p -h127.0.0.1
2)配置pam
cat /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.mysql //vsftpd将要使用哪一个pam文件实现认证,相对路径,相对于/etc/pam.d目录
vim /etc/pam.d/vsftpd.mysql //自己建立一个pam文件
auth required pam_mysql.so user=vsftpd passwd=vsftpdusers host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=vsftpdusers host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
//一个用于验证账户,一个验证密码,都必须满足才通过认证,编译目录中有README文件说明了用法
创建一个系统用户,用来映射虚拟用户
useradd -s /sbin/nologin -d /ftproot vuser
chmod go+rx /ftproot/ //让其他用户能读
3)修改配置文件:
vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.mysql
guest_enable=YES //启动来宾账户
guest_username=vuser
anonymous_enable=YES //这几个都保证yes,这样用于虚拟账户才能用
local_enable=YES
write_enable=YES
systemctl restart vsftpd
chmod -w /ftproot/
注:实验中虚拟用户,只能使用没有写权限的/ftproot
虚拟用户用的是匿名用户的权限,匿名为vuser
//匿名用户,也就是来宾用户,需要映射为一个系统用户
3.匿名用户添加写权限
mkdir /ftproot/{pub,upload}
chown vuser /ftproot/upload/ //fs级别的权限
vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES
ftp //tom登录
cd upload //只有在该目录中有权限
lcd /etc
put fstab //tom和jerry用户都有上传的权限
4.区分tom和jerry的权限,//不同匿名用户,匿名为同一系统用户,分配不同权限
cd /etc/vsftpd/
vim vsftpd.conf
anon_upload_enable=YES //关闭该权限
mkdir vuser.conf.d ;cd vuser.conf.d
vim tom
anon_upload_enable=YES
vim jerry
anon_upload_enable=NO
vim ../vsftpd.conf
user_config_dir=/etc/vsftpd/vuser.conf.d/
systemctl restart vsftpd
ftp 192.168.4.118 //分别使用tom和jerry测试
小结:
ftp:命令连接,数据连接(port,pasv)
vsftpd:/etc/vsftpd/vsftpd.conf
用户类型:
匿名用户:
本地用户:
禁锢本地用户
黑名单
白名单
虚拟用户
权限
实验四:虚拟用户(pam_userdb.so)
[root@localhost vsftpd]# mkdir /etc/vsftpd/virtual/ [root@localhost vsftpd]# touch /etc/vsftpd/vuer.txt [root@localhost vsftpd]# cat /etc/vsftpd/vuer.txt ftpuser1 ftpuser1 ftpuser2 ftpuser2 [root@localhost vsftpd]# db_load -T -t hash -f /etc/vsftpd/vuer.txt /etc/vsftpd/vuser.db //yum install db4-utils db4-devel db4-4.3 [root@localhost vsftpd]# vim /etc/pam.d/vsftpd //之前有的加注释 auth required pam_userdb.so db=/etc/vsftpd/vuser account required pam_userdb.so db=/etc/vsftpd/vuser [root@localhost vsftpd]# chmod 700 vuser.db [root@localhost vsftpd]# useradd -d /ftpdir vuser [root@localhost vsftpd]# chown vuser.vuser /ftpdir/ [root@localhost vsftpd]# usermod -s /sbin/nologin vuser [root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf guest_enable=YES ####激活虚拟账户 guest_username=vuser ####把虚拟账户绑定为系统账户vuser pam_service_name=vsftpd ####使用PAM验证 user_config_dir=/etc/vsftpd/vsftpd_user_conf 设置用户虚拟用户配置文件,与虚拟用户同名 [root@localhost ~]# touch /etc/vsftpd/vsftpd_user_conf/ftpuser1 [root@localhost ~]# touch /etc/vsftpd/vsftpd_user_conf/ftpuser2 文件内容://随意填写 anon_world_readable_only=NO ###浏览FTP目录和下载 anon_upload_enable=YES ###允许上传 anon_mkdir_write_enable=YES ###建立和删除目录 anon_other_write_enable=YES ####改名和删除文件 local_root=/ftpdir/ #### 指定虚拟用户在系统用户下面的路径,限制虚拟用户的家目录,虚拟用户登录后的主目录。
标签:来宾 分享图片 wrap 属性 监听端口 文件 外部 ever .so
原文地址:http://blog.51cto.com/hmtk520/2064842