SecurityManager主要对账号、权限及身份认证进行设置和管理。如果Spark的部署模式为YARN,则需要生成secret_key(密钥)并存入Hadoop UGI;而在其它模式下,则需要设置环境变量_SPARK_AUTH_SECRET(优先级更高)或spark.lauthenticate.secret属性指定secret key(密钥)。SecurityManager还会给当前系统设置默认的口令认证实例,在SparkEnv中创建SecurityManager的代码如下:
val securityManager = new SecurityManager(conf)
SecurityManager有很多内部属性:
private val authOn = sparkConf.getBoolean(SecurityManager.SPARK_AUTH_CONF, false)
// keep spark.ui.acls.enable for backwards compatibility with 1.0
private var aclsOn =
sparkConf.getBoolean("spark.acls.enable", sparkConf.getBoolean("spark.ui.acls.enable", false))
private var adminAcls: Set[String] =
stringToSet(sparkConf.get("spark.admin.acls", ""))
// admin group acls should be set before view or modify group acls
private var adminAclsGroups : Set[String] =
stringToSet(sparkConf.get("spark.admin.acls.groups", ""))
private var viewAcls: Set[String] = _
private var viewAclsGroups: Set[String] = _
// list of users who have permission to modify the application. This should
// apply to both UI and CLI for things like killing the application.
private var modifyAcls: Set[String] = _
private var modifyAclsGroups: Set[String] = _
// always add the current user and SPARK_USER to the viewAcls
private val defaultAclUsers = Set[String](System.getProperty("user.name", ""),
Utils.getCurrentUserName())
private val secretKey = generateSecretKey()
- authOn:是否开启认证。可以通过spark.authenticate属性配置,默认为false
- aclsOn:是否对账号进行授权检查。可通过spark.acls.enable(优先级较高)或spark.ui.acls.enable(此属性是说为了向前兼容)属性进行配置。aclsOn的默认值为false。
- adminAcls:管理员账号集合。可以通过spark.admin.acls属性配置,默认为空。
- adminAclsGroups:管理员账号所在组的集合。可以通过spark.admin.acls.groups属性配置,默认为空。
- viewAcls:有查看权限的账号集合。包扎AdminAcls、defaultAclusers及spark.ui.view.acls属性配置的用户。
- viewAclsGroups:拥有查看权限的账号,所在组的集合。包括adminAclsGroups和spark.ui.view.acls.groups属性配置的用户。
- modifyAcls:有修改权限的账号的集合。包括adminAcls、defaultAclUsers及spark.modify.acls属性配置的用户。
- modifyAclsGroups:拥有修改权限的账号所在组的集合。包括adminAclsGroups和spark.modify.acls.groups属性配置的用户。
- defaultAclUsers:默认用户。包括系统属性user.name指定的用户或系统登录用户或者通过系统环境变量SPARK_USER进行设置的用户。
- secretKey:在YARN模式下,首先使用sparkCookie从Hadoop UGI中获取密钥。如果Hadoop UGI没有保存密钥,则生成新的密钥(密钥长度可以通过spark.authenticate.secretBitLength属性指定)并存入Hadoop UGI。其它模式下,则需要设置环境变量_SPARK_AUTH_SECRET(优先级更高)或spark.authenticate.secret属性指定。
SecurityManager中设置了默认的口令认证实例Authenticator,此实例采用匿名内部类实现,用于每次使用HTTP client从HTTP服务器获取用户的用户名和密码。这是由于Spark的节点间通信往往需要动态协商用户名、密码,这种方式灵活地支持了这种需求。设置默认身份认证器的代码如下:
if (authOn) {
Authenticator.setDefault(
new Authenticator() {
override def getPasswordAuthentication(): PasswordAuthentication = {
var passAuth: PasswordAuthentication = null
val userInfo = getRequestingURL().getUserInfo()
if (userInfo != null) {
val parts = userInfo.split(":", 2)
passAuth = new PasswordAuthentication(parts(0), parts(1).toCharArray())
}
return passAuth
}
}
)
}