ラベル ldap の投稿を表示しています。 すべての投稿を表示
ラベル ldap の投稿を表示しています。 すべての投稿を表示

2025年9月18日木曜日

Gitlab で LDAP のログインテストをスクリプトから行う

Gitlab で LDAP のログインテストをスクリプトから行う

概要

過去に CLI を使った方法を紹介しました
CLI の場合 Gitlab インスタンスに ssh が必要なのと接続チェックしか行えないので実際のログインまでのテストはできません

今回は実際にログインするテストを ssh なしで実装してみました
UI と同じリクエストを Python スクリプトから送信すれば OK です

環境

  • Gitlab 18.1.6
  • Python 3.12.11
    • requests 2.32.5
    • beautifulsoup4 4.13.5

サンプルコード

import requests
from bs4 import BeautifulSoup

# GitLab の URL
GITLAB_URL = "https://your-gitlab-fqdn"

# LDAP ユーザーの資格情報
USERNAME = "hawk"
PASSWORD = "xxxxxxxx"
LDAP_NAME = "ldapserver01"


def test_ldap_login():
    # セッションを作成
    session = requests.Session()

    # ログインページにアクセスして CSRF トークンを取得
    login_page = session.get(f"{GITLAB_URL}/users/sign_in")
    if login_page.status_code != 200:
        print("ログインページへのアクセスに失敗しました。")
        return

    # CSRF トークンを取得
    soup = BeautifulSoup(login_page.text, "html.parser")
    element = soup.find("input", {"name": "authenticity_token"})
    if element is None:
        print("authenticity_tokenが見つかりませんでした。")
        return
    csrf_token = element["value"]  # type: ignore

    # ログインデータを準備
    login_data = {
        "username": USERNAME,
        "password": PASSWORD,
        "authenticity_token": csrf_token,
    }

    # ログインリクエストを送信
    response = session.post(
        f"{GITLAB_URL}/users/auth/{LDAP_NAME}/callback",
        data=login_data,
    )

    # レスポンスを確認
    if response.status_code == 200 and "Invalid Login or password" not in response.text:
        if "Welcome to GitLab" in response.text:
            print("LDAP ログインテストが成功しました。")
        else:
            print("LDAP ログインテストに失敗しました。")
            print("レスポンスに 'Welcome to GitLab' が含まれていません。")
    else:
        print("LDAP ログインテストに失敗しました。")
        print("ステータスコード:", response.status_code)
        print("レスポンス:", response.text)


if __name__ == "__main__":
    test_ldap_login()

少し解説

LDAP_NAME の部分は gitlab.rb に設定した ldap_name を設定してください
クロスサイト対策として CSRF トークンが必要になるのでそれをページから取得しリクエストに含める必要があります

Gitlab の API はなく直接 UI ページにアクセスして UI のフォームと同じリクエストを送信している感じです

最後に

これで LDAP のログインテストも ssh せずにテストできます

2025年9月10日水曜日

Gitlab と ldap の接続テストを CLI で行う

Gitlab と ldap の接続テストを CLI で行う

概要

基本的には接続テストのみなので実際に LDAP 内のユーザでログインできるかどうかは UI から試すしかありません

環境

  • Gitlab-ee 18.0.6
  • openldap 2.6.10

CLI

今回は結果を確認するために標準出力と標準エラーを別のファイルにリダイレクトしています

  • docker compose exec gitlab gitlab-rake gitlab:ldap:check > stdout.log 2> stderr.log

  • cat stdout.log

Checking LDAP ...

LDAP: ... Server: ldapmain
LDAP authentication... Success
LDAP users with access to your GitLab server (only showing the first 100 results)
        DN: uid=hawk,dc=example,dc=org   uid: hawk
Server: ldapsecondary
Exception: getaddrinfo: Name or service not known

Checking LDAP ... Finished
  • cat stderr.log

基本的には結果はすべて標準出力に表示されます
gitlab.rb に記載されている LDAP サーバごとにチェックはしてくれますが結果はすべて標準出力になります

最後に

Gitlab に LDAP を設定したあとにうまくログインできない場合にトラシュとして使う感じになりそうです
特定のユーザでログインできるかのチェックも CLI でやりたいですがそれは厳しいようです

2025年9月9日火曜日

OpenLDAP + phpLDAPAdmin の compose.yaml

OpenLDAP + phpLDAPAdmin の compose.yaml

概要

前回 OpenLDAP + TLS の設定を compose.yaml で定義しました
今回は更に phpLdapAdmin を追加して UI からも確認できるようにします

環境

  • Ubuntu 24.04
  • docker 28.3.3
  • openldap 2.6.10
  • phpLDAPAdmin 0.9.0

compose.yaml

services:
  openldap:
    image: bitnami/openldap:latest
    container_name: openldap
    ports:
      - "636:636"
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - LDAP_ENABLE_TLS=yes
      - LDAP_TLS_CERT_FILE=/opt/bitnami/openldap/certs/fullchain.pem
      - LDAP_TLS_KEY_FILE=/opt/bitnami/openldap/certs/privkey.pem
      - LDAP_TLS_CA_FILE=/opt/bitnami/openldap/certs/fullchain.pem
      - LDAP_PORT_NUMBER=389
      - LDAP_LDAPS_PORT_NUMBER=636
    volumes:
      - /etc/letsencrypt/live/your-domain.com/:/opt/bitnami/openldap/certs
      - ./ldif/base.ldif:/ldifs/base.ldif
      - ./ldif/hawk.ldif:/ldifs/hawk.ldif
    restart: unless-stopped

  phpldapadmin:
    image: osixia/phpldapadmin:0.9.0
    container_name: ldap-admin
    ports:
      - "6443:443"
    environment:
      - PHPLDAPADMIN_LDAP_HOSTS=openldap
      - PHPLDAPADMIN_HTTPS=true
      - PHPLDAPADMIN_HTTPS_CRT_FILENAME=fullchain.pem
      - PHPLDAPADMIN_HTTPS_KEY_FILENAME=privkey.pem
    volumes:
      - ./certs:/container/service/phpldapadmin/assets/apache2/certs/
    restart: unless-stopped

ポイント

  • LDAP_LDAPS_PORT_NUMBER と LDAP_PORT_NUMBER を使ってポートをデフォルトのポートにしなければいけない
    • phpldapadmin がデフォルトポートの LDAP を参照するためです
  • PHPLDAPADMIN_LDAP_HOSTS は ldaps じゃないポートを参照する
    • phpLDAPAdmin からは ldaps ではない 389 ポートを参照すると簡単です
  • PHPLDAPADMIN_HTTPS は phpLDAPAdmin の UI 用の https 設定
    • 接続する LDAP の TLS の設定ではないので注意
    • UI を https 化するなら設定必須
  • openldap と phpldapadmin が使用する証明書が同じ場合には権限が変わるので注意しましょう
    • phpldapadmin が証明書を 600 の権限にコンテナ内で偏光子してしまう
    • そうすると openldap が証明書を読み込めなくなってしまうため TLS の設定がおかしくなり ldap にアクセスできなくなってしまう
    • なので openldap と phpldapadmin の使用する証明書が同じであってもホスト側では別のパスに保存しそれぞれでマウントして使うようにしましょう

