GitLab OpenID ConnectによるVault認証

GitLab 9.0 で導入されました

VaultはHashiCorpが提供するシークレット管理アプリケーションです。 シークレット環境変数、暗号化キー、認証トークンなどの機密情報を保存、管理することができます。 VaultはIdentity-based Accessを提供しており、Vaultユーザーは複数の好みのクラウドプロバイダを介して認証することができます。

このドキュメントでは、VaultのOpenID認証機能を利用してGitLabからVaultユーザーを認証する方法を説明します。 以下は、すでにVaultがインストールされ、実行されていることを前提としています。

  1. GitLab から OpenID Connect クライアント ID とシークレットを取得します:

    まず GitLab アプリケーションを作成し、Vault で認証するためのアプリケーション ID とシークレットを取得します。 これを行うには、GitLab にサインインして以下の手順に従います:

    1. GitLabで右上のアバターをクリックし、Settings(設定)> Applications(アプリケーション)を選択します。
    2. アプリケーション名とリダイレクトURIを入力し、OpenIDスコープを選択してください。
    3. アプリケーションを保存します。
    4. クライアントIDとシークレットをコピーするか、参照用にページを開いておいてください。

    GitLab OAuth provider

  2. Vault で OIDC 認証を有効にします:

    OpenID ConnectはデフォルトではVaultで有効になっていません。 ターミナルで有効にする必要があります。

    ターミナルセッションを開き、以下のコマンドを実行して、VaultのOpenID Connect認証プロバイダを有効にします:

    vault auth enable oidc
    

    ターミナルに次のような出力が表示されるはずです:

    Success! Enabled oidc auth method at: oidc/
    
  3. OIDCコンフィグを書き込みます:

    次に、VaultにGitLabが生成したアプリケーションIDとシークレットを渡す必要があります。

    ターミナルセッションで以下のコマンドを実行し、OpenIDスコープを使って作成したGitLabアプリケーションにVaultがアクセスできるようにします。 これにより、VaultはGitLabを通して認証を行うことができます。

    以下の例のyour_application_idyour_secret は、アプリ用に生成されたアプリケーションIDとシークレットに置き換えてください:

    $ vault write auth/oidc/config \
        oidc_discovery_url="https://gitlab.com" \
        oidc_client_id="your_application_id" \
        oidc_client_secret="your_secret" \
        default_role="demo" \
        bound_issuer="localhost"
    

    ターミナルに次のような出力が表示されるはずです:

    Success! Data written to: auth/oidc/config
    
  4. OIDCロールコンフィグを書き込みます:

    Vault が GitLab アプリケーション ID とシークレットを取得したところで、今度は リダイレクト URIとアプリケーション作成時に GitLab に渡されたスコープを知る必要があります。 リダイレクト URI は、Vault のインスタンスが動いている場所と一致する必要があります。oidc_scopes フィールドにはopenidを含める必要があります。前のステップと同様に、your_application_id を GitLab から生成されたアプリケーション ID に置き換えます:

    この設定は、作成するロールの名前で保存されます。今回は、demo ロールを作成します。後ほど、Vault CLIからこのロールにアクセスする方法を説明します。

    vault write auth/oidc/role/demo \
          user_claim="sub" \
          allowed_redirect_uris="http://localhost:8250/oidc/callback,http://127.0.0.1:8200/ui/vault/auth/oidc/oidc/callback" \
          bound_audiences="your_application_id" \
          role_type="oidc" \
          oidc_scopes="openid" \
          policies=demo \
          ttl=1h
    
  5. Vaultにサインインしてください:

    1. Vault UI(例:http://127.0.0.1:8200/ui/vault/auth?with=oidc)にアクセスします。
    2. OIDC メソッドが現在選択されていない場合は、ドロップダウンを開いて選択します。
    3. Sign in With GitLab ボタンをクリックすると、モーダルウィンドウが開きます:

      Sign into Vault with GitLab

    4. モーダルでAuthorize をクリックし、Vault が GitLab 経由でサインインできるようにします。 サインインしたユーザーとして Vault UI にリダイレクトされます。

      Authorize Vault to connect with GitLab

  6. Vault CLIを使用してサインインします(オプション):

    VaultではCLIを使ってサインインすることもできます。

    上記と同じ設定を書いた後、ターミナルで以下のコマンドを実行すると、上記ステップ4で作成したロール設定でサインインすることができます:

    vault login -method=oidc port=8250 role=demo
    

    このコマンドが何をするのかを簡単に説明します:

    1. OIDCロールの設定を書き込む(ステップ4)で、demoというロールを作成しました。role=demo を設定することで、Vaultがどの設定でログインしたいかを知ることができます。
    2. Vault がOIDC のサインイン方法を使うように設定するために、-method=oidcを設定します。
    3. GitLabがリダイレクトするポートを設定するために、port=8250 、またはRedirect URIをリストするときにGitLabに与えられたポート番号と一致するポート番号を設定します。

    上記のコマンドを実行すると、ターミナルにリンクが表示されます。 ターミナルのリンクをクリックすると、OIDC経由でVaultにサインインしていることを確認するタブがブラウザに開きます:

    Signed into Vault via OIDC

    ターミナルから出力されます:

    Success! You are now authenticated. The token information displayed below
    is already stored in the token helper. You do NOT need to run "vault login"
    again. Future Vault requests will automatically use this token.