コンテンツにスキップ

ゼロトラスト GitLab SSH & HTTP

Last reviewed: almost 4 years ago

Cloudflare Accessを使用して、自己ホスト型のGitLabインスタンスにゼロトラストルールを追加できます。Cloudflare Tunnelと組み合わせることで、ユーザーはHTTPおよびSSHを介して接続し、チームのアイデンティティプロバイダーで認証できます。

この手順では、以下の内容をカバーします:

  • GitLabのインスタンスをデプロイする
  • そのインスタンスへのすべての受信接続を制限し、Cloudflare Tunnelを使用してCloudflareへの送信接続を設定する
  • Cloudflare Accessを使用して、誰がGitLabにアクセスできるかを制御するポリシーを構築する
  • Cloudflareを介してHTTPおよびSSHで接続する

完了までの時間:

1時間


GitLabのデプロイ

このセクションでは、DigitalOceanにGitLabをデプロイする手順を説明します。すでにGitLabをデプロイしている場合は、このセクションをスキップできます。

16GBのRAMと6CPUを持つDropletを作成します。これにより、GitLabのリソース推奨に基づいて500ユーザーをサポートできるはずです。

Dropletの作成

GitLabは、インターネットに公開される外部IPを提供します(今のところ)。初期設定のために、この外部IPを使用してデプロイされたサーバーに接続する必要があります。DigitalOceanアカウントにSSHキーを追加することで、IPへの接続を安全にすることができます。

この例では、macOSマシンを使用してDropletを設定します。DigitalOceanからマシンに割り当てられたIPアドレスをコピーします。

マシンのIP

ターミナルを開き、次のコマンドを実行します。IPアドレスはDigitalOceanによって割り当てられたものに置き換えてください。

Terminal window
ssh root@134.209.124.123

次に、GitLabをインストールします。この例では、UbuntuパッケージとGitLabのドキュメントの手順を使用しますが、以下に示すいくつかの例外があります。

次のコマンドを実行して開始します。

Terminal window
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash

上記のコマンドは、このマシンにGitLabソフトウェアをダウンロードします。これをインストールする必要があります。これは、このチュートリアルがGitLabのドキュメントの操作から逸脱する最初の場所です。GitLabが提供するチュートリアルの次のステップでは、外部ホスト名を設定します。代わりに、ソフトウェアをインストールするだけで済みます。

Terminal window
sudo apt-get install gitlab-ee

約1分後、GitLabがインストールされます。

GitLabのインストール

ただし、アプリケーションはまだ実行されていません。ssを使用して、リスニングしているポートを確認できます。

Terminal window
sudo ss -lntup

結果は、現在マシンでアクティブなサービスのみであるべきです:

Terminal window
sudo ss -lntup
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 *:9094 *:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=29,fd=3))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=29,fd=4))

GitLabを起動するには、ソフトウェアの再構成コマンドを実行します。

Terminal window
sudo gitlab-ctl reconfigure

GitLabはそのコンポーネントサービスを起動します。完了したら、GitLabが実行中で、ポート22と80の両方でリスニングしていることを確認します。

GitLabサービス

Terminal window
sudo ss -lntup
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 *:9094 *:*
tcp LISTEN 0 4096 127.0.0.1:9236 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.1:8150 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=29,fd=3))
tcp LISTEN 0 4096 127.0.0.1:8151 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.1:3000 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.1:8153 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.1:8154 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.1:8155 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:8060 0.0.0.0:* users:(("nginx",pid=324,fd=8))
tcp LISTEN 0 4096 127.0.0.1:9121 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.1:9090 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.1:9187 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.1:9093 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.1:9229 0.0.0.0:*
tcp LISTEN 0 1024 127.0.0.1:8080 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=324,fd=7))
tcp LISTEN 0 4096 127.0.0.1:9168 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.1:8082 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=29,fd=4))
tcp LISTEN 0 4096 *:9094 *:*

ユーザーはSSH(ここではポート22)およびWebアプリ(ポート80)を介してGitLabに接続します。次のステップでは、Cloudflare Accessを介してユーザーが両方を試すことができるようにします。このまま実行し、Cloudflareダッシュボードに移動します。

