GitLabとActive Directoryの連携とは

この記事では、RHEL8のコンテナ上に構築したGitLab Community Edition(CE)を、WindowsのActive Directoryと連携させてユーザー管理する方法について紹介します。

これにより、Active Directoryを使ったユーザーの一元管理が可能になり、効率的な運用が実現できます。

GitLab CEの基本的なインストール方法については、以下の記事で詳しく解説しています。

GitLabとActive Directoryの連携とは

GitLabとActive Directory(AD DS)を連携させることで、WindowsのドメインユーザーとGitLabの開発者ユーザを一元管理することができます。これにより、GitLabにおけるユーザー管理の手間が削減され、管理効率が格段に向上します。

具体的には、次のようなメリットがあります。

  • ユーザーのアカウントを開発環境内で一元管理できる。
  • GitLabのアカウント管理作業の手間が省ける。
  • セキュリティ強化(強固なパスワード管理)

この手順では、WindowsのActive Directory(AD DS)との連携を進めていきます。ユーザー認証を安全に行うため、SSL(Secure Socket Layer)を使用して通信を暗号化します。

特に自己認証局を使用している場合、暗号化された通信が正常に機能するためには、自己認証局が発行した認証局(CA)証明書の検証が必要です。

そのため、CA証明書が手元に準備されていることを前提として解説を進めます。このCA証明書をGitLabに設定して、AD DSとの間における通信の正当性を確認します。

Active Directoryとは

Active Directoryは、ドメインユーザーの認証情報をLDAP(Lightweight Directory Access Protocol)というプロトコルを使用して通信します。

LDAP は、ディレクトリサービス(Active Directory)に格納された情報にアクセスするための標準的な手段であり、ユーザー名やパスワード、グループ情報などを取得できます。

Active Directoryと連携させることで、GitLabへのログイン時において、LDAPを使ってユーザーを認証することができます。

これにより、個別にGitLabユーザーの追加作業が必要なくなり、強固なセキュリティ環境下におけるユーザの一元管理が実現できます。

LDAPSの連携手順

ここからは、LDAPS(LDAP over SSL/TLS) プロトコルを利用して、暗号化された通信によるLDAP連携の手順について解説します。LDAPSを使うことにより、Active Directoryと安全なデータ交換が可能となります。

GitLabのLDAPS設定は、gitlab.rbファイルを使って定義します。

# cd /etc/gitlab
# vi gitlab.rb

以下のパラメータに対して設定します。以下を参考にしながら、自身の環境に適した設定を行ってください。

gitlab_rails['ldap_enabled'] = true

gitlab_rails['ldap_servers'] = YAML.load <<-EOS
   main: # 'main' is the GitLab 'provider ID' of this LDAP server
     label: 'LDAP'
     host: 'srv00.reafnex.local'  #Active Directoryのホスト名
     port: 636  #LDAPSの標準ポート番号
     uid: 'sAMAccountName'  # ユーザー名の属性
     bind_dn: 'CN=binduser,OU=sysadmin,OU=Labo,DC=reafnex,DC=local'  # バインドユーザーのフルDN
     password: 'XXXXXXXX'  # バインドユーザーのパスワード
     encryption: 'simple_tls'  # LDAPS(暗号化通信)を使用
     verify_certificates: true  # 証明書の検証を有効化
     ca_file: '/etc/gitlab/ssl/reafnex_CA.crt'  # CA証明書のパス
     smartcard_auth: false
     active_directory: true  # Active Directory を使用する
#     smartcard_ad_cert_field: 'altSecurityIdentities'
#     smartcard_ad_cert_format: null # 'issuer_and_serial_number', 'issuer_and_subject' , 'principal_name'
     allow_username_or_email_login: false
     lowercase_usernames: false
     block_auto_created_users: false
     base: 'DC=reafnex,DC=local'  # 検索ベースDN
     user_filter: ''  # 必要に応じてフィルタを設定
#     ## EE only
#     group_base: ''
#     admin_group: ''
#     sync_ssh_keys: false
EOS

パスワードを設定する項目があるため、gitlab.rbファイルのパーミッションが600であることを確認し、rootユーザ以外がアクセスできないことを確認してください。

設定を保存したら、自己認証局のCA証明書を「ca_file」パラメータで設定したディレクトリに配置します。

(CA証明書のファイル名は一例です。自身の準備したCA証明書に読み替えてください。)

CA証明書を所定の場所に配置したら、GitLabの環境構築を再実行します。

# gitlab-ctl reconfigure
# gitlab-ctl restart

続いて、LDAPSによる認証設定が正しく動作するか確認します。

# gitlab-rake gitlab:ldap:check

Checking LDAP ...

LDAP: ... Server: ldapmain
LDAP authentication... Success
LDAP users with access to your GitLab server (only showing the first 100 results)
        DN: cn=access control assistance operators,cn=builtin,dc=reafnex,dc=local        sAMAccountName: Access Control Assistance Operators
        DN: cn=account operators,cn=builtin,dc=reafnex,dc=local  sAMAccountName: Account Operators
        DN: cn=administrator,cn=users,dc=reafnex,dc=local        sAMAccountName: Administrator
        DN: cn=administrators,cn=builtin,dc=reafnex,dc=local     sAMAccountName: Administrators
        DN: cn=allowed rodc password replication group,cn=users,dc=reafnex,dc=local      sAMAccountName: Allowed RODC Password Replication Group
        DN: cn=backup operators,cn=builtin,dc=reafnex,dc=local   sAMAccountName: Backup Operators
        DN: cn=binduser,ou=sysadmin,ou=labo,dc=reafnex,dc=local  sAMAccountName: binduser
        DN: cn=cert publishers,cn=users,dc=reafnex,dc=local      sAMAccountName: Cert Publishers
        DN: cn=certificate service dcom access,cn=builtin,dc=reafnex,dc=local    sAMAccountName: Certificate Service DCOM Access
        DN: cn=cloneable domain controllers,cn=users,dc=reafnex,dc=local         sAMAccountName: Cloneable Domain Controllers
        DN: cn=cryptographic operators,cn=builtin,dc=reafnex,dc=local    sAMAccountName: Cryptographic Operators
        DN: cn=denied rodc password replication group,cn=users,dc=reafnex,dc=local       sAMAccountName: Denied RODC Password Replication Group
        DN: cn=distributed com users,cn=builtin,dc=reafnex,dc=local      sAMAccountName: Distributed COM Users
        DN: cn=dnsadmins,cn=users,dc=reafnex,dc=local    sAMAccountName: DnsAdmins
        DN: cn=dnsupdateproxy,cn=users,dc=reafnex,dc=local       sAMAccountName: DnsUpdateProxy
        DN: cn=domain admins,cn=users,dc=reafnex,dc=local        sAMAccountName: Domain Admins
        DN: cn=domain computers,cn=users,dc=reafnex,dc=local     sAMAccountName: Domain Computers
        DN: cn=domain controllers,cn=users,dc=reafnex,dc=local   sAMAccountName: Domain Controllers
        DN: cn=domain guests,cn=users,dc=reafnex,dc=local        sAMAccountName: Domain Guests
        DN: cn=domain users,cn=users,dc=reafnex,dc=local         sAMAccountName: Domain Users
        DN: cn=enterprise admins,cn=users,dc=reafnex,dc=local    sAMAccountName: Enterprise Admins
        DN: cn=enterprise key admins,cn=users,dc=reafnex,dc=local        sAMAccountName: Enterprise Key Admins
        DN: cn=enterprise read-only domain controllers,cn=users,dc=reafnex,dc=local      sAMAccountName: Enterprise Read-only Domain Controllers
        DN: cn=event log readers,cn=builtin,dc=reafnex,dc=local  sAMAccountName: Event Log Readers
        DN: cn=group policy creator owners,cn=users,dc=reafnex,dc=local  sAMAccountName: Group Policy Creator Owners
        DN: cn=guest,cn=users,dc=reafnex,dc=local        sAMAccountName: Guest
        DN: cn=guests,cn=builtin,dc=reafnex,dc=local     sAMAccountName: Guests
        DN: cn=furukawa hirokazu,ou=sysusers,ou=labo,dc=reafnex,dc=local         sAMAccountName: h-furukawa
        DN: cn=hyper-v administrators,cn=builtin,dc=reafnex,dc=local     sAMAccountName: Hyper-V Administrators
        DN: cn=iis_iusrs,cn=builtin,dc=reafnex,dc=local  sAMAccountName: IIS_IUSRS
        DN: cn=incoming forest trust builders,cn=builtin,dc=reafnex,dc=local     sAMAccountName: Incoming Forest Trust Builders
        DN: cn=key admins,cn=users,dc=reafnex,dc=local   sAMAccountName: Key Admins
        DN: cn=krbtgt,cn=users,dc=reafnex,dc=local       sAMAccountName: krbtgt
        DN: cn=network configuration operators,cn=builtin,dc=reafnex,dc=local    sAMAccountName: Network Configuration Operators
        DN: cn=performance log users,cn=builtin,dc=reafnex,dc=local      sAMAccountName: Performance Log Users
        DN: cn=performance monitor users,cn=builtin,dc=reafnex,dc=local  sAMAccountName: Performance Monitor Users
        DN: cn=pre-windows 2000 compatible access,cn=builtin,dc=reafnex,dc=local         sAMAccountName: Pre-Windows 2000 Compatible Access
        DN: cn=print operators,cn=builtin,dc=reafnex,dc=local    sAMAccountName: Print Operators
        DN: cn=protected users,cn=users,dc=reafnex,dc=local      sAMAccountName: Protected Users
        DN: cn=ras and ias servers,cn=users,dc=reafnex,dc=local  sAMAccountName: RAS and IAS Servers
        DN: cn=rds endpoint servers,cn=builtin,dc=reafnex,dc=local       sAMAccountName: RDS Endpoint Servers
        DN: cn=rds management servers,cn=builtin,dc=reafnex,dc=local     sAMAccountName: RDS Management Servers
        DN: cn=rds remote access servers,cn=builtin,dc=reafnex,dc=local  sAMAccountName: RDS Remote Access Servers
        DN: cn=read-only domain controllers,cn=users,dc=reafnex,dc=local         sAMAccountName: Read-only Domain Controllers
        DN: cn=remote desktop users,cn=builtin,dc=reafnex,dc=local       sAMAccountName: Remote Desktop Users
        DN: cn=remote management users,cn=builtin,dc=reafnex,dc=local    sAMAccountName: Remote Management Users
        DN: cn=replicator,cn=builtin,dc=reafnex,dc=local         sAMAccountName: Replicator
        DN: cn=schema admins,cn=users,dc=reafnex,dc=local        sAMAccountName: Schema Admins
        DN: cn=server operators,cn=builtin,dc=reafnex,dc=local   sAMAccountName: Server Operators
        DN: cn=srv00,ou=domain controllers,dc=reafnex,dc=local   sAMAccountName: SRV00$
        DN: cn=storage replica administrators,cn=builtin,dc=reafnex,dc=local     sAMAccountName: Storage Replica Administrators
        DN: cn=terminal server license servers,cn=builtin,dc=reafnex,dc=local    sAMAccountName: Terminal Server License Servers
        DN: cn=users,cn=builtin,dc=reafnex,dc=local      sAMAccountName: Users
        DN: cn=windows authorization access group,cn=builtin,dc=reafnex,dc=local         sAMAccountName: Windows Authorization Access Group
        DN: cn=wsus administrators,cn=users,dc=reafnex,dc=local  sAMAccountName: WSUS Administrators
        DN: cn=wsus reporters,cn=users,dc=reafnex,dc=local       sAMAccountName: WSUS Reporters

