ポータルでの TLS の使用

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

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

TLS とポータル

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

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

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

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

    Developer Services ポータルを使用して API をデプロイする場合、デベロッパーはポータルにログインして、アプリケーションの登録と API キーの受信を行います。ログイン認証情報と API キーは、セキュリティ確保のために HTTPS 経由で送信することが望まれる組織の専有情報です。このタイプの専有情報は、HTTPS 経由で送信する必要があります。

    このシナリオの TLS を構成する方法は、ポータルをデプロイした方法、つまり、クラウドと Apigee Edge for Private Cloud のどちらでデプロイしたかによって異なります。次のセクションでは、両方のシナリオについて説明します。

ポータルと Edge 管理 API の間の TLS の構成

通信で TLS を使用できるかどうかは、Edge 管理 API の構成によって決まります。TLS を使用するように Edge 管理 API が構成されている場合、ポータルは HTTPS を使用できます。それ以外の場合、ポータルは HTTP 経由で Edge と通信します。したがって、ポータル デベロッパーは、ポータルと Edge の間の接続を設定するために、Edge がどのように構成されているかを確認するだけで済みます。

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

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

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

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

プライベート クラウド インストールの Edge の場合、Edge 管理 API の URL は次の形式になります。
http://EdgePrivateCloudIp:8080/v1?
または
https://EdgePrivateCloudIp:TLSport/v1

EdgePrivateCloudIp は Edge Management Server サーバーの IP アドレス、TLSport は Edge 管理 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 を構成できます。デフォルトでは、Apigee は Apache ウェブサーバーをインストールします。Apache で TLS を構成する方法については、https://www.drupal.org/https-information をご覧ください。

ポータルを本番環境にデプロイするには、独自の TLS 証明書を取得する必要があります。

その他の TLS 設定の構成

sites/default/settings.local.php(クラウド)または sites/default/settings.php(プライベート クラウド)ファイルを編集して、ポータルのために TLS の構成を変更できます。

ファイルを編集するときに、ini_set() 関数のインスタンスを追加してプロパティを設定します。この関数の詳細については、http://php.net/manual/ja/function.ini-set.php をご覧ください。

sites/default/settings.local.php(クラウド)または sites/default/settings.php(プライベート クラウド)ファイルで次のプロパティを設定できます。

  • 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_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(プライベート クラウド)ファイルに下記のコードを追加する必要があります。ロードバランサは、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 へのリダイレクト

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

このシナリオでは、デベロッパーが 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 ファイル(プライベート クラウド)に追加します。

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