正确使用阿里云NAS文件存储服务系列之文件权限校验

1、简介

阿里云在3月份推出了NAS服务,可以让用户无需对现有应用做任何修改,就可以使用具备无限容量及性能扩展、单一命名空间、多共享、高可靠和高可用等特性的分布式文件系统。目前阿里云NAS服务只支持NFS,后续会支持更多的协议。

由于NFS协议经过了较长时间的发展,目前已经发展了多个版本,不同版本间可能会有不同的处理方式。另外,Linux kernel不同的版本下对于NFS协议的实现可能也会有稍微差别。为了帮助用户更好地使用阿里云NAS文件存储服务,我们推出系列文档来介绍阿里云NAS的使用。

首先介绍阿里云NAS服务文件权限校验的使用。阿里云NAS目前使用标准的NFS协议,支持标准的UNIX文件权限校验方法。由于NFS协议不同的版本实现方式不太相同,所以对于某些版本的NFS Client一些功能不能完全支持。

由于NFS V4版本的实现机制,在较早版本的NFS Client上,如果使用NFS V4挂载,会存在两个问题:①client不能正确显示文件owner和group,会显示成匿名用户;②调用chown和chgrp时,会把文件的owner和group修改成匿名用户。所以建议用户使用阿里云NAS服务时,尽量选择高版本的Kernel。如果必须使用存在上述问题的Kernel时,可以使用NFS V3方式挂载来避免上述问题。

接下来首先分析上述问题的原因,然后通过选择阿里云两个版本(CentOS 5.10和CentOS 6.5)的ecs vm来验证上述问题。

2、NFS协议文件权限校验机制

NFS协议支持Linux文件系统本身的权限校验。在NFS3协议中,使用AUTH_SYS方式进行权限验证。NFS请求把nfs client本地的user
ID(uid)和一组组ID(gids)发送给nfs server。在NFS Server上按UNIX权限校验方式进行权限检查,把结果返回给nfs client。Nfs client和nfs server之间传送文件owner和group信息时使用数字uid和gids。这样的缺点是要求不同的client必须有相同的user-uid映射关系,如果两个client上,不同的用户有相同的uid,它们在nfs server上的权限验证是相同的,对于所有的文件有相同的权限。NFS V3文件权限校验方式如下图所示。

Linux使用uid来表示进程,对于每一个NFS请求,NFS client都会把当前的euid和egids发送到nfs server。linux系统中每个进程都有2个ID,分别为用户ID(uid)和有效用户ID(euid),UID表示进程的创建者(创建简称的用户uid),而EUID表示进程对于文件和资源的访问权限(等同于哪个用户的权限)。

 

为了解决不同的client有不同的name-uid的映射关系,在nfs v4协议中,通过idmap服务,client和server传输文件的owner信息时,使用字符串,而不再使用数字uid和gids,比如user@nfs_domain,group@nfs_domain。NFS Server收到字符串的owner和group时,再把字符串信息转换成数字uid和gids。使用字符串代替数字uid和gids,增加了灵活性,通过idmap服务允许client和server接入NIS和LDAP服务。具体流程见下图。

对于公有云的NAS服务,是没有用户的name->uid的映射关系的,所以要求用户只能发送数字的uid和gids,如果用户发送过来的文件owner信息是string,在server端也只能把用户映射成nobody。但糟糕的是较早版本的nfs client中,nfs v4协议发送文件的owner信息时,必须使用idmap转换成string,如果用户不使用idmap服务,nfs client就会把数字uid映射成nobody发送过来。另外,对于server发送过来的数字uid和gid,也会映射成nobody。

这个是较早版本的NFS client实现方式:

    if (iap->ia_valid & ATTR_UID) {
        owner_namelen = nfs_map_uid_to_name(server->nfs_client, iap->ia_uid, owner_name);
        if (owner_namelen < 0) {
            dprintk("nfs: couldn't resolve uid %d to string\n",
                    iap->ia_uid);
            strcpy(owner_name, "nobody");
            owner_namelen = sizeof("nobody") - 1;
            /* goto out; */
        }
        len += 4 + (XDR_QUADLEN(owner_namelen) << 2);
    }

如果通过idmap查找name-uid映射关系失败时,会把username应射成nobody来处理。