最後に

UI へのログインは過去に紹介した通り ldapsearch で使用する dc 情報を使ってログインします

phpLDAPAdmin は 0.9.0 で更新が止まっているので代替できるツールが他にあるといいかなと思っています

参考サイト

2025年9月4日木曜日

tls な openldap サーバを docker compose で構築する方法

tls な openldap サーバを docker compose で構築する方法

概要

過去に openldap を tls 化する方法を紹介しました
今回はそれを docker compose で一発で構築しかつユーザも自動で登録する方法を紹介します

環境

  • Ubuntu 24.04
  • docker 28.3.3
  • openldap 2.6.10

compose.yaml

LDAP_TLS_CA_FILE には LDAP_TLS_CERT_FILE と同じものを指定すれば大丈夫でした
fullchain.pem は分割しないでもいいようです

services:
  openldap:
    image: bitnami/openldap:latest
    container_name: openldap
    ports:
      - "1636:1636"
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - LDAP_ENABLE_TLS=yes
      - LDAP_TLS_CERT_FILE=/opt/bitnami/openldap/certs/fullchain.pem
      - LDAP_TLS_KEY_FILE=/opt/bitnami/openldap/certs/privkey.pem
      - LDAP_TLS_CA_FILE=/opt/bitnami/openldap/certs/fullchain.pem
    volumes:
      - /etc/letsencrypt/live/your-domain.com/:/opt/bitnami/openldap/certs
      - ./ldif/base.ldif:/ldifs/base.ldif
      - ./ldif/hawk.ldif:/ldifs/hawk.ldif
    restart: unless-stopped

ldif/base.ldif

今回 bitnami の openldap イメージの機能で /ldifs にファイルを置くと自動でユーザや組織を追加する仕組みを使っています

この仕組みを使うと環境変数に設定してあるデフォルトの組織情報が無視されるので自分で作成してあげます

dn: dc=example,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: Example Organization
dc: example

ちなみにログには以下のようなログが出力されます

WARN  ==> Ignoring LDAP_USERS, LDAP_PASSWORDS, LDAP_USER_OU, LDAP_GROUP_OU and LDAP_GROUP environment variables...

ldif/hawk.ldif

ユーザ追加用の ldif ファイルです
ユーザごとに作成してもいいですしまとめて書いてしまっても OK です

dn: uid=hawk,dc=example,dc=org
uid: hawk
cn: hawk
sn: snowlog
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson
loginShell: /bin/bash
homeDirectory: /home/hawk
uidNumber: 1000
gidNumber: 1000
userPassword: {SSHA}MYHODLo+3s3ZuMCN7qDw4hWY8JZ7O6YA
mail: hawk@example.org
gecos: hawksnowlog

起動

  • docker compose up -d

動作確認

以下どれでも OK です
admin ユーザは作成されるので admin でも追加したユーザでも検索できることを確認しましょう

  • docker exec openldap ldapsearch -x -H ldap://localhost:1389 -b "dc=example,dc=org" -D "uid=hawk,dc=example,dc=org" -w xxx "(objectClass=*)"
  • docker exec openldap ldapsearch -x -H ldap://localhost:1389 -b "dc=example,dc=org" "(uid=hawk)"
  • docker exec openldap ldapsearch -x -H ldap://localhost:1389 -b "dc=example,dc=org" -D "cn=admin,dc=example,dc=org" -w xxx "(objectClass=*)"

tls で確認したい場合は以下のようにします

  • docker exec openldap ldapsearch -x -H ldaps://your-domain.com:1636 -b "dc=example,dc=org" -D "uid=hawk,dc=example,dc=org" -w xxx "(objectClass=*)"

最後に

docker compose を使って openldap を tls で構築する方法を紹介しました
今回データ領域は使っていないのでコンテナをダウンさせるたびにユーザ情報は消えますが毎回 ldif を実行するため同じ状態で起動はしてきます

コンテナ起動後に手動でユーザなどを追加した場合は ldif も作成しないと次回起動時に消えてしまうので注意しましょう

参考サイト

2023年2月14日火曜日

UbuntuにActiveDirectoryをdockerで構築する方法

UbuntuにActiveDirectoryをdockerで構築する方法

概要

Samba をベースに bind や ldap と組み合わせると ActiveDirectory DC (Domain Controller) を構築できるようなのでやってみました

環境

  • Ubuntu 18.04
  • Samba 4

使用するイメージ

今回はこちらを使用します

公式などではないので注意が必要です
ActiveDirectory Domain Controller (以下、ADDC) に必要なコンポーネントが一式詰まっているイメージになります

事前準備

いくつか事前準備が必要なのでやっていきます

仮想ネットワークの作成

検証用なので作成します
本来は ADDC を配置したいネットワーク上に配置すれば OK です
またコンポーネントとして DNS (bind) があるので DNS がすでにネットワーク上に存在する場合は一旦停止するか存在しないネットワーク上にデプロイしましょう

  • sudo ifconfig ens192:1 192.168.3.222 netmask 255.255.255.0 up
  • sudo systemctl stop bind9

ADDC用のデータディレクトリ作成

永続化用に作成します

  • mkdir data
  • mkdir config
  • chmod -R 777 data
  • chmod -R 777 cofig

ADDCコンテナの作成

ではコンテナを起動していきます
まずは完成形は以下の通りとなります

docker run -t -i \
  -e "DOMAIN=CORP.EXAMPLE.COM" \
  -e "DOMAINPASS=yourAdminPassword" \
  -e "HOSTIP=192.168.3.222" \
  -e "INSECURELDAP=true" \
  -p 192.168.3.222:53:53 \
  -p 192.168.3.222:53:53/udp \
  -p 192.168.3.222:88:88 \
  -p 192.168.3.222:88:88/udp \
  -p 192.168.3.222:135:135 \
  -p 192.168.3.222:137-138:137-138/udp \
  -p 192.168.3.222:139:139 \
  -p 192.168.3.222:389:389 \
  -p 192.168.3.222:389:389/udp \
  -p 192.168.3.222:445:445 \
  -p 192.168.3.222:464:464 \
  -p 192.168.3.222:464:464/udp \
  -p 192.168.3.222:636:636 \
  -p 192.168.3.222:1024-1044:1024-1044 \
  -p 192.168.3.222:3268-3269:3268-3269 \
  -v /etc/localtime:/etc/localtime:ro \
  -v $(pwd)/data/:/var/lib/samba \
  -v $(pwd)/config:/etc/samba/external \
  --dns-search corp.example.com \
  --dns 192.168.3.222 \
  --add-host localdc.corp.example.com:192.168.3.222 \
  -h localdc \
  --name samba \
  --privileged \
  nowsci/samba-domain

ちょっと解説