ゼロトラストルールでGitLabを保護する

ゼロトラストポリシーの構築

Cloudflare Accessを使用して、GitLabのWebアプリケーション(HTTP)およびSSHを介して接続できるユーザーを決定するゼロトラストルールを構築できます。

ユーザーがAccessで保護されたサイトにリクエストを送信すると、そのリクエストは最初にCloudflareのネットワークに到達します。Accessは、そのユーザーがアプリケーションに到達することを許可されているかどうかを確認できます。Cloudflare Tunnelと統合されると、ゼロトラストアーキテクチャは次のようになります:

GitLabサービス

アプリケーションに到達できるユーザーを決定するために、Cloudflare AccessはOktaやAzureAD、Googleなどのアイデンティティプロバイダーとの統合に依存して、ドアでチェックされるアイデンティティカードを発行します。VPNは、誰かがそれを止めるためのアクティブなルールを構築しない限り、ユーザーにプライベートネットワーク上で自由に行動させますが、Accessはすべてのリクエスト(および設定された任意の粒度)でそのアイデンティティチェックを強制します。

GitLabの場合、まず2つのポリシーを構築します。ユーザーはWebアプリとSSHの2つの方法でGitLabに接続します。それぞれのサブドメインを保護するポリシーを作成します。まず、Webアプリです。

ルールを構築する前に、これらの手順に従って、アカウントでCloudflare Accessを設定する必要があります。

有効にしたら、Zero Trustのアプリケーションページに移動します。アプリケーションを追加を選択します。

提示されたオプションから自己ホスト型を選択します。

自己ホスト型

ポリシービルダーでは、リソースを表すサブドメインを追加するように求められます。これは、Cloudflareアカウント内のドメインのサブドメインである必要があります。WebアプリケーションとSSHフローのために別々のサブドメインが必要です。

この例では、Webアプリケーションにはgitlab.widgetcorp.tech、SSH接続にはgitlab-ssh.widgetcorp.techを使用します。

このページにいる間に、どのアイデンティティプロバイダーが認証を許可されるかを決定できます。デフォルトでは、すべての構成されたプロバイダーが許可されます。次へを選択して、アプリケーションに到達できるユーザーを決定するルールを構築します。

次に、サイトに到達できるユーザーを決定するためのルールを追加できます。

次へを選択し、セットアップページで再度次へを選択します。この例では、高度なCORS構成は必要ありません。2つ目のアプリケーションgitlab-ssh.widgetcorp.techについても同様の手順を繰り返します。

Cloudflare Tunnel

Cloudflare Tunnelは、このマシンとCloudflareのネットワーク間に安全な送信専用接続を作成します。送信専用モデルを使用することで、このマシンへの直接アクセスを防ぎ、外部に公開された侵入ポイントをロックダウンできます。そのため、オープンファイアウォールポートはありません。

Cloudflare Tunnelは、Cloudflareの軽量デーモンcloudflaredを通じて実現されます。ダウンロードページに記載されている手順に従って、DigitalOceanマシンにcloudflaredをダウンロードしてインストールします。

インストールが完了したら、次のコマンドでcloudflaredのインスタンスを認証します。

Terminal window
cloudflared login

このコマンドは、Cloudflareアカウントでログインするために訪問する必要があるURLを出力します。

アカウントに追加したウェブサイトを選択します。

アカウント内のサイトの1つを選択すると、Cloudflareはこのcloudflaredインスタンスを認証するための証明書ファイルをダウンロードします。これで、Cloudflareアカウント内のCloudflare Tunnel接続を制御するためにcloudflaredを使用できます。

証明書のダウンロード

Cloudflareへの接続

これで、Cloudflare Tunnelを使用してGitLabをCloudflareに接続できます。

  1. 次のコマンドを実行して新しいトンネルを作成します。
Terminal window
cloudflared tunnel create gitlab

cloudflaredは、このトンネルのユニークIDを生成します。例えば、6ff42ae2-765d-4adf-8112-31c55c1551efのようになります。このトンネルは、SSHおよびHTTPトラフィックの両方に使用できます。

  1. Cloudflare Tunnelを構成して、両方の宛先にトラフィックをプロキシする必要があります。以下の構成は、Webアプリケーションのために作成されるDNSレコードと、SSHトラフィックを表すDNSレコードに向けてトラフィックを送ります。