这种强制使用idmap的行为对用户使用来说是很不友好的,而且也和以前版本的NFS协议处理方式不兼容。所以在后续的版本中,Linux kernel对这种方式进行了修改。如果用户选择关闭idmaper,则client把数字uid和gids按字符串的形式发送给Server。如果NFS server发送给client的是数字uid和gid的话,client也会接受,不会像以前强制转换成nobody处理。详情可以参考如下网址:

http://linux-nfs.vger.kernel.narkive.com/g02o9Wrr/patch-v4-0-5-allow-the-admin-to-turn-off-nfsv4-uid-gid-mapping

Trond Myklebust (5):
NFSv4: If the server sends us a numeric uid/gid then accept it
NFSv4: Send unmapped uid/gids to the server if the idmapper fails
NFSv4: cleanup idmapper functions to take an nfs_server argument
NFSv4: Propagate the error NFS4ERR_BADOWNER to nfs4_do_setattr
NFSv4: Send unmapped uid/gids to the server when using auth_sys

代码层面的修改,是在调用nfs_idmap_lookup_name时,添加了一个判断条件。

int nfs_map_uid_to_name(struct nfs_client *clp, __u32 uid, char *buf, size_t buflen)
{
-	return nfs_idmap_lookup_name(uid, "user", buf, buflen);
+	int ret;
+	ret = nfs_idmap_lookup_name(uid, "user", buf, buflen);
+	if (ret < 0)
+	ret = nfs_map_numeric_to_string(uid, buf, buflen);
+	return ret;
}

3、测试验证

按照上述分析,由于早期的kernel版本,如果不使用idmap,文件的owner会转换成nobody发送给server。由于阿里云NAS现在没有用户name->uid的映射关系,现在只支持数字的uid和gids,所以在一些较早的kernel版本上使用阿里云NAS服务,会遇到用户和组信息无法正确识别和转换的问题。使用nfs v4挂载时,较早版本的kernel主要有两个问题:① nfs client无法显示文件的uid和gid,会全部显示成匿名用户;② nfs client做chown,chgrp操作时,会把文件的owner和group修改成匿名用户。

接下来,用阿里云提供的Centos镜像的两个发行版(CentOS
5.10和CentOS 6.5)来验证上述问题。这两个发行版对应的内核版本分别为2.6.18和2.6.32。对于nfs v4,CentOS 5.10强制使用idmap,CentOS 6.5允许使用数字uid和gids。

CentOS 5.10

CentOS 6.5

3.1文件owner和group显示问题

     在CentOS 5.10上创建两个普通用户Tom和Alice,然后使用NFS V4挂载。

首先创建owner为Tom的文件,使用ll命令,可以看到Tom.txt的uid和gid都是4294967294,这个数字代表匿名用户。

用户Alice看到这个文件uid和gid也都是匿名用户。

按照上面的分析,这种情况下uid和gid只是没有正确显示,在server保存的uid和gid还是正确的,所以文件权限校验还是正确的。测试证明虽然显示的都是匿名用户,但用户Tom能够继续修改这个文件,而Alice是没有权限修改的。

 

然后,我们看一下使用NFS V3挂载时,显示的文件owner和group。从下面的截图可以看出,使用NFS V3方式进行挂载是没有问题的。用户Tom和用户Alice看到的都是这个文件的owner和group是Tom。

 

我们再在另外一台机器上(CentOS
6.5)使用NFS V4和NFS V3两种方式挂载,看一下结果。先使用NFS V4挂载,但在CentOS 6.5上看到文件Tom.txt属于用户Bill。

 

按照上面的分析,NAS Server返回文件的owner和group是数字的uid和gid,只是linux在显示时按照/etc/passwd里面的uid-name关系来现实,所以在CentOS
6.5和CentOS 5.10上,用户Bill和用户Tom的uid和gid应该是相同的。

如果CentOS 6.5机器上没有用户的uid和gid是502,这个时候执行ls命令的时候文件的owner和group直接显示数字uid和gid。

 

上面是用户在较早版本的内核上使用NFS
V4新创建的一个文件,但糟糕的是对于已经存在的文件也有这样的问题。

在CentOS 5.10上使用NFS V4挂载,ls整个文件夹,所有的文件都显示匿名用户。

在CentOS 5.10上使用NFS V3挂载,没有问题。

Centos 6.5上NFS V3和NFS V4两种方式挂载,结果相同,都没有问题。

 

综上所述,较早版本的Kernel上,使用NFS V4方式挂载,所有文件的uid和gid都会显示为匿名用户,不过文件的权限校验是正确的。

