CardDAVサーバとLDAPサーバ

Linphoneのユーザ毎のコンタクトリストをデータベースとして保存し、デバイス間で共有するために必要なCardDAVサーバ、発信先を検索・リストアップするためのLDAPサーバを構築。


Baikalのインストール

条件:Apacheでhttpsを有効にしていること。Debian12へインストール。

Baikal は SQLite を標準 DB として使うため、pdo_sqlitesqlite3 の両方が必要です。
SQLiteのインストール(PHP のバージョンが 8.2の場合)

$ sudo apt install php-sqlite3 php8.2-sqlite3

ダウンロード

$ git clone https://github.com/sabre-io/Baikal.git -b 0.10.1

ディレクトリの移動・アクセス権変更

$ sudo mv Baikal /var/www/
$ sudo chown -R www-data:www-data /var/www/Baikal

ComposerでPHP関連パッケージのインストール

$ cd /var/www/Baikal
$ sudo -u www-data composer install

アパッチ設定ファイルの作成

$ sudo nano /etc/apache2/sites-available/dav.example.com.conf
<VirtualHost *:443>

    DocumentRoot /var/www/Baikal/html
    ServerName dav.example.com

    RewriteEngine on
    # Generally already set by global Apache configuration
    # RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    RewriteRule /.well-known/carddav /dav.php [R=308,L]
    RewriteRule /.well-known/caldav  /dav.php [R=308,L]

    <Directory "/var/www/Baikal/html">
        Options None
        # If you install cloning git repository, you may need the following
        Options +FollowSymlinks
        AllowOverride None
        # Configuration for apache-2.4:
        Require all granted
        # Configuration for apache-2.2:
        # Order allow,deny
        # Allow from all
    </Directory>

    <IfModule mod_expires.c>
        ExpiresActive Off
    </IfModule>

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/dav.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/dav.example.com/privkey.pem

</VirtualHost>

上記設定の再読込

$ sudo a2ensite dav.example.com.conf
$ sudo systemctl reload apache2

アクセスURL

https://dav.example.com

OpenLDAP + phpLDAPadmin のインストール

各パッケージのインストール

$ sudo apt install slapd ldap-utils phpldapadmin -y

再設定

$ sudo dpkg-reconfigure slapd
質問 推奨回答例
Omit OpenLDAP server configuration? いいえ
DNS domain name example.com
Organization name Example Com
Administrator password 任意の安全なパスワード
Database backend MDB
Do you want the database to be removed when slapd is purged? いいえ
Move old database? はい

ステータス確認

$ sudo systemctl status slapd
$ ldapsearch -x -LLL -H ldap://localhost -b dc=example,dc=com dn

TLS認証ファイルのコピー

$ sudo mkdir -p /etc/ssl/ldap
$ sudo cp /etc/letsencrypt/live/ldap.example.com/fullchain.pem /etc/ssl/ldap/
$ sudo cp /etc/letsencrypt/live/ldap.example.com/privkey.pem /etc/ssl/ldap/
$ sudo chown openldap:openldap /etc/ssl/ldap/*.pem
$ sudo chmod 400 /etc/ssl/ldap/*.pem

ldaps:/// を追加

$ sudo nano /etc/default/slapd

SLAPD_SERVICES=“ldap:/// ldaps:/// ldapi:///”

TLSファイル作成

$ nano ldap-tls.ldif
dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/ldap/fullchain.pem
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/ldap/privkey.pem

TLSファイル読込

$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f ./ldap-tls.ldif

LDAPサーバ再起動

$ sudo systemctl restart slapd
$ sudo ss -ltnp | grep slapd

LDAPS(636ポート)接続テスト:

$ ldapsearch -x -H ldaps://ldav.example.com -b dc=example,dc=com

StartTLS(389ポート)接続テスト:

$ ldapsearch -x -H ldap://ldap.example.com -ZZ -b dc=example,dc=com

phpLDAPadmin:ベースDNとバインドDNの設定

$ sudo nano /etc/phpldapadmin/config.php
$servers->setValue('server','host','127.0.0.1');
$servers->setValue('server','base',array('dc=example,dc=com'));
$servers->setValue('login','bind_id','cn=admin,dc=example,dc=com');

注)Debianでは自動的にApache設定が追加されます


アクセス
https://ldap.example.com/phpldapadmin