一、linux中常见的三种文件服务

FTP File Transfer Protocol 文件传输协议

NFSNetwork File SystemRPCRemote Procedure Call 远程过程调用) 网络文件系统

SambaCIFS/SMB

ftp主要监听在tcp21号端口,它实现文件共享服务,工作在应用层的协议,在客户端与服务器端的通信是基于tcp/ip的,尤其是tcp协议的上层当中实现的一种特殊协议来完成的。我们这里重点强调的这一点是因为它跟另一种机制,基于RPC的文件共享服务有着巨大的不同,RPC这种机制,能够让位于不同主机上的两个进程能够基于二进制的格式实现数据通信的。

ftp是工作在应用层的文件共享;NFS本身叫做网络文件系统,它主要是依赖于RPC工作的一种机制;Samba主要是基于CIFS/SMB协议的实现,主要实现跨平台文件共享的,而且共享的机制也是比较底层的,能够实现linuxwindows之间共享文件。

ftp有两个连接,第一个连接,首先我们的客户端发起请求,服务器端予以相应,这个连接只要客户端不断开,就会长时间处于连接状态,但是这个连接不真正的进行数据传输。只要客户端与服务器端真正连接数据的时候,这个时候就会打开另外一个连接,向客户端传输数据。


  
  1. FTP:tcp,两个连接 
  2.  
  3.           命令连接:控制连接:21/tcp 
  4.  
  5.           数据连接:按需打开,按需关闭。 
  6.  
  7.               ftp服务器主动连接:20/tcp 
  8.  
  9.               ftp服务器被动模式:端口随机 

二、安装ftp服务器

第一步:我们要安装yum库。

我们这里用挂载光盘来安装yum库。



  
  1. [root@localhost ~]# mkdir /mnt/cdrom    ###创建cdrom目录 
  2. [root@localhost ~]# mount /dev/cdrom /mnt/cdrom  ###挂载光盘(当场有效,开机无效) 
  3. [root@localhost ~]# vim /etc/fstab  ###在配置文件中挂载光盘(当场无效,开机有效) 
  4. /dev/cdrom              /mnt/cdrom              ext3    defaults        0 0 
  5. [root@localhost ~]# cd /etc/yum.repos.d/  ###进入yum.repos.d目录下面 
  6. [root@localhost yum.repos.d]# vim server.repo  ###编辑server.repo 
  7. [base] 
  8. name=Server 
  9. baseurl=file:///mnt/cdrom/Server   
  10. enabled=1 
  11. gpgcheck=0 

第二步:安装ftp服务器软件。

我们安装ftp软件完成以后,我们查看一下都生成了哪些文件。除了这些剩下的大部分都是文档。这时候我们就启动用户就可以了,然后设置开机自动运行,我们在/var/ftp下面有一个pub目录,我们共享的时候都应该放到pub里面,这也就是我们每次访问服务器的时候都是到pub里面去。默认就是用pub存储公开出去的允许下载的文件。但是前提是防火墙必须是关闭的,我们用iptables –L –n查看一下,如果里面的内容如图中的那么少就是关闭的,回头我们在讲防火墙。


  
  1. [root@station34 ~]# yum install vsftpd 
  2.  
  3. [root@station34 ~]# rpm -ql vsftpd 
  4.  
  5. /etc/logrotate.d/vsftpd.log     ####日志滚动配置文件 
  6.  
  7. /etc/pam.d/vsftpd            ####pam.d下生成配置文件,是基于pam来完成用户认证的 
  8.  
  9. /etc/rc.d/init.d/vsftpd         ####服务控制脚本 
  10.  
  11. /etc/vsftpd                 ####配置文件目录 
  12.  
  13. /etc/vsftpd/ftpusers          ####控制用户登录的配置文件 
  14.  
  15. /etc/vsftpd/user_list          ####控制用户登录的配置文件 
  16.  
  17. /etc/vsftpd/vsftpd.conf        ####主配置文件跟服务器名称相同 
  18.  
  19. /etc/vsftpd/vsftpd_conf_migrate.sh ####配置文件下生成的脚本 
  20.  
  21. /usr/sbin/vsftpd              ####主程序配置文件 
  22.  
  23. /var/ftp                    ####ftp服务的根目录 
  24.  
  25. [root@station34 ~]# service vsftpd start 
  26.  
  27. [root@station34 ~]# chkconfig vsftpd on 

附加:ftp用户