DOMAIN の部分は ldap で言うところの dc に割り当てられます
あとで ldapsearch の動作確認コマンドも紹介しますがそこで使用します

DOMAINPASS は Administrator ユーザ用のパスワードになります
ADDC の場合少し特殊なパスワードポリシーがありいろいろと面倒なので INSECURELDAP を true にすることで回避しています

これが false のままだと

ldap_bind: Strong(er) authentication required (8)
        additional info: BindSimple: Transport encryption required.

というエラーが発生するのでそれの対処として設定します

各種ポートは必須になります
バインドするポートは作成した仮想ネットワーク上の IP を使ってバインドします

あとは特権を付与するのと必要なデータ領域のマウントをして起動してあげます

起動ログ

一応記載しておきます

Looking up IPv6 addresses
No IPv6 address will be assigned
Setting up share.ldb
Setting up secrets.ldb
Setting up the registry
Setting up the privileges database
Setting up idmap db
Setting up SAM db
Setting up sam.ldb partitions and settings
Setting up sam.ldb rootDSE
Pre-loading the Samba 4 and AD schema
Adding DomainDN: DC=corp,DC=example,DC=com
Adding configuration container
Setting up sam.ldb schema
Setting up sam.ldb configuration data
Setting up display specifiers
Modifying display specifiers
Adding users container
Modifying users container
Adding computers container
Modifying computers container
Setting up sam.ldb data
Setting up well known security principals
Setting up sam.ldb users and groups
Setting up self join
Adding DNS accounts
Creating CN=MicrosoftDNS,CN=System,DC=corp,DC=example,DC=com
Creating DomainDnsZones and ForestDnsZones partitions
Populating DomainDnsZones and ForestDnsZones partitions
Setting up sam.ldb rootDSE marking as synchronized
Fixing provision GUIDs
A Kerberos configuration suitable for Samba 4 has been generated at /var/lib/samba/private/krb5.conf
Setting up fake yp server settings
Once the above files are installed, your Samba4 server will be ready to use
Server Role:           active directory domain controller
Hostname:              localdc
NetBIOS Domain:        CORP
DNS Domain:            corp.example.com
DOMAIN SID:            S-1-5-21-3454798468-3565208184-955098804
/usr/lib/python2.7/dist-packages/supervisor/options.py:297: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
  'Supervisord is running as root and it is searching '
2023-02-08 09:00:30,600 CRIT Supervisor running as root (no user in config file)
2023-02-08 09:00:30,600 WARN Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing
2023-02-08 09:00:30,608 INFO RPC interface 'supervisor' initialized
2023-02-08 09:00:30,608 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2023-02-08 09:00:30,608 INFO supervisord started with pid 17
2023-02-08 09:00:31,611 INFO spawned: 'samba' with pid 20
2023-02-08 09:00:32,796 INFO success: samba entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

動作確認

ldapsearch を使って ADDC にアクセスできるか確認します

LDAPTLS_REQCERT=never ldapsearch -x -b "dc=corp,dc=example,dc=com" -H ldap://192.168.3.222 -D "CN=Administrator,CN=Users,DC=CORP,DC=EXAMPLE,DC=COM" -w "yourAdminPassword"

とりあえずこれでいろいろと ADDC 内のエントリが検索できるのが確認できるかなと思います

自分が試した感じだと numResponses で 265 返却されました

LDAPTLS_REQCERT=never はなくても動作するかもしれません

最後に

Ubuntu に ADDC を構築してみました
今回は docker イメージを使用したので内部的に構成など詳しいことを気にせずサクっと構築しました
検証などではこのような方法で全然問題ないですが実際に運用する場合に理解を深めるためにも一から手動で構築してみるのもいいかなと思います

Tips

仮想ネットワークを作成しないで既存のネットワーク上にデプロイすることもできます

既存のネットワーク上ですでに bind9 などが動作している場合はそちらに Forward するような設定にしても OK です

例えば既存のネットワークである 10.100.xxx.xxx という IP アドレス対して動作させたい場合は以下のようになります

10.100.xxx.xxx ではすでに bind9 が動作しているのでそちらに forward するのと ADDC では 53 ポートを EXPOSE しないようにします

docker run -t -i \
  -e "DOMAIN=CORP.EXAMPLE.COM" \
  -e "DOMAINPASS=xxx" \
  -e "DNSFORWARDER=10.100.xxx.xxx" \
  -e "HOSTIP=10.100.xxx.xxx" \
  -e "INSECURELDAP=true" \
  -p 88:88 \
  -p 88:88/udp \
  -p 135:135 \
  -p 137-138:137-138/udp \
  -p 139:139 \
  -p 389:389 \
  -p 389:389/udp \
  -p 445:445 \
  -p 464:464 \
  -p 464:464/udp \
  -p 636:636 \
  -p 1024-1044:1024-1044 \
  -p 3268-3269:3268-3269 \
  -v /etc/localtime:/etc/localtime:ro \
  -v $(pwd)/data/:/var/lib/samba \
  -v $(pwd)/config:/etc/samba/external \
  --dns-search corp.example.com \
  --dns 10.100.xxx.xxx \
  --add-host localdc.corp.example.com:10.100.xxx.xxx \
  -h localdc \
  --name samba \
  --privileged \
  nowsci/samba-domain

参考サイト

2023年2月10日金曜日

macOS で ApacheDirectoryStudio をインストールする方法

macOS で ApacheDirectoryStudio をインストールする方法

概要

Java がないと動かないのがポイントです

環境

  • macOS 11.7.3
  • java 19.0.2
  • Apache Directory Studio 2.0.0

Java のインストール

  • brew install java
  • echo 'export PATH="/usr/local/opt/openjdk/bin:$PATH"' >> ~/.zshrc

ApacheDirectoryStudio のインストール

  • brew install --cask apache-directory-studio

起動

  • cd /Applications
  • open -a ApacheDirectoryStudio

ポイント

Finder から起動しようとしても java が古いので起動しません

ターミナルであれば Homebrew でインストールした最新の java が使えるのでターミナルから起動してあげましょう

2023年2月9日木曜日

Gitlab + ldap(tlsあり)設定メモ

Gitlab + ldap(tlsあり)設定メモ

概要

過去にTLSなしのLDAPと連携する方法を紹介しました

TLS 版も確認したのでメモがてら記載しておきます

ちなみに TLS + LDAP の構築方法はこちらです

gitlab.rb

gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = {
  'main' => {
    'label' => 'login',
    'host' => 'your.ldap.server.com',
    'port' => 1636,
    'uid' => 'uid',
    'encryption' => 'simple_tls',
    'verify_certificates' => true,
    'bind_dn' => 'cn=admin,dc=example,dc=org',
    'password' => 'xxx',
    'timeout' => 60,
    'active_directory' => false,
    'allow_username_or_email_login' => false,
    'block_auto_created_users' => false,
    'base' => 'dc=example,dc=org',
    'user_filter' => '',
    'lowercase_usernames' => false,
    'attributes' => {
      'username' => ['uid', 'userId', 'sAMAccountName'],
      'email' => ['mail', 'email', 'userPrincipalName'],
      'name' => 'uid',
      'first_name' => '',
      'last_name' => '',
    },
  }
}

