プライベートIPのみのクラウドSQL:良い、悪い、醜い

データは、すべての企業の新しい金鉱であり、このの宝物は必須です。安全で保護されている

。そのため、長年にわたり、データベース管理者の一般的なグッドプラクティスは、データベースへのすべてのパブリックアクセスを削除することです

、特にパブリックIP、およびプライベートIPからのアクセスのみを許可します。

この「ゴールデン」ルールはすべてのユーザーに適用されますセキュリティチームとそのためには、どのクラウド展開でも同じパターンが必要です。

Cloud SQLサービスは、Google Cloudのマネージドデータベースサービスであり、次のことができます。

これらの機能のおかげで、セキュリティチームの要件を適用できます

しかし、私たちが仕事をするとき、それは問題ですか?クラウドSQLインスタンスにパブリックIPがないようにするには、今日ですか?

これを3つのユースケースで確認しましょう:

  1. コンピューティングエンジン

    接続

  2. サーバーレスサービス

    接続

  3. ローカル環境

    接続

クラウドSQLプロキシバイナリ

使用例を詳しく説明する前に、 クラウドSQLプロキシ

  • このバイナリは

    。要約すると、データベースにSSL証明書がない場合でも、データは転送中に暗号化されます。

  • トンネルを開く前に、バイナリが現在の認証情報がCloudSQLインスタンスへのアクセスを許可されている場合のIAMサービスAPI 。これは、ユーザー/パスワードによる標準のデータベース認証に加えて、セキュリティの追加レイヤーです。
  • トンネルは、ローカルポート(TCP接続モード)またはUnixソケット(では不可能)で開くことができます。 Windows環境)

良い点:ComputeEngine接続

この「プライベートIPセキュリティパターン」は

構築されているためレガシーアーキテクチャ

(つまり、オンプレムVMとプライベートネットワーク)の場合、制約はIaaSの世界に完全に適合します

(つまり、Compute Engine + VPC)。
Compute Engineについて説明しましたが、Compute Engineインスタンスを使用するすべてのサービス(Dataflow、Dataproc、GKEなど)にも当てはまります。

  • VMをCloudSQLインスタンスのプライベートIPと同じVPC。
  • CloudSQLインスタンスのプライベートIPを使用して、ComputeEngineにデプロイされているアプリからアクセスします。
  • 必要なファイアウォールルールを開くには、必要です。

それは

「良い」

!!

注:この場合のCloudSQLプロキシの使用法について説明できます。 IAMサービスと暗号化された通信に対する承認をチェックすることにより、セキュリティレイヤーを追加しますが、遅延と潜在的な障害点も追加します。トレードオフの問題です。

悪い点:サーバーレスサービスの接続性

「新しい世界」を使用している場合サーバーレスパラダイム

であるクラウドの場合、クラウド実行クラウド機能

アプリエンジン。

実際、サーバーレスプラットフォームにデプロイする場合、定義上、サーバーを管理する必要はありません

、したがってサーバーがVPCにありません

。したがって、プロジェクトのVPCに接続されているCloudSQLプライベートIP にすぐにアクセスすることは

できません。

クラウド実行クラウド機能および App Engine クラウドSQLインスタンスをサーバーレスサービスに接続する方法

組み込み機能のおかげで:

Cloud SQLインスタンス接続名を構成に追加すると、インスタンスの開始時にトンネルが自動的に作成されます。

実際には、クラウドSQLプロキシバイナリによって

Unixソケットモードで開かれた接続です。 。ただし、このソリューションは、CloudSQLインスタンスにパブリックIP がある場合にのみ機能します。
プライベートIPのみ

の場合、およびの場合でもプライベートIP接続モードはCloudSQLプロキシに存在しますは機能しません!

サーバーレスサービスをCloudSQLプライベートIPに接続します

解決策が存在することを願っています。 private IP <をクリックできます。このためのCloudSQL接続チュートリアル

の/ div>タブ( Cloud Functionsの例)。

要約すると、次のことを行う必要があります。

  • サーバーレスVPCコネクタ

    、サーバーレスサービスと同じリージョン。そしてもちろん、CloudSQLインスタンスと同じVPCに接続します。
    現在、すべてのリージョンがサーバーレスVPCコネクタでサポートされていますが、しばらくはそうではありませんでした。

  • このVPCコネクタ

    でサーバーレスサービスをデプロイします。

    クラウド実行、クラウド機能および

    アプリエンジン

  • アプリで、(Unixソケット接続の代わりに)CloudSQLプライベートIP を使用します

このソリューションは機能しますが、新しいネットワーク要素

追加コスト

新しい障害の可能性のあるポイント

接続チェーン内にあります。

それは

「悪い」

!!

醜い:ローカル環境の接続性

データベースにクエリを実行する場合

、本番環境では、コンピューターにインストールされている優先データベースIDEを介して

、ローカル環境をクラウドに接続する必要がありますSQLインスタンス、つまりプライベートIP経由。

