CentOS7搭建NAS文件共享存储

一、安装

服务端安装nfs-utils、rcpbind软件包;

yum -y install nfs-utils rpcbind

 

二、配置

通过nfs协议配置nas

# vi /etc/sysconfig/nfs
设置各种*port=...参数

# TCP port rpc.lockd should listen on.
LOCKD_TCPPORT=32803
# UDP port rpc.lockd should listen on.
LOCKD_UDPPORT=32769

# Port rpc.statd should listen on.
STATD_PORT=662
# Outgoing port statd should used. The default is port
# is random
STATD_OUTGOING_PORT=2020

配置要共享的文件

创建共享目录:

mkdir /shared
chmod 777 /shared

注意:初次配置NAS 建议将权限设置为777, 有助于顺利测试后续的挂载, 测试读取,创建,删除,修改文件, 但是这样设置是有安全风险的, 后续熟悉了用户身份映射再回来设置合适的权限. 另外此处我以root用户身份创建的/shared目录, 所有共享目录的owner也是root, 后续等弄明白了身份映射, 也建议回头把owner改为合适的owner. 当前阶段因为权限设置为了777, Owner也不是重点, 不影响将整个流程走通.

 

配置共享目录细节:

vi /etc/exports

/shared 192.168.0.0/16(rw,root_squash,all_squash,sync,anonuid=1000,anongid=1000)

初次看到这么一长串其实挺令人费解的, 这些都是什么鬼, 除了rw比较熟悉一点,猜也能猜出来是可读写以外, 其他都是一头雾水.

这里其实不必太纠结, 直接设置为最开放的权限 /shared *(rw) 继续往后走好了, 后续也不会遇到一些莫名其妙的问题, 把流程走通最重要, 后续回头来将其调精细也可以, 尤其是初次配置NAS. 当你回头来调参数的时候,就需要了解以下内容了.

第一点: NAS 客户端是不需要登陆即可访问共享目录的, 哪它如何知道访问者是谁,访问者该拥有多大权限的呢?

答案就是通过ip 地址和客户端的用户id, 和组id , 当然不是很严格, 比较理想化, 要做到相对安全也要看个人的配置水平.

这里制定我指定的是一个网段192.168.0.0/16 也就是这个网段的用户可以访问该目录, 当然也可以按ip地址配置, 可以将网段替换为ip地址, 这样就只有指定ip地址的用户可以访问共享目录这样就精细化了很多, 当然 ip地址是容易伪装, 替换, 以及变化的, 这就是NAS 权限控制比较理想化的地方, 如果是在局域网内,就看管理员如何控制好ip地址的分配, 路由设置等水平了, 所以安不安全要看管理员的水平了. 这里也可以配置为通配符, 例如 *, 任何ip过来的用户都可以访问.

刚刚讲到了 ip 地址是NAS 权限控制的重要因子, 另外客户端uid, gid 也是权限控制的重要因子. 首先假设这里配置是no_root_squash, no_all_squash, 先简单介绍这两个选项的作用, 就是不要做身份映射, 简单来说就是, 如果客户端当前是 root用户, 那么他访问共享目录的身份就是root, (当然是不是 root 用户是取决于他的用户id, 而不是用户名, 我们知道所有的linux root 用户的ID都是0, 所属组是0, 这里为了便于描述用用户名代表root用户) , 如果是普通用户 例如zhangsan (uid:999), 那么他操作共享目录的身份就是zhangsan, 那么张三有什么样的权限呢? 还记得我们创建共享目录的时候设置了什么样的访问权限吗? chmod 777 /shared, 张三不是owner, 不在root组, 张三应该属于 others , others对该目录用户读写执行权限. 假设我们创建共享目录的时候是这样 chmod 770 /shared, 那么张三是没有任何权限. 这就是我为什么在创建共享目录的时候建议大家先授予目录777权限, 权限似乎大的吓人, 但是后续就好发现它的好处, 因为我们在客户端配置,测试的时候, 往往可能就是其他用户, 不是root, 也不是root的用户, 尤其在windows*问NAS.

从以上的描述, 不知道各位看官有没有发现一个问题或者叫漏洞( 我担心在本已很复杂的逻辑,再引入一个复杂的问题, 会让人晕掉,所以只字未提这个, 现在另起一段来讨论这个问题). 这里先假设客户端有个叫zhangsan(uid:999) 的用户, 服务器端也有zhangsan(uid:999) 的用户, 那很好啊,客户端的张三就像服务器端的张三一样读或写共享目录.接下来的问题就复杂一些了, 假设服务器端压根就没有 zhangsan(uid:999) 的用户, 连uid为999的用户都没有, 那会怎样? 大家可以把流程走通后自己测试一下, 我已经测试过了, 张三依然能访问目录, 而且当张三创建新文件的时候, 会创建一个uid:999的文件, 当我ls -lt 此文件的时候, 只能看到文件的 owner是999, 不会显示owner的名字, 如果再进一步使用服务器端用户访问此文件, 如果服务器端的 umask 是0022 除了root 没有一个用户能查看,修改或删除它. 这样其实带来一个好处, 只有客户端用户能访问他所创建的文件, 如果我们严格现在服务器端的 root权限, 理想状况下能很好的保护隐私.

