Amazon Web Services ブログ

Apache Knox を使用して EMR でペリメータセキュリティを実装する

ペリメータセキュリティは、Apache Hadoop クラスターリソースをクラスター外部からアクセスするユーザーに対して保護するのに役立ちます。Apache Hadoop クラスターとのすべての REST および HTTP でのインタラクションに対して単一のアクセスポイントを有効にし、クラスターとのクライアントによるインタラクションを簡素化します。たとえば、クライアントアプリケーションは、Kerberos 対応クラスター上のサービスとインタラクションする前に、Kinit または SPNEGO を使用して Kerberos チケットを取得する必要があります。この記事では、Apache Knox のセットアップ設定を順をおって説明し、EMR クラスターのペリメータセキュリティを有効にします。

以下の利点があります。

  • さまざまな Hadoop サービスと UI の認証を簡素化する
  • プロキシとして機能することにより、サービス固有の URL/ポートを非表示にする
  • ペリメータでの SSL 終了を有効にする
  • 複数のクラスターにわたって公開されたエンドポイントの管理を容易にする

概要

Apache Knox

Apache Knox は、REST API エンドポイントを使用して Hadoop クラスターにアクセスするためのゲートウェイを提供します。エンタープライズ ID 管理ソリューションと統合し、クラスターのデプロイの詳細を非表示にする隠すことで、Hadoop クラスターでのサービスとクライアントのインタラクションを簡素化します。

この記事では、以下の設定を実行します。

  • Amazon VPC に基づいて仮想プライベートクラウド (VPC) を作成する
  • Active Directory ドメインコントローラー用の Amazon EC2 Windows インスタンスをプロビジョニングする
  • Kerberos およびクロスレルムの信頼用の Amazon EMR セキュリティ構成を作成する
  • EMR マスターノードで Knox を設定し、LDAP 認証を有効にする

視覚的には、以下のリソースを作成しています。

図 1: CloudFormation からプロビジョニングされたインフラストラクチャ

前提条件および仮定

開始する前に、以下の前提条件を満たす必要があります。

  • AWS のサービスへのアクセスを提供する AWS アカウント。
  • AWS Identity and Access Management (IAM) ユーザー (AWS CLI を設定するためのアクセスキーとシークレットアクセスキーがある)。

重要: テンプレートは、ハードコーディングされたユーザー名とパスワードを使用し、セキュリティグループを開きます。修正なしでは、本番運用に利用できません。

注意:

  • ネットワークを簡素化するために単一の VPC が使用されています。
  • CloudFormation テンプレートは、簡単にするためにハードコーディングされたユーザー名とパスワードを使用し、セキュリティグループを開きます。

実装

シングルクリックでのソリューションのデプロイ

各コンポーネントを個別に設定したくない場合は、シングルステップ AWS CloudFormation テンプレートを使用できます。シングルステップテンプレートとは、ネストされたスタック (追加のテンプレート) を使用して、単一の操作でソリューションのすべてのリソースを起動および設定するマスターテンプレートです。

ソリューション全体を起動するには、下にある [Launch Stack] ボタンをクリックしてコンソールに移動します。テンプレートは US-EAST-1 リージョンでのみ動作するように設計されているため、別のリージョンに変更しないでください。

このテンプレートには、指定する必要があるいくつかのパラメータが必要です。値を指定する必要がある「*」でマークされたパラメータに注意して、以下の表を参照してください。残りのパラメータにはデフォルト値があり、編集しないでください。

