文件共享服务

一、什么是文件共享服务

简单来说就是文件或存储块设备可以共享给大家使用

(一)、实现共享服务有三种:

1、ftp:属于应用层服务,可以跨平台使用(linux<->unix<-->windows)

2、nfs:属于内核模式,不可以跨平台(linux<-->linux)

3、samba:可以跨平台(linux<-->unix<-->windows)

(二)、实现存储设备与服务器连接的方式有三种:

1、DAS:连接的磁盘

2、NAS:通过nfs/cifs协议实现网络共享文件(文件存储方式)电子邮件、网页服务器、多媒体流服务、档案分享等就适用于NAS存储架构。

3、SAN:通过网线或光纤实现ISCSI和FCSAN将物理存储设备连接起来使用(块存储方式较底层,需要格式化并挂载当本地磁盘使用)数据库有关的应用适用于SAN存储架构。

(三)、附:

1、nfs(Network File System,网络文件系统)协议实现Linux的文件封装共享传输。

2、cifs(common internet File System,公共互联网文件系统)协议实现windows与linux的共享识别,例如samba就是基于cifs(smb)协议实现。

二、FTP

1、FTP是File Transfer Protocol 文件传输协议的缩写,基于网络来传输文件的应用层通信协议。

2、FTP能够通过网络来传输文件,因为工作在应用层所以不会受到平台的限制。

3、FTP的工作模式

文件共享服务之FTP_第1张图片

文件共享服务之FTP_第2张图片

(1)、FTP的数据传输分为命令数据与文件数据,命令传输就是客户端要执行的命令,服务端收到后返回给客户端执行结果,如ls命令的执行结果一样。文件传输就是客户端要传输的数据,服务端与客户端数据连接来传输。

(2)、FTP的服务端与客户端建立连接大体三个步骤,建立连接,传输数据,断开连接。

(3)、FTP是基于tcp协议来传输数据的,使用21号端口来建立认证通道,20号端口来建立数据通道。

(4)、FTP是明文传输的。

(5)、FTP的用户可分为实体用户(real user),匿名用户(anonymous user),访问用户(guest user)。

主动模式与被动模式

由于现在的网络架构中,都会有防火墙来阻止端口与高位端口被主动连接,特别20端口是被禁止主动连接的,因为20端口是FTP的数据端口,所以为了解决客户端或者服务端的防火墙问题,FTP就有了主动和被动两种模式,通过墙内的一端来主动连接外端的一方,这样子就不会被防火墙阻挡。

主动模式:一般用于服务端存在防火墙的情况,客户端无法主动连接至服务端的20数据端口,需要由服务端主动连接客户端的高位数据端口。

1. 两端在建立TCP通信通道后,客户端会发送port请求与服务端的21号端口认证连接并发送开放用来建立数据连接的高位端口号。
2. 服务端在收到后,会通过20号端口发送ACK响应请求
3. 服务端会通过20端口与客户端发送的高位端口建立数据连接通道。

被动模式:一般用于客户端存在防火墙的情况,服务端在收到连接请求后因为客户端防火墙而无法达到客户端高位端口,需要客户端主动连接至服务端的数据传输端口。

1. 两端在建立TCP通信通道连接后,客户端会发送PASV请求给服务端。
2. 服务端在受到PASV端口后就会打开一个高位端口作为数据传输端口来响应给客户端等待客户端连接。
3. 客户端在收到响应后,就会去连接响应的端口建立数据连接通道。

我们可以看到以上两种工作方式,都是由墙内的一方来发出连接并允许另一端来连接指定端口,墙内的一方就类似是一间房子的主人,而另外一方是客人,客人去访问需要得到主人的同意,并来给你“开门”之后,你才能进到这个屋子。

文件共享服务之FTP_第3张图片

文件共享服务之FTP_第4张图片

三、响应码

    1XX:信息类

      2XX:成功类信息

      3XX:提示需要进一步补全内容类

      4XX:客户端错误

      5XX:服务器端错误

四、用户认证

1、虚拟用户:仅用于访问某特定服务中的资源

   nsswitch:network server switch,名称解析框架

     配置文件:/etc/nsswitch.conf

     模块:/lib64/libnss*,/usr/lib64/libnss*

   pam:pluggable authentication module,用户认证框架

     配置文件:/etc/pam.conf,/etc/pam.d/*

    模块:/lib64/security/

   以上两种框架是linux的自带框架,通过库调用的方式自由选择基于系统账户实现,非系统账户实现,还是数据    库账户形式实现不用全部编译进去浪费资源。

2、系统用户:通过nsswitch服务解决用户名称解析,通过pam对系统用户进行认证(/etc/passwd,/etc/shadow)

3、匿名用户:映射为一个系统用户ftp,为ftp用户设置权限

4、虚拟用户:映射为系统某一用户,用户账号密码存储于非/etc/passwd,/etc/shadow

注:匿名用户或虚拟用户虽然和系统用户没有关系,但是登陆后获取系统上的文件权限还是需要映射为系统用户,以系统用户的权限访问系统文件(例如:FTP系统用户,httpd系统用户)

五、VSFTPD

VSFTPD是基于ftp协议来对网络数据交换的一种实现,是一个开源的解决方案。

VSFTPD能攻通过配置,搭建ftp服务器,完成基于网络的数据传输功能。

1、vsftpd基础服务搭建
[root@lab01 ~]# cat /etc/redhat-release 
CentOS release 6.7 (Final)
[root@lab01 ~]# yum -y install vsftpd #安装vsftpd
[root@lab01 ~]# rpm -ql vsftpd   #查看安装生成的文件
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd                 #pam认证文件
/etc/rc.d/init.d/vsftpd           #服务启动进程
/etc/vsftpd
/etc/vsftpd/ftpusers              #限制登陆文件
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf           #vsftp的主配置文件
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/sbin/vsftpd                  #程序文件
......
/var/ftp                          #FTP家目录
/var/ftp/pub                      

2、vsftpd配置文件详解
#匿名用户的配置:
    anonymous_enable=YES         #启动匿名用户
    anon_upload_enable=YES       #是否允许匿名用户上传文件
    anon_mkdir_write_enable=YES  #是否允许匿名用户有创建目录的权限
    anon_ohter_write_enable=YES
#系统用户的配置:
    local_enable=YES   #启用本地用户
    write_enable=YES   #允许用户有写入的权限
    local_umask=022    #上传后文件的umask,也就是上传后文件的权限
#定义访问日志
    xferlog_enable=YES   #是否启动xferlog日志
    xferlog_file=/var/log/xferlog    #定义xferlog日志文件的存放位置
    xferlog_std_format=YES   #是否使用标准的xferlog模式 
#禁锢所有的ftp本地用户于其家目录中:
    chroot_local_user=YES
#禁锢文件中指定的ftp本地用户于其家目录中:
    chroot_list_enable=YES  #设置是否启用将部分用户禁锢在家目录
    chroot_list_file=/etc/vsftpd/chroot_list(在此文件中添加系统用户)
#虚拟用户映射系统用户
    guest_enable=YES  是否启用来宾账号(默认没有) 
    guest_username=vuser  将来宾账号映射为那一个系统用户(默认没有)
#通过pam用户认证
    pam_service_name=vsftpd    (/etc/pam.d/vsftpd中定义) 
    pam_service_name=vsftpd.mysql \\pam认证文件
#定义欢迎语
    ftpd_banner=Welcome to blah FTP service. \\设置定义登录ftp的欢迎语

#其他选项       
    connect_from_port_20=YES  #设置主动连接的数据传输端口  
    chown_uploads=YES  #是否启动上传ftp文件后,更改文件的属主 [YES | NO] 
    chown_username=whoever  #若启用了更改上传文件的属主,则定义是哪一个属主
    idle_session_timeout=600  \\设置会话超时时间 
    data_connection_timeout=120 \\设置数据传输超时时间 
    nopriv_user=ftpsecure  \\运行vsftpd需要非特权系统用户,默认是nobody  
    async_abor_enable=YES  \\设置是否允许执行特殊的ftp命令async ABOR
    ascii_upload_enable=YES  \\设置是否使用ascii码上传文件 [YES | NO]
    ascii_download_enable=YES \\设置是否使用ascii码下载文件 [YES | NO]
    deny_email_enable=YES  \\设置是否禁止匿名用户使用某些邮件地址
    banned_email_file=/etc/vsftpd/banned_emails  \\邮件地址文件
    ls_recurse_enable=YES  \\是否允许递归 [YES | NO]
    listen=YES \\设置vsftpd是否处于监听状态
    listen_ipv6=YES \\是否启用ipv6地址监听 
    user_config_dir=/etc/vsftpd/vuser_config\\设置匿名用户的权限配置文件位置 (默认没有)
    userlist_enable=YES  \\此选项与下面选项userlit_deny都为YES时,/etc/vsftpd/user_list为黑名单,
    userlist_deny=YES     \\若userlist_enable为YES,userlist_deny=NO则此文件为白名单
    tcp_wrappers=YES  \\支持tcp_wrappers访问限制(/etc/{hosts.allow,hosts.deny} 
    max_clients=1024  \\限制最大并发连接数(默认没有此选项)
    max_per_ip=1024   \\限制每个ip同时请求的连接数(默认没有此选项)
    anon_max_rate=1024 \\限制匿名用户的传输速率(默认没有此选项)
    local_max_rate=1024 \\限制本地用户的传输速率(默认没有出选项)
#匿名用户(映射为ftp用户)共享资源位置:/var/ftp 
#系统用户通过ftp访问的资源的位置:用户自己的家目录 
#虚拟用户通过ftp访问的资源的位置:给虚拟用户指定的映射成为的系统用户的家目录

六、vsftpd+mysql+pam实现过程

1、安装数据库及pam_mysql插件
[root@lab01 ~]# yum -y install mysql-server pam_mysql
2、创建用于vsftpd的数据库,在创建表和用户
mysql> CREATE DATABASE vsftpd;   #创建数据库
mysql> use vsftpd;              #进入数据库
mysql> create table users (      #创建表
    -> id int AUTO_INCREMENT NOT NULL,
    -> name char(20) binary NOT NULL,
    -> password char(48) binary NOT NULL,
    -> primary key(id)
    -> );
mysql> INSERT INTO users(name,password) values('bjwf',password('123456'));
mysql> INSERT INTO users(name,password) values('zhangsan',password('bjwf.com'));
mysql> GRANT ALL ON vsftpd.* TO vsftpd@'%' IDENTIFIED BY 'bjwf.com';   #用户授权
mysql> FLUSH PRIVILEGES;     #刷新授权
3、查看pam模块,并创建认证文件
[root@lab01 ~]# rpm -ql pam_mysql
/lib64/security/pam_mysql.so   #pam模块生成认证时需要的共享库
[root@lab01 ~]# vim /etc/pam.d/vsftpd.mysql
auth required /lib64/security/pam_mysql.so user=vsftpd passwd=bjwf.com host=192.168.130.251 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /lib64/security/pam_mysql.so user=vsftpd passwd=bjwf.com host=192.168.130.251 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
4、创建虚拟用户的映射用户
[root@lab01 ~]# useradd -s /sbin/nologin -d /var/ftproot vuser
[root@lab01 ~]# chmod go+rx /var/ftproot
5、编辑配置文件,启动如下选项
[root@lab01 ~]# vim /etc/vsftpd/vsftpd.conf
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    anon_upload_enable=NO
    anon_mkdir_write_enable=NO
    chroot_local_user=YES
    pam_service_name=vsftpd.mysql
    guest_enable=YES
    guest_username=vuser
6、为单个用户提供配置文件
[root@lab01 ~]# vim /etc/vsftpd/vsftpd.conf
    user_config_dir=/etc/vsftpd/vuser_config
[root@lab01 ~]# mkdir /etc/vsftpd/vuser_config
[root@lab01 ~]# cd /etc/vsftpd/vuser_config
[root@lab01 vuser_config]# cat bjwf
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@lab01 vuser_config]# cat zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
7、重启服务验证权限
[root@lab01 ~]# service vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]
[root@lab01 ~]# netstat -tnlp|grep 21
tcp        0      0 0.0.0.0:21 0.0.0.0:*     LISTEN      1850/vsftpd   
[root@lab01 ~]# cp install.log /var/ftproot/
#切换另一台机器测试
 [root@node1 tmp]# lftp -u bjwf 192.168.130.251   #使用可读、可写账号
Password: 
lftp [email protected]:~> ls         #查看文件
-rw-r--r--    1 0        0            9545 Jul 01 09:16 install.log
lftp [email protected]:/> lcd /etc/  #切换到本地目录
lcd ok, local cwd=/etc
lftp [email protected]:/> put fstab  #上传文件
541 bytes transferred
lftp [email protected]:/> ls
-rw-------    1 500      500           541 Jul 01 09:20 fstab
-rw-r--r--    1 0        0            9545 Jul 01 09:16 install.log
lftp [email protected]:/> put passwd  #上传文件
1228 bytes transferred
lftp [email protected]:/> ls
-rw-------    1 500      500           541 Jul 01 09:20 fstab
-rw-r--r--    1 0        0            9545 Jul 01 09:16 install.log
-rw-------    1 500      500          1228 Jul 01 09:21 passwd
lftp [email protected]:/> mkdir haha  #创建目录
mkdir ok, `haha' created
lftp [email protected]:/> rm install.log #删除文件
rm ok, `install.log' removed
lftp [email protected]:/> ls
-rw-------    1 500      500           541 Jul 01 09:20 fstab
drwx------    2 500      500          4096 Jul 01 09:21 haha
-rw-------    1 500      500          1228 Jul 01 09:21 passwd

[root@node1 tmp]# lftp -u zhangsan 192.168.130.251  #切换另一个用户
Password: 
lftp [email protected]:~> ls     
-rw-------    1 500      500           541 Jul 01 09:20 fstab
drwx------    2 500      500          4096 Jul 01 09:21 haha
-rw-------    1 500      500          1228 Jul 01 09:21 passwd
lftp [email protected]:/> lcd /etc
lcd ok, local cwd=/etc
lftp [email protected]:/> put issue    #上传成功
23 bytes transferred
lftp [email protected]:/> ls
-rw-------    1 500      500           541 Jul 01 09:20 fstab
drwx------    2 500      500          4096 Jul 01 09:21 haha
-rw-------    1 500      500            23 Jul 01 09:23 issue
-rw-------    1 500      500          1228 Jul 01 09:21 passwd
lftp [email protected]:/> rm issue
rm: Access failed: 550 Permission denied. (issue)    #不能删除
lftp [email protected]:/> mkdir data
mkdir: Access failed: 550 Permission denied. (data)   #不能创建目录
lftp [email protected]:/> ls
-rw-------    1 500      500           541 Jul 01 09:20 fstab
drwx------    2 500      500          4096 Jul 01 09:21 haha
-rw-------    1 500      500            23 Jul 01 09:23 issue
-rw-------    1 500      500          1228 Jul 01 09:21 passw

#常见问题:
1、ftp无法登陆,请检查你的文件夹权限并检查主配置文件中的属性是否打开了,如anonymous_enable,local_enable等。
2、无法切换目录或者个别用户无法登陆,请检查chroot_list,ftpusers,user_list文件内容或者主配置文件中的配置是否正确。
3、mysql存储无法登陆,请查看日志文件/var/log/secure,/var/log/message,/var/log/xferlog,并确认认证文件没有写错,仔细检查配置文件与目录和被映射的实体用户的权限。
4、如果遇到密码错误,检查密码文件,如mysql表中字段长度类型是否正确,数据库用户是否能远程登陆访问数据库user表。
5、建议不要编译安装pam_mysql模块
6、无法正常工作时,请检查端口是否开启,或检查防火墙和selinux是否有配置正确。