对于NFS类型的文件系统,阿里云NAS目前提供基于user id (uid)和group id (gid)的经典POSIX访问控制方式。具体来说,每个文件或目录的拥有者(owner)是由uid和gid描述的,文件的访问控制由文件mode来描述。一般来说,文件的owner或者root用户可以通过chown命令修改文件的owner,也可以通过chmod命令修改文件mode信息。基本的访问控制mode也即经典的rwxrwxrwx控制串。其中前三位表示owner uid对应的用户拥有的权限读、写和执行权限,中间三位和最后三位分别是是owner gid对应的组以及所有其他用户(others)所拥有的读、写和执行权限。除此以外,mode还包括文件的setuid,setgid,和sticky bit,前两种权限是在执行程序时赋予进程可执行文件owner的权限,sticky bit在不同操作系统中有不同的用途,一般很少用到。对于上面chown和chmod的具体命令细节,用户可以在对应的man page或者其它的Unix/Linux使用说明中很容易地找到。举例来说,“chmod o+r a.txt”给除了uid对应的用户和gid对应的用户组中的用户之外的所有其他用户读a.txt的权限。一点需要注意的是NFS卷的id 映射设置,root squash设置决定了客户端root对远程NFS文件操作时是否还映射为root,用户需要根据自己的安全需求在阿里云NAS控制台上决定这个参数;类似的还有是否设置all_squash来将不同用户都映射为匿名用户,进一步具体的解释可以参考NFS exports的Linux man page (https://linux.die.net/man/5/exports) 中User Id Mapping部分。
和传统企业级IT设施及其它的云厂商如AWS一致,阿里云目前的NFS实现支持AUTH_SYS安全模式,也即当前客户端用户的uid/gid会被NFS client送到服务器端,在服务器端和文件或目录的owner信息比较,再和服务器端该文件的mode一起决定控制访问行为。可以看出如果不同Linux客户端不能保证uid/gid和具体用户映射关系的一致,访问控制会不能按照用户的本来意愿工作。举例来说,如果Linux client1上user1对应的uid是1000,user2对应的uid是1001,而Linux client2上user1对应的uid是1001,user2对应的uid是1000,这两台客户端的uid和用户的映射关系就出现了不一致的现象。如果user1 在client1上挂载NFS卷并在上面创建一个文件file,并通过修改file mode的方式限制该文件只能由owner uid和自己一致的人访问,当该用户在client2上登录以后由于uid的不一致,他会发现自己无法访问该文件,而不应该有权限的user2却可以对这个文件进行各种操作,甚至修改文件的owner。解决以上的id映射问题是NFS和其它很多UNIX/Linux应用提供用户级访问控制的前提,阿里云NFS的安全系统保证不会允许跨云账号的NFS访问,但是和传统企业级IT设施及其它的云厂商的产品一样,NFS子用户的id映射一致性需要通过用户自己配置客户端操作系统来解决。下面介绍两种常用的在Linux系统上保证跨机器用户/组信息一致的方式。
同步不同系统的本地用户
有很多的配置管理部署工具如Puppet、Chef等可以支持用户不同机器本地用户/组的同步,这样上面例子里user1和user2在不同系统上有不同uid的现象可以随着及时的同步被基本避免。对于客户端和子用户都不多的用户来说,最简单直接的方式是系统管理员通过在必要的时手工候修改/etc/passwd 和/etc/group 这两个配置文件来同步用户/组的信息。在进行了相应的用户信息修改以后,用户可以运行下面的命令来改变当前整个文件系统树(包括挂载的NFS卷)中相关文件的owner,使之与配置中id的修改一致,用户根据自己的UID/GID替换OLD_GID、NEW_GID、OLD_UID、NEW_UID。
find / -group <OLD_GID> -exec chgrp <NEW_GID> '{}' \+
find / -user <OLD_UID> -exec chown <NEW_UID> '{}' \+
使用中央用户目录
用户可以在自己管理的系统中提供一个中央用户目录服务来管理用户信息,通过该目录登录保证了同一个用户uid/gid的一致性,这是最彻底和有效的方案。NIS是一个比较老的方式,曾经被广泛采用但是安全性不好;基于LDAP的方案是现在被广泛采用的高安全性的方式。LDAP的配置和使用都比较复杂,系统管理员需要对相关机制有比较深入的了解来保证自己配置的合理安全。我们以Ubuntu 16.04系统为例,给出用OpenLDAP来进行用户管理的大致步骤。进一步的细节请参考云栖社区的文章”OpenLDAP installation“ 和”openldap的配置手册“、”《Linux/UNIX OpenLDAP实战指南》——导读“等文章,以及其它网站的公开文档如”使用 PAM 集成 OpenLDAP 实现 Linux 统一管理系统用户“和“OpenLDAP Server”。
- 安装OpenLDAP server。以ubuntu 16.04系统为例,运行下面的命令:
sudo apt-get update
sudo apt-get install slapd ldap-utils
- 通过dpkg对slapd进行基本配置。
sudo dpkg-reconfigure slapd
- 用户编辑并通过ldapadd加入people和groups等基本的Organizational Unit来作为描述用户和组的基础。
dn: ou=people,dc=aliyun-test,dc=net
objectClass: organizationalUnit
ou: people
dn: ou=groups,dc=aliyun-test,dc=net
objectClass: organizationalUnit
ou: groups
- 通过slappasswd生成用户密码的SHA Hash并加入用户user1的信息,包括用户名、密码,uid,gid, 缺省shell, home目录等, 通过ldapadd命令将用户和组加入LDAP数据库。之后所有客户端的对user1的登录都可以用LDAP为基础,保证登录成功以后在不同客户端上都会使用2000作为该用户的uid。
dn: uid=user1,ou=people,dc=aliyun-test,dc=net
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: user1
sn: user1
userPassword: {SSHA}QD1jJDdLUJeeZ1utKYfxpaSzygIHa88L
loginShell: /bin/bash
uidNumber: 2000
gidNumber: 2000
homeDirectory: /home/user1
dn: cn=user1,ou=groups,dc=aliyun-test,dc=net
objectClass: posixGroup
cn: user1
gidNumber: 2000
memberUid: user1
- 用户可以通过ldapdelete和ldapmodify等工具进行用户和组的删除修改。
- 安装LDAP client,按照过程中会提示填写LDAP server地址等配置项。
apt-get -y install libnss-ldap libpam-ldap ldap-utils
- 用户可以选择安装phpldapamdin来提供web 界面的ldap管理。具体的使用帮助可以在http://phpldapadmin.sourceforge.net 上面找到。
apt-get -y install phpldapadmin