Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护

一. Trash垃圾回收 1. 背景
DFS本身也是一个文件系统,那么就会涉及到文件数据的删除操作。默认情况下,HDFS中是没有回收站垃圾桶概念的,删除操作的数据将会被直接删除
2. 功能概述
Trash机制,叫做回收站或者垃圾桶。Trash就像Windows操作系统中的回收站一样。它的目的是防止你无意中删除某些东西。默认情况下是不开启的。
启用Trash功能后,从HDFS中删除某些内容时,文件或目录不会立即被清除,它们将被移动到回收站Current目录中(/user/${username}/.Trash/current)。
.Trash中的文件在用户可配置的时间延迟后被永久删除。也可以简单地将回收站里的文件移动到.Trash目录之外的位置来恢复回收站中的文件和目录。
1. Trash Checkpoint 检查点仅仅是用户回收站下的一个目录,用于存储在创建检查点之前删除的所有文件或目录。如果你想查看回收站目录,可以在/user/${username}/.Trash/{timestamp_of_checkpoint_creation}处看到:
最近删除的文件被移动到回收站Current目录,并且在可配置的时间间隔内,HDFS会为在Current回收站目录下的文件创建检查点/user/${username}/.Trash/<日期>,并在过期时删除旧的检查点。
3. 功能开启
1. 关闭HDFS集群 在node1节点上,执行一键关闭HDFS集群命令:stop-dfs.sh。
Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

2. 修改core-site.xml 文件 在node1节点修改core-site.xml文件,添加下面两个属性:

vim /export/server/hadoop-3.1.4/etc/hadoop/core-site.xmlfs.trash.interval 1440 fs.trash.checkpoint.interval 0

fs.trash.interval: 分钟数,当超过这个分钟数后检查点会被删除。如果为零,Trash回收站功能将被禁用。
fs.trash.checkpoint.interval: 检查点创建的时间间隔(单位为分钟)。其值应该小于或等于fs.trash.interval。如果为零,则将该值设置为fs.trash.interval的值。每次运行检查点时,它都会从当前版本中创建一个新的检查点,并删除在数分钟之前创建的检查点。
3. 同步集群配置文件
scp -r /export/server/hadoop-3.1.4/etc/hadoop/core-site.xml node2:/export/server/hadoop-3.1.4/etc/hadoop/ scp -r /export/server/hadoop-3.1.4/etc/hadoop/core-site.xml node3:/export/server/hadoop-3.1.4/etc/hadoop/

4. 启动HDFS集群 在node1节点上,执行一键启动HDFS集群命令:start-dfs.sh。
4. 功能使用
1. 删除文件到Trash 开启Trash功能后,正常执行删除操作,文件实际并不会被直接删除,而是被移动到了垃圾回收站。
Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

Trash回收站下面查看:
Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

2. 删除文件调过Trash 有的时候,我们希望直接把文件删除,不需要再经过Trash回收站了,可以在执行删除操作的时候添加一个参数:-skipTrash.
hadoop fs -rm -skipTrash /smallfile1/3.txt

Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

