GitLabにログインする際AzureのSSOを利用する方法(SAML)

# 構築した経緯
セキュリティのためAzureでアカウント一元管理したい＆Azureにログインを任せたいっていう要望が来たため

# 検証環境
* Azure(ActiveDirectoryの管理)
* Vagrant+VirtualBoxで作ったCentOS7環境でGitLab

# 前提
GitLabに関してはVagrant+VirtualBoxで作成(CentOS7 ホストが192.168.10.210　443を22443にポートフォワード)

# Azure側
## [Azureポータルサイト](https://portal.azure.com/) 表示をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142784/314a349d-3807-2d94-0a59-54584eaaa38e.png)

## サイドバーのエンタープライズアプリケーションをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142784/a32d3fb4-be3d-96ce-6efc-7e2a16009391.png)

## 新しいアプリケーションをクリックして管理用アプリケーション作成する(ここは会社の管理アカウントでないとできないため私作ってないので割愛)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142784/a67c3d68-5d5a-aba1-e862-0483fd4e6774.png)

## 作ったアプリケーションをクリック後 シングルサインオンをクリック
(なんか初期アクセス時UI違った気がする…SAMLをクリックした気がする)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142784/bb26efbd-17a8-b106-ef91-a5eac5584f17.png)

## 基本的なSAML構成を下記のとおりにする(※識別子は白で塗りつぶしてますが入力はしてます)＆識別子はメモっておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142784/5464e5f8-07c8-a932-00a7-8f8d073500e3.png)


## SAML署名証明書の証明書(Base64)をDLしておく＆拇印はメモっておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142784/6555081e-16bb-6f3f-005e-e5a2332e596c.png)


## ログインURLとログアウトURLをメモっておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142784/c2a18b39-2466-9652-4a67-b286b8490f3d.png)

## ユーザーとグループの割当でログインするユーザーを登録しておく(詳細割愛)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142784/e596234a-c0b6-73ed-389c-58f17d52cf91.png)

# GitLab側
## インストールに関しては割愛
※[セルフマネージドGitLabをインストール](https://www.gitlab.jp/install/)を参考にしたらよいかと

## 前提
Azureでログインする際のメールアドレス(今回のサンプルではhoge@example.jp)をGitLab側のユーザー作成において登録してることを前提にしてます(GitLab側のユーザーパスワードは覚えておく必要はないです)

## SAML設定
[SAML OmniAuth Provider](https://docs.gitlab.com/ee/integration/saml.html)を参考にする

```/etc/gitlab/gitlab.rb(一部抜粋)
gitlab_rails['omniauth_allow_single_sign_on'] = ['saml']
gitlab_rails['omniauth_block_auto_created_users'] = true
gitlab_rails['omniauth_auto_link_saml_user'] = true
gitlab_rails['omniauth_providers'] = [
  {
    name: 'saml',
    args: {
             assertion_consumer_service_url: 'https://192.168.10.210:22443/users/auth/saml/callback',
             idp_cert_fingerprint: '拇印を2文字単位で:を入れたやつ',
             idp_sso_target_url: 'メモったログインURL',
             idp_slo_target_url: 'メモったログアウトURL',
             name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
           },
    label: 'Company Login' # optional label for SAML login button, defaults to "Saml"
  }
]
```

## ログインしてみる
ログイン画面に`Company Login`があるので押すとAzure認証ページに飛ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142784/1381f8f3-9b4b-47e9-9998-f02b6fd310e9.png)

## これだけだと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142784/def63f1c-6b8a-f43b-3116-79015552881b.png)
になる罠(メールアドレスとってこれねっていう感じ)

## ChromeのSAML-trace拡張機能で調べると
```一部抜粋
        <AttributeStatement>
            <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name">
                <AttributeValue>hoge@example.jp</AttributeValue>
            </Attribute>
        </AttributeStatement>
```

ってなってたので

```/etc/gitlab/gitlab.rb(一部抜粋)
gitlab_rails['omniauth_allow_single_sign_on'] = ['saml']
gitlab_rails['omniauth_block_auto_created_users'] = true
gitlab_rails['omniauth_auto_link_saml_user'] = true
gitlab_rails['omniauth_providers'] = [
  {
    name: 'saml',
    args: {
             assertion_consumer_service_url: 'https://192.168.10.210:22443/users/auth/saml/callback',
             idp_cert_fingerprint: '拇印を2文字単位で:を入れたやつ',
             idp_sso_target_url: 'メモったログインURL',
             idp_slo_target_url: 'メモったログアウトURL',
             idp_cert: 'DLした証明書(Base64)の中身をコピペ',
             issuer: 'メモった識別子',
             name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
             attribute_statements: { email: ['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name'] }
           },
    label: 'Company Login' # optional label for SAML login button, defaults to "Saml"
  }
]
```

でログインできた