Linux下的NFS快速配置教程与安全策略

    在Linux下实现文件共享有多种方式,NFS就是其中之一。网络文件系统(NFS)协议是由Sun MicroSystem在20世纪80年代为了提供对共享文件的远程访问而设计和实现的。该协议采用Client/Server模型,经过使用Sun开发的远程过程调用协议(RPC Protocol)来实现运行在一台计算机上的程序来调用在另外一台远程机器上运行的子程序,而且,它提供的外部数据表示(XDR)可使得数据在不一样平台上的计算机上进行交换。该协议能够在TCP协议或者是UDP协议上运行,而在此基础上,NFS在数据的传送过程当中须要RPC命令获得确认,并且在须要的时候将会重传。javascript

一、NFS原理

    NFS比较复杂,包括不少组件,经过特殊的协议进行交互。不一样的组件在操做系统当中都使用不一样的配置文件以及状态文件。下图说明了NFS的主要组件及配置文件。java

网络文件系统原理示意图 
图 网络文件系统原理示意图node

    NFS分为服务器和客户机两部分,每一个主机都有本身的内核级服务:外部数据表示(XDR,eXternal Data Representation)、远程过程调用(RPC,Remote Procedure Call)、I/O监控程序和锁监控程序。每一个主机还有本身的用户级服务。内核级服务和用户级服务都依赖于主机的功能:NFS客户机或者是NFS服务器。固然,还要依赖于每一个主机使用的不一样功能的配置文件(若是是服务器,则用的是/etc/exports配置文件,若是是客户机,则用的是/etc/fstab配置文件)。若是一台主机既是服务器又是客户机,那么它须要运行两个部分的服务。安全

    在服务器端,portmap、 mountd、 nfsd三个监控程序将在后台运行。portmap监控程序用来注册基于rpc的服务。当一个RPC的监控程序启动的时候,它告诉portmap监控程序它在哪个端口进行侦听,而且它在进行什么样的RPC服务。当一个客户机向服务器提出一个RPC请求,那么它就会和portmap监控程序取得联系以肯定RPC消息应该发往的端口号。而Mountd监控程序的功能是来读取服务器端的/etc/exportfs文件而且建立一个将服务器的本地文件系统导出的主机和网络列表,于是客户机的挂接(mount)请求都被定位到mountd监控程序(daemon)。当验证了服务器确实具备挂接所请求的文件系统的权限之后,mountd为请求的挂接点返回一个文件句柄。而nfsd监控程序则被服务器用来处理客户机端发过来的请求,因为服务器须要同时处理多个客户机的请求,因此在缺省状况下,在Linux当中将会自动启动八个nfsd线程。固然,若是NFS服务器特别忙的时候,系统有可能根据实际状况启动三十个线程。服务器

二、NFS安装

    在网络环境下,使用yum安装NFS的命令以下:网络

#yum –y install nfs

三、NFS配置和使用

    在安装好NFS后,须要对其进行配置才能正常使用,主要包括服务器配置和客户机配置两个步骤,下面详细对它们加以说明。async

服务器配置ide

    编辑/etc/exports,在文件中列出,要共享的目录。书写规则是:共享目录主机(参数)。而且每条规则占据一行。例如:网站

/mnt/mp3 192.168.10.168(ro,sync, no_root_squash)

    上面的规则表明将/mnt/mp3目录以读写同步方式共享给主机192.168.10.168。若是登录到NFS主机的用户是root,那么该用户就具备NFS主机的root用户的权限。ui

    具体的可选参数以下所示:

  1. rw:可读写的权限
  2. ro:只读的权限
  3. no_root_squash:登入到NFS主机的用户若是是ROOT用户,他就拥有ROOT的权限
  4. root_squash:在登入NFS主机使用目录的使用者若是是root时,那么这个使用者的权限将被压缩成为匿名使用者,一般他的UID与GID都会变成nobody那个身份
  5. all_squash:无论登录NFS主机的用户是什么都会被从新设定为nobody
  6. anonuid:将登入NFS主机的用户都设定成指定的userid,此ID必须存在于/etc/passwd中
  7. anongid:同anonuid,可是变成groupID就是了
  8. sync资料同步写入存储器中
  9. async:资料会先暂时存放在内存中,不会直接写入硬盘
  10. insecure容许从这台机器过来的非受权访问 

服务器配置

    客户机配置相对简单,只须要使用下述命令mount NFS文件系统便可:

#mount -t nfs 192.168.10.168:/home /mnt/mp3

    上述命令将远程的共享目录挂接到本地的/home目录下,用户能够直接对该目录进行操做,从而获取远程的共享资源。

启动NFS服务

