0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

私的サーバー構築日誌:LDAPサーバー OpenLDAP over TLS とログ確認

Last updated at Posted at 2023-11-01

能書き

私的サーバー構築日誌:仕切り直しからの自宅サーバー構築の続きです。以前も構築しました、その焼き直しになりますが、今回は手順など大幅に変更してお送りします。

それで、CentOS方面の話ですけども、現在はOpenLDAPは非推奨になっているようです。

参考文献:9.2. OPENLDAP - 9. LDAP サーバー - II. ID と認証ストア - システムレベルの認証ガイド - Product Documentation for Red Hat Enterprise Linux 7

代わりに 389 Directory Server (通称 389-ds)というソフトが標準となるようです。理由は明示されてませんが、OpenLDAPは重いからじゃないかという意見も。調査によっては動作が4倍以上遅いとかいう数字も見かけました。

しかし Ubuntu 20.04 の頃の話ですけど、389-dsをインストールしようとすると依存パッケージが山程出てきてちょっと不気味。良く見るとApacheまで入ってるように見えました。見間違いでしょうか?しかしこれで使う気が失せました。

と言う訳で、OpenLDAPのサーバーをDockerコンテナで立ち上げます。手順は探せば日本語の記事も見つかりました。

それにしてもLDAPという規格は参考文献が少なくて苦労してます。ネットで幾ら調べても、ごく大雑把な概念説明と、こうやったら上手くいきましたというノウハウしか出てこなくて。その間を埋める知識がわかりません。仕方が無いので本を買いました。それも2007年の本、新品ではなくて古本屋での購入です。関係者の皆様スミマセン。

どうやらLDAPは、エンタープライズでの利用が一般的なせいかあんまり記事がありませんな。誰か中級者向け記事を書いてください(切実)

本記事もノウハウ寄りになります。理論は参考書を購入して勉強して下さい。古~い規格なので、十数年前の古~い参考書も現役で役に立ちます。

目標

  • OpenLDAPサーバーをDockerコンテナで立てる。そしてログ確認。
  • LDAP over TLS を設定。そしてクライアントマシン代わりにLXDコンテナからアクセス。
  • 便利なGUIツールは使いません。これは私のコダワリです。

参考文献

LDAPサーバーとDockerコンテナ

基本的なインストールと設定

ログ

LDAP 一般論

Dockerコンテナ

準備

場所は前回検討した通りです。Dockerコンテナの場所は、管理者アカウント$HOME/docker-slapdディレクトリとします。

ホスト側
cd
mkdir docker-slapd
cd docker-slapd
mkdir -p data/certs
mkdir data/config
mkdir data/db
mkdir data/ldif

docker-compose.ymlファイルは下記のようにします。各環境変数などの値は、環境に合わせて適当に変えて下さい。特にadmin_passwordreadonly_passwordなど。

ホスト側
cat <<___ >docker-compose.yml
version: '3.8'
services:
  slapd:
    image: osixia/openldap:latest
    container_name: slapd
    restart: unless-stopped
    hostname: primary.home
    ports:
      - 636:636
    environment:
      LDAP_ORGANISATION: "Example Home."
      LDAP_DOMAIN: "home"
      LDAP_ADMIN_PASSWORD: "admin_password"
      LDAP_READONLY_USER: "true"
      LDAP_READONLY_USER_USERNAME: "readonly"
      LDAP_READONLY_USER_PASSWORD: "readonly_password"
      LDAP_TLS_VERIFY_CLIENT: "never"
      LDAP_TLS_CRT_FILENAME: "primary.home.crt"
      LDAP_TLS_KEY_FILENAME: "primary.home.key"
      LDAP_TLS_CA_CRT_FILENAME: "demoCA.crt"
    volumes:
      - ./data/db:/var/lib/ldap
      - ./data/config:/etc/ldap/slapd.d
      - ./data/certs:/container/service/slapd/assets/certs
      - ./data/ldif:/root/ldif
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
___

通信暗号化の為の鍵

以前、rsyslogの通信暗号化で鍵を作りました。今回はこれを流用します。

認証局:

  • 秘密鍵 /home/cert/demoCA/pki/private/ca.key
  • 公開鍵 /home/cert/demoCA/pki/ca.crt

サーバーマシンprimary.homeの証明書:

  • 秘密鍵 /home/cert/demoCA/pki/private/primary.home.key
  • 公開鍵 /home/cert/demoCA/pki/issued/primary.home.crt

参照する鍵とその置き場所は、上述のdocker-compose.ymlの記述通りです。

  • 認証局の公開鍵 ca.crt
  • 証明書の公開鍵 primary.home.crt
  • 証明書の秘密鍵 primary.home.key
  • 置き場所 $HOME/data/certs