このパラメータには この値を使用
1 ドメインコントローラ名 DC1
2 Active Directory ドメイン awsknox.com
3 ドメイン NetBIOS 名 AWSKNOX (ドメインの NetBIOS 名 (最大 15 文字))
4 ドメイン管理者ユーザー ドメイン管理者として追加するアカウントのユーザー名。 (awsadmin)
5 ドメイン管理者パスワード * ドメイン管理者ユーザーのパスワード。文字、数字、記号を含めて 8 文字以上である必要があります。例、CheckSum123
6 キーペア名 * ドメインコントローラインスタンスへのアクセスを有効にする既存の EC2 キーペアの名前。
7 インスタンスタイプ ドメインコントローラー EC2 インスタンスのインスタンスタイプ。
8 LDAP バインドユーザー名 LDAP バインドユーザー名。
デフォルト値: CN=awsadmin,CN=Users,DC=awsknox,DC=com
9 EMR Kerberos レルム EMR Kerberos レルム名。これは通常、大文字での VPC のドメイン名です。例、EC2.INTERNAL
10 レルム間信頼パスワード * レルム間信頼のパスワード。例、CheckSum123
11 信頼できる Active Directory ドメイン 信頼する Active Directory ドメイン。これは名前は Active Directory と同じですが、大文字です。デフォルト値は「AWSKNOX.COM」です。
12 インスタンスタイプ ドメインコントローラー EC2 インスタンスのインスタンスタイプ。デフォルト: m4.xlarge
13 インスタンス数 EMR クラスターのコアインスタンスの数。デフォルト: 2
14 許可された IP アドレス クラスターに到達できるクライアント IP アドレス。CIDR 表記で IP アドレス範囲を指定します (たとえば、203.0.113.5/32)。デフォルトでは、VPC CIDR (10.0.0.0/16) だけがクラスターに到達できます。SSH を使用してクラスターに接続できるように、クライアント IP 範囲を必ず追加してください。
15 EMR アプリケーション クラスタにインストールするアプリケーションのカンマ区切りリスト。デフォルトでは、「Hadoop」、「Spark」、「Ganglia」、「Hive」、「HBase」が選択されます。
16 LDAP 検索ベース LDAP 検索ベース: 唯一の値 : “CN=Users,DC=awshadoop,DC=com”
17 LDAP 検索属性 LDAP ユーザー検索属性を指定します。唯一の値 : “sAMAccountName”
18 LDAP ユーザーオブジェクトクラス LDAP ユーザーオブジェクトクラスの値を指定します。唯一の値: “person”
19 LDAP グループ検索ベース LDAP グループ検索ベースの値を指定します。唯一の値: “dc=awshadoop, dc=com”
20 LDAP グループオブジェクトクラス LDAP グループオブジェクトクラスを指定します。値は「グループ」のみです。
21 LDAP メンバー属性 LDAP メンバー属性を指定します。唯一の値: 「メンバー」
22 EMRLogDir * EMRLog が保存されている Amazon S3 バケットを指定します。また、プレフィックスとして「“s3://”」を指定します。
23 S3 バケット アーティファクトが保存される Amazon S3 バケット。この場合、すべてのアーティファクトは「aws-bigdata-blog」パブリック S3 バケットに保存されます。この値は変更しないでください。

各コンポーネントを個別にデプロイする

シングルステップソリューションで CloudFormation テンプレートを使用した場合、このセクションをスキップして、クラスターへのアクセスセクションから開始できます。このセクションでは、AWS CloudFormation テンプレートを使用して、ソリューションの各ステップを個別に実行する方法について説明します。

1.     Amazon VPC を作成して設定する

このステップでは、Amazon VPC、パブリックサブネット、インターネットゲートウェイ、ルートテーブル、セキュリティグループを設定します。

Amazon EMR Kerberos レルムと Active Directory ドメインの間でレルム間の信頼を確立するには、Amazon VPC が以下の要件を満たしている必要があります。

  • Amazon EMR クラスターに使用されるサブネットには、9 桁未満の CIDR ブロックが必要です (たとえば、10.0.1.0/24)。
  • DNS 解決と DNS ホスト名の両方を有効にする必要があります (「yes」に設定)。
  • Active Directory ドメインコントローラーは、Amazon VPC のインスタンスの DNS サーバーである必要があります (これは次の手順で設定します)。

コンソールから直接起動するには、[Launch Stack] を選択します。

2.     Active Directory ドメインコントローラーを起動して設定する

この手順では、AWS CloudFormation テンプレートを使用して、新しい Active Directory ドメインコントローラとレルム間での信頼を自動的に起動および設定します。

次に、Windows EC2 インスタンスを起動し、Active Directory ドメインコントローラをインストールして設定します。Active Directory ドメインコントローラとレルム間での信頼の起動と設定に加えて、この AWS CloudFormation テンプレートは、ドメインコントローラを Amazon VPC の DNS サーバー (ネームサーバー) として設定します。

コンソールから直接起動するには、[Launch Stack] を選択します。

3.     Apache Knox を使用して EMR クラスターを起動および設定する

Kerberos 化された Amazon EMR クラスターを起動するには、まず、レルム間での信頼設定を含むセキュリティ設定を作成する必要があります。詳細については、ブログ記事Kerberos 認証を使用して Amazon EMR と Microsoft Active Directory を統合するを参照してください。

上記のブログで説明されている手順に加えて、これにより EMR クラスターに追加の手順が追加され、Knox の Kerberos プリンシパルが作成されます。