start_tls だとエラーになる

gitlab

Could not authenticate you from Ldapmain because "No start tls result".

openldap

63e1d4cd.1b38e0da 0x7fbaf180c700 conn=1014 fd=14 ACCEPT from IP=xxx.xxx.xxx.xxx:33202 (IP=0.0.0.0:1636)
63e1d4cd.1b3b7769 0x7fbaf0d0a700 TLS: can't accept: error:1408F10B:SSL routines:ssl3_get_record:wrong version number.
63e1d4cd.1b3e00d9 0x7fbaf0d0a700 conn=1014 fd=14 closed (TLS negotiation failure)

Openldap の場合は素直に simple_tls を使うのがいいのかもしれません

2023年2月8日水曜日

openldap サーバで tls を設定する方法

openldap サーバで tls を設定する方法

概要

前回 bitnami の openldap イメージで ldap サーバを構築してみました

今回は TLS 設定行ってみます

環境

  • Ubuntu 18.04
  • docker 20.10.7
  • bitnami/openldap 2.6.3

事前準備

  • ドメインの取得
  • A レコードの登録
  • A レコードの FQDN に対応した証明書の取得

は事前に済ませておいてください
ワイルドカード証明書があればそれでも OK です

今回証明書は certs 配下にデータを配置するディレクトリは data 配下とします

TLS + openldap の構築

コマンドは以下の通りです

docker run --name openldap -d \
    -v $(pwd)/certs:/opt/bitnami/openldap/certs \
    -v $(pwd)/data:/bitnami/openldap/ \
    -e ALLOW_EMPTY_PASSWORD=yes \
    -e LDAP_ENABLE_TLS=yes \
    -e LDAP_TLS_CERT_FILE=/opt/bitnami/openldap/certs/server.crt \
    -e LDAP_TLS_KEY_FILE=/opt/bitnami/openldap/certs/server.key \
    -e LDAP_TLS_CA_FILE=/opt/bitnami/openldap/certs/ca.crt \
    -p 1636:1636 \
    bitnami/openldap:latest

ちょっと解説

data ディレクトリは

  • mkdir data
  • chmod -R 777 data

しておきます
777 は「mkdir: cannot create directory ‘/bitnami/openldap/data’: Permission denied」対策です

ldapsearch で指定するホスト名は登録した FQDN でアクセスすることになるので 1636 ポートは外部からアクセスできるようにしておきます

証明書と鍵、CAファイルは指定が必須になります
証明書に CA 証明書の情報も記載されている場合はこちらの記事を参考に分割してください

動作確認

  • ldapsearch -x -H ldaps://your.ldap-server.com:1636 -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w adminpassword

TLS である ldaps プロトコルの指定と 1636 ポートを指定します

これで検索結果が返却されれば OK です

トラブルシューティング

「-d 1」というオプションを付与すればデバッグ表示できます

  • ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

TLS の場合サーバ証明書のホスト名とアクセスするホスト名が同一でなければなりません
例えば ldaps://localhost:1636 などとすると上記のエラーになります

  • tls_write: want=31 error=Bad file descriptor

これは正常に検索結果が返ってきているにも関わらずデバッグ表示すると最後に表示されているエラーでした
基本は無視で問題ないかなと思います

最後に

Openldap で TLS を設定する方法を紹介しました
今回は docker から構築しましたが slapd を使った場合でも同じようなオプションが slapd.conf にあるのでそれを編集すれば有効にできると思います

ちなみに slapd.conf の場所はコンテナ内にはなくすべて ldif ファイルで管理されています

  • docker exec openldap slapcat -F /opt/bitnami/openldap/etc/slapd.d
  • sudo cat data/slapd.d/cn\=config.ldif

2023年2月3日金曜日

bitnami の openldap サーバで ldap サーバを構築する

bitnami の openldap サーバで ldap サーバを構築する

概要

前回 ldap サーバを docker で構築してみました
今回は別イメージでも構築したので方法を紹介します

環境

  • Ubuntu 18.04
  • docker 20.10.7
  • bitnami/openldap 2.6.3

起動

  • docker run -d --name openldap bitnami/openldap:latest

少し説明

いくつかの値はデフォルトで設定されているので今回はそれを使います

  • dc のデフォルトは dc=example,dc=org
  • admin ユーザのデフォルトパスワードは「adminpassword」
  • デフォルトのポートは 1389

になっているのでこれらを使って動作確認します
上記のパラメータやこれら以外のパラメータは環境変数で設定可能です

検索

  • docker exec openldap ldapsearch -x -H ldap://localhost:1389 -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w adminpassword

ユーザ追加

  • vim hawk.ldif
dn: uid=hawk,dc=example,dc=org
uid: hawk
cn: hawk
sn: snowlog
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson
loginShell: /bin/bash
homeDirectory: /home/hawk
uidNumber: 1000
gidNumber: 1000
userPassword: {SSHA}eSe6XqKkf4t7jgcfQYdG73L7u2xtWqib
mail: hawk@example.org
gecos: hawksnowlog

userPassword は slappasswd コマンドで生成するのがおすすめです

  • docker cp hawk.ldif openldap:/bitnami/openldap/data/hawk.ldif
  • docker exec openldap ldapadd -x -H ldap://localhost:1389 -D "cn=admin,dc=example,dc=org" -w adminpassword -f /bitnami/openldap/data/hawk.ldif

=> adding new entry "uid=hawk,dc=example,dc=org"

先程の検索コマンドで hawk ユーザが追加されていることを確認できれば OK です

最後に

次回は SSL を使った接続をしてみたいと思います

参考サイト

2022年4月27日水曜日

Gitlab で LDAP サーバと連携して LDAP にいるユーザでログインする方法

Gitlab で LDAP サーバと連携して LDAP にいるユーザでログインする方法

概要

Gitlab + LDAP で LDAP に存在するユーザでログインする方法を試してみました

環境

  • Ubuntu 18.04
  • docker 20.10.7
  • osixia/openldap 1.5.0
  • Gitlab-ee 14.7.7

LDAP サーバの構築

今回は docker で構築しました
過去に紹介しているのでそちらを参考に構築してください

gitlab.rb の編集

LDAP 連携の部分だけ記載しています

gitlab_rails['ldap_servers'] = {
  'main' => {
    'label' => 'LDAP',
    'host' =>  '192.168.100.10',
    'port' => 389,
    'uid' => 'uid',
    'encryption' => 'plain',
    'verify_certificates' => false,
    'bind_dn' => 'cn=admin,dc=my-company,dc=com',
    'password' => 'xxx',
    'tls_options' => {
      'ca_file' => '',
      'ssl_version' => '',
      'ciphers' => '',
      'cert' => '',
      'key' => ''
    },
    'timeout' => 10,
    'active_directory' => false,
    'allow_username_or_email_login' => false,
    'block_auto_created_users' => false,
    'base' => 'dc=my-company,dc=com',
    'user_filter' => '',
    'attributes' => {
      'username' => ['uid', 'userid', 'sAMAccountName'],
      'email' => ['mail', 'email', 'userPrincipalName'],
      'name' => 'uid',
    },
    'lowercase_usernames' => false,
  }
}

