安全性
该文档介绍Alluxio安全性相关的的功能。
- 身份验证: 如果
alluxio.security.authentication.type=SIMPLE
(默认情况下), Alluxio文件系统将区分使用服务的用户。要使用其他高级安全特性(如访问权限控制以及审计日志),SIMPLE
身份验证需要被开启。 Alluxio还支持其它身份验证模式,如NOSASL
和CUSTOM
。 - 访问权限控制: 如果是
alluxio.security.authorization.permission.enabled=true
(默认情况下),根据请求用户和要访问的文件或目录的POSIX权限模型,Alluxio文件系统将授予或拒绝用户访问。 注意,身份验证不能是NOSASL
,因为授权需要用户信息。 - 用户模拟:Alluxio支持用户模拟,以便某一个用户可以代表其他用户访问Alluxio。这个机制在Alluxio客户端需要为多个用户提供数据访问的服务的一部分时相当有用。
- 审计: 如果是
alluxio.master.audit.logging.enabled=true
, Alluxio 文件系统 维护用户访问文件元数据的审计日志(audit log)。
参考系统安全相关的配置参数列表的信息以启用不同安全特性。
安全认证
SIMPLE
当alluxio.security.authentication.type
被设置为SIMPLE
时,身份验证被启用。
在客户端访问Alluxio服务之前,该客户端将按以下列次序获取用户信息以汇报给Alluxio服务进行身份验证:
- 如果属性
alluxio.security.login.username
在客户端上被设置,其值将作为 此客户端的登录用户。 - 否则,将从操作系统获取登录用户。
客户端检索用户信息后,将使用该用户信息进行连接该服务。在客户端创建目录/文件之后,将用户信息添加到元数据中 并且可以在CLI和UI中检索。
NOSASL
当alluxio.security.authentication.type
为NOSASL
时,身份验证被禁用。Alluxio服务将忽略客户端的用户,
并不把任何用户信息与创建的文件或目录关联。
CUSTOM
当alluxio.security.authentication.type
为CUSTOM
时,身份验证被启用。Alluxio客户端
检查alluxio.security.authentication.custom.provider.class
类的名称
用于检索用户。此类必须实现alluxio.security.authentication.AuthenticationProvider
接口。
这种模式目前还处于试验阶段,应该只在测试中使用。
访问权限控制
Alluxio文件系统为目录和文件实现了一个访问权限模型,该模型与POSIX标准的访问权限模型类似。
每个文件和目录都与以下各项相关联:
- 一个所属用户,即在client进程中创建该文件或文件夹的用户。
- 一个所属组,即从用户-组映射(user-groups-mapping)服务中获取到的组。参考用户-组映射。
- 访问权限。
访问权限包含以下三个部分:
- 所属用户权限,即该文件的所有者的访问权限
- 所属组权限,即该文件的所属组的访问权限
- 其他用户权限,即上述用户之外的其他所有用户的访问权限
每项权限有三种行为:
- read (r)
- write (w)
- execute (x)
对于文件,读取该文件需要r权限,修改该文件需要w权限。对于目录,列出该目录的内容需要r权限,在该目录下创建、重命名或者删除其子文件或子目录需要w权限,访问该目录下的子项需要x权限。
例如,当启用访问权限控制时,运行shell命令ls -R
后其输出如下:
$ ./bin/alluxio fs ls /
drwxr-xr-x jack staff 24 PERSISTED 11-20-2017 13:24:15:649 DIR /default_tests_files
-rw-r--r-- jack staff 80 NOT_PERSISTED 11-20-2017 13:24:15:649 100% /default_tests_files/BASIC_CACHE_PROMOTE_MUST_CACHE
用户-组映射
当用户确定后,其组列表通过一个组映射服务确定,该服务通过alluxio.security.group.mapping.class
配置,其默认实现是
alluxio.security.group.provider.ShellBasedUnixGroupsMapping
,该实现通过执行groups
shell命令获取一个给定用户的组关系。
用户-组映射默认使用了一种缓存机制,映射关系默认会缓存60秒,这个可以通过alluxio.security.group.mapping.cache.timeout
进行配置,如果这个值设置成为”0”,缓存就不会启用.
alluxio.security.authorization.permission.supergroup
属性定义了一个超级组,该组中的所有用户都是超级用户。
目录和文件初始访问权限
初始创建访问权限是777,并且目录和文件的区别为111。默认的umask值为022,新创建的目录权限为755,文件为644。umask可以通过alluxio.security.authorization.permission.umask
属性设置。
更新目录和文件访问权限
所属用户、所属组以及访问权限可以通过以下两种方式进行修改:
所属用户只能由超级用户修改。 所属组和访问权限只能由超级用户和文件所有者修改。
用户模拟
Alluxio支持用户模拟,以便用户代表另一个用户访问Alluxio。这个机制在Alluxio客户端需要为多个用户提供数据访问的服务的一部分时相当有用。 在这种情况下,可以将Alluxio客户端配置为用特定用户(连接用户)连接到Alluxio服务器,但代表其他用户(模拟用户)行事。 为了让Alluxio支持用户模拟功能,需要在客户端和服务端进行配置。
服务端配置
为了能够让特定的用户模拟其他用户,需要配置Alluxio服务端(master和worker)。服务端的配置属性包括:alluxio.master.security.impersonation.<USERNAME>.users
和 alluxio.master.security.impersonation.<USERNAME>.groups
。
对于alluxio.master.security.impersonation.<USERNAME>.users
,你可以指定由逗号分隔的用户列表,这些用户可以被<USERNAME>
模拟。
通配符*
表示任意的用户可以被<USERNAME>
模拟。以下是例子。
alluxio.master.security.impersonation.alluxio_user.users=user1,user2
- Alluxio用户
alluxio_user
被允许模拟用户user1
以及user2
。
- Alluxio用户
alluxio.master.security.impersonation.client.users=*
- Alluxio用户
client
被允许模拟任意的用户。
- Alluxio用户
对于alluxio.master.security.impersonation.<USERNAME>.groups
,你可以指定由逗号分隔的用户组,这些用户组内的用户可以被<USERNAME>
模拟。
通配符*
表示该用户可以模拟任意的用户。以下是一些例子。
alluxio.master.security.impersonation.alluxio_user.groups=group1,group2
- Alluxio用户
alluxio_user
可以模拟用户group1
以及group2
中的任意用户。
- Alluxio用户
alluxio.master.security.impersonation.client.groups=*
- Alluxio用户
client
可以模拟任意的用户。
- Alluxio用户
为了使得用户alluxio_user
能够模拟其他用户,你至少需要设置alluxio.master.security.impersonation.<USERNAME>.users
和
alluxio.master.security.impersonation.<USERNAME>.groups
的其中一个(将<USERNAME>
替换为alluxio_user
)。你可以将两个参数设置为同一个用户。
客户端配置
如果服务端配置为允许某些用户模拟其他的用户,client端也要进行相应的配置。使用alluxio.security.login.impersonation.username
进行配置。
这样Alluxio的客户端连接到服务的方式不变,但是该客户端模拟的是其他的用户。参数可以设置为以下值:
- 不设置
- 不启用Alluxio client用户模拟
_NONE_
- 不启用Alluxio client用户模拟
_HDFS_USER_
- Alluxio client会模拟HDFS client的用户(当使用Hadoop兼容的client来调用Alluxio时)
异常
应用程序中最可能常见的错误类似于
Failed to authenticate client user="yarn" connecting to Alluxio server and impersonating as
impersonationUser="foo" to access Alluxio file system. User "yarn" is not configured to
allow any impersonation.
这个错误意味着用户yarn
正在试图模拟用户foo
连接到Alluxio,但是Alluxio服务并没有配置允许用户yarn
启用模拟。
为了解决这个问题,Alluxio服务器必须配置允许有问题的用户启用模拟(示例中用户yarn
)
更多的建议可参考该文档 。
审计
Alluxio支持审计日志以便系统管理员能追踪用户对文件元数据的访问操作。
审计日志文件(master_audit.log
) 包括多个审计记录条目,每个条目对应一次获取文件元数据的记录。
Alluxio审计日志格式如下表所示:
key | value |
---|---|
succeeded | 如果命令成功运行,值为true。在命令成功运行前,该命令必须是被允许的。 |
allowed | 如果命令是被允许的,值为true。即使一条命令是被允许的它也可能运行失败。 |
ugi | 用户组信息,包括用户名,主要组,认证类型。 |
ip | 客户端IP地址。 |
cmd | 用户运行的命令。 |
src | 源文件或目录地址。 |
dst | 目标文件或目录的地址。如果不适用,值为空。 |
perm | user:group:mask,如果不适用值为空。 |
它和HDFS审计日志的格式wiki很像。
为了使用Alluxio的审计功能,你需要将JVM参数alluxio.master.audit.logging.enabled
设置为true,具体可见配置文档。
加密
目前,服务层的加解密方案还没有完成,但是用户可以在应用层对敏感数据进行加密,或者是开启底层系统的加密功能,比如,HDFS的透明加解密,Linux的磁盘加密。
部署
推荐由同一个用户启动Alluxio master和workers。Alluxio集群服务包括master和workers,每个worker需要通过RPC与master通信以进行某些文件操作。如果一个worker的用户与master的不一致,这些文件操作可能会由于权限检查而失败。