本文說明超級使用者如何代表其他使用者提交工作或存取 hdfs。
下一節中描述的程式碼範例適用於下列使用案例。
使用者名稱為「super」的超級使用者想要代表使用者 joe 提交工作和存取 hdfs。超級使用者擁有 kerberos 認證,但使用者 joe 沒有。這些工作需要以使用者 joe 的身分執行,且名稱節點上的任何檔案存取都需要以使用者 joe 的身分執行。使用者 joe 必須能夠使用超級使用者的 kerberos 認證連線到名稱節點或工作追蹤器。換句話說,超級使用者正在偽裝成使用者 joe。
某些產品(例如 Apache Oozie)需要這樣做。
在此範例中,超級使用者的認證用於登入,並為 joe 建立代理使用者 ugi 物件。作業會在此代理使用者 ugi 物件的 doAs 方法中執行。
... //Create ugi for joe. The login user is 'super'. UserGroupInformation ugi = UserGroupInformation.createProxyUser("joe", UserGroupInformation.getLoginUser()); ugi.doAs(new PrivilegedExceptionAction<Void>() { public Void run() throws Exception { //Submit a job JobClient jc = new JobClient(conf); jc.submitJob(conf); //OR access hdfs FileSystem fs = FileSystem.get(conf); fs.mkdir(someFilePath); } }
您可以使用屬性 hadoop.proxyuser.$superuser.hosts
,以及 hadoop.proxyuser.$superuser.groups
和 hadoop.proxyuser.$superuser.users
(或兩者皆使用)來組態代理使用者。
透過在 core-site.xml 中指定如下內容,名為 super
的超級使用者只能從 host1
和 host2
連線,才能冒充屬於 group1
和 group2
的使用者。
<property> <name>hadoop.proxyuser.super.hosts</name> <value>host1,host2</value> </property> <property> <name>hadoop.proxyuser.super.groups</name> <value>group1,group2</value> </property>
如果沒有這些組態,將不允許冒充,而且連線會失敗。
如果偏好較寬鬆的安全性,可以使用萬用字元 * 來允許從任何主機或任何使用者進行冒充。例如,透過在 core-site.xml 中指定如下內容,從任何主機存取的名為 oozie
的使用者可以冒充屬於任何群組的任何使用者。
<property> <name>hadoop.proxyuser.oozie.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.oozie.groups</name> <value>*</value> </property>
hadoop.proxyuser.$superuser.hosts
接受 IP 位址清單、CIDR 格式的 IP 位址範圍和/或主機名稱。例如,透過指定如下內容,從範圍 10.222.0.0-10.222.255.255
和 10.113.221.221
中的主機存取的名為 super
的使用者可以冒充 user1
和 user2
。
<property> <name>hadoop.proxyuser.super.hosts</name> <value>10.222.0.0/16,10.113.221.221</value> </property> <property> <name>hadoop.proxyuser.super.users</name> <value>user1,user2</value> </property>
如果叢集在 安全模式中執行,超級使用者必須具有 Kerberos 憑證,才能冒充其他使用者。
它無法為此功能使用委派權杖。如果超級使用者將自己的委派權杖新增到代理使用者 ugi,將是錯誤的,因為這將允許代理使用者以超級使用者的權限連線到服務。
但是,如果超級使用者確實想要給予 Joe 委派權杖,它必須先冒充 Joe 並為 Joe 取得委派權杖,方式與上述程式碼範例相同,並將其新增到 Joe 的 ugi。如此一來,委派權杖的所有者將會是 Joe。