変更できたら gitlab-ctl reconfigure などで設定を反映しましょう

  • docker-compose up -d

各項目の説明

  • label・・・Gitlabのログイン画面で表示するラベルを設定します
  • host・・・LDAPサーバのIPまたはホスト名を記載します
  • port・・・LDAPサーバの接続ポートを記載します
  • uid・・・sAMAccountName or uid or userPrincipalName のどれかを記載します、LDAP側に存在する属性を記載します
  • encryption・・・start_tls or simple_tls or plain のどれかを記載します、今回は tls は使わないので plain を設定します
  • verify_certificates・・・今回は tls は使わないので false を設定します
  • bind_dn・・・探索する dn を記載します、ldapsearch で使用する -D オプションの値を記載します
  • password・・・admin ユーザのパスワードを記載します
  • tls_options・・・tlsを使う場合に使用します、今回は使用しないのですべて空にしています
  • timeout・・・LDAPにクエリを投げた際のタイムアウトを秒単位で指定します
  • active_directory・・・AD経由のLDAPの場合は true を設定します、今回は OpenLDAP なので false を設定します
  • allow_username_or_email_login・・・ユーザ名またはメールアドレスでのログインを許可します、true にした場合はメールアドレスのアットマーク以降は自動的に省略されます
  • block_auto_created_users・・・ユーザ作成時にブロックユーザとして自動で作成します、面倒なので基本は false にします
  • base・・・探索する base を記載します、ldapsearch で使用する -b オプションの値を記載します
  • user_filter・・・検索する際のフィルタを指定できます、'(employeeType=developer)' こんな感じの指定ができます
  • attributes・・・ログインに成功した際に Gitlab 側に登録するユーザ属性とLDAPのユーザ属性のマッピングを指定します
  • lowercase_usernames・・・自動的にユーザ名を小文字に変換します

その他の項目については参考サイトにある公式のドキュメントを確認してください

動作確認

Gitlab にアクセスして LDAP の項目が増えていることを確認します
あとは LDAP に存在するユーザでログインできるか確認しましょう

注意点

LADP 経由でログインはしていますが一度 Gitlab 側にユーザが作成されると LDAP 側のユーザを削除しても Gitlab 側には残り続けてしまいます (ログインはできなくなります)

もし LDAP とユーザ情報を同期したい場合はこちらを参考に設定してください

billy ユーザについて

パスワードは不明なので自分で ldif ファイルを変更してパスワードを設定してください

参考サイト

2022年4月26日火曜日

docker で phpAdminLDAP を構築する

docker で phpAdminLDAP を構築する

概要

前回 docker で OpenLDAP サーバを構築しました
今回は管理UIである phpAdminLDAP も docker で構築してみたいと思います

環境

  • Ubuntu 18.04
  • docker 20.10.7
  • osixia/openldap 1.5.0
  • osixia/phpldapadmin 0.9.0

起動

以下のコマンドで起動します
192.168.100.10 は OpenLDAP サーバの IPアドレスを記載してください

docker run -p 6443:443 \
  -e PHPLDAPADMIN_LDAP_HOSTS=192.168.100.10 \
  --name ldap-admin \
  -d osixia/phpldapadmin:0.9.0

アクセス

https://192.168.100.10:6443 でアクセスできます
https プロトコルなので注意しましょう

アクセスするとログインしていない状態になるので左メニューからログインを選択します

dn と admin ユーザのパスワードを入力することでログインできます

ログインすると指定した dn 内のユーザが確認できます

最後に

LDAP のインタフェースはコマンドが基本ですがややこしいので GUI のインタフェースがあると便利かなと思います

参考サイト

2022年4月25日月曜日

docker で OpenLDAP サーバ構築

docker で OpenLDAP サーバ構築

概要

docker で OpenLDAP サーバを構築してみました
過去に CentOS 上に構築しましたが今回は docker を使います

環境

  • Ubuntu 18.04
  • docker 20.10.7
  • osixia/openldap 1.5.0

ldap サーバ起動

LDAP 関連の設定は環境変数で設定できます
外部からアクセスする想定の場合は 389 と 636 ポートをバインドします

docker run \
  -e LDAP_ORGANISATION="My Company" \
  -e LDAP_DOMAIN="my-company.com" \
  -e LDAP_ADMIN_PASSWORD="xxx" \
  -p 389:389 -p 636:636 \
  --name ldap-server \
  -d osixia/openldap:1.5.0

作成した dc があるか検索

LDAP_DOMAIN で指定した dc があるか検索してみましょう
検索するときは -b オプションを使います

docker exec ldap-server \
  ldapsearch -x -H ldap://localhost -b dc=my-company,dc=com -D "cn=admin,dc=my-company,dc=com" -w xxx

ユーザを新規で登録する

ldif ファイルを作成して新規でユーザ登録してみます
dn の部分は LDAP_DOMAIN に合わせてください

  • vim new-user.ldif
dn: uid=billy,dc=my-company,dc=com
uid: billy
cn: billy
sn: 3
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson
loginShell: /bin/bash
homeDirectory: /home/billy
uidNumber: 14583102
gidNumber: 14564100
userPassword: {SSHA}j3lBh1Seqe4rqF1+NuWmjhvtAni1JC5A
mail: billy@my-company.com
gecos: Billy User

一旦コンテナにコピーします

  • docker cp new-user.ldif ldap-server:/container/service/slapd/assets/test/new-user.ldif

あとは ldapadd で登録すれば OK です
登録する際は -b は不要です

docker exec ldap-server \
   ldapadd -x -H ldap://localhost -D "cn=admin,dc=my-company,dc=com" -w xxx -f /container/service/slapd/assets/test/new-user.ldif

先程の検索コマンドで検索すると指定の dn 配下にユーザが登録されていることが確認できると思います

ユーザを削除する

最後にユーザを削除しましょう
これも ldif ファイルを使います
削除する場合の ldif ファイルは形式が少し違うので注意しましょう
削除対象の dn のエントリを1行記載すれば OK です

  • vim delete-user.ldif
uid=billy,dc=my-company,dc=com

これもコンテナにコピーします

  • docker cp delete-user.ldif ldap-server:/container/service/slapd/assets/test/delete-user.ldif

あとは ldapdelete コマンドでユーザ削除します

docker exec ldap-server \
   ldapdelete -x -H ldap://localhost -D "cn=admin,dc=my-company,dc=com" -w xxx -f /container/service/slapd/assets/test/delete-user.ldif

最後に

データを永続化したりクラスタ化したり TLS 対応もできます
詳細は参考サイトにある公式のページを御覧ください

