ゼロトラスト GitLab SSH & HTTP
Cloudflare Accessを使用して、自己ホスト型のGitLabインスタンスにゼロトラストルールを追加できます。Cloudflare Tunnelと組み合わせることで、ユーザーはHTTPおよびSSHを介して接続し、チームのアイデンティティプロバイダーで認証できます。
この手順では、以下の内容をカバーします:
- GitLabのインスタンスをデプロイする
- そのインスタンスへのすべての受信接続を制限し、Cloudflare Tunnelを使用してCloudflareへの送信接続を設定する
- Cloudflare Accessを使用して、誰がGitLabにアクセスできるかを制御するポリシーを構築する
- Cloudflareを介してHTTPおよびSSHで接続する
完了までの時間:
1時間
このセクションでは、DigitalOceanにGitLabをデプロイする手順を説明します。すでにGitLabをデプロイしている場合は、このセクションをスキップできます。
16GBのRAMと6CPUを持つDropletを作成します。これにより、GitLabのリソース推奨 ↗に基づいて500ユーザーをサポートできるはずです。

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

ターミナルを開き、次のコマンドを実行します。IPアドレスはDigitalOceanによって割り当てられたものに置き換えてください。
ssh root@134.209.124.123次に、GitLabをインストールします。この例では、Ubuntuパッケージ ↗とGitLabのドキュメントの手順を使用しますが、以下に示すいくつかの例外があります。
次のコマンドを実行して開始します。
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificatescurl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash上記のコマンドは、このマシンにGitLabソフトウェアをダウンロードします。これをインストールする必要があります。これは、このチュートリアルがGitLabのドキュメントの操作から逸脱する最初の場所です。GitLabが提供するチュートリアルの次のステップでは、外部ホスト名を設定します。代わりに、ソフトウェアをインストールするだけで済みます。
sudo apt-get install gitlab-ee約1分後、GitLabがインストールされます。

ただし、アプリケーションはまだ実行されていません。ssを使用して、リスニングしているポートを確認できます。
sudo ss -lntup結果は、現在マシンでアクティブなサービスのみであるべきです:
sudo ss -lntupNetid State Recv-Q Send-Q Local Address:Port Peer Address:Port Processudp 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を起動するには、ソフトウェアの再構成コマンドを実行します。
sudo gitlab-ctl reconfigureGitLabはそのコンポーネントサービスを起動します。完了したら、GitLabが実行中で、ポート22と80の両方でリスニングしていることを確認します。

sudo ss -lntupNetid State Recv-Q Send-Q Local Address:Port Peer Address:Port Processudp 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ダッシュボードに移動します。
Cloudflare Accessを使用して、GitLabのWebアプリケーション(HTTP)およびSSHを介して接続できるユーザーを決定するゼロトラストルールを構築できます。
ユーザーがAccessで保護されたサイトにリクエストを送信すると、そのリクエストは最初にCloudflareのネットワークに到達します。Accessは、そのユーザーがアプリケーションに到達することを許可されているかどうかを確認できます。Cloudflare Tunnelと統合されると、ゼロトラストアーキテクチャは次のようになります:

アプリケーションに到達できるユーザーを決定するために、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のネットワーク間に安全な送信専用接続を作成します。送信専用モデルを使用することで、このマシンへの直接アクセスを防ぎ、外部に公開された侵入ポイントをロックダウンできます。そのため、オープンファイアウォールポートはありません。
Cloudflare Tunnelは、Cloudflareの軽量デーモンcloudflaredを通じて実現されます。ダウンロードページに記載されている手順に従って、DigitalOceanマシンにcloudflaredをダウンロードしてインストールします。
インストールが完了したら、次のコマンドでcloudflaredのインスタンスを認証します。
cloudflared loginこのコマンドは、Cloudflareアカウントでログインするために訪問する必要があるURLを出力します。
アカウントに追加したウェブサイトを選択します。
アカウント内のサイトの1つを選択すると、Cloudflareはこのcloudflaredインスタンスを認証するための証明書ファイルをダウンロードします。これで、Cloudflareアカウント内のCloudflare Tunnel接続を制御するためにcloudflaredを使用できます。

これで、Cloudflare Tunnelを使用してGitLabをCloudflareに接続できます。
- 次のコマンドを実行して新しいトンネルを作成します。
cloudflared tunnel create gitlabcloudflaredは、このトンネルのユニークIDを生成します。例えば、6ff42ae2-765d-4adf-8112-31c55c1551efのようになります。このトンネルは、SSHおよびHTTPトラフィックの両方に使用できます。
- Cloudflare Tunnelを構成して、両方の宛先にトラフィックをプロキシする必要があります。以下の構成は、Webアプリケーションのために作成されるDNSレコードと、SSHトラフィックを表すDNSレコードに向けてトラフィックを送ります。
お好みのテキストエディタを使用して構成ファイルを編集します。この例ではViを使用します。
vim ~/.cloudflared/config.yml- トンネルを構成してトラフィックを提供します。
tunnel: 6ff42ae2-765d-4adf-8112-31c55c1551efcredentials-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
- 次のコマンドで構成ファイルが正しく設定されているかテストできます。
cloudflared tunnel ingress validatecloudflaredはトンネルが正常であることを示すはずです。これで、トンネルを実行し始めることができます。
cloudflared tunnel run
これで、CloudflareダッシュボードでGitLabのDNSレコードを作成できます。Webアプリケーション用とSSHトラフィック用の2つのレコードが必要です。
DNSタブで、Accessポリシーを構築したウェブサイトを選択します。レコードを追加を選択し、タイプからCNAMEを選択します。名前フィールドにgitlabを入力します。ターゲットフィールドに、作成したトンネルのIDを入力し、cfargotunnel.comを追加します。この例では、その値は次のようになります:
6ff42ae2-765d-4adf-8112-31c55c1551ef.cfargotunnel.com保存を選択します。同じターゲットで2つ目のCNAMEレコードを作成するプロセスを繰り返しますが、名前にはgitlab-sshを入力します。両方のレコードが同じトンネルを指すように表示されるはずです。上記の構成ファイルで定義されたイングレスルールは、トラフィックを適切なポートに誘導します。

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

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

GitLabは新しいプロジェクトとリポジトリを作成します。
SSHを介してコードをプッシュおよびプルするには、クライアントマシンにもcloudflaredをインストールする必要があります。この例では、macOSラップトップを使用します。macOSでは、次のコマンドでcloudflaredをインストールできます。
brew install cloudflaredcloudflaredをインストールする必要がありますが、SSHコマンドを特別な方法でラップする必要はありません。代わりに、SSH構成ファイルに一度だけ変更を加える必要があります。
vim /Users/samrhea/.ssh/config次の値を入力し、gitlab-ssh.widgetcorp.techを作成したホスト名に置き換えます。
Host gitlab-ssh.widgetcorp.tech ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %hこれで、以前に作成したプロジェクトをクローンしようとすることでSSHフローをテストできます。
git clone git@gitlab-ssh.widgetcorp.tech:samrhea/democloudflaredは、私のアイデンティティプロバイダーでログインするように促し、成功するとデバイスにトークンを発行して認証を許可します。

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

Cloudflare Tunnelは、アウトバウンドのみの接続を引き続き実行し、このマシンが暗号通貨マイニング作業やそれ以上の何かに巻き込まれるのを避けることができます。
許可されたイベントとブロックされたイベントのログも表示できます。Zero TrustのLogsセクションのAccessページを開いてください。