Hadoopクラスタの導入権限の概要
64340 ワード
これは、Hadoopクラスタの迅速な導入権限の手順と注意事項を主に説明するまとめの記事です.詳細な手順については、このブログの他の記事を参照してください.
1.開始前
オペレーティングシステムはCentOs 6である.2 HadoopバージョンはCDH 5.2 hostnameはkerberosで大文字と小文字を区別するため、hadoopではhostnameの小文字を を開始する前に、HAを構成するかどうかにかかわらず、hadoopクラスタの導入が正常にインストールされたことを確認し、各ノードの役割を計画してください.ここでは簡単にするために、3つのノードのクラスタを例に説明します.本稿を参考にして、実際の状況と結びつけて調整することができます. ファイアウォールが閉じられていることを確認し、クラスタ内でkerberosおよびldapサーバとクロック同期を維持してください. cdh 1は管理ノードであるため、cdh 1からクラスタのすべてのノードへのパスワードレスログインを行う必要があり、それ自体を含む.
クラスタ内の各ノードのhostsは次のとおりです.
クラスタの管理を容易にするために、cdh 1を管理ノードとして使用し、/opt/shellディレクトリにいくつかのスクリプトを作成し、/opt/shell/cmd.sh一括実行コマンド:
/opt/shell/cmd.sh一括実行コマンド:
/opt/shell/cluster.shクラスタの各サービスを一括メンテナンスするために使用される:
2.kerberosのインストール
dw_defaultライブラリ:読み取り権限 dw_userライブラリt 1テーブル:読み取り権限 dw_userライブラリt 2テーブル:読み取り権限 LDAPサーバにLDAPユーザーを追加し、パスワードを設定します.まずシステムユーザーを追加します.
次に、LDAPツールを使用してユーザーをLDAPにインポートします.
test 2ユーザーにランダムパスワードを生成し、LDAPのtest 2のパスワードを変更します.
各datanodeマシンにtest 2ユーザーとsecureを作成します.analystパケット、test 2はsecure_に属するanalystグループ:
hiveでロールを作成するには:
その後、impalaがメタデータをリフレッシュし、テストを行う必要があります.impala-catalogをリフレッシュするには、impala-catalogに時間がかかる場合があります.
最後にテストを行います.この部分は省略します.
1.開始前
hadoopクラスタには3つのノードがあり、各ノードのip、hostname、ロールは以下の通りです.192.168.56.121 cdh1 NameNode、kerberos-server、ldap-server、sentry-store
192.168.56.122 cdh2 DataNode、yarn、hive、impala
192.168.56.123 cdh3 DataNode、yarn、hive、impala
いくつかの注意事項:
192.168.56.121 cdh1 NameNode、kerberos-server、ldap-server、sentry-store
192.168.56.122 cdh2 DataNode、yarn、hive、impala
192.168.56.123 cdh3 DataNode、yarn、hive、impala
_HOST
、impalaでは直接hostnameを_HOST
に置き換えます.クラスタ内の各ノードのhostsは次のとおりです.
$ cat /etc/hosts
127.0.0.1 localhost
192.168.56.121 cdh1
192.168.56.122 cdh2
192.168.56.123 cdh3
クラスタの管理を容易にするために、cdh 1を管理ノードとして使用し、/opt/shellディレクトリにいくつかのスクリプトを作成し、/opt/shell/cmd.sh一括実行コマンド:
$ cat /opt/shell/cmd.sh
#!/bin/sh
for node in 121 122 123;do
echo "==============="192.168.56.$node"==============="
ssh 192.168.56.$node $1
done
/opt/shell/cmd.sh一括実行コマンド:
$ cat /opt/shell/syn.sh
#!/bin/sh
for node in 121 122 123;do
echo "==============="192.168.56.$node"==============="
scp -r $1 192.168.56.$node:$2
done
/opt/shell/cluster.shクラスタの各サービスを一括メンテナンスするために使用される:
$ cat /opt/shell/cluster.sh
#!/bin/sh
for node in 121 122 123;do
echo "==============="192.168.56.$node"==============="
ssh 192.168.56.$node 'for src in `ls /etc/init.d|grep '$1'`;do service $src '$2'; done'
done
2.kerberosのインストール
cdh 1ノードで/etc/krb 5を変更する.confは以下の通りです.[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = JAVACHEN.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
default_tgs_enctypes = aes256-cts-hmac-sha1-96
default_tkt_enctypes = aes256-cts-hmac-sha1-96
permitted_enctypes = aes256-cts-hmac-sha1-96
clockskew = 120
udp_preference_limit = 1
[realms]
JAVACHEN.COM = {
kdc = cdh1
admin_server = cdh1
}
[domain_realm]
.javachen.com = JAVACHEN.COM
javachen.com = JAVACHEN.COM
変更/var/kerberos/krb 5 kdc/kdc.confは以下の通りです.[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
JAVACHEN.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
max_renewable_life = 7d
max_life = 1d
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
default_principal_flags = +renewable, +forwardable
}
変更/var/kerberos/krb 5 kdc/kadm 5.aclは次のとおりです.*/[email protected] *
cdh 1上の/etc/krb 5を.confはクラスタの各ノードに同期します.sh /opt/shell/syn.sh /etc/krb5.conf /etc/krb5.conf
kerberosをインストールして初期化するスクリプトが書かれています(詳細はinstall_kerberos.shとinit_kerberos.shを参照してください):# install the kerberos components
yum install -y krb5-server
yum install -y openldap-clients
yum install -y krb5-workstation
rm -rf /var/kerberos/krb5kdc/*.keytab /var/kerberos/krb5kdc/prin*
kdb5_util create -r JAVACHEN.COM -s
chkconfig --level 35 krb5kdc on
chkconfig --level 35 kadmin on
service krb5kdc restart
service kadmin restart
echo -e "root
root" | kadmin.local -q "addprinc root/admin"
DNS=JAVACHEN.COM
HOSTNAME=`hostname -i`
# /etc/host ip 192.168.56 (kerberos )
for host in `cat /etc/hosts|grep 192.168.56|grep -v $HOSTNAME|awk '{print $2}'` ;do
for user in hdfs; do
kadmin.local -q "addprinc -randkey $user/$host@$DNS"
kadmin.local -q "xst -k /var/kerberos/krb5kdc/$user-un.keytab $user/$host@$DNS"
done
for user in HTTP hive yarn mapred impala zookeeper zkcli hbase llama sentry solr hue; do
kadmin.local -q "addprinc -randkey $user/$host@$DNS"
kadmin.local -q "xst -k /var/kerberos/krb5kdc/$user.keytab $user/$host@$DNS"
done
done
#
cd /var/kerberos/krb5kdc/
echo -e "rkt hdfs-un.keytab
rkt HTTP.keytab
wkt hdfs.keytab" | ktutil
#kerberos , ldap
kadmin.local -q "addprinc [email protected]"
kadmin.local -q "addprinc -randkey ldap/[email protected]"
kadmin.local -q "ktadd -k /etc/openldap/ldap.keytab ldap/[email protected]"
/etc/init.d/slapd restart
# ldap
ldapsearch -x -b 'dc=javachen,dc=com'
上のスクリプトを実行し、上で生成したkeytabを他のノードに同期して権限を設定します.sh /opt/shell/syn.sh /opt/keytab/hdfs.keytab /etc/hadoop/conf/
sh /opt/shell/syn.sh /opt/keytab/mapred.keytab /etc/hadoop/conf/
sh /opt/shell/syn.sh /opt/keytab/yarn.keytab /etc/hadoop/conf/
sh /opt/shell/syn.sh /opt/keytab/hive.keytab /etc/hive/conf/
sh /opt/shell/syn.sh /opt/keytab/impala.keytab /etc/impala/conf/
sh /opt/shell/syn.sh /opt/keytab/zookeeper.keytab /etc/zookeeper/conf/
sh /opt/shell/syn.sh /opt/keytab/zkcli.keytab /etc/zookeeper/conf/
sh /opt/shell/syn.sh /opt/keytab/sentry.keytab /etc/sentry/conf/
sh /opt/shell/cmd.sh "chown hdfs:hadoop /etc/hadoop/conf/hdfs.keytab ;chmod 400 /etc/hadoop/conf/*.keytab"
sh /opt/shell/cmd.sh "chown mapred:hadoop /etc/hadoop/conf/mapred.keytab ;chmod 400 /etc/hadoop/conf/*.keytab"
sh /opt/shell/cmd.sh "chown yarn:hadoop /etc/hadoop/conf/yarn.keytab ;chmod 400 /etc/hadoop/conf/*.keytab"
sh /opt/shell/cmd.sh "chown hive:hadoop /etc/hive/conf/hive.keytab ;chmod 400 /etc/hive/conf/*.keytab"
sh /opt/shell/cmd.sh "chown impala:hadoop /etc/impala/conf/impala.keytab ;chmod 400 /etc/impala/conf/*.keytab"
sh /opt/shell/cmd.sh "chown zookeeper:hadoop /etc/zookeeper/conf/*.keytab ;chmod 400 /etc/zookeeper/conf/*.keytab"
# sentry cdh1
chown sentry:hadoop /etc/sentry/conf/*.keytab ;chmod 400 /etc/sentry/conf/*.keytab
クラスタ内の各ノードにkerberosクライアントをインストールします.sh /opt/shell/cmd.sh "yum install krb5-workstation -y"
root/adminユーザーのticketを一括取得sh /opt/shell/cmd.sh "echo root|kinit root/admin"
3.hadoop集積kerberos
各ノードのJCEファイルを更新し、/etc/default/hadoop-hdfs-datanodeを変更し、hdfs、yarn、mapred、hiveのプロファイルを変更します.
HAが構成されている場合は、zookeeper統合kerberosを先に構成します.
同期プロファイル:sh /opt/shell/syn.sh /etc/hadoop/conf /etc/hadoop
sh /opt/shell/syn.sh /etc/zookeeper/conf /etc/zookeeper
sh /opt/shell/cmd.sh "cd /etc/hadoop/conf/; chown root:yarn container-executor.cfg ; chmod 400 container-executor.cfg"
sh /opt/shell/syn.sh /etc/hive/conf /etc/hive
次に、各サービスに対応するticketを順次取得し、対応するサービスを開始します.スクリプト/opt/shell/manager_を作成しました.cluster.shはこのことをします.#!/bin/bash
role=$1
dir=$role
command=$2
if [ X"$role" == X"hdfs" ];then
dir=hadoop
fi
if [ X"$role" == X"yarn" ];then
dir=hadoop
fi
if [ X"$role" == X"mapred" ];then
dir=hadoop
fi
echo $dir $role $command
for node in 121 122 123 ;do
echo "========192.168.56.$node========"
ssh 192.168.56.$node '
host=`hostname -f| tr "[:upper:]" "[:lower:]"`
path="'$role'/$host"
#echo $path
principal=`klist -k /etc/'$dir'/conf/'$role'.keytab | grep $path | head -n1 | cut -d " " -f5`
echo $principal
if [ X"$principal" == X ]; then
principal=`klist -k /etc/'$dir'/conf/'$role'.keytab | grep $path | head -n1 | cut -d " " -f4`
echo $principal
if [ X"$principal" == X ]; then
echo "Failed to get hdfs Kerberos principal"
exit 1
fi
fi
kinit -r 24l -kt /etc/'$dir'/conf/'$role'.keytab $principal
if [ $? -ne 0 ]; then
echo "Failed to login as hdfs by kinit command"
exit 1
fi
kinit -R
for src in `ls /etc/init.d|grep '$role'`;do service $src '$command'; done
'
done
起動コマンド:# zookeeper
sh /opt/shell/manager_cluster.sh zookeeper restart
# hdfs ticket
sh /opt/shell/manager_cluster.sh hdfs status
# hadoop-hdfs-zkfc、hadoop-hdfs-journalnode、hadoop-hdfs-namenode、hadoop-hdfs-datanode
sh /opt/shell/cluster.sh hadoop-hdfs-zkfc restart
sh /opt/shell/cluster.sh hadoop-hdfs-journalnode restart
sh /opt/shell/cluster.sh hadoop-hdfs-namenode restart
sh /opt/shell/cluster.sh hadoop-hdfs-datanode restart
sh /opt/shell/manager_cluster.sh yarn restart
sh /opt/shell/manager_cluster.sh mapred restart
sh /opt/shell/manager_cluster.sh hive restart
impalaプロファイルを変更し、他のノードに同期し、impalaサービスを開始します.\cp /etc/hadoop/conf/core-site.xml /etc/impala/conf/
\cp /etc/hadoop/conf/hdfs-site.xml /etc/impala/conf/
\cp /etc/hive/conf/hive-site.xml /etc/impala/conf/
sh /opt/shell/syn.sh /etc/impala/conf /etc/impala/
sh /opt/shell/syn.sh /etc/default/impala /etc/default/impala
sh /opt/shell/manager_cluster.sh impala restart
これでクラスタの起動に成功したはずです.
3 javaコードを使用してkerberosをテストする
hdfsにkerberosを統合する前に、次のコード(Krb.java)を使用してテストできます.import com.sun.security.auth.module.Krb5LoginModule;
import javax.security.auth.Subject;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class Krb {
private void loginImpl(final String propertiesFileName) throws Exception {
System.out.println("NB: system property to specify the krb5 config: [java.security.krb5.conf]");
//System.setProperty("java.security.krb5.conf", "/etc/krb5.conf");
System.out.println(System.getProperty("java.version"));
System.setProperty("sun.security.krb5.debug", "true");
final Subject subject = new Subject();
final Krb5LoginModule krb5LoginModule = new Krb5LoginModule();
final Map<String,String> optionMap = new HashMap<String,String>();
if (propertiesFileName == null) {
//optionMap.put("ticketCache", "/tmp/krb5cc_1000");
optionMap.put("keyTab", "/etc/krb5.keytab");
optionMap.put("principal", "foo"); // default realm
optionMap.put("doNotPrompt", "true");
optionMap.put("refreshKrb5Config", "true");
optionMap.put("useTicketCache", "true");
optionMap.put("renewTGT", "true");
optionMap.put("useKeyTab", "true");
optionMap.put("storeKey", "true");
optionMap.put("isInitiator", "true");
} else {
File f = new File(propertiesFileName);
System.out.println("======= loading property file ["+f.getAbsolutePath()+"]");
Properties p = new Properties();
InputStream is = new FileInputStream(f);
try {
p.load(is);
} finally {
is.close();
}
optionMap.putAll((Map)p);
}
optionMap.put("debug", "true"); // switch on debug of the Java implementation
krb5LoginModule.initialize(subject, null, new HashMap<String,String>(), optionMap);
boolean loginOk = krb5LoginModule.login();
System.out.println("======= login: " + loginOk);
boolean commitOk = krb5LoginModule.commit();
System.out.println("======= commit: " + commitOk);
System.out.println("======= Subject: " + subject);
}
public static void main(String[] args) throws Exception {
System.out.println("A property file with the login context can be specified as the 1st and the only paramater.");
final Krb krb = new Krb();
krb.loginImpl(args.length == 0 ? null : args[0]);
}
}
プロファイルkrb 5を作成する.properties: keyTab=/etc/hadoop/conf/hdfs.keytab
principal=hdfs/[email protected]
doNotPrompt=true
refreshKrb5Config=true
useTicketCache=true
renewTGT=true
useKeyTab=true
storeKey=true
isInitiator=true
Javaコードをコンパイルして実行します.
# ticket
$ kdestroy
$ javac Krb.java
$ java -cp . Krb ./krb5.properties
4.ldapのインストール
次のコマンドを使用してcdh 1ノードにldap-serverを迅速にインストールします.yum install db4 db4-utils db4-devel cyrus-sasl* krb5-server-ldap -y
yum install openldap openldap-servers openldap-clients openldap-devel compat-openldap -y
# :
rm -rf /var/lib/ldap/*
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap.ldap /var/lib/ldap
# slapd-conf
cp -rf /etc/openldap/slapd.d /etc/openldap/slapd.d.bak
cp /usr/share/doc/krb5-server-ldap-1.10.3/kerberos.schema /etc/openldap/schema/
touch /etc/openldap/slapd.conf
echo "include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
include /etc/openldap/schema/kerberos.schema" > /etc/openldap/slapd.conf
echo -e "pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args" >> /etc/openldap/slapd.conf
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
chown -R ldap:ldap /etc/openldap/slapd.d && chmod -R 700 /etc/openldap/slapd.d
#
chkconfig --add slapd
chkconfig --level 345 slapd on
/etc/init.d/slapd restart
統合kerberos:#
kadmin.local -q "addprinc [email protected]"
kadmin.local -q "addprinc -randkey ldap/[email protected]"
rm -rf /etc/openldap/ldap.keytab
kadmin.local -q "ktadd -k /etc/openldap/ldap.keytab ldap/[email protected]"
chown -R ldap:ldap /etc/openldap/ldap.keytab
/etc/init.d/slapd restart
modifyを作成する.ldifファイルは、データベースを更新するために使用されます.dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=javachen,dc=com
dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcRootDN
# Temporary lines to allow initial setup
olcRootDN: uid=ldapadmin,ou=people,dc=javachen,dc=com
dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: secret
dn: cn=config
changetype: modify
add: olcAuthzRegexp
olcAuthzRegexp: uid=([^,]*),cn=GSSAPI,cn=auth uid=$1,ou=people,dc=javachen,dc=com
dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcAccess
# Everyone can read everything
olcAccess: {0}to dn.base="" by * read
# The ldapadm dn has full write access
olcAccess: {1}to * by dn="uid=ldapadmin,ou=people,dc=javachen,dc=com" write by * read
次のコマンドを実行してデータベースを更新します.ldapmodify -Y EXTERNAL -H ldapi:/// -f modify.ldif
ユーザーとグループを追加し、setupを作成します.ldifは次のとおりです.dn: dc=javachen,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: javachen com
dc: javachen
dn: ou=people,dc=javachen,dc=com
objectclass: organizationalUnit
ou: people
description: Users
dn: ou=group,dc=javachen,dc=com
objectClass: organizationalUnit
ou: group
dn: uid=ldapadmin,ou=people,dc=javachen,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: LDAP admin account
uid: ldapadmin
sn: ldapadmin
uidNumber: 1001
gidNumber: 100
homeDirectory: /home/ldap
loginShell: /bin/bash
次のコマンドを実行してデータベースにインポートします.ldapadd -x -D "uid=ldapadmin,ou=people,dc=javachen,dc=com" -w secret -f setup.ldif
次に、ldapサーバ上にローカルシステムユーザを作成し、ldapサービスにインポートできます.
migrationtoolsをインストールしてから/usr/share/migrationtools/migrarate_を変更します.common.phファイルのdefalut DNS domainとdefalut base.
# admin
groupadd admin
# test hive , sentry
useradd test hive
usermod -G admin test
usermod -G admin hive
# ldap
grep -E "bi_|hive|test" /etc/passwd >/opt/passwd.txt
/usr/share/migrationtools/migrate_passwd.pl /opt/passwd.txt /opt/passwd.ldif
ldapadd -x -D "uid=ldapadmin,ou=people,dc=javachen,dc=com" -w secret -f /opt/passwd.ldif
# admin ldap
grep -E "admin" /etc/group >/opt/group.txt
/usr/share/migrationtools/migrate_group.pl /opt/group.txt /opt/group.ldif
ldapadd -x -D "uid=ldapadmin,ou=people,dc=javachen,dc=com" -w secret -f /opt/group.ldif
次に、ユーザーごとにパスワードを設定し、次のコマンドを使用します.ldappasswd -x -D 'uid=ldapadmin,ou=people,dc=javachen,dc=com' -w secret "uid=hive,ou=people,dc=javachen,dc=com" -S
また、これらのユーザーとグループはldapサーバに存在し、hadoopの各ノードにリモートでマウントする必要があります.そうしないと、各ノードに対応するユーザーとグループを作成する必要があります(現在、テストはそうです).
6.統合sentry
このセクションでは、データベースを使用してルールを格納することを推奨します.本番環境ではファイル保存を推奨しません.
詳細な構成は、ImpalaとHive統合Sentryを参照してください.
beelineでhive/[email protected]
接続hive-server 2を使用して、いくつかのロールとグループを作成します.create role admin_role;
GRANT ALL ON SERVER server1 TO ROLE admin_role;
GRANT ROLE admin_role TO GROUP admin;
GRANT ROLE admin_role TO GROUP hive;
create role test_role;
GRANT ALL ON DATABASE testdb TO ROLE test_role;
GRANT ALL ON DATABASE default TO ROLE test_role;
GRANT ROLE test_role TO GROUP test;
上のamdinグループとhiveグループにはすべてのデータベースの管理者権限があり、testグループにはtestdbとdefaultライブラリの読み書き権限しかありません.
impala-shellではldapで異なるユーザーに転送され、読み書き権限をテストできます.
7.新しいユーザーを追加して権限を設定する方法
次にtest 2アカウントを例に、新しいユーザーを追加してアクセス権を設定する方法を説明します.test 2には以下の権限が必要です
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = JAVACHEN.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
default_tgs_enctypes = aes256-cts-hmac-sha1-96
default_tkt_enctypes = aes256-cts-hmac-sha1-96
permitted_enctypes = aes256-cts-hmac-sha1-96
clockskew = 120
udp_preference_limit = 1
[realms]
JAVACHEN.COM = {
kdc = cdh1
admin_server = cdh1
}
[domain_realm]
.javachen.com = JAVACHEN.COM
javachen.com = JAVACHEN.COM
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
JAVACHEN.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
max_renewable_life = 7d
max_life = 1d
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
default_principal_flags = +renewable, +forwardable
}
*/[email protected] *
sh /opt/shell/syn.sh /etc/krb5.conf /etc/krb5.conf
# install the kerberos components
yum install -y krb5-server
yum install -y openldap-clients
yum install -y krb5-workstation
rm -rf /var/kerberos/krb5kdc/*.keytab /var/kerberos/krb5kdc/prin*
kdb5_util create -r JAVACHEN.COM -s
chkconfig --level 35 krb5kdc on
chkconfig --level 35 kadmin on
service krb5kdc restart
service kadmin restart
echo -e "root
root" | kadmin.local -q "addprinc root/admin"
DNS=JAVACHEN.COM
HOSTNAME=`hostname -i`
# /etc/host ip 192.168.56 (kerberos )
for host in `cat /etc/hosts|grep 192.168.56|grep -v $HOSTNAME|awk '{print $2}'` ;do
for user in hdfs; do
kadmin.local -q "addprinc -randkey $user/$host@$DNS"
kadmin.local -q "xst -k /var/kerberos/krb5kdc/$user-un.keytab $user/$host@$DNS"
done
for user in HTTP hive yarn mapred impala zookeeper zkcli hbase llama sentry solr hue; do
kadmin.local -q "addprinc -randkey $user/$host@$DNS"
kadmin.local -q "xst -k /var/kerberos/krb5kdc/$user.keytab $user/$host@$DNS"
done
done
#
cd /var/kerberos/krb5kdc/
echo -e "rkt hdfs-un.keytab
rkt HTTP.keytab
wkt hdfs.keytab" | ktutil
#kerberos , ldap
kadmin.local -q "addprinc [email protected]"
kadmin.local -q "addprinc -randkey ldap/[email protected]"
kadmin.local -q "ktadd -k /etc/openldap/ldap.keytab ldap/[email protected]"
/etc/init.d/slapd restart
# ldap
ldapsearch -x -b 'dc=javachen,dc=com'
sh /opt/shell/syn.sh /opt/keytab/hdfs.keytab /etc/hadoop/conf/
sh /opt/shell/syn.sh /opt/keytab/mapred.keytab /etc/hadoop/conf/
sh /opt/shell/syn.sh /opt/keytab/yarn.keytab /etc/hadoop/conf/
sh /opt/shell/syn.sh /opt/keytab/hive.keytab /etc/hive/conf/
sh /opt/shell/syn.sh /opt/keytab/impala.keytab /etc/impala/conf/
sh /opt/shell/syn.sh /opt/keytab/zookeeper.keytab /etc/zookeeper/conf/
sh /opt/shell/syn.sh /opt/keytab/zkcli.keytab /etc/zookeeper/conf/
sh /opt/shell/syn.sh /opt/keytab/sentry.keytab /etc/sentry/conf/
sh /opt/shell/cmd.sh "chown hdfs:hadoop /etc/hadoop/conf/hdfs.keytab ;chmod 400 /etc/hadoop/conf/*.keytab"
sh /opt/shell/cmd.sh "chown mapred:hadoop /etc/hadoop/conf/mapred.keytab ;chmod 400 /etc/hadoop/conf/*.keytab"
sh /opt/shell/cmd.sh "chown yarn:hadoop /etc/hadoop/conf/yarn.keytab ;chmod 400 /etc/hadoop/conf/*.keytab"
sh /opt/shell/cmd.sh "chown hive:hadoop /etc/hive/conf/hive.keytab ;chmod 400 /etc/hive/conf/*.keytab"
sh /opt/shell/cmd.sh "chown impala:hadoop /etc/impala/conf/impala.keytab ;chmod 400 /etc/impala/conf/*.keytab"
sh /opt/shell/cmd.sh "chown zookeeper:hadoop /etc/zookeeper/conf/*.keytab ;chmod 400 /etc/zookeeper/conf/*.keytab"
# sentry cdh1
chown sentry:hadoop /etc/sentry/conf/*.keytab ;chmod 400 /etc/sentry/conf/*.keytab
sh /opt/shell/cmd.sh "yum install krb5-workstation -y"
sh /opt/shell/cmd.sh "echo root|kinit root/admin"
各ノードのJCEファイルを更新し、/etc/default/hadoop-hdfs-datanodeを変更し、hdfs、yarn、mapred、hiveのプロファイルを変更します.
HAが構成されている場合は、zookeeper統合kerberosを先に構成します.
同期プロファイル:
sh /opt/shell/syn.sh /etc/hadoop/conf /etc/hadoop
sh /opt/shell/syn.sh /etc/zookeeper/conf /etc/zookeeper
sh /opt/shell/cmd.sh "cd /etc/hadoop/conf/; chown root:yarn container-executor.cfg ; chmod 400 container-executor.cfg"
sh /opt/shell/syn.sh /etc/hive/conf /etc/hive
次に、各サービスに対応するticketを順次取得し、対応するサービスを開始します.スクリプト/opt/shell/manager_を作成しました.cluster.shはこのことをします.
#!/bin/bash
role=$1
dir=$role
command=$2
if [ X"$role" == X"hdfs" ];then
dir=hadoop
fi
if [ X"$role" == X"yarn" ];then
dir=hadoop
fi
if [ X"$role" == X"mapred" ];then
dir=hadoop
fi
echo $dir $role $command
for node in 121 122 123 ;do
echo "========192.168.56.$node========"
ssh 192.168.56.$node '
host=`hostname -f| tr "[:upper:]" "[:lower:]"`
path="'$role'/$host"
#echo $path
principal=`klist -k /etc/'$dir'/conf/'$role'.keytab | grep $path | head -n1 | cut -d " " -f5`
echo $principal
if [ X"$principal" == X ]; then
principal=`klist -k /etc/'$dir'/conf/'$role'.keytab | grep $path | head -n1 | cut -d " " -f4`
echo $principal
if [ X"$principal" == X ]; then
echo "Failed to get hdfs Kerberos principal"
exit 1
fi
fi
kinit -r 24l -kt /etc/'$dir'/conf/'$role'.keytab $principal
if [ $? -ne 0 ]; then
echo "Failed to login as hdfs by kinit command"
exit 1
fi
kinit -R
for src in `ls /etc/init.d|grep '$role'`;do service $src '$command'; done
'
done
起動コマンド:
# zookeeper
sh /opt/shell/manager_cluster.sh zookeeper restart
# hdfs ticket
sh /opt/shell/manager_cluster.sh hdfs status
# hadoop-hdfs-zkfc、hadoop-hdfs-journalnode、hadoop-hdfs-namenode、hadoop-hdfs-datanode
sh /opt/shell/cluster.sh hadoop-hdfs-zkfc restart
sh /opt/shell/cluster.sh hadoop-hdfs-journalnode restart
sh /opt/shell/cluster.sh hadoop-hdfs-namenode restart
sh /opt/shell/cluster.sh hadoop-hdfs-datanode restart
sh /opt/shell/manager_cluster.sh yarn restart
sh /opt/shell/manager_cluster.sh mapred restart
sh /opt/shell/manager_cluster.sh hive restart
impalaプロファイルを変更し、他のノードに同期し、impalaサービスを開始します.
\cp /etc/hadoop/conf/core-site.xml /etc/impala/conf/
\cp /etc/hadoop/conf/hdfs-site.xml /etc/impala/conf/
\cp /etc/hive/conf/hive-site.xml /etc/impala/conf/
sh /opt/shell/syn.sh /etc/impala/conf /etc/impala/
sh /opt/shell/syn.sh /etc/default/impala /etc/default/impala
sh /opt/shell/manager_cluster.sh impala restart
これでクラスタの起動に成功したはずです.
3 javaコードを使用してkerberosをテストする
hdfsにkerberosを統合する前に、次のコード(Krb.java)を使用してテストできます.import com.sun.security.auth.module.Krb5LoginModule;
import javax.security.auth.Subject;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class Krb {
private void loginImpl(final String propertiesFileName) throws Exception {
System.out.println("NB: system property to specify the krb5 config: [java.security.krb5.conf]");
//System.setProperty("java.security.krb5.conf", "/etc/krb5.conf");
System.out.println(System.getProperty("java.version"));
System.setProperty("sun.security.krb5.debug", "true");
final Subject subject = new Subject();
final Krb5LoginModule krb5LoginModule = new Krb5LoginModule();
final Map<String,String> optionMap = new HashMap<String,String>();
if (propertiesFileName == null) {
//optionMap.put("ticketCache", "/tmp/krb5cc_1000");
optionMap.put("keyTab", "/etc/krb5.keytab");
optionMap.put("principal", "foo"); // default realm
optionMap.put("doNotPrompt", "true");
optionMap.put("refreshKrb5Config", "true");
optionMap.put("useTicketCache", "true");
optionMap.put("renewTGT", "true");
optionMap.put("useKeyTab", "true");
optionMap.put("storeKey", "true");
optionMap.put("isInitiator", "true");
} else {
File f = new File(propertiesFileName);
System.out.println("======= loading property file ["+f.getAbsolutePath()+"]");
Properties p = new Properties();
InputStream is = new FileInputStream(f);
try {
p.load(is);
} finally {
is.close();
}
optionMap.putAll((Map)p);
}
optionMap.put("debug", "true"); // switch on debug of the Java implementation
krb5LoginModule.initialize(subject, null, new HashMap<String,String>(), optionMap);
boolean loginOk = krb5LoginModule.login();
System.out.println("======= login: " + loginOk);
boolean commitOk = krb5LoginModule.commit();
System.out.println("======= commit: " + commitOk);
System.out.println("======= Subject: " + subject);
}
public static void main(String[] args) throws Exception {
System.out.println("A property file with the login context can be specified as the 1st and the only paramater.");
final Krb krb = new Krb();
krb.loginImpl(args.length == 0 ? null : args[0]);
}
}
プロファイルkrb 5を作成する.properties: keyTab=/etc/hadoop/conf/hdfs.keytab
principal=hdfs/[email protected]
doNotPrompt=true
refreshKrb5Config=true
useTicketCache=true
renewTGT=true
useKeyTab=true
storeKey=true
isInitiator=true
Javaコードをコンパイルして実行します.
# ticket
$ kdestroy
$ javac Krb.java
$ java -cp . Krb ./krb5.properties
4.ldapのインストール
次のコマンドを使用してcdh 1ノードにldap-serverを迅速にインストールします.yum install db4 db4-utils db4-devel cyrus-sasl* krb5-server-ldap -y
yum install openldap openldap-servers openldap-clients openldap-devel compat-openldap -y
# :
rm -rf /var/lib/ldap/*
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap.ldap /var/lib/ldap
# slapd-conf
cp -rf /etc/openldap/slapd.d /etc/openldap/slapd.d.bak
cp /usr/share/doc/krb5-server-ldap-1.10.3/kerberos.schema /etc/openldap/schema/
touch /etc/openldap/slapd.conf
echo "include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
include /etc/openldap/schema/kerberos.schema" > /etc/openldap/slapd.conf
echo -e "pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args" >> /etc/openldap/slapd.conf
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
chown -R ldap:ldap /etc/openldap/slapd.d && chmod -R 700 /etc/openldap/slapd.d
#
chkconfig --add slapd
chkconfig --level 345 slapd on
/etc/init.d/slapd restart
統合kerberos:#
kadmin.local -q "addprinc [email protected]"
kadmin.local -q "addprinc -randkey ldap/[email protected]"
rm -rf /etc/openldap/ldap.keytab
kadmin.local -q "ktadd -k /etc/openldap/ldap.keytab ldap/[email protected]"
chown -R ldap:ldap /etc/openldap/ldap.keytab
/etc/init.d/slapd restart
modifyを作成する.ldifファイルは、データベースを更新するために使用されます.dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=javachen,dc=com
dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcRootDN
# Temporary lines to allow initial setup
olcRootDN: uid=ldapadmin,ou=people,dc=javachen,dc=com
dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: secret
dn: cn=config
changetype: modify
add: olcAuthzRegexp
olcAuthzRegexp: uid=([^,]*),cn=GSSAPI,cn=auth uid=$1,ou=people,dc=javachen,dc=com
dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcAccess
# Everyone can read everything
olcAccess: {0}to dn.base="" by * read
# The ldapadm dn has full write access
olcAccess: {1}to * by dn="uid=ldapadmin,ou=people,dc=javachen,dc=com" write by * read
次のコマンドを実行してデータベースを更新します.ldapmodify -Y EXTERNAL -H ldapi:/// -f modify.ldif
ユーザーとグループを追加し、setupを作成します.ldifは次のとおりです.dn: dc=javachen,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: javachen com
dc: javachen
dn: ou=people,dc=javachen,dc=com
objectclass: organizationalUnit
ou: people
description: Users
dn: ou=group,dc=javachen,dc=com
objectClass: organizationalUnit
ou: group
dn: uid=ldapadmin,ou=people,dc=javachen,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: LDAP admin account
uid: ldapadmin
sn: ldapadmin
uidNumber: 1001
gidNumber: 100
homeDirectory: /home/ldap
loginShell: /bin/bash
次のコマンドを実行してデータベースにインポートします.ldapadd -x -D "uid=ldapadmin,ou=people,dc=javachen,dc=com" -w secret -f setup.ldif
次に、ldapサーバ上にローカルシステムユーザを作成し、ldapサービスにインポートできます.
migrationtoolsをインストールしてから/usr/share/migrationtools/migrarate_を変更します.common.phファイルのdefalut DNS domainとdefalut base.
# admin
groupadd admin
# test hive , sentry
useradd test hive
usermod -G admin test
usermod -G admin hive
# ldap
grep -E "bi_|hive|test" /etc/passwd >/opt/passwd.txt
/usr/share/migrationtools/migrate_passwd.pl /opt/passwd.txt /opt/passwd.ldif
ldapadd -x -D "uid=ldapadmin,ou=people,dc=javachen,dc=com" -w secret -f /opt/passwd.ldif
# admin ldap
grep -E "admin" /etc/group >/opt/group.txt
/usr/share/migrationtools/migrate_group.pl /opt/group.txt /opt/group.ldif
ldapadd -x -D "uid=ldapadmin,ou=people,dc=javachen,dc=com" -w secret -f /opt/group.ldif
次に、ユーザーごとにパスワードを設定し、次のコマンドを使用します.ldappasswd -x -D 'uid=ldapadmin,ou=people,dc=javachen,dc=com' -w secret "uid=hive,ou=people,dc=javachen,dc=com" -S
また、これらのユーザーとグループはldapサーバに存在し、hadoopの各ノードにリモートでマウントする必要があります.そうしないと、各ノードに対応するユーザーとグループを作成する必要があります(現在、テストはそうです).
6.統合sentry
このセクションでは、データベースを使用してルールを格納することを推奨します.本番環境ではファイル保存を推奨しません.
詳細な構成は、ImpalaとHive統合Sentryを参照してください.
beelineでhive/[email protected]
接続hive-server 2を使用して、いくつかのロールとグループを作成します.create role admin_role;
GRANT ALL ON SERVER server1 TO ROLE admin_role;
GRANT ROLE admin_role TO GROUP admin;
GRANT ROLE admin_role TO GROUP hive;
create role test_role;
GRANT ALL ON DATABASE testdb TO ROLE test_role;
GRANT ALL ON DATABASE default TO ROLE test_role;
GRANT ROLE test_role TO GROUP test;
上のamdinグループとhiveグループにはすべてのデータベースの管理者権限があり、testグループにはtestdbとdefaultライブラリの読み書き権限しかありません.
impala-shellではldapで異なるユーザーに転送され、読み書き権限をテストできます.
7.新しいユーザーを追加して権限を設定する方法
次にtest 2アカウントを例に、新しいユーザーを追加してアクセス権を設定する方法を説明します.test 2には以下の権限が必要です
import com.sun.security.auth.module.Krb5LoginModule;
import javax.security.auth.Subject;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class Krb {
private void loginImpl(final String propertiesFileName) throws Exception {
System.out.println("NB: system property to specify the krb5 config: [java.security.krb5.conf]");
//System.setProperty("java.security.krb5.conf", "/etc/krb5.conf");
System.out.println(System.getProperty("java.version"));
System.setProperty("sun.security.krb5.debug", "true");
final Subject subject = new Subject();
final Krb5LoginModule krb5LoginModule = new Krb5LoginModule();
final Map<String,String> optionMap = new HashMap<String,String>();
if (propertiesFileName == null) {
//optionMap.put("ticketCache", "/tmp/krb5cc_1000");
optionMap.put("keyTab", "/etc/krb5.keytab");
optionMap.put("principal", "foo"); // default realm
optionMap.put("doNotPrompt", "true");
optionMap.put("refreshKrb5Config", "true");
optionMap.put("useTicketCache", "true");
optionMap.put("renewTGT", "true");
optionMap.put("useKeyTab", "true");
optionMap.put("storeKey", "true");
optionMap.put("isInitiator", "true");
} else {
File f = new File(propertiesFileName);
System.out.println("======= loading property file ["+f.getAbsolutePath()+"]");
Properties p = new Properties();
InputStream is = new FileInputStream(f);
try {
p.load(is);
} finally {
is.close();
}
optionMap.putAll((Map)p);
}
optionMap.put("debug", "true"); // switch on debug of the Java implementation
krb5LoginModule.initialize(subject, null, new HashMap<String,String>(), optionMap);
boolean loginOk = krb5LoginModule.login();
System.out.println("======= login: " + loginOk);
boolean commitOk = krb5LoginModule.commit();
System.out.println("======= commit: " + commitOk);
System.out.println("======= Subject: " + subject);
}
public static void main(String[] args) throws Exception {
System.out.println("A property file with the login context can be specified as the 1st and the only paramater.");
final Krb krb = new Krb();
krb.loginImpl(args.length == 0 ? null : args[0]);
}
}
keyTab=/etc/hadoop/conf/hdfs.keytab
principal=hdfs/[email protected]
doNotPrompt=true
refreshKrb5Config=true
useTicketCache=true
renewTGT=true
useKeyTab=true
storeKey=true
isInitiator=true
# ticket
$ kdestroy
$ javac Krb.java
$ java -cp . Krb ./krb5.properties
次のコマンドを使用してcdh 1ノードにldap-serverを迅速にインストールします.
yum install db4 db4-utils db4-devel cyrus-sasl* krb5-server-ldap -y
yum install openldap openldap-servers openldap-clients openldap-devel compat-openldap -y
# :
rm -rf /var/lib/ldap/*
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap.ldap /var/lib/ldap
# slapd-conf
cp -rf /etc/openldap/slapd.d /etc/openldap/slapd.d.bak
cp /usr/share/doc/krb5-server-ldap-1.10.3/kerberos.schema /etc/openldap/schema/
touch /etc/openldap/slapd.conf
echo "include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
include /etc/openldap/schema/kerberos.schema" > /etc/openldap/slapd.conf
echo -e "pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args" >> /etc/openldap/slapd.conf
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
chown -R ldap:ldap /etc/openldap/slapd.d && chmod -R 700 /etc/openldap/slapd.d
#
chkconfig --add slapd
chkconfig --level 345 slapd on
/etc/init.d/slapd restart
統合kerberos:
#
kadmin.local -q "addprinc [email protected]"
kadmin.local -q "addprinc -randkey ldap/[email protected]"
rm -rf /etc/openldap/ldap.keytab
kadmin.local -q "ktadd -k /etc/openldap/ldap.keytab ldap/[email protected]"
chown -R ldap:ldap /etc/openldap/ldap.keytab
/etc/init.d/slapd restart
modifyを作成する.ldifファイルは、データベースを更新するために使用されます.
dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=javachen,dc=com
dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcRootDN
# Temporary lines to allow initial setup
olcRootDN: uid=ldapadmin,ou=people,dc=javachen,dc=com
dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: secret
dn: cn=config
changetype: modify
add: olcAuthzRegexp
olcAuthzRegexp: uid=([^,]*),cn=GSSAPI,cn=auth uid=$1,ou=people,dc=javachen,dc=com
dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcAccess
# Everyone can read everything
olcAccess: {0}to dn.base="" by * read
# The ldapadm dn has full write access
olcAccess: {1}to * by dn="uid=ldapadmin,ou=people,dc=javachen,dc=com" write by * read
次のコマンドを実行してデータベースを更新します.
ldapmodify -Y EXTERNAL -H ldapi:/// -f modify.ldif
ユーザーとグループを追加し、setupを作成します.ldifは次のとおりです.
dn: dc=javachen,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: javachen com
dc: javachen
dn: ou=people,dc=javachen,dc=com
objectclass: organizationalUnit
ou: people
description: Users
dn: ou=group,dc=javachen,dc=com
objectClass: organizationalUnit
ou: group
dn: uid=ldapadmin,ou=people,dc=javachen,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: LDAP admin account
uid: ldapadmin
sn: ldapadmin
uidNumber: 1001
gidNumber: 100
homeDirectory: /home/ldap
loginShell: /bin/bash
次のコマンドを実行してデータベースにインポートします.
ldapadd -x -D "uid=ldapadmin,ou=people,dc=javachen,dc=com" -w secret -f setup.ldif
次に、ldapサーバ上にローカルシステムユーザを作成し、ldapサービスにインポートできます.
migrationtoolsをインストールしてから/usr/share/migrationtools/migrarate_を変更します.common.phファイルのdefalut DNS domainとdefalut base.
# admin
groupadd admin
# test hive , sentry
useradd test hive
usermod -G admin test
usermod -G admin hive
# ldap
grep -E "bi_|hive|test" /etc/passwd >/opt/passwd.txt
/usr/share/migrationtools/migrate_passwd.pl /opt/passwd.txt /opt/passwd.ldif
ldapadd -x -D "uid=ldapadmin,ou=people,dc=javachen,dc=com" -w secret -f /opt/passwd.ldif
# admin ldap
grep -E "admin" /etc/group >/opt/group.txt
/usr/share/migrationtools/migrate_group.pl /opt/group.txt /opt/group.ldif
ldapadd -x -D "uid=ldapadmin,ou=people,dc=javachen,dc=com" -w secret -f /opt/group.ldif
次に、ユーザーごとにパスワードを設定し、次のコマンドを使用します.
ldappasswd -x -D 'uid=ldapadmin,ou=people,dc=javachen,dc=com' -w secret "uid=hive,ou=people,dc=javachen,dc=com" -S
また、これらのユーザーとグループはldapサーバに存在し、hadoopの各ノードにリモートでマウントする必要があります.そうしないと、各ノードに対応するユーザーとグループを作成する必要があります(現在、テストはそうです).
6.統合sentry
このセクションでは、データベースを使用してルールを格納することを推奨します.本番環境ではファイル保存を推奨しません.
詳細な構成は、ImpalaとHive統合Sentryを参照してください.
beelineでhive/[email protected]
接続hive-server 2を使用して、いくつかのロールとグループを作成します.create role admin_role;
GRANT ALL ON SERVER server1 TO ROLE admin_role;
GRANT ROLE admin_role TO GROUP admin;
GRANT ROLE admin_role TO GROUP hive;
create role test_role;
GRANT ALL ON DATABASE testdb TO ROLE test_role;
GRANT ALL ON DATABASE default TO ROLE test_role;
GRANT ROLE test_role TO GROUP test;
上のamdinグループとhiveグループにはすべてのデータベースの管理者権限があり、testグループにはtestdbとdefaultライブラリの読み書き権限しかありません.
impala-shellではldapで異なるユーザーに転送され、読み書き権限をテストできます.
7.新しいユーザーを追加して権限を設定する方法
次にtest 2アカウントを例に、新しいユーザーを追加してアクセス権を設定する方法を説明します.test 2には以下の権限が必要です
create role admin_role;
GRANT ALL ON SERVER server1 TO ROLE admin_role;
GRANT ROLE admin_role TO GROUP admin;
GRANT ROLE admin_role TO GROUP hive;
create role test_role;
GRANT ALL ON DATABASE testdb TO ROLE test_role;
GRANT ALL ON DATABASE default TO ROLE test_role;
GRANT ROLE test_role TO GROUP test;
次にtest 2アカウントを例に、新しいユーザーを追加してアクセス権を設定する方法を説明します.test 2には以下の権限が必要です
useradd test2
次に、LDAPツールを使用してユーザーをLDAPにインポートします.
grep -E "test2" /etc/passwd >/opt/passwd.txt
/usr/share/migrationtools/migrate_passwd.pl /opt/passwd.txt /opt/passwd.ldif
ldapadd -x -D "uid=ldapadmin,ou=people,dc=javachen,dc=com" -w secret -f /opt/passwd.ldif
test 2ユーザーにランダムパスワードを生成し、LDAPのtest 2のパスワードを変更します.
ldappasswd -x -D 'uid=ldapadmin,ou=people,dc=javachen,dc=com' -w secret "uid=test2,ou=people,dc=javachen,dc=com" -S
各datanodeマシンにtest 2ユーザーとsecureを作成します.analystパケット、test 2はsecure_に属するanalystグループ:
sh /opt/shell/cmd.sh "groupadd secure_analyst ; useradd test2; usermod -G secure_analyst,test2 test2"
hiveでロールを作成するには:
beeline -u "jdbc:hive2://cdh1:10000/default;principal=hive/[email protected]"
を実行し、次の文を入力してsentryでロールを作成し、secure_に権限を付与します.analystグループ:create role dw_default_r;
GRANT SELECT ON DATABASE dw_default TO ROLE dw_default_r;
create role dw_user;
GRANT SELECT ON DATABASE dw_user TO ROLE dw_user_r;
use dw_user;
create role dw_user_secure_r;
GRANT SELECT ON table t1 TO ROLE dw_user_secure_r;
GRANT SELECT ON table t2 TO ROLE dw_user_secure_r;
GRANT ROLE dw_default_r TO GROUP secure_analyst;
GRANT ROLE dw_user_secure_r TO GROUP secure_analyst;
その後、impalaがメタデータをリフレッシュし、テストを行う必要があります.impala-catalogをリフレッシュするには、impala-catalogに時間がかかる場合があります.
最後にテストを行います.この部分は省略します.