鍵を置き場所にコピーするには、下記手順にします。これも以前のrsyslogの記事の通りです。

ホスト側
sudo -u cert cp -p /home/cert/demoCA/pki/ca.crt /tmp/demoCA.crt
ホスト側
sudo -u cert cp -p /home/cert/demoCA/pki/issued/primary.home.crt /tmp
ホスト側
sudo -u cert cp -p /home/cert/demoCA/pki/private/primary.home.key /tmp
ホスト側
sudo mv /tmp/demoCA.crt /tmp/primary.home.crt /tmp/primary.home.key ~/docker-slapd/data/certs

起動

ホスト側
cd
cd docker-slapd
docker compose up -d

~/data/ldifだけは自動では権限が設定されないようです。他は大丈夫の模様。

ホスト側
sudo chown root:root data/ldif

LXDコンテナ

オレオレ認証局を信頼

信頼対象のオレオレ認証局、その公開鍵を用意します。

ホスト側
sudo -u cert cp -p /home/cert/demoCA/pki/ca.crt /tmp/demoCA.crt
ホスト側
sudo chown root: /tmp/demoCA.crt
ホスト側
sudo chmod 644 /tmp/demoCA.crt

クライアントマシン代わりのLXDコンテナです。

ホスト側
lxc init images:ubuntu/jammy/cloud ldap-client --device eth0,ipv4.address=192.168.0.2

オレオレ認証局の公開鍵をLXDコンテナに仕込みます。

ホスト側
lxc file push /tmp/demoCA.crt ldap-client/usr/share/ca-certificates/demoCA/demoCA.crt -p
sudo rm /tmp/demoCA.crt

LXDコンテナの初期化手順を設定

ホスト側
lxc config set ldap-client cloud-init.user-data="$(cat <<___
#cloud-config
timezone: Asia/Tokyo
locale: ja_JP.utf8
package_upgrade: true
packages:
  - ldap-utils
runcmd:
  - echo demoCA/demoCA.crt >>/etc/ca-certificates.conf
  - [update-ca-certificates]
___
)"

起動。

ホスト側
lxc start ldap-client

LXDコンテナの初期化が終わるのを待ちます。

ホスト側
lxc exec ldap-client -- cloud-init status --wait

初期化が終わったら、証明書(というか認証局)を信頼した事を確認します。

ホスト側
lxc exec ldap-client -- ls -l /etc/ssl/certs/ | grep demoCA

LDAP動作確認

下記コマンドを実行してみます。

ホスト側
lxc exec ldap-client -- ldapsearch -x -LLL -H ldaps://primary.home -b dc=home -D cn=readonly,dc=home -W

パスワード入力後、ちょっとだけ表示されます。

ホスト側
$ lxc exec ldap-client -- ldapsearch -x -LLL -H ldaps://primary.home -b dc=home -D cn=readonly,dc=home -W
Enter LDAP Password:
dn: dc=home
objectClass: top
objectClass: dcObject
objectClass: organization
o: Example Home.
dc: home

dn: cn=readonly,dc=home
cn: readonly
objectClass: simpleSecurityObject
objectClass: organizationalRole
userPassword:: e1NTSEF9bUtFWmZoRlM4emQ3SGNuMi90a2JEZ3A0alZjdDYreWk=
description: LDAP read only user

Dockerコンテナ側のログを確認してみます。

ホスト側
docker logs slapd 2>&1 | grep -A 100 "ACCEPT from IP="

LXDコンテナからの問合せが届いていれば、こんな感じになるでしょう。

ホスト側
$ docker logs slapd 2>&1 | grep -A 100 "ACCEPT from IP="
654a0147 conn=1000 fd=12 ACCEPT from IP=172.20.0.1:36158 (IP=0.0.0.0:636)
654a0147 conn=1000 fd=12 TLS established tls_ssf=256 ssf=256
654a0147 conn=1000 op=0 BIND dn="cn=readonly,dc=home" method=128
654a0147 conn=1000 op=0 BIND dn="cn=readonly,dc=home" mech=SIMPLE ssf=0
654a0147 conn=1000 op=0 RESULT tag=97 err=0 text=
654a0147 conn=1000 op=1 SRCH base="dc=home" scope=2 deref=0 filter="(objectClass=*)"
654a0147 conn=1000 op=1 SEARCH RESULT tag=101 err=0 nentries=2 text=
654a0147 conn=1000 op=2 UNBIND
654a0147 conn=1000 fd=12 closed

仕舞い

実験に使った、クライアントマシン代わりのLXDコンテナは削除しましょう。

ホスト側
lxc stop ldap-client
lxc rm ldap-client

LDAPサーバーをDockerコンテナで立てて、通信路を暗号化し、ログを記録・確認する事に成功しました。きちんとしたドメイン管理への第一歩です。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?