CloudFormation スクリプトは、core-site.xml、hive-site.xml、hcatalog-webchat-site.xml、oozie-site.xml ファイルの以下のパラメータも更新します。これらは、create_emr.py スクリプトで確認できます。EMR クラスターが作成されると、EMR ステップとしてシェルスクリプトも実行されます。このシェルスクリプトは、EMR マスターマシンに Knox ソフトウェアをダウンロードしてインストールします。また、次の名前の Knox トポロジーファイルも作成します: emr-cluster-top

コンソールから直接起動するには、[Launch Stack] を選択します。

クラスターへのアクセス

Hadoop サービスへの API アクセス

Apache Knox を使用する主な理由の 1 つは、ユーザーによる直接接続からの Hadoop クラスターの分離です。以下に、REST API 呼び出しを使用して Knox エンドポイントを通過する WebHDFS、WebHCat、Oozie、HBase、Hive、Yarn アプリケーションなどのいくつかの Hadoop サービスとインタラクションする方法を示します。REST 呼び出しは、EMR クラスターで、または EMR クラスターの外部で呼び出すことができます。ただし、本番環境では、EMR クラスターのセキュリティグループは、Knox のポート番号でのトラフィックのみを許可し、他のすべてのアプリケーションへのトラフィックをブロックするように設定する必要があります。

このブログの目的のために、LDAP 認証情報を使用して EMR クラスターのマスターノードに SSH で接続することにより、EMR クラスターで REST 呼び出しを行います。

ssh awsadmin@<EMR-Master-Machine-Public-DNS>

<EMR-Master-Machine-Public-DNS> を、EMR クラスターのマスターノードへの CloudFormation 出力からの値に置き換えます。上記のステップ手順 3 でデプロイしたスタックから、この CloudFormation 出力の値を見つけます。

「awsadmin」LDAP パスワードの入力を求められます。CloudFormation スタックの作成中に選択したパスワードを使用してください。

注意: 接続するには、クライアントマシンの IP が、CloudFormation パラメータの「Allowed IP address (許可された IP アドレス)で指定された CIDR 範囲内にある必要があります。マスターノードに接続できない場合は、EMR クラスターのマスターインスタンスのセキュリティグループに、クライアントからのトラフィックを許可するルールがあることを確認してください。そうでないと、組織のファイアウォールがトラフィックをブロックしている可能性があります。

WebHDFS サービス API へのアクセスのデモ:

ここで、knox ゲートウェイを介して WebHDFS で LISTSTATUS 操作を呼び出します。この設定では、knox はポート番号 8449 で実行されています。以下のコマンドは、HDFS のルートディレクトリのディレクトリリストを返します。

curl -ku awsadmin 'https://localhost:8449/gateway/emr-cluster-top/webhdfs/v1/?op=LISTSTATUS'

「localhost」または EMR マスターノードのプライベート DNS の両方を使用できます。

パスワードの入力を求められます。これは、パラメータとして CloudFormation スタックに渡されたものと同じ「ドメイン管理者パスワード」です。

リソースマネージャーサービス API へのアクセスのデモ:

リソースマネージャー REST API は、Hadoop クラスターのステータス、クラスターで実行されているアプリケーションなどに関する情報を提供します。以下のコマンドを使用して、クラスター情報を取得できます。

curl -ikv -u awsadmin -X GET 'https://localhost:8449/gateway/emr-cluster-top/resourcemanager/v1/cluster'

パスワードの入力を求められます。これは、パラメータとして CloudFormation スタックに渡されたものと同じ「ドメイン管理者パスワード」です。

Apache Knox を介して Beeline を使用した Hive への接続のデモ:

JDBC クライアントツールである Beeline を使用して、HiveServer2 に接続できます。ここでは、Knox を介して Beeline に接続します。

次のコマンドを使用して、Hive シェルに接続します。

$hive

次の構文を使用して、Beeline から Hive に接続します。

!connect jdbc:hive2://<EMR-Master-Machine-Public-DNS>:8449/;transportMode=http;httpPath=gateway/emr-cluster-top/hive;ssl=true;sslTrustStore=/home/knox/knox/data/security/keystores/gateway.jks;trustStorePassword=CheckSum123

注意: EMR マスターノードのパブリック DNS 名で <EMR-Master-Machine-Public-DNS> を更新する必要があります。

Apache Knox を介して Apache Livy を使用した Spark ジョブ送信のデモ