CloudSQLインスタンスにはパブリックIPがないため、から直接アクセスすることはできません。インターネット

(お使いのコンピューター)、およびクラウドSQLプロキシも

。ここでの解決策は、 要塞ホスト

:外界(パブリックIP)と内界(プライベートIP)の間のブリッジVM。

このために、小さなComputeEngineインスタンスを作成します。たとえば、 f1-micro (これを実現するには、非常に手頃な価格で、月額5ドル未満)。

セキュリティチームの要件

:すべてのVMにパブリックIPがあってはなりません。もちろん、0.0.0.0 / 0ファイアウォールルールは許可されていません。特にポート22(ssh)

パブリックIPのない要塞ホスト

対処するための新しい制約!!しかし、それは一貫しています。ドアを閉めると、窓を開けることになります!!
問題ありません。GoogleCloudは、このための優れた簡単なソリューションを提供します: Identity-Aware Proxy (IAP)

IAPでは、 Google CloudIAPを付与するだけで済みますファイアウォールルールのポート22でComputeEngineにアクセスするためのIP範囲

35.235.240.0/20 。したがって、 0.0.0.0/0(インターネット全体)を開く必要はありません。 Compute Engine sshポートにアクセスします!

次に、 gcloudSDKを使用して要塞ホストComputeに接続しますエンジンインスタンス

そして

魔法が起こります! gcloud SDK は、ComputeEngineのパブリックIP の欠如を自動的に検出しますインスタンスと

は自動的にIAPトンネルを開き、SSHでインスタンスに接続します。ユーザーには表示されません!

資格情報(ここではユーザーアカウントですが、サービスアカウントの場合もあります) IAPトンネルを作成するための十分な権限が必要です

。役割は、 トンネルを作成するためのroles / iap.tunnelResourceAccessor 、および roles /compute.instanceAdmin.v1を使用してVMにアクセスします

これで、要塞ホストに接続しましたが、CloudSQLインスタンスにまだ接続していません

IAPトンネリング、SSLポート転送、クラウドSQLプロキシ

そこで、 「醜い」

の部分が始まります。達成すべき2つのことがあります

  1. 要塞ホストをCloudSQLインスタンス

    に接続しますプライベートIP

  2. ローカル環境データベース接続要求

    を要塞ホストに転送して

    クラウドSQLプロキシトンネルを介してクラウドSQLインスタンス

    に到達します

1。要塞ホストからのクラウドSQLインスタンスの接続

このためには、要塞ホストとクラウドSQLインスタンスの間のトンネルを開くためのクラウドSQLプロキシが必要です。

最初の問題: あなたが

パブリックIPを持っていないので、インターネットにアクセスできません。
クラウドNATを作成することを選択できます

。ただし、最も簡単な方法は、ローカル環境にダウンロード

してから、要塞ホスト

にコピーします。これを実現するには、このコマンドを使用できます。
gcloud compute scp /local/path/to/cloud_sql_proxy :/tmp
IAPを介してSSH接続を開くことができるため、 scp プロトコル(sshコピー)から IAPを介してファイルをコピーします!魔法!!

これで、要塞ホストのCompute Engineインスタンスにバイナリが作成され、接続が機能するかどうかをテストしたい

。コマンドを実行できます

connection_name クラウドSQLインスタンスのページ内

