概要
株式会社Link-Uでエンジニアを務めている堀内です。
Linuxサーバの認証統合を実現する手段として、LDAPを用いることが一般的です。
docker-composeを用いて、GUIで管理できるLDAPサーバの構築手順を解説します。
検証環境
- Ubuntu Server 20.04 LTS
- Docker 19.03.11 (snap版)
- 使用イメージ
サーバ構成
- LDAPデーモン: OpenLDAP
- 管理用アカウント・読取専用アカウントを作成、匿名アクセスは不可
- LDAPS (636/TCP) でのみ外部からアクセス可能にする
- Linuxのユーザ認証向けの設定を行う
- SSH公開鍵を格納できるようにする (sshPublicKey)
- LDAP管理ツール: Ldap Account Manager
- LDAPのユーザ登録・編集用
- HTTPSでアクセスを可能にする(リバースプロキシコンテナ経由)
- ホストとの共有ディレクトリ
- ./data/certs ... SSL証明書
- ./data/ldap_config ... OpenLDAP設定
- ./data/ldap_db ... OpenLDAPデータベース
- 公開ポート
- 80/tcp (HTTP) ... 管理ツール用、HTTPSに転送
- 443/tcp (HTTPS) ... 管理ツール用
- 636/tcp (LDAPS) ... LDAPサービス用
docker-compose設定
Dockerの導入
下記コマンドにてsnap版のdockerを導入します。
$ sudo snap install docker
docker-compose設定の記述
root権限に移行して、必要なディレクトリを準備します。
$ sudo -s
# cd ~
# mkdir ldap
# cd ldap
# mkdir data
# mkdir data/certs
# mkdir data/ldap_config
# mkdir data/ldap_db
# vi docker-compose.yml
docker-compose.yml を記述します。
コメント文のある箇所は環境により適宜修正してください。
version: '3.8'
services:
slapd: # OpenLDAPサーバ
image: osixia/openldap:1.4.0
container_name: slapd
restart: on-failure:3
hostname: ldap.example.com # サーバのホスト名
ports:
- 636:636
environment:
LDAP_ORGANISATION: "Example Inc." # 組織名
LDAP_DOMAIN: "example.com" # 組織のドメイン
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" # SSLクライアント認証の無効化
# デフォルトでは自己署名証明書を自動生成、本番環境では下記コメントを外して証明書を指定
# LDAP_TLS_CRT_FILENAME: "ldap.crt" # SSL証明書
# LDAP_TLS_KEY_FILENAME: "ldap.key" # SSL秘密鍵
# LDAP_TLS_CA_CRT_FILENAME: "ca.crt" # クライアント認証用CA証明書、使用しなくても指定は必須
volumes:
- ./data/ldap_db:/var/lib/ldap
- ./data/ldap_config:/etc/ldap/slapd.d
- ./data/certs:/container/service/slapd/assets/certs
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
lam: # Ldap Account Manager (LDAP管理ツール)
image: ldapaccountmanager/lam
container_name: lam
restart: on-failure:3
environment:
LDAP_DOMAIN: "example.com" # 組織のドメイン、OpenLDAPの設定に合わせる
LDAP_BASE_DN: "dc=example,dc=com" # LDAPのルートDN、ドメインをDN形式で表記する
LDAP_USERS_DN: "ou=people,dc=example,dc=com" # ユーザOU、ドメイン部分だけ変更する
LDAP_GROUPS_DN: "ou=groups,dc=example,dc=com" # グループOU、ドメイン部分だけ変更する
LDAP_SERVER: "ldap://slapd:389"
LAM_LANG: "ja_JP"
LAM_PASSWORD: "lam_password" # LdapAccountManagerの 初期設定用パスワード
VIRTUAL_HOST: "lam"
CERT_NAME: "ldap" # SSL証明書名、.crt, .key のファイル名部分を指定。
depends_on:
- slapd
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
proxy: # LDAP Account Manager 用のリバースプロキシ
image: jwilder/nginx-proxy
container_name: proxy
restart: on-failure:3
environment:
DEFAULT_HOST: "lam"
ports:
- 80:80
- 443:443
volumes:
- ./data/certs:/etc/nginx/certs
- /var/run/docker.sock:/tmp/docker.sock:ro
depends_on:
- slapd
- lam
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
サービスの起動
サービスを起動し、全コンテナが正常に動作していることを確認します。
初回起動時はリバースプロキシが証明書を読み込めていない場合があるため、手動でproxyコンテナの再起動をかけてください。
# docker-compose up -d
# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------
lam /usr/bin/dumb-init -- /usr ... Up (healthy) 80/tcp
proxy /app/docker-entrypoint.sh ... Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
slapd /container/tool/run Up 389/tcp, 0.0.0.0:636->636/tcp
# docker-compose restart proxy
LDAP Account Manager設定
初期設定
サービスを起動したサーバにブラウザでアクセスします。
正式な証明書を入れていない場合、下記のように警告が出ますが、無視して続行します。
docker-compose.yml
で指定したパスワードでログインします。
"モジュール"タブを開き、ユーザのモジュールから "shadow"を削除、"SSH公開鍵"を追加して図のような状態にします。
LDAPユーザ追加
初期設定の完了後、LDAPの管理者ユーザのパスワードを入力してログインします。
テスト用ユーザのプライマリグループを追加します。"グループ"タブの"新しいグループ"を選択します。
グループ名を入力して保存します。ここでは"testuser"を作成します。
"unix"タブに移り、ユーザ名とcommon nameを入力します。プライマリグループとして先ほど登録したグループが表示されていることを確認します。
"パスワード設定"を選択し、ログインパスワードを設定します。
"SSH公開鍵"タブの"SSH公開鍵拡張を追加" を選択します。
動作確認
Apache Directory Studio 等のLDAPブラウザでLDAPサーバに接続し、作成したユーザとグループの情報が読み取れることを確認します。
接続の際の認証情報は下記のように設定します。
プロトコル: LDAPS
ポート: 636
ユーザDN: cn=admin,dc=example,dc=com
※cn=admin以降は組織のドメインに合わせて変更
パスワード: (docker-compose.ymlで設定した管理者パスワード)
まとめ
docker-composeを用いたLDAPサーバの構築方法を解説しました。
LinuxサーバにSSSDを導入して本LDAPサーバと連携させれば、
パスワード認証 or SSH鍵認証を行ってログインすることが可能になります。