以下のコマンドを使用して、スパークジョブを EMR クラスターに送信できます。この例では、spark-examples.jar で利用可能な SparkPi プログラムを実行します。

curl -i -k -u awsadmin -X POST --data '{"file": "s3://aws-bigdata-blog/artifacts/aws-blog-emr-knox/spark-examples.jar", "className": "org.apache.spark.examples.SparkPi", "args": ["100"]}' -H "Content-Type: application/json" https://localhost:8449/gateway/emr-cluster-top/livy/v1/batches

「localhost」または EMR マスターノードのプライベート DNS の両方を使用できます。

Hadoop ウェブ UI に安全にアクセスする

Hadoop クラスターへの API アクセスを提供することに加えて、Knox は Hadoop UI のプロキシサービスも提供します。以下は、利用可能な UI の表です。

アプリケーション名 アプリケーション URL
1 リソースマネージャー https://<EMRClusterURL>:8449/gateway/emr-cluster-top/yarn/
2 Ganglia https://<EMRClusterURL>:8449/gateway/emr-cluster-top/ganglia/
3 Apache HBase https://<EMRClusterURL>:8449/gateway/emr-cluster-top/hbase/webui/master-status
4 WebHDFS https://<EMRClusterURL>:8449/gateway/emr-cluster-top/hdfs/
5 Spark 履歴 https://<EMRClusterURL>:8449/gateway/emr-cluster-top/sparkhistory/

上記の UI に初めてアクセスすると、ログイン認証情報のドロップダウンが表示されます。ログインユーザー awsadmin と、CloudFormation テンプレートのパラメータとして指定したパスワードを入力します。

これで、クラスターに直接接続していたときと同様に UI を参照できます。以下は、Yarn UI のサンプルです。

そして、Yarn UI のスケジューラー情報:

Ganglia:

Spark 履歴 UI:

最後に、HBase UI。「マスターステータス」ページへの URL 全体を提供する必要があります

トラブルシューティング

Apache Knox とのインタラクションでエラーが発生した場合は常に明確です。以下は、いくつかのトラブルシューティング手順です。

UI に接続できません。エラーコードは表示されません。

  • Apache Knox が実行されていない可能性があります。クラスターのマスターノードにログインし、「ps -ef | grep knox」を実行して確認します。実行中のプロセスがあるはずです。
ps -ef | grep knox
Knox 114022 1 0 Aug24 ? 00:04:21 /usr/lib/jvm/java/bin/java -Djava.library.path=/home/knox/knox/ext/native -jar /home/knox/knox/bin/gateway.jar

プロセスが実行されていない場合は、Knox ユーザー (sudo su – knox) として「/home/knox/knox/bin/gateway.sh start」を実行してプロセスを開始します。

  • ブラウザがクラスターに接続していない可能性があります。クラスターに SSH で接続できる場合でも、ファイアウォールルールまたはセキュリティグループルールが、Knox が実行されているポート番号でのトラフィックを阻止している可能性があります。SSH トンネルを構築してポート転送を有効にすることにより、SSH を介してトラフィックをルーティングできます。

