您的位置:首页 > 大数据 > Hadoop

WebHdfs API使用和开放WebHdfs使用后权限控制

2016-09-21 18:34 288 查看
测试集群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来拷贝集群中可以被第三方访问的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: