hdfs 설정sasl 모드

35374 단어 kerberos
DataNode 데이터 전송 프로토콜은 Hadoop RPC 프레임워크를 사용하지 않기 때문에 DataNode는 dfs를 사용해야 합니다.datanode.address 및 dfs.datanode.http.address에서 지정한 권한이 있는 포트를 인증합니다.이 인증은 다음과 같은 가설을 바탕으로 합니다. 공격자는 DataNode 호스트에서 루트 권한을 얻을 수 없습니다.
root 사용자로 hdfs datanode 명령을 실행할 때 서버 프로세스는 우선 특권 포트를 연결한 다음 특권을 삭제하고 HADOOP_SECURE_DN_USER에서 지정한 사용자 계정이 실행됩니다.이 시작 프로세스는 JSVC_에 설치됩니다.HOME의 jsvc 프로그램입니다.시작할 때 (hadoop-env.sh에서) HADOOP_을 지정해야 합니다.SECURE_DN_USER 및 JSVC_HOME은 환경 변수로 사용됩니다.
SASL은 버전 2.6.0부터 데이터 전송 프로토콜을 검증하는 데 사용할 수 있습니다.이 설정에서 보안 집단은 jsvc를 사용하여 루트로 DataNode를 시작하고 특권 포트에 연결할 필요가 없습니다.SASL 데이터 전송 프로토콜을 사용하려면hdfs-site에 있습니다.xml에 dfs를 설정합니다.data.transfer.protection, dfs.datanode.address 비특권 포트 설정, dfs.http.정책 설정은 HTTPS_ONLY, HADOOP_SECURE_DN_USER 환경 변수가 정의되지 않았습니다.만약 dfs가datanode.address는 권한이 있는 포트로 설정되어 데이터 전송 프로토콜에서 SASL을 사용할 수 없습니다.후방 호환성 때문에 필수적이다.HDFS Hadoop 구성은 2단계로 나뉩니다. Principal과 *unix 사용자의 매핑 관계를 만듭니다.예를 들어 우리 위의 Datanode 서비스의 Principal은 dn/[email protected], 기본hadoop.security.auth_to_local 규칙은 instance와 realm을 제거하고 dn만 보존하는 것입니다. 그러나 실제hdfs의 사용자maybe는 dn이 아닙니다. (내가 여기에 hdfs를 조작하는 사용자는hadoop입니다. 만약에 가방으로 설치하면hdfs라고 할 수 있습니다. 구체적으로 hdfs의 기본 파일을 볼 수 있는 사용자가 누구인지 알 수 있습니다.) dn은 linux 기기에도 존재하지 않습니다. 그러면 dn이 nn에 연결될 때 이 사용자의 그룹을 찾을 수 없음을 알립니다.
2016-06-07 19:06:58,329 INFO SecurityLogger.org.apache.hadoop.ipc.Server: Auth successful for dn/cdh2@HADOOP.COM (auth:KERBEROS)
2016-06-07 19:06:58,393 WARN org.apache.hadoop.security.UserGroupInformation: No groups available for user dn
2016-06-07 19:06:58,393 INFO org.apache.hadoop.ipc.Server: IPC Server handler 2 on 8020, call org.apache.hadoop.hdfs.server.protocol.DatanodeProtocol.versionRequest from 192.168.103.224:55035 Call#0 Retry#0: org.apache.hadoop.security.AccessControlException: Access denied for user dn. Superuser privilege is required

맵 설정 방법:core-site를 수정합니다.xml, 증가:
<property>
  <name>hadoop.security.auth_to_localname>
  <value>RULE:[2:$1@$0]([nd][email protected])s/.*/dtdream/DEFAULTvalue>
property>

RULE의 작법은 이곳을 참고할 수 있습니다. Kerberos의 규칙과 같습니다.구체적으로 Hadoop까지 이 글은 좀 더 직접적이다.
위의 RULE는 nn과 dn을 모두 dtdream으로 바꾸겠다고 밝혔다.
2, HDFS 구성
2.1 총 구성
상세한 각 파라미터의 설명은 hortonworks 홈페이지를 보십시오. 아래에 제 설정을 직접 붙여 주십시오. 약간 길습니다.
<property>
  <name>dfs.block.access.token.enablename>
  <value>truevalue>
property>


<property>
  <name>dfs.namenode.kerberos.principalname>
  <value>nn/[email protected]value>
property>
<property>
  <name>dfs.namenode.keytab.filename>
  <value>/etc/security/nn.service.keytabvalue> 
property>
<property>
  <name>dfs.https.portname>
  <value>50470value>
property>
<property>
  <name>dfs.https.addressname>
  <value>cdh2:50470value>
property>


<property>
  <name>dfs.datanode.kerberos.principalname>
  <value>dn/[email protected]value>
property>
<property>
  <name>dfs.datanode.keytab.filename>
  <value>/etc/security/dn.service.keytabvalue> 
property>
<property>
  <name>dfs.datanode.data.dir.permname>
  <value>700value>
property>


<property>
  <name>dfs.datanode.addressname>
  <value>0.0.0.0:1026value>
property>
<property>
  <name>dfs.datanode.http.addressname>
  <value>0.0.0.0:1025value>
property>
<property>
  <name>dfs.http.policyname>
  <value>HTTPS_ONLYvalue>
property>
<property>
  <name>dfs.data.transfer.protectionname>
  <value>integrityvalue>
property>

<property>
     <name>dfs.permissions.supergroupname>
     <value>supergroupvalue>
     <description>The name of the group of
     super-users.description>
property>

<property>
     <name>dfs.web.authentication.kerberos.principalname>
     <value>HTTP/[email protected]value>
property>
<property>
     <name>dfs.web.authentication.kerberos.keytabname>
     <value>/etc/security/spnego.service.keytabvalue>
property>

간략한 설명:
_HOST는 모든 노드가 hdfs-site를 함께 사용할 수 있도록 하는 기계의 FQDN 이름을 나타내는 변수입니다.xmlnamenode의 웹 UI는 https로 바뀌었습니다. 포트 번호는 50470입니다. 각 키탭 파일이 현재dtdream에 접근할 수 있도록 보장해야 합니다.
중간 SASL 이 부분 설정을 추가하지 않으면 시작할 때 datanode가 오류를 보고하고 종료합니다.
2016-06-07 14:02:03,509 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in secureMain
java.lang.RuntimeException: Cannot start secure DataNode without configuring either privileged resources or SASL RPC data transfer protection and SSL for HTTP.  Using privileged resources in combination with SASL RPC data transfer protection is not supported.
        at org.apache.hadoop.hdfs.server.datanode.DataNode.checkSecureConfig(DataNode.java:1173)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:1073)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.(DataNode.java:428)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:2370)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:2257)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:2304)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:2481)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:2505)
2016-06-07 14:02:03,513 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 1
2016-06-07 14:02:03,516 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: SHUTDOWN_MSG:

Kerberos는 datanode가 secure mode로 시작하도록 요구합니다. 2.6 이전 버전에서hadoop은 jsvc만 사용할 수 있습니다. 먼저 루트 사용자로 datanode를 시작한 다음에 일반 사용자로 자르십시오.우리는 일반 사용자에게만 비밀번호를 사용하지 않기 때문에, 루트 사용자로 start-dfs를 시작합니다.sh 스크립트는 오류를 보고할 수 있고 jsvc는 비교적 복잡해 보입니다.다음은 분명하게 말한다.
As of version 2.6.0, SASL can be used to authenticate the data transfer protocol. In this configuration, it is no longer required for secured clusters to start the DataNode as root using jsvc and bind to privileged ports. To enable SASL on data transfer protocol, set dfs.data.transfer.protection in hdfs-site.xml, set a non-privileged port for dfs.datanode.address, set dfs.http.policy to HTTPS_ONLY and make sure the HADOOP_SECURE_DN_USER environment variable is not defined. Note that it is not possible to use SASL on data transfer protocol if dfs.datanode.address is set to a privileged port. This is required for backwards-compatibility reasons.
구성에는 다음과 같은 몇 가지가 있습니다.
dfs 설정.data.transfer.보호는 무결성을 위해 dfs를 설정합니다.datanode.address는 1024보다 큰 비특권 포트입니다. 1026 설정 dfs를 사용합니다.http.정책은 HTTPS_오직 HADOOP_SECURE_DN_USER 변수는 비어 있지만 이야기는 아직 끝나지 않았습니다. 위의 설정에 따라 각 노드를 동기화한 후hdfs를 시작하면namenode가 오류를 보고한 후 종료합니다.
2016-06-07 14:12:37,273 INFO org.apache.hadoop.http.HttpServer2: HttpServer.start() threw a non Bind IOException
java.io.FileNotFoundException: /home/dtdream/.keystore (No such file or directory)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.(FileInputStream.java:146)
        at org.mortbay.resource.FileResource.getInputStream(FileResource.java:275)
        at org.mortbay.jetty.security.SslSocketConnector.createFactory(SslSocketConnector.java:242)
        at org.mortbay.jetty.security.SslSocketConnector.newServerSocket(SslSocketConnector.java:476)
        at org.apache.hadoop.security.ssl.SslSocketConnectorSecure.newServerSocket(SslSocketConnectorSecure.java:46)
        at org.mortbay.jetty.bio.SocketConnector.open(SocketConnector.java:73)
        at org.apache.hadoop.http.HttpServer2.openListeners(HttpServer2.java:914)
        at org.apache.hadoop.http.HttpServer2.start(HttpServer2.java:856)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeHttpServer.start(NameNodeHttpServer.java:142)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.startHttpServer(NameNode.java:752)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:638)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:811)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:795)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1488)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1554)
2016-06-07 14:12:37,275 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Stopping NameNode metrics system...

2, 3 키스토어 파일이 없네요.
사실 여기까지는hadoop,Kerberos와 아무런 관계가 없습니다. 순전히 https의 설정입니다.간단한 설명 아래 원리: https는 집단에 CA가 있어야 하고,ca_를 생성합니다key 및ca_cert, 이 집단의 노드에 가입하려면 이 두 파일을 가져와서 일련의 동작을 통해 키스토어를 생성하고hadoop의 ssl-server에 있어야 합니다.xml과 ssl-client.xml에서 이 키스토어의 경로와 비밀번호를 지정하면 각 노드 간에 https로 통신할 수 있습니다.자세한 내용은 SASL 구성 참조
아래에 직접 명령을 붙이다.
CA 시스템에서:
openssl req -new -x509 -keyout test_ca_key -out test_ca_cert -days 9999 -subj '/C=CN/ST=zhejiang/L=hangzhou/O=dtdream/OU=security/CN=zelda.com'

위에서 생성된test_ca_key 및 test_ca_cert는 모든 기계에 잃어버리고 각 기계에서 계속합니다.
keytool -keystore keystore -alias localhost -validity 9999 -genkey -keyalg RSA -keysize 2048 -dname "CN=zelda.com, OU=test, O=test, L=hangzhou, ST=zhejiang, C=cn"
keytool -keystore truststore -alias CARoot -import -file test_ca_cert
keytool -certreq -alias localhost -keystore keystore -file cert
openssl x509 -req -CA test_ca_cert -CAkey test_ca_key -in cert -out cert_signed -days 9999 -CAcreateserial -passin pass:changeit
keytool -keystore keystore -alias CARoot -import -file test_ca_cert
keytool -keystore keystore -alias localhost -import -file cert_signed

최종적으로 현재 디렉터리에서 키스토어,trustkeystore 파일을 생성합니다.
2.4 ssl-server 설정.xml과 ssl-client.xml
{target}.xml.example 파일은 한 부를 복사해서 키스토어,trustkeystore 두 파일의 경로,password를 만들고 모든 노드에 동기화합니다.
2.5 HDFS 시작
namenode의 로그에서 서비스가 정상적으로 시작되었고 DN이 연결되었습니다. https://{namenode_ip}: 50470에서 각각의 datanode를 볼 수 있습니다.그러나 hadoop 명령줄 fs-ls를 사용하면 오류가 발생합니다.
./hadoop fs -ls /
16/06/06 13:24:35 WARN ipc.Client: Exception encountered while connecting to the server : javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
ls: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]; Host Details : local host is: "cdh2/192.168.60.20"; destination host is: "cdh1":8020;

힌트는credentials가 없습니다. 즉, 증거가 없다는 것입니다.한편으로는Kerberos가 확실히 hdfs를 보호했다는 것을 설명하고, 다른 한편으로는hdfs에 접근하기 위해 로컬에 Principal을 추가해야 한다는 것을 설명한다.
2.6 사용자 추가 Principal
KDC에서:
kadmin.local:  addprinc cdh2@HADOOP.COM
WARNING: no policy specified for cdh2@HADOOP.COM; defaulting to no policy
Enter password for principal "cdh2@HADOOP.COM":
Re-enter password for principal "cdh2@HADOOP.COM":
Principal "cdh2@HADOOP.COM" created.

hdfs 클라이언트의 기계에서kinit를 사용하여credentials를 초기화하고 hdfs에 접근하면 정상입니다.
$ kinit cdh2@HADOOP.COM
Password for cdh2@HADOOP.COM: 
$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: cdh2@HADOOP.COM

Valid starting       Expires              Service principal
2016-06-06T13:37:21  2016-06-06T23:37:21  krbtgt/HADOO.COM@HADOO.COM
    renew until 2016-06-07T13:37:19
$ ./hadoop fs -ls /
Found 3 items
drwxr-xr-x   - dtdream supergroup          0 2016-05-27 09:45 /home
drwxrwxr-x   - dtdream supergroup          0 2016-05-25 16:01 /tmp
drwxr-xr-x   - dtdream supergroup          0 2016-05-25 16:11 /user

2.7 Kerberos에서 보호되는 hdfs 웹 UI에 액세스하도록 크롬 구성
FIREFOX, Chrome, IE 지원 Kerberos HTTP SPNEGO 구성, 참조
Firefox를 예로 들면zelda가 필요합니다.com은 신뢰할 수 있는 ui로 네트워크에 설정합니다.negotiate-auth.trusted-uris에 들어가다.
but, 아직도 문제가 있어요. 인증을 어떻게 보내야 할지 모르겠어요. 먼저 틀어주세요.

좋은 웹페이지 즐겨찾기