Checking LDAP ... Finished

「LDAP authentication… Success」と「Checking LDAP … Finished」が表示されたら、LDAPSの設定が完了し、GitLabがActive Directoryと連携できるようになりました。

うまくいかない場合は、以下のコマンドでサーバからLDAPにアクセスできているか確認します。

# openssl s_client -connect <ディレクトリサーバのホスト名またはIPアドレス>:636 -showcerts

ディレクトリサーバ側のポート(636番ポート)が解放されているかも確認してください。

なお、セキュリティリスクの観点から、LDAPの設定と確認は慎重に実施してください。

LDAPでログインする

Active Directoryに連携したGitLabのログイン画面は、以下のとおりです。「LDAP」と「標準」の2つのタブが追加されています。

Active Directoryに登録されているユーザでログインする場合は、「LDAP」のタブからドメインのユーザ名とパスワードを入力して「サインインする」を実行します。もし、GitLabにアカウントが追加されていない場合は、自動的にユーザが登録されてログインできるようになります。

なお、GitLab CEの場合は、既にアカウントが登録されているユーザをLDAP連携に変更することはできないため、一度、GitLabのアカウントを削除してから、再度ログインすることにより、LDAP連携でログインできるようになります。

GitLab Enterprise Edition(EE)では、画面からLDAP連携に変更することができます。

まとめ

いかがでしたでしょうか。

今回は、RHEL8のコンテナ上に構築したGitLab CEとWindowsのActive DirectoryをLDAPS(LDAP over SSL/TLS)で連携させる手順について紹介しました。

この設定により、GitLabのユーザーをActive Directoryで一元管理し、強固なパスワード管理と運用管理の効率化を実現することができます。

また、Active Directoryに新しいユーザーを追加することによって、ユーザにGitLabを利用させることが可能となるため、運用管理が格段に楽になります。

LDAPSプロトコルを使用することで、暗号化された通信によるセキュアな認証を行うことができます。

これらの手順を実施することで、GitLabの運用とユーザー管理が一層効率化され、企業のセキュリティ基準に適合した運用が可能になるはずですので、ぜひ試してみてください。

参考になれば幸いです。

システムのお悩みについてご相談ください

本サイトの掲載内容に関するお問い合わせは、こちらから承ります。
SOHOのシステム運用管理に関するお悩みごとについて、なんでもお気兼ねなくご相談ください。
現役システムエンジニアのスタッフが、ボランティアでご相談にご対応させていただきます。