这三种用户不论哪一种用户最终都映射为我们的系统用户,所以ftp每个用户账号过来访问文件的时候,访问的是那个用户的家目录,例如:ftp的家目录就是/var/ftp也是匿名用户访问目录,因为ftp也是我们的匿名用户本身默认所使用的用户,


  
  1. ftp用户  
  2.   
  3.        匿名用户(anonymous)-->系统用户  
  4.   
  5.        系统用户(local enable)  
  6.  
  7.        虚拟用户-->系统用户  

三、测试

第一步:这里我们使用windows的客户端连接ftp 172.16.58.8服务器地址,这里使用的匿名用户登录,但是匿名不代表可以为空,,所以为空是错误的。

 第二步:我们这里创建一个用户登录,使用一个用户登录,先在hadoop的家目录里复制一个文件issue,我们用hadoop进到ftp服务里查看当前的位置,并且还要查看是否有issue文件,我们还可以上传文件如图,(匿名的用户这个时候是不能上传文件的)。ftp协议是明文的,我们可以抓包。我们输入下面那条命令的时候,不用关掉,我们再次用hadoop用户登录一下,我们查看一下信息,我这里只把有用户和密码的信息剪切了下来。由图中的信息我们可以看出,这非常不安全,用户和密码全是明文的。


  
  1. [root@station34 ~]# useradd hadoop 
  2.  
  3. [root@station34 ~]# echo "hadoop" | passwd --stdin hadoop 
  4.  
  5. [root@station34 ~]# cp /etc/issue /home/hadoop 


[root@station34 ~]# tcpdump -i eth0 -nn -X -vv tcp port 21 and ip host 172.16.58.8


第三步:使匿名用户上传文件

给匿名用户打开上传权限,在/etc/vsftpd/vsftpd.conf里面找到anon_upload_enable=YES把它启动起来,记好前面千万不能有空白字符。但是这样还是不能上传文件的,我们查看一下/var/ftp的属主属组是root,但是我们的ftp的进程是ftp运行的。我们的ftp/var/ftp是没有写权限的,所以也是没法上传文件的。即使ftp的上传功能打开了,但是它仍然是不能上传文件的。我们查看一下/var/ftp/pub也是没有写权限的,我们要想上传文件,有两种方案:一是将/pub的权限更改下;二是我们在创建一个目录专门成为上传目录。这个时候我们重新登录查看一下是可以上传。



  
  1. [root@station34 ~]# ls -ld /var/ftp 
  2.  
  3. drwxr-xr-x 3 root root 4096 Apr 17 16:02 /var/ftp 
  4.  
  5. [root@station34 ~]# ls -ld /var/ftp/pub 
  6.  
  7. drwxr-xr-x 2 root root 4096 Dec  5  2011 /var/ftp/pub 
  8.  
  9. [root@station34 ~]# mkdir /var/ftp/upload 



  
  1. [root@station34 etc]# ftp 172.16.58.8 

四、关闭selinux

因为这一条非常重要所以每次都将作为一整条来写。


  
  1. [root@station34 ~]# getenforce 
  2.  
  3. Enforcing    ####是开启的 
  4.  
  5. [root@station34 ~]# setenforce 0    ####0表示关闭,1表示开启 

五、编辑配置文件

我们先切换到/etc/vsftpd下面查看一下它的配置文件,我们这里先备份一下,然后我们进行编辑。【提示:如果我们启用了某些指令,记住指令前面是不能有空白字符,有空白字符的都是语法错误】,这里我们只解释有用的选项。在dirmessage_enable=YES选项中,我们可以在/var/ftp/upload下面创建一个隐藏文件.message。在里面写入内容,当用户切换这个目录的时候会显示相关信息的。【提示:所有写在/etc/vsftpd/ftpusers里面的用户都不能登录ftp。想知道为什么就要查看/etc/pam.d/vsftpd。其实这个文件跟我们的ftp服务关系不是特别的大,即使你把里面的所有用户都删除了,还是登不上ftp服务器的。】



  
  1. [root@station34 ~]# cd /etc/vsftpd/ 
  2.  
  3. root@station34 vsftpd]# cp vsftpd.conf vsftpd.conf.bak 
  4.  
  5. anonymous_enable=YES     ####是否允许匿名用户的 
  6.  
  7. local_enable=YES          ####是否启用系统用户的 
  8.  
  9. write_enable=YES          ####上传文件 
  10.  
  11. anon_upload_enable=YES   ####是否允许匿名用户上传 
  12.  
  13. anon_mkdir_write_enable=YES ####是否能够创建目录 
  14.  
  15. anon_mkdir_write_enable=YES ####其它的写权限(我们自己添加上去的) 
  16.  
  17. dirmessage_enable=YES    ####当一个用户进入一个目录的时候是否显示信息的 
  18.  
  19. xferlog_enable=YES       ####是否打开传输日志,我们还要打开xferlog_file=/var/log/vsftpd.log才能查看日志 
  20.  
  21. xferlog_std_format=YES   ####日志文件格式 
  22.  
  23. chroot_list_enable=YES    ####用一个文件将特定用户锁定在它的家目录下 
  24.  
  25. chroot_list_file=/etc/vsftpd/chroot_list  ####我们打算在哪一个文件当中创建一个用户列表,所有列在这个文件中的用户,都直接被禁锢到家目录当中。所以上下这两条指令是同时使用的。这个文件是不存在的需要我们手动创建,只要将用户加进来即可。 
  26.  
  27.  


  
  1. chroot_local_user=YES    ####禁止上面两条,手动添加这条,重启服务,就可以禁锢所有用户了。 

