ポータルでの TLS の使用

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

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

TLS とポータル

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

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

    ポータルは、スタンドアロンのシステムとしては機能しません。その代わり、ポータルで使用される情報の多くは実際に Edge に保存されます。この場合、Edge をクラウドにデプロイすることも、プライベート クラウド インストールとしてオンプレミスにデプロイすることもできます。ポータルは、必要に応じて、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 の構成によって決まります。TLS を使用するように Edge Management API が構成されている場合、ポータルは HTTPS を使用できます。それ以外の場合、ポータルは HTTP 経由で Edge と通信します。したがって、ポータル デベロッパーは、ポータルと Edge の間の接続を設定するために、Edge がどのように構成されているかを確認するだけで済みます。

Edge Management API への接続を構成する手順については、デベロッパー ポータルの作成をご覧ください。

クラウドベース バージョンの Edge

ポータルがクラウドベース バージョンの Edge に接続する場合、Edge Management API の URL は、TLS を使用するように Apigee によって事前に構成されています。ポータルを構成する場合、URL の https://api.enterprise.apigee.com/v1 を使用して、Edge Management API にアクセスします。

プライベート クラウド インストールの Edge

プライベート クラウド インストールの 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 のどちらでデプロイしたかによって異なります。

クラウドベースのポータル

Pantheon

Pantheon は、Pantheon Global CDNLet's Encrypt を通じて、プラットフォーム上のすべてのサイトに無料の自動 HTTPS を提供します。Pantheon の Global CDN 上での HTTPS もご覧ください。

Acquia

Acquia を使用して TLS / SSL を有効にする方法については、SSL の有効化をご覧ください。

Edge for Private Cloud ポータル

ポータルの推奨されるすべてのプライベート クラウド インストールで、次に示すように、ロードバランサの内側にポータルを配置する必要があります。

したがって、オンプレミス環境にインストールする場合は、TLS を構成する 2 つのオプションがあります。

  • ロードバランサで TLS を構成する: ポータルではなく、ロードバランサ自体で TLS を構成します。したがって、TLS を構成する手順は、ロードバランサによって異なります。詳細については、ロードバランサのドキュメントをご覧ください。
  • ポータル自体で TLS を構成する: 必要であれば、ポータルをホストするウェブサーバーで TLS を構成できます。デフォルトでは、Apigee は Apache ウェブサーバーをインストールします。Apache で TLS を構成する方法については、https://www.drupal.org/https-information をご覧ください。

ポータルを本番環境にデプロイするには、独自の 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_lifetime は、データの消去が許されるようになるまでの時間を秒数で指定します。cookie_lifetime は cookie の有効時間を秒数で指定します。これらのプロパティを次のように設定します。

    ini_set('session.gc_maxlifetime', 3600);
    ini_set('session.cookie_lifetime', 3600);

デベロッパー ポータルとクライアントの間で TLS を設定する方法の詳細については、Pantheon ドキュメント サイトのEnable SSL for Secure HTTPS Communication をご覧ください。

ロードバランサでの 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 へのリダイレクト

すべてのポータル トラフィックを同じホスト名(例: *.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;
  }
}