#service portmap start
# service nfs start

    下面经过一个具体的例子来介绍NFS的安全性配置。假设在某个网站上有某个目录名为/popgame目录能够开放给NFS客户机来进行下载共享等工做,而这台服务器的IP地址为:202.168.10.8,它能够开放目录给的主机的IP地址为202.168.10.十、202.168.10.13(固然能够提供给更多的服务器,并且他们的IP地址也能够各式各样,如今举的例子有点像局域网中的状况,不过原理相同)。那么咱们首先就须要对服务器端的/etc/exports文件进行编写:

    咱们先进入目录/etc,而后vi exports,那么就会进入到该文件的编辑界面,咱们输入以下的内容:

/popgame 202.168.10.10(ro) 202.168.10.13(ro)

    咱们能够清楚的看到,目录/popgame只能导出到IP地址为上述的客户机上,并且他们的权限也只能是只读,由于他们只是须要简单的共享下载游戏的功能,并不须要具有建立目录、修改文件的功能,并且若是提供了的话,那将会出现安全隐患。下面接着配置客户机的/etc/fstab文件,进入该文件你将须要加入以下的内容,原文件上已经有的内容不要随意更改,不然会影响系统配置,影响文件系统:

202.168.10.8: /popgame /mnt/game nfs ro 0 0

    其中的/mnt/game目录是你要将服务器上的/popgame目录挂接到你的客户机上的本地目录,也就是说,当共享了NFS文件系统之后,你能够经过访问本地目录/mnt/game来访问共享的文件。由于如今有两台客户机,因此每一台上都要如上配置。

    配置完成之后,就须要在客户机上将服务器的NFS挂接到本地客户机上了,命令以下所示:

mount –t nfs 202.168.10.8: /popgame /mnt/game

    特别须要注意的是:在执行命令以前,你必须先要关掉本地客户机上的防火墙,不然也不会挂接成功。缘由是防火墙将会阻碍远程过程调用。如今你就能够放心的使用远程的网络资源了。

    最后,咱们介绍一下使用中须要注意的安全问题。

四、使用中须要注意的安全问题

    一般来讲,咱们要保护好NFS,首先就要关闭最大的漏洞。在操做系统当中,当系统启动的时候,将会有不少的后台系统服务程序在运行,并且有些端口是缺省打开的。若是不对这种状况进行处理的话,一方面会没必要要的消耗大量系统资源,另外一方面则会给咱们的系统带来安全隐患。所以,咱们要保护NFS,必须解决好以下问题:

    ◆要考虑好整体的安全,拒绝全部的访问,只有在须要的时候才提供访问。也就是说,不要把NFS导出到任何主机,而只应该将它导出到所须要的主机,尤为是避免将文件系统导出到不信任的主机。而且要尽可能使用只读(ro)权限导出文件系统,尽可能不要使用(rw)或者是(no_root_squash)权限;

    ◆不要提供太多的根用户帐号。特别要注意保证任何用户都没有NFS客户机的根用户帐号,由于若是具备的话,那么该客户机将会具备最高的权限,将会引发很大的安全问题,它能够修改任何它想修改的东西,这显然是不安全的。并且应该在NFS服务器上使用(root_squash)和(ro)选项;

    ◆尽可能使用限制性的NFS客户机方挂接选项,用只读(ro)选项挂接文件系统,除非确实有必要,要否则不要容许设置UID二进制文件(nosuid)、设备(nodev)和执行文件(noexec)。

    ◆要严格地控制好导出的目录文件。这主要包括导出的数量以及导出的安全选项。导出的数量依据实际状况而定,避免处处过多的和没必要要的选项。另外,要严格地控制好导出的安全选项,安全选项就是上面所描述的只读(ro)、可写(rw)、根用户挤压(root_squash)等选项,这样作就可使得每一个目录都有各自的访问权限,而一般状况下这样也是很合理的,由于全部要导出的目录访问权限都是同样的,这几乎是不可能的。好比说,如今NFS服务器上有三个目录须要导出,一个是/popmusic,一个是/doc,而一个是/digest。这三个目录当中,第一个目录和第三个目录不但容许客户机共享,并且容许客户机上载本身的文件,可是第二个只容许读取,这样第一个和第三个目录的访问权限就要设为rw,而第二个则只能设为ro。

    ◆在导出的文件系统下的目录的设置过程中应当要注意一些控制的问题。一般状况下,应该要将访问权限一致的目录和文件做为父目录、子目录,而访问权限不一致的就另开一个目录进行导出,这实际上就是一个管理的粒度问题。举个例子,现有四个目录要进行导出,它们依次是 /direct1 、/direct2 、/direct3 、/direct4 。其中前两个目录的访问权限是只读,然后面两个是可读写,那么,咱们在导出的时候能够这样作,将 /direct2做为 /direct1的子目录,放入/direct1中进行导出,而后设置共享权限为只读,一样的,能够将 /direct4 做为/direct3的子目录,设置它的共享权限为可读写,而后导出。这样,客户机在访问服务器数据的时候就不会出现,在一个目录当中,整个父目录的权限与子目录的访问权限不相同。解决了这个设置的问题,共享起来也比较方便,并且便于管理。

相关文章
相关标签/搜索