あと外部からアクセスできるか ldap-utils などを使って確認すると良いと思います

参考サイト

2017年8月21日月曜日

Ruby で net-ldap を使ってユーザの登録、削除、取得をやってみた

概要

前回 Ruby から ldap を操作してみました
グループの追加まで確認できたので今回はユーザ周りの操作を試してみました

環境

  • CentOS 7.3.1611
  • openldap 2.4.40
  • Ruby 2.3.1p112
  • net-ldap 0.16.0

ユーザを追加する

  • vim user_add.rb
require 'net/ldap'
require 'pp'

PORT = 389
HOST = '192.168.100.5'
BASE = 'dc=example,dc=com'
AUTH = {
  :method => :simple,
  :username => "cn=Manager,#{BASE}",
  :password => 'password'
}

ldap = Net::LDAP.new(
  host: HOST,
  port: PORT,
  base: BASE,
  auth: AUTH
)

raise 'bind failed' unless ldap.bind

dn = "uid=hawk,ou=People,#{BASE}"
attr = {
  :sn => 'hawk',
  :cn => 'snowlog',
  :objectclass => ['posixAccount', 'inetOrgPerson'],
  :displayName => 'hawksnowlog',
  :uid => 'hawk',
  :uidNumber => '1001',
  :gidNumber => '1000',
  :homeDirectory => '/home/hawk',
  :loginShell => '/bin/bash',
  :userPassword => '{CRYPT}E1N/hpjy8pfc6',
  :mail => 'hawk@hawksnowlog.cf'
}
ldap.add(
  :dn => dn,
  :attributes => attr
)
pp ldap.get_operation_result

前半の接続部分は前回のコードをそのまま使用しています
ユーザを追加するための処理は dn の定義からです

ポイントは objectclass を配列で指定しているところ
そうしないと後に定義した objectclass に上書きされてしまいます
もし inetOrgPerson を後に記載した場合 'uidNumber' not allowed と言われ uid の指定ができません

#<OpenStruct extended_response=nil, code=65, error_message="attribute 'uidNumber' not allowed", matched_dn="", message="Object Class Violation">

では、posixAccount だけ objectclass に指定するとそんなクラスはないと言われます

#<OpenStruct extended_response=nil, code=65, error_message="no structural object class provided", matched_dn="", message="Object Class Violation">

結局 objectclass を配列にして posixAccount と inetOrgPerson を一緒に指定する必要がありました

あとは実行してエラーが表示されなければ OK です

  • bundle exec ruby user_add.rb
#<OpenStruct extended_response=nil, code=0, error_message="", matched_dn="", message="Success">

userPassword の部分は slappasswd コマンドで作成した暗号化済みのパスワードになります

ユーザを削除する

  • vim user_delete.rb
dn = "uid=hawk,ou=People,#{BASE}"
ldap.delete(
  :dn => dn
)
pp ldap.get_operation_result

削除は dn を指定するだけなので簡単です
add のときと同じように結果が返ってくれば OK です

ユーザを取得する

  • vim user_search.rb
users = ldap.search(base: "ou=People,#{BASE}")
pp users

で以下の表に表示されれば OK です

[#<Net::LDAP::Entry:0x000000015a61e8
  @myhash=
   {:dn=>["ou=People,dc=example,dc=com"],
    :objectclass=>["organizationalUnit"],
    :ou=>["People"]}>,
 #<Net::LDAP::Entry:0x000000015a4258
  @myhash=
   {:dn=>["uid=hawk,ou=People,dc=example,dc=com"],
    :sn=>["hawk"],
    :cn=>["snowlog"],
    :objectclass=>["posixAccount", "inetOrgPerson"],
    :displayname=>["hawksnowlog"],
    :uid=>["hawk"],
    :uidnumber=>["1001"],
    :gidnumber=>["1000"],
    :homedirectory=>["/home/hawk"],
    :loginshell=>["/bin/bash"],
    :userpassword=>["{CRYPT}E1N/hpjy8pfc6"],
    :mail=>["hawk@hawksnowlog.cf"]}>]

特定のグループに所属するユーザを取得する

ということをしたいケースはよくあると思います
search の際に filter という機能を使うことで実現できました
自分は gidNumber を指定してその gidNumber を持つユーザを取得する方法で実現しましたが、他にもやり方はいろいろとあると思います

group = "group1"
groups = ldap.search(base: "cn=#{group},ou=Group,#{BASE}")
groups.each { |group|
  gidNumber = group['gidNumber'][0]
  group_name_filter = Net::LDAP::Filter.eq( "gidNumber", "#{gidNumber}" )
  users = ldap.search(base: "ou=People,#{BASE}", filter: group_name_filter, return_result: true)
  pp users
}

ちょっと複雑なように見えますが一旦 group 名から gidNumber を取得して、取得した gidNumber を元に再度 search をかけています
ポイントは取得した groups をループしたときのクラスが Net::BER::BerIdentifiedArray というクラスなのですが配列になっているので、先頭だけを取得して使っています
今回はグループに 1 つの gidNumber しか持たせていないので先頭を無条件で使っていますが、複数の gidNumber を持つグループの場合は少し考慮が必要になります

最後に

Ruby + net-ldap を使って ldap に基本的なユーザ操作をしてみました
特につまるところはなかった感じです
今回作成したユーザは posixAccount として作成してるので Linux などから SSH ログインすることも可能です

2017年8月20日日曜日

Ruby で ldap を使ってみる

概要

Ruby に net-ldap というライブラリがあり、これを使うと Ruby から ldap の操作ができます
今回は初期設定と接続まで行ってみました
ldap サーバの構築に関しては過去の記事を元にしています

環境

  • CentOS 7.3.1611
  • openldap 2.4.40
  • Ruby 2.3.1p112
  • net-ldap 0.16.0

事前準備

過去の ldap 構築記事で admin のパスワード設定、基本スキーマの登録、dc の登録、 ou の登録までは手動で済ませておいてください
もしかするとこれも Ruby から出来るかもですが今回は触れません

ライブラリインストール

  • bundle init
  • vim Gemfile
gem "net-ldap"
  • bundle install --path vendor/bundle

ldap に接続する

  • vim connect.rb
require 'net/ldap'
require 'pp'

PORT = 389
HOST = '192.168.100.5'
BASE = 'dc=example,dc=com'
AUTH = {
  :method => :simple,
  :username => "cn=Manager,#{BASE}",
  :password => 'password'
}

ldap = Net::LDAP.new(
  host: HOST,
  port: PORT,
  base: BASE,
  auth: AUTH
)

raise 'bind failed' unless ldap.bind

ldap は SSL を使っていないので 389 を指定します
HOST の部分は ldap サーバの IP または URL を入力してください

  • bundle exec ruby connect.rb

でエラーがでなければ OK です

グループを操作してみる

せっかくなのでもう少し操作してみます
まずグループを追加してみましょう
先ほどの接続ロジック後に以下を記載してください

  • group_add.rb