3.2修改文件的owner和group

除了显示的问题外,较早版本的Kernel上,使用NFS V4方式挂载,chown和chgrp也会有问题。

继续使用上面的文件,在CentOS 5.10上,使用NFS V4方式挂载,把Tom.txt文件的owner和group改为Alice。

执行完之后,显示确实是Alice,看起来像是成功了,但其实是不对的。

使用NFSV3 方式挂载,看到Tom.txt文件的owner和group都变成了nobody(匿名用户)。

在CentOS 6.5上,看到同样的结果。

按照前面的分析,在较早版本的Kernel上,使用NFS V4挂载,调用chown会把用户的uid和gid转换成匿名用户发送给NFS
Server。但为什么又显示成功了呢。这里怀疑是nfs client的cache的问题,把nfs client的inode的cache清空,确实显示成匿名用户,不再显示成Alice了。

清空inode

Alice和Tom看到的都是匿名用户。

 

综上所述,在较早版本的kernel上,使用NFS V4方式挂载时,修改文件的owner和group会把文件的owner和group都变成匿名用户。如果确实需要修改文件的owner和group呢,可以使用NFS V3方式挂载

使用NFS V3挂载,可以修改成功,文件权限校验也是正确的。

在Centos 6.5上查看该文件的owner和group,显示为503,503即为Centos 5.10
vm上用户Alice的uid和gid。

使用NFS V3挂载修改owner和group后,再使用NFS V4方式挂载,依然显示成匿名用户,但权限是正确的,用户Alice可以修改这个文件。

 

上面的问题是低版本的内核问题导致的,接下来验证一下在CentOS 6.5上,使用NFS V4方式挂载,修改文件的owner的行为。

从下面的截图可以看出用户Andy创建的文件,把owner和group修改为用户Mike后,文件的owner和group显示和文件权限校验都是没有问题的。

在CentOS 5.10上使用NFS V3进行挂载看到文件的uid和gid是数字501,这个是CentOS
6.5 vm上用户Mike的uid和gid。

最后在CentOS 5.10上使用NFS V4挂载,显示的依然是匿名用户。

4、结论

1、在CentOS 5.10上,使用NFS V4进行挂载,所有文件的owner和group都会显示为匿名用户,但权限校验是正确的。

2、在CentOS 5.10上,使用NFS V4进行挂载,调用chown和chgrp操作,会把文件的uid和gid改成匿名用户。

3、用户使用阿里云NAS服务时,尽量选择高版本的Kernel。如果必须使用存在上述问题的Kernel时,可以使用NFS V3方式挂载来避免上述问题。

 

时间: 2024-10-29 22:11:48

正确使用阿里云NAS文件存储服务系列之文件权限校验的相关文章

深入对比 HBase 与阿里云的表格存储服务

随着互联网时代的兴起,NoSQL 类型数据库正日渐成为大数据时代下分布式数据库领域的主力,分布式 NoSQL 数据库中最为著名的莫过于 HBase.谷歌的 Bigtable 于 2016 年推出了兼容 HBase 的接口,而作为国内最早推出分布式 NoSQL 数据存储服务的阿里云表格存储也在最近正式发布了 TableStore HBase Client,能够帮助用户将业务轻松从 HBase 迁移至表格存储. 让我们来深入对比下阿里云的表格存储与 HBase 到底有何异同. 软件与服务 通过对表格

用Windows IIS和阿里云NAS提供Web和FTP服务

阿里云文件存储服务NAS(阿里云NAS)是阿里云在2016年正式推出的公有云上的网络文件系统实现.阿里云NAS主要面向阿里云 ECS 实例.HPC.Docker.弹性Web和BatchCompute 等计算节点提供文件存储服务.通过标准的文件访问协议,用户无需对现有应用做任何修改,即可在云上使用具备无限容量及性能扩展.单一命名空间.多共享.高可靠和高可用等特性的分布式文件系统.阿里云于2016年发布了支持NFS网络文件系统访问协议的阿里云文件系统(NAS).2017年3月,又增加了SMB文件系统