3. 从Trash中恢复文件 回收站里面的文件,在到期被自动删除之前,都可以通过命令恢复出来。使用mv、cp命令把数据文件从Trash目录下复制移动出来就可以了。
hadoop fs -mv /user/root/.Trash/Current/smallfile1/* /smallfile1/

Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

4. 清空Trash 除了fs.trash.interval参数控制到期自动删除之外,用户还可以通过命令手动清空回收站,释放HDFS磁盘存储空间。
首先想到的是删除整个回收站目录,将会清空回收站,这是一个选择。此外。HDFS提供了一个命令行工具来完成这个工作:
hadoop fs -expunge

该命令立即从文件系统中删除过期的检查点。
Snapshot 快照 1. 快照介绍和作用
HDFS snapshot是HDFS整个文件系统,或者某个目录在某个时刻的镜像。该镜像并不会随着源目录的改变而进行动态的更新。可以将快照理解为拍照片时的那一瞬间的投影,过了那个时间之后,又会有新的一个投影。
HDFS快照的核心作用包括:数据恢复、数据备份、数据测试。
1. 数据恢复 可以通过滚动的方式来对重要的目录进行创建snapshot的操作,这样在系统中就存在针对某个目录的多个快照版本。当用户误删除掉某个文件时,可以通过最新的snapshot来进行相关的恢复操作。
2. 数据备份 可以使用snapshot来进行整个集群,或者某些目录、文件的备份。管理员以某个时刻的snapshot作为备份的起始结点,然后通过比较不同备份之间差异性,来进行增量备份。
3. 数据测试 在某些重要数据上进行测试或者实验,可能会直接将原始的数据破坏掉。可以临时的为用户针对要操作的数据来创建一个snapshot,然后让用户在对应的snapshot上进行相关的实验和测试,从而避免对原始数据的破坏。
2. HDFS 快照的实现
在了解HDFS快照功能如何实现之前,首先有一个根本的原则需要记住:快照不是数据的简单拷贝,快照只做差异的记录。 这一原则在其他很多系统的快照概念中都是适用的,比如磁盘快照,也是不保存真实数据的。因为不保存实际的数据,所以快照的生成往往非常迅速。
在HDFS中,如果在其中一个目录比如/A下创建一个快照,则快照文件中将会存在与/A目录下完全一致的子目录文件结构以及相应的属性信息,通过命令也能看到快照里面具体的文件内容。但是这并不意味着快照已经对此数据进行完全的拷贝 。这里遵循一个原则:对于大多不变的数据,你所看到的数据其实是当前物理路径所指的内容,而发生变更的inode数据才会被快照额外拷贝,也就是所说的差异拷贝。
inode译成中文就是索引节点,它用来存放文件及目录的基本信息,包含时间、名称、拥有者、所在组等信息。
HDFS快照不会复制datanode中的块,只记录了块列表和文件大小。
HDFS快照不会对常规HDFS操作产生不利影响,修改记录按逆时针顺序进行,因此可以直接访问当前数据。通过从当前数据中减去修改来计算快照数据。
3.快照命令
1. 快照功能启动/停止命令
[root@node1 ~]# hdfs dfsadmin Usage: hdfs dfsadmin Note: Administrative commands can only be run as the HDFS superuser. [-allowSnapshot ] [-disallowSnapshot ]

HDFS中可以针对整个文件系统或者文件系统中某个目录创建快照,但是创建快照的前提是相应的目录开启快照的功能。
如果针对没有启动快照功能的目录创建快照则会报错:
Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

启用快照功能:
hdfs dfsadmin -allowSnapshot /allenwoon

禁用快照功能:
hdfs dfsadmin -disallowSnapshot/allenwoon

2. 快照操作相关命令
[root@node1 ~]# hdfs dfs Usage: hadoop fs [generic options] [-createSnapshot[]] [-deleteSnapshot] [-renameSnapshot ][root@node1 ~]# hdfs lsSnapshottableDir [root@node1 ~]# hdfs snapshotDiff

快照相关的操作命令有:createSnapshot创建快照、deleteSnapshot删除快照、renameSnapshot重命名快照、lsSnapshottableDir列出可以快照目录列表、snapshotDiff获取快照差异报告。
4. 案例:快照的使用
1. 开启指定目录的快照
hdfs dfsadmin -allowSnapshot /allenwoon

Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

2. 对指定目录创建快照
hdfs dfs -createSnapshot /allenwoon//系统自动生成快照名称 hdfs dfs -createSnapshot /allenwoon mysnap1//指定名称创建快照

Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

3. 通过web浏览器访问快照
http://node1:9870/explorer.html#/allenwoon/.snapshot

Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

4. 重命名快照
hdfs dfs -renameSnapshot /allenwoon mysnap1 mysnap2

Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

5. 列出当前用户所有可以快照的目录
hdfs lsSnapshottableDir

Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

6. 比较两个快照不同之处
[root@node1 ~]# echo 222 > 2.txt [root@node1 ~]# hadoop fs -appendToFile 2.txt /allenwoon/1.txt [root@node1 ~]# hadoop fs -cat /allenwoon/1.txt 1 222 [root@node1 ~]# hdfs dfs -createSnapshot /allenwoon mysnap3 Created snapshot /allenwoon/.snapshot/mysnap3 [root@node1 ~]# hadoop fs -put zookeeper.out /allenwoon [root@node1 ~]# hdfs dfs -createSnapshot /allenwoon mysnap4 Created snapshot /allenwoon/.snapshot/mysnap4hdfs snapshotDiff /allenwoon mysnap2 mysnap3 hdfs snapshotDiff /allenwoon mysnap2 mysnap4

Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

+The file/directory has been created. -The file/directory has been deleted. MThe file/directory has been modified. RThe file/directory has been renamed.

7. 删除快照
hdfs dfs -deleteSnapshot /allenwoon mysnap4

8. 删除有快照的目录
hadoop fs -rm -r /allenwoon

Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

拥有快照的目录不允许被删除,某种程度上也保护了文件安全。
三. HDFS 权限管理 1. 总览概述
作为分布式文件系统,HDFS也集成了一套兼容POSIX的权限管理系统。客户端在进行每次文件操时,系统会从用户身份认证和数据访问授权两个环节进行验证: 客户端的操作请求会首先通过本地的用户身份验证机制来获得“凭证”(类似于身份证书),然后系统根据此“凭证”分辨出合法的用户名,再据此查看该用户所访问的数据是否已经授权。一旦这个流程中的某个环节出现异常,客户端的操作请求便会失败。
Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

2. UGO权限管理
1. 介绍 HDFS的文件权限与Linux/Unix系统的UGO模型类型类似,可以简单描述为:每个文件和目录都与一个所有者和一个组相关联。该文件或目录对作为所有者(USER)的用户,作为该组成员的其他用户(GROUP) 以及对所有其他用户(OTHER) 具有单独的权限。
不同用户拥有不同权限
在HDFS中,对于文件,需要r权限才能读取文件,而w权限才能写入或追加到文件。没有x可执行文件的概念。
对于目录,需要r权限才能列出目录的内容,需要w权限才能创建或删除文件或目录,并且需要x权限才能访问目录的子级。
2. umask权限掩码 Linux中umask可用来设定权限掩码。权限掩码是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限。
与Linux/Unix系统类似,HDFS也提供了umask掩码,用于设置在HDFS中默认新建的文件和目录权限位。默认umask值有属性fs.permissions.umask-mode指定,默认值022。
创建文件和目录时使用的umask,默认的权限就是:777-022=755。也就是drwxr-xr-x。
3. UGO权限相关命令
hadoop fs -chmod 750 /user/itcast/foo//变更目录或文件的权限位 hadoop fs -chown :portal /user/itcast/foo//变更目录或文件的属主或用户组 hadoop fs -chgrp itcast _group1 /user/itcast/foo//变更用户组

需要注意的是,使用这个命令的用户必须是超级用户,或者是该文件的属主,同时也是该用户组的成员。
4. Web页面修改UGO权限 Hadoop3.0之后,支持在HDFS Web页面上使用鼠标修改。
Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

粘滞位(Sticky bit)用法在目录上设置,如此以来,只有目录内文件的所有者或者root才可以删除或移动该文件。如果不为目录设置粘滞位,任何具有该目录写和执行权限的用户都可以删除和移动其中的文件。实际应用中,粘滞位一般用于/tmp目录,以防止普通用户删除或移动其他用户的文件。
Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护
文章图片

3. 用户身份认证
用户身份认证独立于HDFS之外,也就说HDFS并不负责用户身份合法性检查,但HDFS会通过相关接口来获取相关的用户身份,然后用于后续的权限管理。用户是否合法,完全取决于集群使用认证体系。目前社区支持两种身份认证,即简单认证(Simple)和Kerberos。模式由hadoop.security.authentication属性指定,默认simple。
1. simple 认证 基于客户端所在的Linux/Unix系统的登录用户名来进行认证。只要用户能正常登录就认证成功。客户端与NameNode交互时,会将用户的登录账号(通过类似whoami的命令来获取)作为合法用户名传递至Namenode。 这意味着使用不同的账号登录到同一个客户端,会产生不同的用户名,故在多租户条件这种认证会导致权限混淆;同时恶意用户也可以伪造其他人的用户名非法获得相应的权限,对数据安全造成极大的隐患。线上生产环境一般不会使用。simple认证时,HDFS想法是:防止好人误做坏事,不防止坏人做坏事。
2. Kerberos 认证 Kerberos是麻省理工学院(MIT)开发的一种网络身份认证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。
4. Group Mapping组映射
在用户身份验证成功之后,接下来会检查该用户所拥有的权限。HDFS的文件权限也是采用UGO模型,分成用户、组和其他权限。但与 Linux/Unix 系统不同,HDFS的用户和组都是使用字符串存储的,在 Linux/Unix上通用的UID和GID是无法在HDFS使用的。
此外,HDFS的组需要通过外部的用户组关联(Group Mapping)服务来获取。用户到组的映射可以使用系统自带的方案(使用NameNode服务器上的用户组系统),也可以通过其他实现类似功能的插件(LDAP、Ranger等)方式来代替。在拿到用户名后,NameNode会通过用户组关联服务获取该用户所对应的用户组列表,并用于后期的用户组权限校验。下面是两种主要的实现方式 。
1. 基于Linux/Unix系统的用户和用户组 Linux/Unix系统上的用户和用户组信息存储在/etc/passwd和/etc/group 文件中。默认情况下,HDFS会通过调用外部的 Shell 命令来获取用户的所有用户组列表。 此方案的优点在于组映射服务十分稳定,不易受外部服务的影响。但是用户和用户组管理涉及到root权限等,同时会在服务器上生成大量的用户组,后续管理,特别是自动化运维方面会有较大影响。
2. 基于使用LDAP协议的数据库 OpenLDAP是一个开源LDAP的数据库,通过phpLDAPadmin等管理工具或相关接口可以方便地添加用户和修改用户组。HDFS 可以使用 LdapGroupsMappings 来使用 LDAP 服务。通过配置LDAP的相关属性,可以通过接口来直接获取到某个用户所有的用户组列表(memberOf)。 使用LDAP的不足在于需要保障LDAP服务的可用性和性能,关于LDAP的管理和使用将会后续再作介绍。 不同的LDAP有不同的实现,需要使用不同类型的LDAP Schema来构建,譬如示例中使用的是Person和GroupOfNames类型而不是PosixAccount和PosixGroup类型 以下是开启LDAP关联的配置文件:
hadoop.security.group.mapping org.apache.hadoop.security.LdapGroupsMapping hadoop.security.group.mapping.ldap.bind.user cn=Manager,dc=hadoop,dc=apache,dc=org hadoop.security.group.mapping.ldap.bind.password hadoop hadoop.security.group.mapping.ldap.url ldap://localhost:389/dc=hadoop,dc=apache,dc=org hadoop.security.group.mapping.ldap.url ldap://localhost:389/dc=hadoop,dc=apache,dc=org hadoop.security.group.mapping.ldap.base hadoop.security.group.mapping.ldap.search.filter.user (&(|(objectclass=person)(objectclass=applicationProcess))(cn={0})) hadoop.security.group.mapping.ldap.search.filter.group (objectclass=groupOfNames) hadoop.security.group.mapping.ldap.search.attr.member member 【Hadoop 入门笔记 十五 : HDFS数据安全与隐私保护】hadoop.security.group.mapping.ldap.search.attr.group.name cn

    推荐阅读