ポータルで TLS を使用するように構成できます。ポータルの TLS 構成手順は、ポータルをデプロイした方法によって異なります。
- クラウド: ポータルのクラウドベースのホスティング サービスである Pantheon または Acquia から TLS を構成します。
- Apigee Edge for Private Cloud: ポータルをホスティングしているオンプレミスのサーバーで TLS を構成します。
TLS とポータル
次の図に、ポータルが TLS を使用する 2 つの場所を示します。
- ポータルと Edge Management API の間で通信を行う場合
ポータルは、スタンドアロンのシステムとしては機能しません。その代わりに、ポータルで使用される情報の多くは実際に Edge に保存されます。この場合、Edge をクラウドにデプロイすることも、Private Cloud インストールとしてオンプレミスにデプロイすることもできます。ポータルは必要に応じて Edge Management API に対する HTTP または HTTPS リクエストを発行し、情報を送受信します。
ポータルを作成するときに最初に行う手順の 1 つは、Edge Management API の URL を指定することです。Edge Management API の構成方法によっては、その URL で TLS を使用できます。詳細については、デベロッパー ポータルの作成をご覧ください。 - デベロッパーとポータルの間で通信を行う場合
Developer Services ポータルを使用して API をデプロイする場合、デベロッパーはポータルにログインしてアプリを登録し、API キーを受け取ります。ログイン認証情報と API キーは、セキュリティ確保のために HTTPS 経由で送信することが望まれる組織の専有情報です。このタイプの専有情報は、HTTPS 経由で送信する必要があります。
このシナリオでの TLS の構成方法は、ポータルをデプロイした方法、つまりクラウドと Apigee Edge for Private Cloud のどちらの形でポータルをデプロイしたかによって異なります。以降のセクションでは、これら両方のシナリオについて説明します。
ポータルと Edge Management API 間の TLS の構成
TLS を使用して通信できるかどうかは、Edge Management API の構成によって決まります。Edge Management API が TLS を使用するように構成されている場合、ポータルは HTTPS を使用できます。それ以外の場合、ポータルは HTTP で Edge と通信します。したがって、ポータル デベロッパーは、ポータルと Edge 間の接続を設定するために Edge がどのように構成されているかを知っておくだけで済みます。
Edge Management API への接続を構成する手順については、デベロッパー ポータルの作成をご覧ください。
Cloud ベース バージョンの Edge
ポータルがクラウドベース バージョンの Edge に接続する場合、Edge Management API の URL は、最初から TLS を使用するように構成されています。ポータルを構成するとき、https://api.enterprise.apigee.com/v1 の URL を使用して Edge Management API にアクセスします。
Private Cloud インストールの Edge
Private Cloud インストールの Edge の場合、Edge Management API の URL は次の形式になります。
http://EdgePrivateCloudIp:8080/v1
または
https://EdgePrivateCloudIp:TLSport/v1
ここで、EdgePrivateCloudIp は Edge Management Server の IP アドレスで、TLSport は Edge Management API の TLS ポートです。たとえば、ポート番号は、Edge の構成に基づいて 8443 または 8080 になります。
デベロッパーとポータル間の TLS の構成
デベロッパーとポータルの間で TLS を構成する方法は、ポータルをデプロイした方法、つまりクラウドと Apigee Edge for Private Cloud のどちらの形でポータルをデプロイしたかによって異なります。
Cloud ベースのポータル
Pantheon
Pantheon は、Pantheon Global CDN と Let's Encrypt を通じて、プラットフォーム上のすべてのサイトに無料の自動 HTTPS を提供します。Pantheon の Global CDN 上での HTTPS もご覧ください。
Acquia
Acquia を使用して TLS / SSL を有効にする方法については、SSL の有効化をご覧ください。Edge for Private Cloud ポータル
Apigee によって推奨されているポータルの Private Cloud インストールでは、次に示すように、ロードバランサの内側にポータルを配置する必要があります。
したがって、オンプレミス環境にインストールする場合は、次のどちらかの方法で TLS を構成できます。
- ロードバランサで TLS を構成する: ポータルではなく、ロードバランサ自体で TLS を構成します。したがって、TLS を構成する手順はロードバランサによって異なります。詳細については、ロードバランサのドキュメントをご覧ください。
- ポータル自体で TLS を構成する: 必要であれば、ポータルをホストするウェブサーバーで TLS を構成できます。詳細については、ポータルで HTTPS を使用するように構成するをご覧ください。
ポータルを本番環境にデプロイするには、独自の TLS 証明書を取得する必要があります。
その他の TLS 設定の構成
sites/default/settings.local.php(クラウド)または sites/default/settings.php(Private Cloud)ファイルを編集して、ポータルの TLS 構成を変更できます。
ファイルを編集するときは、ini_set() 関数のインスタンスを追加してプロパティを設定します。この関数の詳細については、http://php.net/manual/en/function.ini-set.php をご覧ください。
sites/default/settings.local.php(クラウド)または sites/default/settings.php(Private Cloud)ファイルで設定できるプロパティは次のとおりです。
- cookie_httponly:(推奨)HTTP プロトコルを介した場合にのみ Cookie にアクセスできるようにします。このプロパティを次のように設定します。
ini_set('session.cookie_httponly', true); - session.cookie_secure:(省略可)セキュリティ保護された接続を通じてのみ Cookie を送信できるようにします。ただし、これはすべてのコンテンツを HTTPS で送受信する必要があることを意味しています。この設定が有効になっている場合、サイトは HTTP では機能しません。このプロパティを次のように設定します。
ini_set('session.cookie_secure', true); - gc_maxlifetime と cookie_lifetime:(省略可)gc_lifeteime は、データが消去可能になるまでの時間を秒数で指定します。cookie_lifetime は、Cookie の有効期間を秒数で指定します。これらのプロパティを次のように設定します。
ini_set('session.gc_maxlifetime', 3600);
ini_set('session.cookie_lifetime', 3600);
デベロッパー ポータルとクライアントの間で TLS を設定する方法の詳細については、Pantheon ドキュメント サイトの安全な HTTPS 通信のために SSL を有効にするをご覧ください。
ロードバランサでの TLS の構成
パフォーマンスを向上させるために、ロードバランサで TLS を終端するように構成することもできます。ロードバランサで TLS を終端した場合、ロードバランサは https:// で送信されたメッセージを復号し、そのメッセージを http:// でバックエンド サーバーに転送します。これにより、バックエンド サーバーで https:// メッセージを復号する必要がなくなり、バックエンド サーバーのオーバーヘッドがその分低下します。
ロードバランサが同じデータセンター内のサーバーに暗号化されていない http メッセージを転送する場合、セキュリティは問題にはなりません。ただし、ロードバランサがデータセンターの外部にあるサーバー(Apigee デベロッパー ポータルなど)に http:// でメッセージを転送する場合、そのメッセージは暗号化されないため、セキュリティ ホールが開きます。
デベロッパー ポータルが、TLS 終端を使用しているロードバランサの内側にあり、すべてのトラフィックを https:// で送受信する場合、ウェブサイトのページには https:// リンクのみを含める必要があります。さらに、以下のコードをデベロッパー ポータルの sites/default/settings.local.php(クラウド)または sites/default/settings.php(Private Cloud)ファイルに追加する必要もあります。ロードバランサで HTML ページの内容が自動的に変換されることはありません。そのため、このコードを追加することで、クライアントに渡されるリンクがすべて https:// で始まるようにします。
ロードバランサで TLS を構成するには、以下の行を sites/default/settings.local.php(クラウド)または sites/default/settings.php(Private Cloud)ファイルに追加します。
// Only check for SSL if we are not using PHP from the command line. if (PHP_SAPI != 'cli') { // Assume we can't detect SSL unless proven otherwise. $can_detect_ssl = FALSE; // Set HTTPS URL of portal $base_url = 'https://developers.myCo.com'; if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) || (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')) { $can_detect_ssl = TRUE; } if (isset($_SERVER['HTTP_X_ FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_ FORWARDED_PROTO']) == 'https') { $_SERVER['HTTPS'] = 'on'; } if ($can_detect_ssl && $_SERVER['HTTPS'] != 'on') { header('HTTP/1.0 301 Moved Permanently'); // You could optionally substitute a canonical server name for $_SERVER['HTTP_HOST'] here. header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); exit; } }
詳細については、次をご覧ください。
- https://drupal.org/node/425990
- https://drupal.org/node/313145
- http://drupal.stackexchange.com/questions/102091/drupal-behind-a-ssl-offloading-reverse-proxy-is-this-config-correct
ポータル トラフィックの HTTPS へのリダイレクト
sites/default/settings.local.php(クラウド)または sites/default/settings.php(Private Cloud)ファイルを更新することで、すべてのポータル トラフィックを HTTPS にリダイレクトできます。必要な更新は、同じホスト名の HTTPS にリダイレクトするか、複数のホスト名の HTTPS にリダイレクトするかによって異なります。
同じホスト名での HTTPS へのリダイレクト
すべてのポータル トラフィックを同じホスト名(例: *.devportal.apigee.io)の HTTPS にリダイレクトするには、以下のコードを sites/default/settings.local.php(クラウド)または sites/default/settings.php(Private Cloud)ファイルに追加します。
このシナリオでは、デベロッパーが live-example.devportal.apigee.io にあるポータルにアクセスしようとしていて、devportal.example.com 用にアップロードされた証明書にアクセスする必要がある場合、リクエストは失敗します。
// Only check for SSL if we are not using PHP from the command line. if (PHP_SAPI != 'cli') { // Assume we can't detect SSL unless proven otherwise. $can_detect_ssl = FALSE; if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) || (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')) { $can_detect_ssl = TRUE; } if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https') { $_SERVER['HTTPS'] = 'on'; } if ($can_detect_ssl && $_SERVER['HTTPS'] != 'on') { header('HTTP/1.0 301 Moved Permanently'); header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); exit; } }
複数のホスト名での HTTPS へのリダイレクト
すべてのポータル トラフィックを複数のホスト名の HTTPS にリダイレクトするには、以下のコードを sites/default/settings.local.php(クラウド)または sites/default/settings.php(Private Cloud)ファイルに追加します。
// Only check for SSL if we are not using PHP from the command line. if (PHP_SAPI != 'cli') { // Assume we can't detect SSL unless proven otherwise. $can_detect_ssl = FALSE; // Assume we are not forcing a redirect until proven otherwise. $force_redirect = FALSE; if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) || (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')) { $can_detect_ssl = TRUE; } if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https') { $_SERVER['HTTPS'] = 'on'; } if ($can_detect_ssl && $_SERVER['HTTPS'] != 'on') { // We will force a redirect because HTTPS is required. $force_redirect = TRUE; } // This works on Pantheon only; the constant is undefined elsewhere. switch (PANTHEON_ENVIRONMENT) { case 'dev': $canonical_hostname = 'dev.devportal.example.com'; break; case 'test': $canonical_hostname = 'test.devportal.example.com'; break; case 'live': $canonical_hostname = 'devportal.example.com'; break; default: $canonical_hostname = strtolower($_SERVER['HTTP_HOST']); break; } if ($canonical_hostname != strtolower($_SERVER['HTTP_HOST'])) { // We will force a redirect because hostname is not canonical. $force_redirect = TRUE; } if ($force_redirect) { header('HTTP/1.0 301 Moved Permanently'); header('Location: https://' . $canonical_hostname . $_SERVER['REQUEST_URI']); exit; } }