ポータルでの TLS の使用

ポータルで TLS を使用するように構成できます。ポータルの TLS 構成手順は、ポータルをデプロイした方法によって異なります。

  • クラウド: ポータルのクラウドベースのホスティング サービスである Pantheon または Acquia から TLS を構成します。
  • Apigee Edge for Private Cloud: ポータルをホスティングしているオンプレミスのサーバーで TLS を構成します。

TLS とポータル

次の図に、ポータルが TLS を使用する 2 つの場所を示します。

  1. ポータルと Edge Management API の間で通信を行う場合

    ポータルは、スタンドアロンのシステムとしては機能しません。その代わりに、ポータルで使用される情報の多くは実際に Edge に保存されます。この場合、Edge をクラウドにデプロイすることも、Private Cloud インストールとしてオンプレミスにデプロイすることもできます。ポータルは必要に応じて Edge Management API に対する HTTP または HTTPS リクエストを発行し、情報を送受信します。

    ポータルを作成するときに最初に行う手順の 1 つは、Edge Management API の URL を指定することです。Edge Management API の構成方法によっては、その URL で TLS を使用できます。詳細については、デベロッパー ポータルの作成をご覧ください。
  2. デベロッパーとポータルの間で通信を行う場合

    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 CDNLet'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_maxlifetimecookie_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 へのリダイレクト

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;
  }
}