dn = "cn=group1,ou=Group,#{BASE}"
attr = {
  :cn => 'group1',
  :objectClass => 'posixGroup',
  :gidNumber => '1000'
}
ldap.add(
  :dn => dn,
  :attributes => attr
)
pp ldap.get_operation_result

これで #<OpenStruct extended_response=nil, code=0, error_message="", matched_dn="", message="Success"> と表示されれば OK です
作成されたグループ名は group1 になり、ou=Group に属しています

最後の get_operation_result は結構便利でエラーの場合、詳細が見れるのでこれで確認すると良いと思います

そしたらグループの一覧を取得してみましょう

  • group_search.rb
groups = ldap.search(base: "ou=Group,#{BASE}")
pp groups

で以下のように表示されれば OK です

[#<Net::LDAP::Entry:0x000000023d3ec8
  @myhash=
   {:dn=>["ou=Group,dc=example,dc=com"],
    :objectclass=>["organizationalUnit"],
    :ou=>["Group"]}>,
 #<Net::LDAP::Entry:0x000000023d3130
  @myhash=
   {:dn=>["cn=group1,ou=Group,dc=example,dc=com"],
    :cn=>["group1"],
    :objectclass=>["posixGroup"],
    :gidnumber=>["1000"]}>]

あるグループだけ取得したい場合は以下のようにします

groups = ldap.search(base: "ou=Group,#{BASE}")

最後に

Ruby から ldap が操作できる net-ldap を使ってみました
ldap 自体クセが強いのでまずそれに慣れることからかなと思います

登録系に関しては ldif のフォーマットをそのまま Ruby のハッシュに落とし込んで実行するだけという感じです
取得系に関しては面倒くさいコマンドを発行する必要がなく取得できるのはうれしいです
ただ、クエリというか検索の条件は ldap のフォーマットを使わないといけないのが残念なところです

他の ldap 用のライブラリもあるのでそれを使えばもう少し簡単に使えるやつもあるかもしれません

参考サイト

2017年7月22日土曜日

Harbor で ldap 認証を試してみた

概要

前回 CentOS 上に LDAP サーバを構築しました
Harbor には LDAP 認証と連携する機能があります
せっかくなので Harbor の LDAP 連携機能を使ってみました

環境

  • サーバ側
    • CentOS 7.3.1611
    • openldap (servers, clients) 2.4.40-13
  • クライアント側
    • Harbor 1.1.2
    • docker 17.03.1-ce
    • docker-compose 1.13.0

ldap を有効にする

今回は既存の Harbor 環境に対して ldap をあとから追加します

  • vim harbor.cfg
ldap_url = ldap://192.168.10.1:389/
ldap_basedn = ou=People,dc=example,dc=com
  • docker-compose down
  • docker rmi $(docker images -q)
  • docker volume rm $(docker volume ls -q)
  • rm -rf /data
  • ./install.sh

ポイントはデータボリュームと /data を削除することです
そうしないと昔のデータを参照してしまい認証モードがずっと db_auth になってしまいます

動作確認

まずは admin ユーザで Harbor にログインします
そして、 Configuration -> Authentication で Auth Mode が「LDAP」になっていることを確認します
harbor_ldap.png

「LDAP Search Password」は自動で入力されていました
下に「TEST LDAP SERVER」というボタンがあるのでここをクリックして「Connection to LDAP server is verified. 」なることを確認します
もし失敗する場合は FW や ldap サーバの設定を確認してください

確認できたら ldap に登録したユーザでログインできるか確認してみましょう
一旦 admin ユーザでログアウトして別ユーザでログインします

問題なく ldap ユーザでログインできれば連携は成功です

最後に docker login もできるか確認してみましょう
同じく ldap ユーザでログインできるのが確認できると思います

最後に

Harbor の ldap 機能を試してみました
ldap サーバ側はかなり単純な設定なので、Harbor 側も設定する項目が少なく簡単にできました
ユーザ管理が断然楽になるので ldap がある環境であればこっちを使うほうが良いと思います

2017年7月21日金曜日

OpenLDAP と SSH 認証を連携してみた

概要

前回 CentOS 上に構築した LDAP サーバを今回は SSH の認証として使ってみたいと思います

環境

  • サーバ側
    • CentOS 7.3.1611
    • openldap (servers, clients) 2.4.40-13
  • クライアント側
    • Ubuntu 16.04
    • ldap-auth-client 0.5.3
    • nscd 2.23-0ubuntu9

必要なライブラリのインストール

  • apt install -y nscd ldap-auth-client

でインストールすると ldap サーバの設定をいろいろと聞かれます
今回は前回の設定をそのまま使うので以下のように回答しました
ldap サーバの IP やポート、cn, dc は各自で設定したものを記載してください

  • ldap://192.168.10.1:389
  • dc=example,dc=com
  • Protocol version: 3
  • Yes と回答
  • No と回答
  • cn=Manager,dc=example,dc=com
  • パスワードを設定します (たぶん ldap の設定を変更する際の root ユーザ以外に求められるパスワードです)

再度設定したい場合は dpkg-reconfigure ldap-auth-config コマンドを実行してください

pam の設定

  • pam-auth-update

これまた CUI での設定画面になります
項目内に「LDAP Authentication」と「Create home directory on login」があると思うのでそれぞれチェックをして有効にしてください

nsswitch.conf の設定

ldap を認証に使うように設定します

  • vim /etc/nsswitch.conf
passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

そして nscd を再起動します

  • systemctl restart nscd

おまけ: sshd の設定の確認

sshd の設定でパスワード認証がそもそも ON になっていない場合は ON にしましょう
また鍵認証のみが ON になっている場合は OFF にしておきます

  • vim /etc/ssh/sshd_config
PubkeyAuthentication no
PasswordAuthentication yes
  • systemctl restart sshd

動作確認

では動作確認です
設定したサーバに LDAP 上に作成したユーザで SSH ログインできるか確認してみましょう

  • ssh hawk@192.168.10.2

前回作成した hawk さんでログインできることを確認しました
また、ログイン後にホームディレクトリがあり、ログインシェルが bash になっていることも確認しました

hawk@ubuntu:~$ id
uid=1001(hawk) gid=1000(develop) groups=1000(develop)
hawk@ubuntu:~$ pwd
/home/hawk
hawk@ubuntu:~$ echo $BASH
/bin/bash

最後に

OpenLDAP と SSH の連携をしてみました
今回は nscd (Name Service Cache Daemon) というツールを使いましたが他にも sssd (System Security Services Daemon) というツールがあります
最近だと sssd を使うほうが主流らしいです

参考サイト

2017年7月20日木曜日

CentOS7 で OpenLDAP を試してみた

概要

CentOS7 に OpenLDAP をインストールしてグループの追加とユーザの追加までやってみました
結構クセのある操作なので慣れるまで大変かもしれません

環境

  • CentOS 7.3.1611
  • openldap (servers, clients) 2.4.40-13