UI にアクセスすると、HTTP 400、404 または 503 コードが表示されます:

  • 入力している URL が正しいことを確認してください。正しいパスを入力しないと、Knox は HTTP 404 を返します。
  • Apache Knox 内のルーティングルールに問題があり、リクエストのルーティング方法がわかりません。Knox のログはデフォルトでは INFO レベルであり、/home/knox/knox/logs/ にあります。ロギングレベルを変更する場合は、/home/knox/knox/conf/gateway-log4j.properties:log4j.logger.org.apache.knox.gateway=INFO の次の行を変更します。
    #log4j.logger.org.apache.knox.gateway=DEBUGto#log4j.logger.org.apache.knox.gateway=INFO
    log4j.logger.org.apache.knox.gateway=DEBUG。ログは、Knox が URL を書き換える方法など、より多くの情報を提供します。これにより、Knox が URL を正しく変換しているかどうかがわかります。以下の「ldap」、「knoxcli」、「curl」コマンドを使用して、設定が正しいことを確認できます。これらのコマンドを「knox」ユーザーとして実行します。
  • 検索ベース、検索属性、検索クラスを確認するには、以下の「ldap」コマンドを実行します。
    ldapsearch -h <Active-Directory-Domain-Private-IP-Address> -p 389 -x -D 'CN=awsadmin,CN=Users,DC=awsknox,DC=com' -w 'CheckSum123' -b 'CN=Users,DC=awsknox,DC=com' -z 5 '(objectClass=person)' sAMAccountName
  • 「<Active-Directory-Domain-Private-IP-Address>」を、Active Directory EC2 インスタンスのプライベート IP アドレスで置き換えます。2 つ目の CloudFormation テンプレートの出力から、IP アドレスを取得できます。
  • サーバーのホスト、ポート、ユーザー名、パスワードの値を確認するには、以下の「ldap」コマンドを実行します。
    ldapwhoami -h <Active-Directory-Domain-Private-IP-Address> -p 389 -x -D 'CN=awsadmin,CN=Users,DC=awsknox,DC=com' -w 'CheckSum123'
  • 「<Active-Directory-Domain-Private-IP-Address>」を、Active Directory EC2 インスタンスのプライベート IP アドレスで置き換えます。2 つ目の CloudFormation テンプレートの出力から、IP アドレスを取得できます。
  • 以下のような出力が表示されるはずです。

  • システム LDAP バインドが成功したかどうかを確認するには:
    /home/knox/knox/bin/knoxcli.sh user-auth-test --cluster emr-cluster-top --u awsadmin --p 'CheckSum123'
  • ここで、「emr-cluster-top」は、利用可能なアプリケーションと、アプリケーションをサービスするために Knox が接続する必要があるエンドポイントを定義するトポロジファイルです。
  • コマンドからの出力は、以下の出力を返すはずです:

“System LDAP Bind successful! (システム LDAP バインドが成功しました!)”

  • LDAP 認証が成功したかどうかを確認するには、以下のコマンドを実行します。
    /home/knox/knox/bin/knoxcli.sh user-auth-test --cluster emr-cluster-top --u awsadmin --p 'CheckSum123'
  • ここで、「emr-cluster-top」は作成したトポロジファイルの名前です。
  • コマンドからの出力は、以下の出力を返すはずです:

“LDAP authentication successful! (LDAP 認証が成功しました!)”

  • サービスを使用して WebHDFS に直接到達できるかどうかを確認します。
  • まず、有効な Kerberos TGT を取得する必要があります。そのためには、以下のように kinit コマンドを使用する必要があります。
    kinit -kt /mnt/var/lib/bigtop_keytabs/knox.keytab knox/<EMR-Master-Machine-Private-DNS>@EC2.INTERNAL
    curl --negotiate -u : http://<EMR-Master-Machine-Private-DNS>:50070/webhdfs/v1/?op=GETHOMEDIRECTORY
  • 例: EMR-Master-Machine-Private-DNS は次の形式で表示されます: ip-xx-xx-xx-xx.ec2.internal
  • ユーザーのホームディレクトリの「パス」変数を含む JSON オブジェクトを返す必要があります。

クリーンアップ

CloudFormation スタックを削除して、この設定用に作成されたすべてのリソースをクリーンアップします。ネストされたスタックを使用した場合、CloudFormation は 1 回の操作ですべてのリソースを削除します。テンプレートを個別にデプロイした場合は、作成とは逆の順序で削除し、VPC スタックを最後に削除します。

まとめ

この記事では、Apache Knox を使用して EMR クラスターのペリメータセキュリティの設定、構成、検証を行いました。これにより、さまざまな Hadoop サービスの認証が簡素化されます。次回の記事では、Apache Knox と Apache Ranger を統合して認証と監査を有効にする方法を紹介します。

ご期待下さい!

 


関連記事

 


著者について


Varun Rao は、エンタープライズソリューションアーキテクトです
。彼は、データ戦略とセキュリティを中心に、クラウドへの過程で企業顧客と協力しています。余暇には、彼は 4 歳の子供と遊んでいます。

 

 

 

Mert Hocanin は、AWS のビッグデータアーキテクトであり、EMR、Athena、Managed Blockchain などのいくつかの製品を扱っています。AWS で働く前は、シニアソフトウェア開発エンジニアとして Amazon.com の小売ビジネスに携わり、レポート作成のために会社全体から大量のデータを処理するデータレイクを構築しました。データレイクを構築および設計していないときは、Mert は旅行や食事を楽しんでいます。

 

 

 

Srikanth Kodali の写真Srikanth Kodali は、アマゾン ウェブ サービスのシニアIoT データアナリティクスアーキテクトです。AWS のお客様のご協力のもとに、IoT データと分析ソリューションの構築に関する指導や技術支援を行い、AWS を使用する際にソリューションがより有益となるようお客様をサポートしています。