2番目の問題: 機能しません!そして、多くの理由があります!

  • 要塞ホストを作成した場合

    デフォルトのパラメータでComputeEngine 、特にAPIスコープ部分では、Cloud SQLAPIに到達するための十分なスコープがありません。
    これを解決するには、コンピューティングエンジンを停止して

    、編集してスコープをカスタマイズする

  • Cloud SQLトンネルが作成されると、現在の認証情報の IAM権限

    (ここでは Compute Engineの認証情報がチェックされます

    。 Compute Engineサービスアカウントに十分な権限がありませんでした。
    これを解決するには、サービスアカウントに最小限の役割が付与されていることを確認してくださいCloud SQL clientCloud SQL editorまたは

    ComputeEngineのデフォルトのサービスアカウントには役割/エディターがあります役割。広すぎますが、ユースケースには十分です。

  • 最後に、デフォルトでは、がGoogleCloud APIをリクエストすると、パブリックDNSがリクエストされます。これは、トンネルの作成時にCloudSQLプロキシがCloudSQLAPIまたはIAMサービスを要求したときに発生します。また、要塞ホストCompute Engine にはパブリックIPがないため、インターネットと

    パブリックDNS。

    これを解決するには、2つの解決策があります。以前に提案されたようにCloudNAT を設定するか、Google Cloud VPCのトリッキーな機能を使用します:要塞ホストComputeEngineの現在の

    サブネットを許可するプライベートを呼び出すには

    googleapis.com DNS 。これを実現するには、VPCに移動し、正しいサブネットを選択して編集します。次に、[プライベートGoogleアクセス]ラジオボタンでOnを選択し、保存します。

すばらしい!!これで、要塞ホストComputeEngineはCloudSQLプロキシ

を使用して、ローカルポート3306からCloudSQLインスタンスへのトンネルを開くことができます。プライベートIPを介して。

2。ローカル環境トラフィックをCloudSQLインスタンスに転送します

これを実現するために、 gcloud ssh 組み込み機能ですが、代替ソリューションsshとCompute Instancesを直接接続することに加えて、 gcloud SDKを使用すると、任意のポートにトンネルを作成できます

では、要塞ホストのポート22にトンネルを作成しましょう

Compute Engineインスタンスを作成し、任意のローカルポートを定義します(ここでは4226

gcloud compute start-iap-tunnel  22 \
--zone= --local-host-port=localhost:4226

すばらしい、トンネルはこれを使用して、sshの要塞ホストComputeEngineインスタンスに接続できます。

トンネルを開いてターミナルで実行し、開いてください。新しいもの。

それでは、 から

。 1つのコマンドで、接続を確立するためのいくつかの必須事項を達成します

  • ローカル環境から要塞ホスト

    コンピューティングエンジン
    -L 3306:localhost:3306
    「ローカルポート

    は、ターゲットVM(ここでは要塞ホスト)に転送され、ポートに到達します 3306 localhost (つまりターゲットVM)で開かれました “

  • 最初の

    sshキーを再利用します。 / div>要塞ホストComputeEngine(またはscp)への接続。この秘密鍵は、現在のユーザーのhomeディレクトリに保存されます

    -i ~/.ssh/google_compute_engine

  • ssh iv id =を開きますlocalhost環境の既存のIAPトンネル

    を介した “f739a2f021″>

接続、およびローカルポートからのトラフィック

  • 要塞ホストのComputeEngineに接続している場合、 Cloud SQLプロキシを実行して、ポート3306でCloudSQLインスタンス

    へのトンネルを作成します。このためには、--
    -- /tmp/cloud_sql_proxy instances==tcp:3306

  • の後に、リモート(要塞ホスト)で必要なコマンドを実行します。

    そしてこれらすべてをまとめます

    これで完了です! お気に入りのデータベースIDEを使用して、localhost:3306に接続し、ユーザー/パスワードを使用してデータベースにサインインします。

    うわー!! セキュリティパターンに準拠できるようにするためのこれらすべて

    !ここに、私たちが構築したもののスキーマがあります

    それは

    「醜い」

    !!

    追加の副作用

    div id = “f739a2f021″>

    プライベートIPを使用するCloudSQLは、警告を追加するだけです。実際、ピアリングはプロジェクトのVPCとCloudSQLネットワーク

    (Google Cloudによって管理)の間に作成されます。
    また、ピアリングには2つの制限があります。

    • あなたは

      VPCあたり25ピアリングに制限

    • ピアリング間の移行は不可能です

    この最新のポイントは非常に重要であり、別のプロジェクトからデータベースインスタンスにアクセスしたい場合はブロッカーになる可能性があります

    。実際、別のプロジェクトのVPCから、プライベートIPを介して到達するCloudSQLインスタンスを持つプロジェクトとのピアリングを作成したいと考えています。

    ただし、一時性の制限があるため、次のことができます。 t:クラウドSQLプライベートIPは他のプロジェクトのVPCからは見えません。
    ここでの回避策は、 2つのVPCをピアリングするVPNを作成することです


    それは…

    「最も醜い」??

    追加の副作用はパブリックIPが定義されていない場合にAppScriptアプリがCloudSQLインスタンスを使用できないこと。

    「スマート」なセキュリティパターンが重要

    セキュリティの問題とデータベースの既存のパターンレガシーの世界でうまく機能します。
    現在、CloudSQLとCloudSQLプロキシを使用すると、追加のセキュリティレイヤーが存在し、古いパターンが無効になります。

    IP範囲が許可されていない場合に

    パブリックIPに接続することの問題は何ですか

    レガシーの世界でのファイアウォールルールの

    定義

    ではありません。それ? データベースがホストされているこの範囲/ IPにアクセスするすべてのIPを拒否します

    セキュリティチームの懸念

    :IP範囲が許可されていないことを確認するにはどうすればよいですか?

    この質問は正当であるため、組織ポリシーを適用する

    制限 CloudSQLインスタンス上の承認済みネットワーク )から CloudSQLインスタンスへのパブリックIP範囲の追加を防止

    、これは全社的です。

    最終的に、 Cloud SQLインスタンスでパブリックIPを許可すると、多くの回避策を回避できます。対処すべき奇妙なデザイン

    、およびセキュリティレベルを下げることなく

    さらに、作成されたトンネルは暗号化され、高レベルのセキュリティを保証します

    クラウドはパラダイムを変更し( Beyond Corp を参照)、セキュリティパターンを更新してそれらに準拠する必要があります。
    スマートセキュリティパターンは、レガシーセキュリティパターンよりも優れています!

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です