悦跑圈携手阿里云 NAS文件存储省运维

     近日,领衔国内的专业跑步APP悦跑圈携手阿里巴巴旗下阿里巴巴云计算(阿里云)就移动互联网和云计算两个领域展开深入合作,由阿里云提供开发到运营的全方位支持,未来双方将凭借自身优势逐步实现互联网+跑步领域的数据融合,深化大数据应用体系,助力推动体育个性化服务的升级. 随着互联网浪潮的此起彼伏,从pc端到移动端,我们迈入了大数据.云计算的时代.作为国内专业跑步APP,悦跑圈自2014年上线发展至今用户规模已突破2500万,在国内金标赛事当中已有超过一半的跑者选择悦跑圈作为跑步记录软件.而为了

阿里云NAS文件存储部署方案介绍和对比

NAS业务上云的背景 作为国内最大的公有云厂商,阿里云为广大的个人用户.初创团队和企业提供了多种多样的公有云服务,包括弹性计算,数据库,存储和网络等.阿里云弹性伸缩,按需付费,无限容量,便捷使用等特性吸引了大量的客户把他们的应用以及服务部署到阿里云,其中就包括一部分部署NAS应用的客户,对于这些客户,面临的一个问题就是如何以最大的性价比来将原有的NAS应用部署到云上.本文介绍了三种可能的部署方案,并比较了他们的优缺点,包括用户最关心的价格,性能以及扩展性等.   对于企业级NAS应用,大部分企业

阿里云NAS文件存储:性能型、容量型、NAS Plus如何选

阿里云NAS文件存储:性能型.容量型.NAS Plus如何选? 阿里云文件存储(Network Attached Storage,简称NAS)是面向阿里云ECS实例.HPC和Docker的文件存储服务,提供标准的文件访问协议,用户无需对现有应用做任何修改,即可使用具备无限容量及性能扩展.单一命名空间.多共享.高可靠和高可用等特性的分布式文件系统. 为了满足用户业务对NAS文件存储的各种需求,阿里云NAS文件系统目前有3种类型可供用户选择,他们分别是: 性能型 容量型 NAS Plus 如上图所示

从用户Windows系统到阿里云NAS SMB服务:常用数据迁移备份工具

本文介绍如何由本地(on-premises) 或阿里云的虚拟机Windows系统向阿里云NAS SMB服务上传和备份数据. 阿里云文件系统SMB协议服务介绍 阿里云文件存储服务NAS(阿里云NAS)是阿里云在2016年正式推出的公有云上的网络文件系统实现.阿里云NAS主要面向阿里云 ECS 实例.HPC.Docker.弹性Web和BatchCompute 等计算节点提供文件存储服务.通过标准的文件访问协议,用户无需对现有应用做任何修改,即可在云上使用具备无限容量及性能扩展.单一命名空间.多共享.

高性能Vs性价比,总有一款适合你,阿里云NAS家族深度解析

在今年召开的"2017杭州·云栖大会"上,阿里云文件存储(Network Attached Storage,简称NAS)再次释放技术红利,降价幅度达46%,再次成为云上存储的性价比标杆.阿里云NAS是具备无限容量及性能扩展.单一命名空间.多共享.高可靠和高可用等特性的分布式文件系统.不仅是性价比,阿里云NAS家族还提供了适合各个企业场景的产品,来满足用户需求. 在此,笔者就来为大家一一解析整个阿里云NAS家族. 阿里云NAS文件存储共有三种类型:性能型,容量型和NAS Plus. 1.

配置NAT网关实现从公网访问阿里云NAS

阿里云文件存储服务在使用时有一个限制:对于一个地域(比如华东1)内创建的文件系统(NFS或者SMB),只支持同一地域内的ECS挂载,用户在其他地域(比如华北1)内的ECS,或者用户自己IDC机房的服务器,是没法直接挂载的:只有通过建立不同VPC间或者IDC和VPC间的高速通道才能实现跨地域或者从IDC服务器挂载文件系统,而部署高速通道带来的高成本将是很多用户面临的一个非常现实的问题.   之前对于已经在自己机房部署了VPN服务的用户,我们推荐使用阿里云的VPN网关来实现用户Office或者IDC

开源备份工具duplicity支持阿里云OSS后端存储

duplicity简介 duplicity是一款开源的备份工具,使用librsync高效地支持增量备份,节约本地存储空间,同时使用GnuPG加密数据.duplicity能将数据轻松的备份到本地或远端文件共享存储,同时支持各类云存储. 不过官方版本并没有支持阿里云作为后端存储,最近用oss最新的Python SDK oss2支持了duplicity上传阿里云OSS,先实现了一个简单的版本,在本文附件中可以下载到集成了aliyunbackend的duplicity安装包. 适用场景 重要文档数据的打