インストール

  • yum -y install openldap openldap-clients openldap-servers

作業用ディレクトリの作成

OpenLDAP では .ldif というファイルを手動で作成してそれをコマンドで追加することで設定を反映させます
ldif ファイルを作成するディレクトリを作成しておきます

  • cd
  • mkdir ldap_work

設定と起動

データベース用の設定ファイルをコピーしてから起動します

  • cp -p /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
  • systemctl start slapd

admin 用の LDAP パスワードを設定

まずは admin 用のパスワードを登録します
このパスワードは設定を反映させるときに使うので忘れないようにしてください

  • slappasswd

でパスワードを入力して以下のようなハッシュが表示されれば OK です

{SSHA}Gtys4HSlB4NAbEY+/524hxN+Lcr60z7K

まだこの状態ではパスワードは LDAP に反映されていません
冒頭述べたように LDAP への設定の反映は基本的に .ldif ファイルを作成して ldapadd で反映します

  • touch ldap_work/add_admin_pass.ldif
  • vim ldap_work/add_admin_pass.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}Gtys4HSlB4NAbEY+/524hxN+Lcr60z7K

すべてがおまじないのような文法です
dn は識別子のことで「Distinguished Name」の略です
OpenLDAP では設定の追加や削除をするのに、この dn を使って重複や削除する項目を判断します

  • ldapadd -Y EXTERNAL -H ldapi:// -f ldap_work/add_admin_pass.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"

作成した ldif ファイルの設定の追加は ldapadd コマンドを使います
-Y EXTERNAL -H ldapi:// のオプションにしてはおまじないだと思ってください
パスワードの登録は OpenLDAP が持つグローバルな設定に対して追加するのでその場合にこのオプションが必要になります
これでパスワードの登録が完了しました

基本スキーマの登録

グループの登録をするときに必要になるクラスがあるので登録します
インストール時に用意されている ldif ファイルがあるのでそれを ldapadd していきます

  • ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
  • ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
  • ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

Domain Component (dc) の変更

ここからがメインの設定になります
dc は「Domain Component」の略で ldap 内で管理されるドメインになります
今回は example.com をドメインとして登録します
もちろんダミーのドメインですがダミーでも問題ありません

  • touch ldap_work/modify_dc.ldif
  • vim ldap_work/modify_dc.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  read by dn.base="cn=Manager,dc=example,dc=com" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}Gtys4HSlB4NAbEY+/524hxN+Lcr60z7K

自分もよくわかってないのですが、上から

  • monitor というスキーマへ権限情報の変更
  • hdb というスキーマへ olcSuffix の変更
  • hdb というスキーマへ olcRootDN の変更
  • hdb というスキーマへ olcRootPW の変更

をそれぞれ行っています
上記 dc=example,dc=com の部分を書き換えれば別のドメインを設定することができます

設定の変更は ldapmodify コマンドを使って行います

  • ldapmodify -x -D cn=config -W -f ldap_work/modify_dc.ldif

を実行して変更を反映しましょう
先程登録した admin 用のパスワードを入力してください (slappasswd で設定したパスワード)
「-w」オプションを使用すれば引数でパスワードを指定することもできますが「-W」を使って入力したほうが良いと思います

modifying entry "olcDatabase={1}monitor,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"

こんな感じで反映されれば OK です
反映後の実体のファイルは /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif などにあるので確認してみると良いと思います

Organization Unit (ou) の登録

登録したドメインに今度は ou (組織) を登録していきます
この組織の中にグループやユーザを登録することになります
グループやユーザを管理する上位の概念になるのでそれっぽい名前を付けましょう

  • touch ldap_work/add_ou.ldif
  • vim ldap_work/add_ou.ldif
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: Example Inc.

dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=example,dc=com
objectClass: organizationalUnit
ou: Group

今回は People (ユーザを管理する組織) と Group (グループを管理する組織) を作成しました
追加なので ldapadd コマンドを使って登録します

  • ldapadd -x -D “cn=Manager,dc=example,dc=com” -W -f ldap_work/add_ou.ldif
adding new entry "dc=example,dc=com"
adding new entry "ou=People,dc=example,dc=com"
adding new entry "ou=Group,dc=example,dc=com"

グループの追加

Group ou 内にグループを作成していきます

  • touch ldap_work/add_group.ldif
  • vim ldap_work/add_group.ldif
dn: cn=develop,ou=Group,dc=example,dc=com
objectClass: posixGroup
cn: develop
gidNumber: 1000

cn に追加するグループ名を設定することができます
今回は cn=develop としました
ちなみにここで設定したグループ名は後に連携する SSH 認証のログイン後に id コマンドなどで確認できるグループ名になります

あとは ldapadd で追加すれば OK です

  • ldapadd -x -D “cn=Manager,dc=example,dc=com” -W -f ldap_work/add_group.ldif

ユーザの追加

最後にユーザを追加しましょう
ユーザは People 組織配下に作成します
同時に初期パスワードも設定する必要があるので slappasswd でハッシュ値を生成します

  • slappasswd -h ‘{CRYPT}’
    • パスワードを入力してハッシュ値を取得しておきます
    • {CRYPT}vUOIOBK7ku0LU
  • touch ldap_work/add_user.ldif
  • vim ldap_work/add_user.ldif
dn: uid=hawk,ou=People,dc=example,dc=com
objectclass: posixAccount
objectclass: inetOrgPerson
sn: hawk
cn: snowlog
displayName: hawksnowlog
uid: hawk
uidNumber: 1001
gidNumber: 1000
homeDirectory: /home/hawk
loginShell: /bin/bash
userPassword: {CRYPT}vUOIOBK7ku0LU
mail: hawk@hawksnowlog.cf

hawk さんを登録します
グループとの紐付けは gidNumber で行います
slappassword で作成したパスワードは userPassword に設定します
ログインしたときにホームディレクトリを作成しデフォルトで使用するログインシェルを指定しています
あとは ldapadd で追加すれば OK です

  • ldapadd -x -D “cn=Manager,dc=example,dc=com” -W -f ldap_work/add_user.ldif

確認してみる

作成したグループとユーザ情報を ldapsearch コマンドで確認してみます

  • ldapsearch -x -LLL -D “cn=Manager,dc=example,dc=com” -W -b “ou=Group,dc=example,dc=com”
  • ldapsearch -x -LLL -D “cn=Manager,dc=example,dc=com” -W -b “ou=People,dc=example,dc=com”

Group 配下と People 配下に登録したグループとユーザが存在するのが確認できると思います

最後に

CentOS7 上に LDAP サーバを構築してみました
これだけだとタダのユーザ管理にしか使えないので次回は SSH と連携して認証管理までやらせてみようと思います

Tips

作成したユーザを作成した場合は以下のコマンドで削除できます

  • ldapdelete -x -D “cn=Manager,dc=example,dc=com” -W “uid=hawk,ou=People,dc=example,dc=com”

cn=config 配下の設定をすべて表示します

  • ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config

参考サイト