Linux下的NFS快速配置教程与安全策略
【51CTO专稿】在Linux下实现文件共享有多种方式,NFS就是其中之一。网络文件系统(NFS)协议是由Sun MicroSystem在20世纪80年代为了提供对共享文件的远程访问而设计和实现的。该协议采用Client/Server模型,通过使用Sun开发的远程过程调用协议(RPC Protocol)来实现运行在一台计算机上的程序来调用在另一台远程机器上运行的子程序,并且,它提供的外部数据表示(XDR)可以使得数据在不同平台上的计算机上进行交换。该协议可以在TCP协议或者是UDP协议上运行,而在此基础上,NFS在数据的传送过程中需要RPC命令得到确认,而且在需要的时候将会重传。
1、NFS原理
NFS比较复杂,包括很多组件,通过特殊的协议进行交互。不同的组件在操作系统当中都使用不同的配置文件以及状态文件。下图说明了NFS的主要组件及配置文件。
图 网络文件系统原理示意图
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服务器特别忙的时候,系统有可能根据实际情况启动三十个线程。
2、NFS安装
在网络环境下,使用yum安装NFS的命令如下:
#yum –y install nfs
3、NFS配置和使用
在安装好NFS后,需要对其进行配置才能正常使用,主要包括服务器配置和客户机配置两个步骤,下面详细对它们加以说明。
服务器配置
编辑/etc/exports,在文件中列出,要共享的目录。书写规则是:共享目录主机(参数)。并且每条规则占据一行。例如:
/mnt/mp3 192.168.10.168(ro,sync, no_root_squash)
上面的规则代表将/mnt/mp3目录以读写同步方式共享给主机192.168.10.168。如果登陆到NFS主机的用户是root,那么该用户就具有NFS主机的root用户的权限。
具体的可选参数如下所示:
- rw:可读写的权限
- ro:只读的权限
- no_root_squash:登入到NFS主机的用户如果是ROOT用户,他就拥有ROOT的权限
- root_squash:在登入NFS主机使用目录的使用者如果是root时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的UID与GID都会变成nobody那个身份
- all_squash:不管登陆NFS主机的用户是什么都会被重新设定为nobody
- anonuid:将登入NFS主机的用户都设定成指定的userid,此ID必须存在于/etc/passwd中
- anongid:同anonuid,但是变成groupID就是了
- sync资料同步写入存储器中
- async:资料会先暂时存放在内存中,不会直接写入硬盘
- 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.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
特别需要注意的是:在执行命令之前,你必须先要关掉本地客户机上的防火墙,否则也不会挂接成功。原因是防火墙将会阻碍远程过程调用。现在你就可以放心的使用远程的网络资源了。
最后,我们介绍一下使用中需要注意的安全问题。
4、使用中需要注意的安全问题
通常来说,我们要保护好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的子目录,设置它的共享权限为可读写,然后导出。这样,客户机在访问服务器数据的时候就不会出现,在一个目录当中,整个父目录的权限与子目录的访问权限不相同。解决了这个设置的问题,共享起来也比较方便,而且便于管理。
Linux下的NFS快速配置教程与安全策略的更多相关文章
- Linux 下 Memcached 缓存服务器安装配置
Linux 下 Memcached 缓存服务器安装配置 [日期:2011-08-06] 来源:Linux社区 作者:Linux [字体:大 中 小] [安装Memcache服务器端]我目前的平台 ...
- Linux基础环境_安装配置教程(CentOS7.2 64、JDK1.8、Tomcat8)
Linux基础环境_安装配置教程 (CentOS7.2 64.JDK1.8.Tomcat8) 安装包版本 1) VMawre-workstation版本包 地址: https://my.vmw ...
- Linux下Kafka单机安装配置方法(图文)
Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢 介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了 ...
- 分享:linux下apache服务器的配置和管理
linux下apache服务器的配置和管理. 一.两个重要目录: Apache有两个重要的目录:1.配置目录/etc/httpd/conf:2.文档目录/var/www: 二.两种配置模式: Apac ...
- linux下Java环境的配置
linux下Java环境的配置 现在用linux的朋友越来越多了,前几天就有两个朋友问我linux下怎么配置java环境,我想还有很多朋友想了解学习这方面的东西,就写一个完全一点的linux java ...
- linux 下安装jdk及配置jdk环境图解
linux 下安装jdk及配置jdk环境图解 一:先检測是否已安装了JDK 运行命令: # rpm -qa|grep jdk 或 # rpm -q jdk 或 #find / -name j ...
- Ubuntu Linux下设置IP的配置命令
Ubuntu Linux下设置IP的配置命令 今天装了Ubuntu,但是发现不能上网,开始排查问题: 1.首先确定网络连接是否正确,所用的网线是否可以正常工作 2.查看网卡是否能正常工作,检测的方法如 ...
- Linux下SVN服务器搭建配置
Linux下SVN服务器搭建配置 1.SVN服务安装 yum install subversion 2.创建SVN代码仓库 mkdir /data/svn svnadmin create /data/ ...
- Linux下MySQL安装和配置
--Linux下MySQL安装和配置 ---------------------------2014/05/18 Linux下MySQL的配置和安装 本文的安装采用 rpm 包安装 1.首先在官网下载 ...
随机推荐
- Servlet视频-开发第一个java web(最简单的java web程序)(二)
web项目有目录结构要求 WEB-INFO 文件夹 是一个Servlet规范,必须要这么命名,在换个文件夹里面如果创建一个jsp文件是不能直接访问的,在WEB-INfO文件夹之外创建的jsp可以直接访 ...
- .NET 图片转base64
//图片 转为 base64编码的文本 private string ImgToBase64String(string Imagefilename) { try { Bitmap bmp = new ...
- luogu2723 丑数
提供一种单调队列做法(非正解) 显然每一个丑数能够由一个质数乘以另一个丑数得到 所以我们开k个单调递增队列,每次从这些队列顶部找到一个最小的元素把他捞出来,然后枚举所有质数,用这个元素乘以质数,放入相 ...
- luogu1632 点的移动
其实只需要开三重循环 根据OI中的一个重要的原理 给定一个序列a,求一个数x使得\(\sum |a_i-x|\)最小,那么这个数是序列a的中位数 证明略 然后既然是中位数,一定是数列中的数,类比到这题 ...
- 资深专家深度剖析Kubernetes API Server第2章(共3章)
欢迎来到深入学习Kubernetes API Server的系列文章的第二部分.在上一部分中我们对APIserver总体,相关术语及request请求流进行探讨说明.在本部分文章中,我们主要聚焦于探究 ...
- iOS沙盒文件目录
iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么.documents,tmp,app,Library.(NSHomeDirectory() ...
- 关于nginx限速的配置
limit_req zone=req_one burst=; zone定义了一个req_one的name,burst表示允许超过限制的请求数不多于20个,后面可加参数(nodelay):超过的请求不会 ...
- 【Leetcode】Largest Rectangle in Histogram
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
- 2-29 while
do while for
- python 分页 封装
分页 封装 我是在项目根目录创建个分页文件 分页代码: class Pagination(object): def __init__(self, data_num, current_page, url ...