<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-314  評論-209  文章-0  trackbacks-0

    之前在論壇看到一個(gè)關(guān)于HDFS權(quán)限的問題,當(dāng)時(shí)無法回答該問題。無法回答并不意味著對HDFS權(quán)限一無所知,而是不能準(zhǔn)確完整的闡述HDFS權(quán)限,因此決定系統(tǒng)地學(xué)習(xí)HDFS文件權(quán)限。HDFS的文件和目錄權(quán)限模型共享了POSIX(Portable Operating System Interface,可移植操作系統(tǒng)接口)模型的很多部分,比如每個(gè)文件和目錄與一個(gè)擁有者和組相關(guān)聯(lián),文件或者目錄對于擁有者、組內(nèi)的其它用戶和組外的其它用戶有不同的權(quán)限等。與POSIX模型不同的是,HDFS中的文件沒有可執(zhí)行文件的概念,因而也沒有setuid和setgid,雖然目錄依然保留著可執(zhí)行目錄的概念(x),但對于目錄也沒有setuid和setgid。粘貼位(sticky bit)可以用在目錄上,用于阻止除超級用戶,目錄或文件的擁有者外的任何刪除或移動目錄中的文件,文件上的粘貼位不起作用。

          當(dāng)創(chuàng)建文件或目錄時(shí),擁有者為運(yùn)行客戶端進(jìn)程的用戶,組為父目錄所屬的組。每個(gè)訪問HDFS的客戶端進(jìn)程有一個(gè)由用戶姓名和組列表兩部分組的成標(biāo)識,無論何時(shí)HDFS必須對由客戶端進(jìn)程訪問的文件或目錄進(jìn)行權(quán)限檢查,規(guī)則如下:

     

    • 如果進(jìn)程的用戶名匹配文件或目錄的擁有者,那么測試擁有者權(quán)限
    • 否則如果文件或目錄所屬的組匹配組列表中任何組,那么測試組權(quán)限
    • 否則測試其它權(quán)限

     

          如果權(quán)限檢查失敗,則客戶端操作失敗。

          從hadoop-0.22開始,hadoop支持兩種不同的操作模式以確定用戶,分別為simple和kerberos具體使用哪個(gè)方式由參數(shù)hadoop.security.authentication設(shè)置,該參數(shù)位于core-site.xml文件中,默認(rèn)值為simple。在simple模式下,客戶端進(jìn)程的身份由主機(jī)的操作系統(tǒng)確定,比如在類Unix系統(tǒng)中,用戶名為命令whoami的輸出。在kerberos模式下,客戶端進(jìn)程的身份由Kerberos憑證確定,比如在一個(gè)Kerberized環(huán)境中,用戶可能使用kinit工具得到了一個(gè)Kerberos ticket-granting-ticket(TGT)且使用klist確定當(dāng)前的principal。當(dāng)映射一個(gè)Kerberosprincipal到HDFS的用戶名時(shí),除了最主要的部分外其余部分都被丟棄,比如一個(gè)principal為todd/foobar@CORP.COMPANY.COM,將映射為HDFS上的todd。無論哪種操作模式,對于HDFS來說用戶標(biāo)識機(jī)制都是外部的,HDFS本身沒有創(chuàng)建用戶標(biāo),建立組或者處理用戶憑證的規(guī)定。

          上面討論了確定用戶的兩種模式,即simple和kerberos,下面學(xué)習(xí)如何確定用戶組。用戶組是通過由參數(shù)hadoop.security.group.mapping設(shè)置的組映射服務(wù)確定的,默認(rèn)實(shí)現(xiàn)是org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback,該實(shí)現(xiàn)首先確定Java本地接口(JNI)是否可用,如果JNI可用,該實(shí)現(xiàn)將使用hadoop中的API為用戶解析用戶組列表。如果JNI不可用,那么使用ShellBasedUnixGroupsMapping,該實(shí)現(xiàn)將使用Linux/Unix中的bash –cgroups命令為用戶解析用戶組列表。其它實(shí)現(xiàn)還有LdapGroupsMapping,通過直接連接LDAP服務(wù)器來解析用戶組列表。對HDFS來說,用戶到組的映射是在NameNode上執(zhí)行的,因而NameNode的主機(jī)系統(tǒng)配置決定了用戶的組映射。HDFS將文件或目錄的用戶和組存儲為字符串,并且不像Linux/Unix那樣可以將用戶和組轉(zhuǎn)換為數(shù)字。

          每個(gè)針對文件或者目錄的操作都將全路徑名稱傳遞到NameNode,然后對該路徑的每次操作都將應(yīng)用權(quán)限檢查。客戶端隱含地關(guān)聯(lián)用戶身份到NameNode的連接,減少改變現(xiàn)存客戶端API的需要。總是存在這么一種情景,當(dāng)在一個(gè)文件上的操作成功后,當(dāng)重復(fù)該操作時(shí)可能失敗,因?yàn)樵撐募蛘呗窂街械哪承┠夸浺呀?jīng)不再存在。例如,當(dāng)客戶端第一次開始讀取一個(gè)文件時(shí),它向NameNode發(fā)出的第一個(gè)請求來發(fā)現(xiàn)該文件第一個(gè)塊的位置,第二個(gè)尋找其他塊的請求可能失敗。另一方面,對于已經(jīng)知道文件塊的客戶端來說,刪除文件不會取消訪問。通過添加權(quán)限,客戶端對文件的訪問在請求之間可能撤回,對于已經(jīng)知道文件塊的客戶端來說,改變權(quán)限不會取消客戶端的訪問。

          HDFS中超級用戶與通常熟悉的Linux或Unix中的root用戶不同,HDFS的超級用戶是與NameNode進(jìn)程有相同標(biāo)示的用戶,更簡單易懂些,啟動NameNode的用戶就為超級用戶。對于誰是超級用戶沒有固定的定義,當(dāng)NameNode啟動后,該進(jìn)程的標(biāo)示決定了誰是超級用戶。HDFS的超級用戶不必是NameNode主機(jī)的超級用戶,也需用所有的集群使用相同的超級用戶,出于實(shí)驗(yàn)?zāi)康脑趥€(gè)人工作站上運(yùn)行HDFS的人自然而然的稱為超級用戶而不需要任何配置。另外參數(shù)dfs.permissions.superusergroup設(shè)置了超級用戶,該組中的所有用戶也為超級用戶。超級用戶在HDFS中可以執(zhí)行任何操作而針對超級用戶的權(quán)限檢查永遠(yuǎn)不會失敗。

          HDFS也提供了對POSIX ACL(訪問控制列表)支持來為特定的用戶或者用戶組提供更加細(xì)粒度的文件權(quán)限。ACL是不同于用戶和組的自然組織層次的有用的權(quán)限控制方式,ACL可以為特定的用戶和組設(shè)置不同的權(quán)限,而不僅僅是文件的擁有者和文件所屬的組。默認(rèn)情況下,HDFS禁用ACL,因此NameNode禁止ACL的創(chuàng)建,為了啟用ACL,需要在hdfs-site.xml中將參數(shù)dfs.namenode.acls.enabled設(shè)置為true。

          訪問控制列表由一組ACL項(xiàng)組成,每個(gè)ACL項(xiàng)命名了特定的用戶或組,并為其授予或拒絕讀,寫和執(zhí)行的權(quán)限,例如:

     

    user::rw- user:bruce:rwx                  #effective:r-- group::r-x                      #effective:r-- group:sales:rwx                 #effective:r-- mask::r-- other::r-- 

     

          每個(gè)ACL項(xiàng)由類型,可選的名稱和權(quán)限字符串組成,它們之間使用冒號(:)。在上面的例子中文件的擁有者具有讀寫權(quán)限,文件所屬的組具有讀和執(zhí)行的權(quán)限,其他用戶具有讀權(quán)限,這些設(shè)置與將文件設(shè)置為654等價(jià)(6表示擁有者的讀寫權(quán)限,5表示組的讀和執(zhí)行權(quán)限,4表示其他用戶的讀權(quán)限)。除此之外,還有兩個(gè)擴(kuò)展的ACL項(xiàng),分別為用戶bruce和組sales,并都授予了讀寫和執(zhí)行的權(quán)限。mask項(xiàng)是一個(gè)特殊的項(xiàng),用于過濾授予所有命名用戶,命名組及未命名組的權(quán)限,即過濾除文件擁有者和其他用戶(other)之外的任何ACL項(xiàng)。在該例子中,mask值有讀權(quán)限,則bruce用戶、sales組和文件所屬的組只具有讀權(quán)限。每個(gè)ACL必須有mask項(xiàng),如果用戶在設(shè)置ACL時(shí)沒有使用mask項(xiàng),一個(gè)mask項(xiàng)被自動加入到ACL中,該mask項(xiàng)是通過計(jì)算所有被mask過濾項(xiàng)的權(quán)限與(&運(yùn)算)得出的。對擁有ACL的文件執(zhí)行chmod實(shí)際改變的是mask項(xiàng)的權(quán)限,因?yàn)閙ask項(xiàng)扮演的是過濾器的角色,這將有效地約束所有擴(kuò)展項(xiàng)的權(quán)限,而不是僅改變組的權(quán)限而可能漏掉其它擴(kuò)展項(xiàng)的權(quán)限。

          訪問控制列表和默認(rèn)訪問控制列表存在著不同,前者定義了在執(zhí)行權(quán)限檢查實(shí)施的規(guī)則,后者定義了新文件或者子目錄創(chuàng)建時(shí)自動接收的ACL項(xiàng),例如:

    user::rwx group::r-x other::r-x default:user::rwx default:user:bruce:rwx          #effective:r-x default:group::r-x default:group:sales:rwx         #effective:r-x default:mask::r-x default:other::r-x 

          只有目錄可能擁有默認(rèn)訪問控制列表,當(dāng)創(chuàng)建新文件或者子目錄時(shí),自動拷貝父輩的默認(rèn)訪問控制列表到自己的訪問控制列表中,新的子目錄也拷貝父輩默認(rèn)的訪問控制列表到自己的默認(rèn)訪問控制列表中。這樣,當(dāng)創(chuàng)建子目錄時(shí)默認(rèn)ACL將沿著文件系統(tǒng)樹被任意深層次地拷貝。在新的子ACL中,準(zhǔn)確的權(quán)限由模式參數(shù)過濾。默認(rèn)的umask為022,通常新目錄權(quán)限為755,新文件權(quán)限為644。模式參數(shù)為未命名用戶(文件的擁有者),mask及其他用戶過濾拷貝的權(quán)限值。在上面的例子中,創(chuàng)建權(quán)限為755的子目錄時(shí),模式對最終結(jié)果沒有影響,但是如果創(chuàng)建權(quán)限為644的文件時(shí),模式過濾器導(dǎo)致新文件的ACL中文件擁有者的權(quán)限為讀寫,mask的權(quán)限為讀以及其他用戶權(quán)限為讀。mask的權(quán)限意味著用戶bruce和組sales只有讀權(quán)限。拷貝ACL發(fā)生在文件或子目錄的創(chuàng)建時(shí),后面如果修改父輩的默認(rèn)ACL將不再影響已存在子類的ACL。

          默認(rèn)ACL必須包含所有最小要求的ACL項(xiàng),包括文件擁有者項(xiàng),文件所屬的組項(xiàng)和其它用戶項(xiàng)。如果用戶沒有在默認(rèn)ACL中配置上述三項(xiàng)中的任何一個(gè),那么該項(xiàng)將通過從訪問ACL拷貝對應(yīng)的權(quán)限來自動插入,或者如果沒有訪問ACL則自動插入權(quán)限位。默認(rèn)ACL也必須擁有mask,如果mask沒有被指定,通過計(jì)算所有被mask過濾項(xiàng)的權(quán)限與(&運(yùn)算)自動插入mask。當(dāng)一個(gè)文件擁有ACL時(shí),權(quán)限檢查的算法變?yōu)椋?/p>

     

    • 如果用戶名匹配文件的擁有者,則測試擁有者權(quán)限
    • 否則,如果用戶名匹配命名用戶項(xiàng)中的用戶名,則測試由mask權(quán)限過濾后的該項(xiàng)的權(quán)限
    • 否則,如果文件所屬的組匹配組列表中的任何組,并且如果這些被mask過濾的權(quán)限具有訪問權(quán)限,那么使用這么權(quán)限
    • 否則,如果存在命名組項(xiàng)匹配組列表中的成員,并且如果這些被mask過濾的權(quán)限具有訪問權(quán)限,那么使用這么權(quán)限
    • 否則,如果文件所屬的組或者任何命名組項(xiàng)匹配組列表中的成員,但不具備訪問權(quán)限,那么訪問被拒絕
    • 否則測試文件的其他用戶權(quán)限

     

          最佳實(shí)踐時(shí)基于傳統(tǒng)的權(quán)限位設(shè)置大部分權(quán)限要求,然后定義少量帶有特殊規(guī)則的ACL增加權(quán)限位。相比較只是用權(quán)限位的文件,使用ACL的文件會在NameNode中產(chǎn)生額外的內(nèi)存消耗。

          上面學(xué)習(xí)了HDFS中的文件權(quán)限和訪問控制列表,最后學(xué)習(xí)一下如何針對權(quán)限和ACL進(jìn)行配置,下表列出了其中的重要參數(shù):

    參數(shù)名

    位置

    用途

    dfs.permissions.enabled

    hdfs-site.xml

    默認(rèn)值為true,即啟用權(quán)限檢查。如果為 false,則禁用權(quán)限檢查。

    hadoop.http.staticuser.user

    core-site.xml

    默認(rèn)值為dr.who,查看web UI的用戶

    dfs.permissions.superusergroup

    hdfs-site.xml

    超級用戶的組名稱,默認(rèn)為supergroup

    <fs.permissions.umask-mode

    core-site.xml

    創(chuàng)建文件和目錄時(shí)使用的umask,默認(rèn)值為八進(jìn)制022,每位數(shù)字對應(yīng)了擁有者,組和其他用戶。該值既可以使用八進(jìn)制數(shù)字,如022,也可以使用符號,如u=rwx,g=r-x,o=r-x(對應(yīng)022)

    dfs.cluster.administrators

    hdfs-site.xml

    被指定為ACL的集群管理員

    dfs.namenode.acls.enabled

    hdfs-site.xml

    默認(rèn)值為false,禁用ACL,設(shè)置為true則啟用ACL。當(dāng)ACL被禁用時(shí),NameNode拒絕設(shè)置或者獲取ACL的請求

    posted on 2017-07-28 10:55 xzc 閱讀(988) 評論(0)  編輯  收藏 所屬分類: hadoop
    主站蜘蛛池模板: 在线免费观看视频你懂的| 亚洲av高清在线观看一区二区 | 亚洲娇小性xxxx| 国产免费观看网站| 成人一区二区免费视频| 成年人免费网站在线观看| 国产AV无码专区亚洲AV蜜芽| 亚洲中文字幕久久精品无码喷水 | a高清免费毛片久久| 亚洲人成在线影院| 免费观看的a级毛片的网站| www.xxxx.com日本免费| 亚洲国产韩国一区二区| 亚洲?v无码国产在丝袜线观看| 久久免费视频精品| 亚洲AV无码码潮喷在线观看| 天堂亚洲免费视频| 7777久久亚洲中文字幕蜜桃 | 最近免费中文字幕大全视频| 一级毛片a女人刺激视频免费| 91大神亚洲影视在线| 免费看小12萝裸体视频国产 | 免费在线观看黄网站| 最近新韩国日本免费观看| 边摸边吃奶边做爽免费视频网站 | 夜色阁亚洲一区二区三区| 特级精品毛片免费观看| 国产成人综合亚洲| 亚洲欧洲另类春色校园小说| 久久久无码精品亚洲日韩软件| 皇色在线视频免费网站| 亚洲免费网站观看视频| 亚洲国产人成网站在线电影动漫| 免费国产高清视频| 在线视频观看免费视频18| 精品国产麻豆免费人成网站| 九九久久精品国产免费看小说| 亚洲中文字幕精品久久| 亚洲美女激情视频| 亚洲成AV人片一区二区密柚| 亚洲成AⅤ人影院在线观看|