六、设置ftp安全机制

由于使用ftp协议传输过程中使用的是明文(在第二步已经验证了这一点),我们这里是基于openssl结合tls/sslftp进行加密的。我们先在/etc/pki/CA下面创建几个目录和文件,如果不创建这几个文件的话到时候会出现错误的。创建完成后我们就要创建密钥生成自签证书,到时候会让填国家省份等等的,但是那个填入ca.shuaige.com的内容最重要了,一会跟访问服务的名称保持一致。



  
  1. [root@station34 ~]# cd /etc/pki/CA 
  2.  
  3. [root@station34 CA]# mkdir certs newcerts crl####创建这三个目录 
  4.  
  5. [root@station34 CA]# touch index.txt 
  6.  
  7. [root@station34 CA]# echo 01 > serial 
  8.  
  9. [root@station34 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)   ####创建密钥 
  10.  
  11. [root@mail CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3656####生成自签证书 



  
  1. [root@mail CA]# mkdir /etc/vsftpd/ssl 
  2.  
  3. [root@mail CA]# cd /etc/vsftpd/ssl 
  4.  
  5. [root@mail ssl]# (umask 077;openssl genrsa -out vsftpd.key 2048;)####创建密钥 
  6.  
  7. [root@mail ssl]# openssl req -new -key vsftpd.key -out vsftpd.csr####生成证书颁发申请 

这里我们就要签署了,这里可能会出错因为找不到路径,所以我们要去配置文件中将路径改为/etc/pki/CA。然后再进行签署就行了。在签署的时候会出现两个[y/n],回答y就签署完成了。配置我们的vsftp能够使用这个证书,在/etc/vsftpd/vsftpd.conf文件中添加下面的内容,这时候我们进行测试,非匿名用户是需要使用ssl才能登陆的。这时候我们就要特定安装一个客户端进行远程连接请求。我们本地本来下载的有这样的软件,我们这里就直接用了。


  
  1. [root@mail ssl]# openssl ca -in vsftpd.cst-out vsftpd.crt####签署 
  2.  
  3. [root@mail ssl]# vim /etc/pki/tls/openssl.cnf####编辑配置文件【提示:这个配置文件一定要修改的】 



  
  1. [root@mail ssl]# openssl ca -in vsftpd.crt -out vsftpd.crt####签署 
  2.  
  3. [root@mail ~]# vim /etc/vsftpd/vsftpd.conf。 
  4.  
  5. # ssl or tls  
  6.  
  7. ssl_enable=YES    ####启用ssl功能 
  8.  
  9. ssl_sslv3=YES     ####支持sslv3机制 
  10.  
  11. ssl_tlsv1=YES      ####支持tlsv1机制 
  12.  
  13. allow_anon_ssl=NO  ####匿名用户不用使用ssl 
  14.  
  15. force_local_data_ssl=YES     ####文件传输也要使用ssl 
  16.  
  17. force_local_logins_ssl=YES   ####强制本地用户使用ssl 
  18.  
  19. rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt  ####rsa格式的证书 
  20.  
  21. rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key   ####rsa格式的密钥 
  22.  
  23. [root@mail ~]# service vsftpd restart 

这里我们先用使用抓包命令,再使用的是FlashFXP这个软件,我们需要建立站点,在站点—>管理站点—>新建站点。这个时候我们就可以创建站点了。这里我们创建的站定名称是ftp,然后设置其内容,内容完成后我们就进行连接,然后出现一个证书信息让你接受并保存一下,这时候我们就可以查看一下抓包的东西了,是不是都是乱码?



  
  1. [root@mail ~]# tcpdump -i eth0 -nn -X -vv tcp port 21 and ip host 172.16.58.8