默认状况下,运行在emr
上的zeppelin
是未开启用户验证的,这意味着集群安全组内的任何人均可以访问zeppelin
,并在上面运行代码,这无疑是不安全的。咱们经过必定的设置为zeppelin
开启用户验证。html
参考文档Apache Shiro authentication for Apache Zeppelin,ssh
到已经启动的集群的主节点进行设置。python
step
自动设置手动设置须要在每次集群启动后都设置一遍,若是须要频繁启动集群,就很不方便,所以能够在启动集群的时候使用step
来自动设置。
具体来讲,AWS
提供了一个script-runner.jar
,它的路径是s3://<YOUR-AWS-REGION>.elasticmapreduce/libs/script-runner/script-runner.jar
,在启动集群的时候,添加这个jar
包做为step
,指定一个S3
上的shell
脚本做为参数,就能够在启动集群后立刻运行这个脚本了。具体命令以下:shell
aws emr create-cluster --name "Test cluster" ...(省略部分参数) --steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,Jar=s3://<YOUR-AWS-REGION>.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://mybucket/script-path/add_password.sh mypassword"]
该命令启动一个名为Test cluster
的集群,并为zeppelin
的admin
用户加上mypassword
做为密码。add_password.sh
的代码以下:apache
#!/bin/bash password=$1 if test -z "$password" then exit 1 fi aws s3 cp s3://mybucket/script-path/add_password.py /home/hadoop/add_password.py sudo /usr/bin/python3 /home/hadoop/add_password.py $password sudo stop zeppelin sudo start zeppelin exit 0
能够看到,脚本首先从s3
上下载一个python
脚原本完成设置密码的操做,而后再重启zeppelin
使其生效。对应的add_password.py
代码以下安全
#!/usr/bin/python3 import os import time import sys password = str(sys.argv[1]).strip() with open("/etc/zeppelin/conf/shiro.ini", "r") as f: lines = f.readlines() with open("/etc/zeppelin/conf/shiro.ini", "w") as f: for line in lines: if line.startswith('admin ='): f.write('admin = {}\n'.format(password)) elif line.startswith('user'): continue elif line.startswith('/** = anon'): f.write('#/** = anon\n') elif line.startswith('#/** = authc'): f.write('/** = authc\n') else: f.write(line) os.popen('cp /etc/zeppelin/conf/zeppelin-site.xml.template /etc/zeppelin/conf/zeppelin-site.xml') time.sleep(1) with open("/etc/zeppelin/conf/zeppelin-site.xml", "r") as f: lines = f.readlines() with open("/etc/zeppelin/conf/zeppelin-site.xml", "w") as f: for i, line in enumerate(lines): if i > 0 and 'zeppelin.anonymous.allowed' in lines[i-1].strip() and line.strip() == '<value>true</value>': f.write(line.replace('true', 'false')) else: f.write(line)
这个python
脚本写的很简陋,理解就好。bash