另起一段, 让事情再复杂一些, 假设服务器上没有zhangsan(uid:999) 这个用户, 但是有lisi(uid:999) 这个用户, 那么会怎样? 此时, 张三创建的文件, 会显示 owner 是李四(lisi), 如果这个文件里面有张三的隐私的话, 那么张三的隐私有可能被泄露, 如果是钱的哈, 有可能被转走. 那么这么防止这一点呢, linux 也可以做到, 这就需要研究ACL权限控制了, 这里不做展开.

以上不算最严重的情况, 毕竟服务器端, 恶意篡改的可能性相对比较小, 也容易控制. 下面这种情况就比较糟糕了, 假设现在有多个客户端可以访问共享目录, 这些客户机上分别有 李四 lisi(uid:999)  王五 wangwu(uid:999), 赵六zhaoliu(uid:999) , 那么他们都能看到彼此创建的文件, 如果是隐私或保密数据, 那将是是糟糕的不能再糟糕的一件事情. 难道隐私数据就不能放在NAS上吗? 之前说了, 这取决于管理员的配置水平, NAS权限配置可以精细到单个ip级别, 不同的ip只能访问到不同的目录, ip+uid 可以让用户彼此隔离开来, 活着引入LDAP, 单点登录, 让不同的用户拥有不同的uid也能防止重复的问题, 而且可以很好的结合LDAP身份验证功能. 但是任何事物都有两面性, 假设架设NAS的目的就是为了分享, 为了协同工作, 那么这种设置又能很容易的达到目的. 所以NAS的权限管理可以很灵活, 也可以做到很严谨, 也可能很糟糕, 取决于使用目的以及管理水平.

讲了这么多, 才讲完了no_root_squash, no_all_squash 两个选项, 是不是超级复杂? 这就完了吗? 当然还没有完, 因为权限控制问题本身就很复杂, 在任何一个系统中都是逻辑最复杂最混乱的一块.  当我们试图解决客户端uid重复的时候, 有没有发现一个新的问题, 问题一, 如果按ip+uid 唯一映射共享目录, 可以做到很好的隔离, 但是配置文件会膨胀的非常快, 会相当混乱, 维护起来会相当困难, 复杂性转移到了配置管理了, 有没有?  问题二, 如果采用LDAP, 客户端uid可以实现唯一, 但是我们知道任何客户端的东西都可能被恶意篡改, 难免有不怀好意的用户, 那么我们必须把控制权掌握在自己手中, 不给恶意使用者留下机会. 那要怎么办呢? 这里就是身份映射闪亮登场的时候了. 为什么需要身份映射. 

刚刚说了, 在以隐私保护,数据安全为导向的权限设置中,最大的威胁是uid重复. 这里我们引入了LDAP, 也就引入了身份验证, 也尽量避免uid重复, 但是防止不了伪造. 我们也知道NAS 没有引入身份验证的功劳, 尽量保持简便灵活. 既然没有引入身份验证, 理论上是不能很好的做到数据隔离的, 更何况我们也有数据共享的必要,协作的必要. 引入身份验证可能使得协助,共享变得困难,复杂. 既然不能保证全体用户的隔离, 我们还是能保证部分敏感用户是隔离的. 假设我们以保护张三的隐私为最高优先级, 那么王五赵六的为次优先级. 那么我们就可以把王五赵六映射为nfsnobody, 张三的映射到全服务器上唯一的一个用户上, 这样就避免了张三与其他用户uid冲突的问题, 服务器端严格限制张三对于的uid的权限, 除了root可以访问,尽量不让其他用户访问张三的隐私数据. 当然如果root用户要作恶, 技术手段是很难防止的了得, 只有通过行政手段,法律措施, 规章制度来保证.

这应该就是引入 root_squansh, all_squash, anonuid, anongid的目的, 要搞懂这些选项, 先要弄懂这几个单词的含义很重要, squansh 这里采用的是压扁的意思, 想象一下网络上的用户(赵钱孙李,周吴郑王) 像潮水一遍的向NAS涌来, 在进入nas服务之前, 将他们压缩,压扁成一个用户nfsnobody(nfs小人物) 或者anonuid 指定的映射身份. root_squansh 表示无论那个客户端来的root压扁成nfsnobody, all_squash 表示无论哪个客户端来的普通用户压扁成服务器上的nfs小人物, 那么大人物是谁? 就是那些以真实身份访问服务器的用户, 他们的隐私应该得到更好的保护. anonuid  中的anon 就是anonym匿名的缩写, uid 则对于 linux uid (user id), 这样这些选项就容易理解, 不容易配错了. sync选项与权限无关,是用来控制内存数据和硬盘数据是否同步.

Trouble Shooting

clnt_create: RPC: Port mapper failure – Timed out

 

STATD_OUTGOING_PORT=2020

reference documents:

https://www.cnblogs.com/cash/p/13433978.html

https://blog.51cto.com/yttitan/2406403

上一篇:2021-07-24


下一篇:搭建简单windows版NAS