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来拷贝集群中可以被第三方访问的数据。

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