阿里雲NASNFS服務的檔案訪問控制

nas-hz發表於2018-01-21

對於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
  apt-get -y install phpldapadmin


相關文章