お好みのテキストエディタを使用して構成ファイルを編集します。この例ではViを使用します。

Terminal window
vim ~/.cloudflared/config.yml
  1. トンネルを構成してトラフィックを提供します。
tunnel: 6ff42ae2-765d-4adf-8112-31c55c1551ef
credentials-file: /root/.cloudflared/6ff42ae2-765d-4adf-8112-31c55c1551ef.json
ingress:
- hostname: gitlab.widgetcorp.tech
service: http://localhost:80
- hostname: gitlab-ssh.widgetcorp.tech
service: ssh://localhost:22
# 以前のルールに一致しないトラフィックには404で応答するキャッチオールルール
- service: http_status:404

自己ホスト型

  1. 次のコマンドで構成ファイルが正しく設定されているかテストできます。
Terminal window
cloudflared tunnel ingress validate

cloudflaredはトンネルが正常であることを示すはずです。これで、トンネルを実行し始めることができます。

Terminal window
cloudflared tunnel run

トンネルの実行

DNSレコードの構成

これで、CloudflareダッシュボードでGitLabのDNSレコードを作成できます。Webアプリケーション用とSSHトラフィック用の2つのレコードが必要です。

DNSタブで、Accessポリシーを構築したウェブサイトを選択します。レコードを追加を選択し、タイプからCNAMEを選択します。名前フィールドにgitlabを入力します。ターゲットフィールドに、作成したトンネルのIDを入力し、cfargotunnel.comを追加します。この例では、その値は次のようになります:

6ff42ae2-765d-4adf-8112-31c55c1551ef.cfargotunnel.com

保存を選択します。同じターゲットで2つ目のCNAMEレコードを作成するプロセスを繰り返しますが、名前にはgitlab-sshを入力します。両方のレコードが同じトンネルを指すように表示されるはずです。上記の構成ファイルで定義されたイングレスルールは、トラフィックを適切なポートに誘導します。

DNSの表示

Webアプリケーションへの接続

これで、Webアプリケーションのエンドツーエンド構成をテストできます。Webアプリケーション用に作成されたサブドメインにアクセスします。Cloudflare Accessが認証を求めます。プロバイダーでログインします。

認証が完了すると、GitLabのWebアプリケーションが表示されるはずです。

GitLab Web

自分のアカウントを登録し、次のステップでSSHをテストするために空のプロジェクトを作成します。

空のプロジェクト

GitLabは新しいプロジェクトとリポジトリを作成します。

SSHの構成

SSHを介してコードをプッシュおよびプルするには、クライアントマシンにもcloudflaredをインストールする必要があります。この例では、macOSラップトップを使用します。macOSでは、次のコマンドでcloudflaredをインストールできます。

Terminal window
brew install cloudflared

cloudflaredをインストールする必要がありますが、SSHコマンドを特別な方法でラップする必要はありません。代わりに、SSH構成ファイルに一度だけ変更を加える必要があります。

Terminal window
vim /Users/samrhea/.ssh/config

次の値を入力し、gitlab-ssh.widgetcorp.techを作成したホスト名に置き換えます。

Host gitlab-ssh.widgetcorp.tech
ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h

これで、以前に作成したプロジェクトをクローンしようとすることでSSHフローをテストできます。

Terminal window
git clone git@gitlab-ssh.widgetcorp.tech:samrhea/demo

cloudflaredは、私のアイデンティティプロバイダーでログインするように促し、成功するとデバイスにトークンを発行して認証を許可します。

GitLab Clone

公開ポートの制限

これで、DigitalOceanのファイアウォールを単一のルールで構成し、すべての受信トラフィックをブロックして直接アクセスを防ぐことができます。

Set Rules

Cloudflare Tunnelは、アウトバウンドのみの接続を引き続き実行し、このマシンが暗号通貨マイニング作業やそれ以上の何かに巻き込まれるのを避けることができます。

ログの表示

許可されたイベントとブロックされたイベントのログも表示できます。Zero TrustのLogsセクションのAccessページを開いてください。