能書き
私的サーバー構築日誌:仕切り直しからの自宅サーバー構築の続きです。以前も構築しました、その焼き直しになりますが、今回は手順など大幅に変更してお送りします。
それで、CentOS方面の話ですけども、現在はOpenLDAPは非推奨になっているようです。
代わりに 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サーバー OpenLDAP・インストールとログ出力 - Qiita
- 自宅サーバー構築譚:LDAPサーバー OpenLDAP over TLS - Qiita
- 自宅サーバー構築譚:LDAPサーバー OpenLDAP - Qiita
- 私的サーバー構築日誌:オレオレ認証局が認証する証明書 - Qiita … 通信暗号化の鍵の作成手順です。
- 自宅サーバー構築譚:LXDでcloud-initによる初期設定の自動化 - Qiita … ちょっとイタズラで、cloud-initでクライアントとなるコンテナを設定してみます。
-
LDAP検索ツール ldapsearch の覚書 - Qiita …
ldapsearch
コマンドの引数の覚え書きです。助かります。
ログ
- Dockert調査 ~ログ編~ - Qiita
- OpenLDAP のログの見方、確認、解析方法 - 【図解】ネットワーク/サーバ/セキュリティの基礎から応用まで
- 私的サーバー構築日誌:rsyslogとlogrotateとlogger - Qiita … rsyslogの使い方を調べましたが、今回は結局使いませんでした。しかし鍵作成などで参照します。
LDAP 一般論
- OpenLDAPで社内サービスのユーザ情報を一元管理する - Qiita … 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_password
やreadonly_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
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コンテナで立てて、通信路を暗号化し、ログを記録・確認する事に成功しました。きちんとしたドメイン管理への第一歩です。