ポータルでの 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 にアクセスします。

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 のどちらでデプロイしたかで異なります。

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

Pantheon

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

Acquia

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

Edge for Private Cloud ポータル

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

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

  • ロードバランサでの 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/ja/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: (省略可能)セキュリティで保護された接続のみで cookies を送信できると指定します。ただし、これはすべてのコンテンツを 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 のドキュメント サイトの 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(プライベート クラウド)ファイルに以下のコードを追加する必要があります。ロードバランサは、HTML ページの内容を自動的に変換することはないため、このコードにより、クライアントに渡されるすべてのリンクは必ず https:// で始まることになります。

ロードバランサで TLS を構成するには、次の行を sites/default/settings.local.php(クラウド)または sites/default/settings.php(プライベート クラウド)ファイルに追加します。

    // 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(プライベート クラウド)ファイルを更新することで、すべてのポータル トラフィックを HTTPS にリダイレクトできます。必要とされる更新は、同じホスト名と複数のホスト名のどちらで HTTPS にリダイレクトするかで異なります。

同じホスト名での HTTPS へのリダイレクト

以下のコードを sites/default/settings.local.php(クラウド)または sites/default/settings.php(プライベート クラウド)ファイルに追加して、同じホスト名(たとえば、*.devportal.apigee.io)ですべてのポータル トラフィックを HTTPS にリダイレクトします。

このシナリオでは、デベロッパーが 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 へのリダイレクト

以下のコードを sites/default/settings.local.php ファイル(クラウド)または sites/default/settings.php ファイル(Private Cloud)に追加して、複数のホスト名ですべてのポータル トラフィックを HTTPS にリダイレクトします。

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