WebHdfs API使用和開放WebHdfs使用後權限控制

測試集羣1 namenode:vm-10-142-164-18
測試集羣2 新64G測試集羣

文件和目錄操作

創建和寫文件
1、命令行執行 : curl -i -X PUT “http://vm-10-142-164-18:50070/webhdfs/v1/user/hadoop/chy?op=CREATE
執行完畢後會出現
HTTP/1.1 307 TEMPORARY_REDIRECT
Cache-Control: no-cache
Expires: Wed, 07 Sep 2016 06:37:43 GMT
Date: Wed, 07 Sep 2016 06:37:43 GMT
Pragma: no-cache
Expires: Wed, 07 Sep 2016 06:37:43 GMT
Date: Wed, 07 Sep 2016 06:37:43 GMT
Pragma: no-cache
Content-Type: application/octet-stream
Location: c
Content-Length: 0
Server: Jetty(6.1.26)

2、根據上步驟中執行完後出現的Location執行 : curl -i -X PUT -T /tmp/write “http://vm-10-142-164-25:50075/webhdfs/v1/user/hadoop/chy?op=CREATE&namenoderpcaddress=vm-10-142-164-18:9000
此步驟中的主機名爲Location中的主機名,同時需要指定namenoderpcaddress,否則會出現 401 bad request錯誤。
執行完畢後出現
HTTP/1.1 100 Continue

HTTP/1.1 201 Created
Cache-Control: no-cache
Expires: Wed, 07 Sep 2016 06:40:26 GMT
Date: Wed, 07 Sep 2016 06:40:26 GMT
Pragma: no-cache
Expires: Wed, 07 Sep 2016 06:40:26 GMT
Date: Wed, 07 Sep 2016 06:40:26 GMT
Pragma: no-cache
Content-Type: application/octet-stream
Location: webhdfs://vm-10-142-164-18:9000/user/hadoop/chy
Content-Length: 0
Server: Jetty(6.1.26)
——————————表示執行成功,在vm-10-142-164-18所屬的集羣中可以用hadoop fs -ls 命令查看到已經建立的新文件 chy 內容爲執行指令機器本地文件 /tmp/write 中的內容


追加
1、命令行執行:curl -i -X POST “http://vm-10-142-164-18:50070/webhdfs/v1/user/hadoop/chy?op=APPEND
執行完畢後出現
HTTP/1.1 307 TEMPORARY_REDIRECT
Cache-Control: no-cache
Expires: Wed, 07 Sep 2016 07:31:52 GMT
Date: Wed, 07 Sep 2016 07:31:52 GMT
Pragma: no-cache
Expires: Wed, 07 Sep 2016 07:31:52 GMT
Date: Wed, 07 Sep 2016 07:31:52 GMT
Pragma: no-cache
Content-Type: application/octet-stream
Location: http://vm-10-142-164-27:50075/webhdfs/v1/user/hadoop/chy?op=APPEND&namenoderpcaddress=vm-10-142-164-18:9000
Content-Length: 0
Server: Jetty(6.1.26)
與創建和寫文件類似

2、執行:curl -i -X POST -T /tmp/write1 “http://vm-10-142-164-27:50075/webhdfs/v1/user/hadoop/chy?op=APPEND&namenoderpcaddress=vm-10-142-164-18:9000
執行完畢後出現
HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Cache-Control: no-cache
Expires: Wed, 07 Sep 2016 07:33:00 GMT
Date: Wed, 07 Sep 2016 07:33:00 GMT
Pragma: no-cache
Expires: Wed, 07 Sep 2016 07:33:00 GMT
Date: Wed, 07 Sep 2016 07:33:00 GMT
Pragma: no-cache
Content-Type: application/octet-stream
Content-Length: 0
Server: Jetty(6.1.26)
———————————表示執行成功,文件本地文件 /tmp/write1內容已經追加到 vm-10-142-164-18所在集羣中chy文件中


合併
1、命令行執行:curl -i -X POST “http://vm-10-142-164-18:50070/webhdfs/v1/user/hadoop/chy?op=CONCAT&sources=/user/hadoop/restart.sh
執行完畢後報錯 出現400 bad request
{“RemoteException”
:{
“exception”:”HadoopIllegalArgumentException”,
“javaClassName”:”org.apache.hadoop.HadoopIllegalArgumentException”,
“message”:”The last block in /user/hadoop/chy is not full; last block size = 301 but file block size = 67108864”
}
}
目前未修復該bug


讀取
1、命令行執行:curl -i -L “http://vm-10-142-164-18:50070/webhdfs/v1/user/hadoop/chy?op=OPEN
執行完畢直接打印出文件內容


創建文件夾
1、命令行執行:curl -i -X PUT “http://vm-10-142-164-18:50070/webhdfs/v1/user/hadoop/xf?op=MKDIRS
執行完畢後出現
HTTP/1.1 200 OK
Cache-Control: no-cache
Expires: Wed, 07 Sep 2016 07:59:51 GMT
Date: Wed, 07 Sep 2016 07:59:51 GMT
Pragma: no-cache
Expires: Wed, 07 Sep 2016 07:59:51 GMT
Date: Wed, 07 Sep 2016 07:59:51 GMT
Pragma: no-cache
Content-Type: application/json
Transfer-Encoding: chunked
Server: Jetty(6.1.26)
{“boolean”:true}
———————————表示執行成功,在vm-10-142-164-18所在集羣中建立目錄 /user/hadoop/xf


重命名
1、命令行執行:curl -i -X PUT “http://vm-10-142-164-18:50070/webhdfs/v1/user/hadoop/xf?op=RENAME&destination=/user/hadoop/xfchy
執行完畢後出現
HTTP/1.1 200 OK
Cache-Control: no-cache
Expires: Wed, 07 Sep 2016 08:02:16 GMT
Date: Wed, 07 Sep 2016 08:02:16 GMT
Pragma: no-cache
Expires: Wed, 07 Sep 2016 08:02:16 GMT
Date: Wed, 07 Sep 2016 08:02:16 GMT
Pragma: no-cache
Content-Type: application/json
Transfer-Encoding: chunked
Server: Jetty(6.1.26)
{“boolean”:true}
————————————表示執行成功,原先vm-10-142-164-18所在集羣中 /user/hadoop/xf 已經被重命名爲 /user/hadoop/xfchy


刪除目錄或文件
1、命令行執行:curl -i -X DELETE “http://vm-10-142-164-18:50070/webhdfs/v1/user/hadoop/xfchy?op=DELETE&recursive=true” 如果不加recursive參數,則如果是刪除文件夾且文件夾下有內容,則無法刪除。
執行完畢後出現
HTTP/1.1 200 OK
Cache-Control: no-cache
Expires: Wed, 07 Sep 2016 08:07:32 GMT
Date: Wed, 07 Sep 2016 08:07:32 GMT
Pragma: no-cache
Expires: Wed, 07 Sep 2016 08:07:32 GMT
Date: Wed, 07 Sep 2016 08:07:32 GMT
Pragma: no-cache
Content-Type: application/json
Transfer-Encoding: chunked
Server: Jetty(6.1.26)

{“boolean”:true}
—————————————-表示執行成功,原先vm-10-142-164-18所在集羣中 /user/hadoopp/xfchy 文件夾刪除


查看文件狀態
1、命令行執行:curl -i “http://vm-10-142-164-18:50070/webhdfs/v1/user/hadoop/chy?op=GETFILESTATUS
執行完畢後出現
HTTP/1.1 200 OK
Cache-Control: no-cache
Expires: Wed, 07 Sep 2016 08:30:14 GMT
Date: Wed, 07 Sep 2016 08:30:14 GMT
Pragma: no-cache
Expires: Wed, 07 Sep 2016 08:30:14 GMT
Date: Wed, 07 Sep 2016 08:30:14 GMT
Pragma: no-cache
Content-Type: application/json
Transfer-Encoding: chunked
Server: Jetty(6.1.26)

{
“FileStatus”:
{
“accessTime”: 1473234194925,
“blockSize”: 67108864,
“childrenNum”: 0,
“fileId”:25580,
“group”: “supergroup”,
“length”: 301,
“modificationTime”: 1473233582609,
“owner”: “hadoop”,
“pathSuffix”:”“,
“permission”:”755”,
“replication”:3,
“storagePolicy”:0,
“type”:”FILE”
}
}


針對集羣開放WebHdfs出現的安全隱患(用戶可以通過API對集羣數據進行任意操作) 需要進行權限控制。通過修改WebHdfs相關的源碼來禁止不允許的集羣操作行爲。

與WebHdfs有關的源碼均在hadoop-hdfs-2.7.2.jar下。相應的包名均包含”webhdfs” 。主要需要進行修改的源碼文件包括org.apache.hadoop.hdfs.web.WebHdfsFileSystem.class和org.apache.hadoop.hdfs.server.namenode.web.resources.NamenodeWebHdfsMethods.class兩個類。

根據API操作可以發現,語句中包含了-L -POST -PUT。L在源碼中對應了Response get()方法 POST對應了Response post()方法 PUT對應了Response put()方法。各個方法中使用switch語句來判斷傳遞的參數,如OPEN、APPEND等等。

put和post中的方法需要全部禁止掉,因爲這些方法是可以修改集羣文件或文件夾的。而get方法需要保留,爲其他集羣提供distcp功能。

調試源代碼發現,在使用API進行操作的時候,操作集羣的用戶默認全部爲hadoop用戶,而使用hadoop distcp -pb webhdfs命令時,操作集羣的用戶則是提交該命令的用戶,遵循Linux的rwx 權限規定。由於大集羣hadoop用戶爲超級用戶,所有服務均是hadoop用戶啓動的,所以hadoop用戶可以進行的操作無視rwx權限規定。而集羣中某些數據對第三方是不可見的,如果第三方用戶使用API來操作則可以讀取該數據造成安全隱患,所以對get方法需要修改而不是禁止。

定位到get方法中的switch語句,在”case OPEN”的情況中添加條件判斷

if(ugi.getUserName().equals("hadoop"))
 {
         throw new IOException("Not supported");
 }

即判斷當前用戶是否是hadoop用戶,是則拋出異常不支持;否則繼續執行原來的代碼。
這樣重新編譯源碼,替換原來的jar包即可。

至此WebHdfs開通之後,所有可以進行數據修改的操作均被禁止,而讀操作也被限制。二級部門同事僅可以通過distcp來拷貝集羣中可以被第三方訪問的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章