ニフクラ ブログ

ニフクラ/FJ Cloud-Vやクラウドの技術について、エンジニアが語るブログです。

OpenLDAPで冗長化したLDAPサーバーの構築を検証【構築編】

f:id:TechnicalAccountEngineer:20190508093109p:plain
こんにちは、ニフクラテクニカルアカウントチームです。

複数のネットワークに接続する機器やユーザーなどのリソース情報をまとめて管理する目的で利用されているのが、ディレクトリサービスです。 代表的なディレクトリサービスとして、Microsoft社のActive DirectoryやオープンソースのOpenLDAPなどがよく知られています。
今回は、OpenLDAPをLinuxサーバーにインストールし、基本的なアカウント管理機能を試しました。
ユーザーのホームディレクトリはNAS上に作成し、ファイルを一元管理できるようにしています。また、phpLDAPadminによるユーザー作成 や、LDAPサーバーを冗長化する検証も行っています。
構築編となる本記事では、LDAPサーバー、LDAPクライアントを構築し、phpLDAPadminの導入とLDAPサーバーの冗長化設定までを行います。

f:id:TechnicalAccountEngineer:20190422101407p:plain

前提条件

本記事は、以下の前提知識がある方を想定しています。

  • ニフクラの基本的なコントロールパネルの操作、サービスを利用する知識
    (サーバー作成、ネットワーク構築など)
  • Linuxの基本的な操作、知識

検証概要

本記事は、以下の検証を実施しています。
※検証内容の詳細は、検証編でご紹介します。

検証(1)

  1. LDAPサーバー(プロバイダ)でグループ、ユーザーを作成し(CLI)、ユーザーのホームディレクトリをNAS上に設定する。
  2. Linuxのユーザー管理と連携して、作成したユーザーでLDAPクライアントからログインする。
  3. ログインしたユーザーのホームディレクトリ上でファイルの読み書きを行う。
  4. phpLDAPadminを使用してプロバイダでグループ、ユーザーを作成し(GUI)、ユーザーのホームディレクトリをNAS上に設定する。
  5. Linuxのユーザー管理と連携して、作成したユーザーでLDAPクライアントからログインする。

検証(2)

  1. LDAPサーバーを冗長化する(プロバイダ、コンシューマ)。
  2. プロバイダ側のLDAPサーバーをダウンさせ、LDAPクライアントからコンシューマ経由でログインできることを確認する。

利用リソース

本検証を実施するにあたり、利用したニフクラのリソース情報に関して以下に記載します。
※各リソースのアクセス制限に関しては、ニフクラのファイアウォール等を用いて適切に設定の上実施しています。

リソース 数量
仮想サーバー(サーバーOS:CentOS7.6) 4
プライベートLAN 1
ルーター 1
NAS 1
NATテーブル 1

モジュール情報について以下に記載します。
※本検証結果は以下バージョンでの検証結果となります。

モジュール名 バージョン
nfs-utils 1.3.0-0.61
openldap-servers 2.4.44-21
openldap-clients 2.4.44-21
autofs 5.0.7-99
nss-pam-ldapd 0.8.13-16
phpldapadmin 1.2.3-10

リソースの名称やIPアドレスは以下のように設定しています。

リソース名 ホスト名 プライベートIP 備考
サーバー
(CentOS7.6)
LDAPSV01 192.168.1.11 LDAPサーバー
(プロバイダ)
LDAPSV02 192.168.1.12 LDAPサーバー
(コンシューマ)
LDAPCL01 192.168.1.21 LDAPクライアント
LDAPCL02 192.168.1.22
ルーター - 192.168.1.254 -
プライベートLAN - 192.168.1.0
/24
-
NAS - 192.168.1.100
/24
no_root_squash

ルーターのWebプロキシ設定および、各リソースのファイアウォールのINルールは以下のように設定しています。
※本検証では、OUTルールの設定は行っていません。(制限していません。)

設定項目 設定値
受け側ネットワーク プライベートLAN名
受け側ポート 8080
迂回側ネットワーク 共通グローバル
リソース プロトコル ポート 接続元種別(IPアドレス) 備考
ルーター TCP 8080 192.168.1.11 モジュールインストール用
192.168.1.12
192.168.1.21
192.168.1.22
LDAPSV01/
LDAPSV02
389 192.168.1.21 LDAP用
192.168.1.22
ルーター/
LDAPSV01
80 作業端末の
グローバルIP
phpLDAPadmin用

インターネットからphpLDAPadminの管理画面にアクセスするため、NATテーブルのDNATルールに以下の設定をしています。

プロトコル インバウンドネットワーク 送信先ポート 変換後IP 変換後ポート
TCP 共通グローバル 80 192.168.1.11 80

検証環境構築

LDAPサーバー(プロバイダ、コンシューマ)とLDAPクライアントを構築し、プロバイダへのphpLDAPadminのインストールとLDAPサーバーの冗長化設定を行います。
※各種リソースの作成については、利用リソース各リンク先のクラウドヘルプをご参照ください。

yumコマンドのproxy設定

【対象サーバー:LDAPSV01,LDAPSV02,LDAPCL01,LDAPCL02】

本検証環境は、プライベートLAN内に構築してルーターのwebプロキシを利用しているため、はじめに各サーバーにモジュールインストール用の設定を行います。

# vi /etc/yum.conf
<最終行に以下を追加>
proxy=http://192.168.1.254:8080

LDAPサーバーの構築

LDAPサーバー(プロバイダ/コンシューマ)を構築します。

NFSクライアントの設定

【対象サーバー:LDAPSV01】
NFSマウントに必要なモジュールをインストールします。この作業はプロバイダ側だけ行います。

# yum -y install nfs-utils

マウント先ディレクトリを作成します。

# mkdir /NAS_home

手動マウントできることを確認します。

# mount -t nfs4 192.168.1.100:/ /NAS_home

自動マウントの設定をします。

# vi /etc/fstab
<最終行に以下を追加>
192.168.1.100:/                            /NAS_home      nfs     defaults        0 0

OpenLDAPサーバー設定

【対象サーバー:LDAPSV01,LDAPSV02】

サーバーに必要なモジュールをインストールします。以降の作業はプロバイダ、コンシューマで共通となります。

# yum -y install openldap-servers openldap-clients

サンプル用のデータベース設定ファイルをコピーします。

# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown ldap:ldap /var/lib/ldap/DB_CONFIG

デフォルトではLDAPのログが出力されないため、設定を行いログが出力されるようにします。

# vi /etc/rsyslog.conf
<最終行に以下を追加>
local4.*                                                /var/log/slapd

rsyslogを再起動します。

# systemctl restart rsyslog
# systemctl status rsyslog

LDAPサービスの起動と自動起動設定を行い、ログが出力されることを確認します。

# systemctl start slapd
# systemctl enable slapd
# systemctl status slapd
# ls -l /var/log/slapd

LDAPに登録されるエントリは、オブジェクトクラスによって含まれる属性が決定されます。 オブジェクトクラスや属性の規則はスキーマとして定義され、アカウント情報など利用用途の多いものには、標準のスキーマが用意されています。 今回の検証に必要なスキーマを読み込みます。

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=cosine,cn=schema,cn=config"

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=inetorgperson,cn=schema,cn=config"

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=nis,cn=schema,cn=config"

LDAPデータベースの追加や変更は、LDIFファイルを作成して読み込ませることで行います。 検証用のLDIFファイルを配置する作業フォルダを作成します。

# mkdir /root/ldap_work

slappasswdコマンドを使用し、暗号化されたLDAP管理者用のパスワードを作成します。

# slappasswd
New password: <任意のパスワードを入力>
Re-enter new password: <もう一度同じパスワードを入力>
{SSHA}*****************************

作成したパスワードをconfigデータベースの管理用として設定するLDIFファイルを作成します。 「olcRootPW:」には、slappasswdで作成された、SSHA値を入力します。 ※{SSHA}を含めて入力します。

# vi /root/ldap_work/slappasswd.ldif
<以下内容で新規作成>
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}*****************************

LDIFファイルの設定を反映します。

# ldapadd -Y EXTERNAL -H ldapi:/// -f /root/ldap_work/slappasswd.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ファイルを作成します。 今回は、「dc=examplle,dc=com」をベースに設定しています。

# vi /root/ldap_work/domain.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}*****************************

LDIFファイルの設定を反映します。

# ldapmodify -Y EXTERNAL -H ldapi:/// -f /root/ldap_work/domain.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
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"

ベースと組織のエントリ登録用のLDIFファイルを作成します。

# vi /root/ldap_work/object.ldif
<以下内容で新規作成>
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: Example Inc.

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

LDIFファイルの設定を反映します。 LDAP管理者のパスワードは、slappasswdコマンド実行時に設定したパスワード(平文)になります。

# ldapadd -x -D cn=Manager,dc=example,dc=com -W -f /root/ldap_work/object.ldif
Enter LDAP Password: <LDAP管理者のパスワード>

adding new entry "ou=Organization,dc=example,dc=com"

以上で基本的なLDAPサーバーの構築は終了となります。

LDAPクライアントの構築

NASへのオートマウント設定

【対象サーバー:LDAPCL01,LDAPCL02】

オートマウントに必要なモジュールをインストールします。

# yum -y install autofs nfs-utils

マウントデバイスが書かれたファイルを作成します。

# vi /etc/auto.home
<以下内容で新規作成>
 * -fstype=nfs4 192.168.1.100:/&

作成したファイル名を/etc/auto.masterに追記します。

# echo "/home /etc/auto.home" >> /etc/auto.master

autofsの自動起動設定をします。

# systemctl start autofs
# systemctl enable autofs
# systemctl status autofs

OpenLDAPクライアント設定

【対象サーバー:LDAPCL01,LDAPCL02】

LDAPクライアントに必要なモジュールをインストールします。

# yum -y install openldap-clients nss-pam-ldapd

LDAPとLDAP認証を有効化し、LDAPサーバーとベースDNの設定をします。

# authconfig --enableldap --enableldapauth \
--ldapserver=192.168.1.11 \
--ldapbasedn="dc=example,dc=com" --update

以上でLDAPクライアント側の構築は終了となります。

phpLDAPadmin導入

データ更新を行うプロバイダ側にphpLDAPadminを導入します。

モジュールインストール

CentOS標準のリポジトリでは、phpLDAPadminのモジュールが見つからないため、EPELリポジトリを追加します。

# yum install -y epel-release

本検証では、phpLDAPadminのインストール以外でEPELリポジトリを利用しないため、設定を無効化します。

# vi /etc/yum.repos.d/epel.repo
<5行目をenabled=0にする>
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=0
gpgcheck=1

EPELリポジトリを一時的に有効化し、phpLDAPadminをインストールします。 phpLDAPadminに必要となるhttpdやphpも同時にインストールされます。

# yum install -y phpldapadmin --enablerepo=epel

configファイルの設定

下記ファイルを編集し、phpLDAPadminへ管理者DNでのログインを許可します。

# vi /etc/phpldapadmin/config.php
<417行目のコメントアウトを解除して、falseをtrueに変更する>
$servers->setValue('login','fallback_dn',true);

下記ファイルを編集し、作業端末からphpLDAPadminへのアクセスを許可します。

# vi /etc/httpd/conf.d/phpldapadmin.conf
<11行目「Require local」の下にアクセス元となる作業端末のIPを追加する>
Require ip <作業端末のIP>

httpdの起動と自動起動設定を行います。

# systemctl start httpd
# systemctl enable httpd
# systemctl status httpd

phpLDAPadminへのログイン

作業端末からブラウザを起動して、「http://<ルーターのグローバルIP>/ldapadmin/」にアクセスします。

f:id:TechnicalAccountEngineer:20190415194348p:plain

左ペインから「ログイン」を選択し、「User Name」に管理者DN、「パスワード」に管理者のパスワードを入力後、「Authenicate」をクリックします。

f:id:TechnicalAccountEngineer:20190415194403p:plain

ログイン後、ホーム画面が表示されることを確認します。

f:id:TechnicalAccountEngineer:20190415194612p:plain

以上でphpLDAPadminの導入は終了となります。

LDAPサーバーの冗長化

※物理ホストの障害を考慮する場合はサーバーセパレート機能の使用をご検討ください。

レプリケーションの設定を行い、データの更新を行うプロバイダから、コンシューマ側へデータを複製させます。

レプリケーション設定(プロバイダ)

【対象サーバー:LDAPSV01】

レプリケーションに必要となるsyncprovモジュール読込用のLDIFファイルを作成します。

# vi /root/ldap_work/mod_syncprov.ldif 
<以下内容で新規作成>
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: syncprov.la

LDIFファイルの設定を反映します。

# ldapadd -Y EXTERNAL -H ldapi:/// -f /root/ldap_work/mod_syncprov.ldif 
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=module,cn=config"

レプリケーション設定用のLDIFファイルを作成します。

# vi /root/ldap_work/syncprov.ldif
<以下内容で新規作成>
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpSessionLog: 100

LDIFファイルの設定を反映します。

# ldapadd -Y EXTERNAL -H ldapi:/// -f /root/ldap_work/syncprov.ldif 
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "olcOverlay=syncprov,olcDatabase={2}hdb,cn=config"

レプリケーション設定(コンシューマ)

【対象サーバー:LDAPSV02】

レプリケーション設定用のLDIFファイルを作成します。

# vi /root/ldap_work/syncrepl.ldif
<以下内容で新規作成>
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
  provider=ldap://192.168.1.11:389/
  bindmethod=simple
  binddn="cn=Manager,dc=example,dc=com"
  credentials= <LDAP管理者のパスワード>
  type=refreshAndPersist
  searchbase="dc=example,dc=com"
  filter=(objectClass=*)
  scope=sub
  retry="60 +"

LDIFファイルの設定を反映します。

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

接続先サーバーの追加(クライアント)

【対象サーバー:LDAPCL01,LDAPCL02】

クライアントの接続先LDAPサーバーにコンシューマを追加します。

# authconfig --ldapserver=192.168.1.11,192.168.1.12 --update
# systemctl restart nslcd

以上で冗長化設定は終了となります。

まとめ

LDAPサーバーとクライアントの構築から、phpLDAPadminの導入とLDAPサーバーの冗長化設定までを行いました。 次回の検証編では、プロバイダ上でグループ、ユーザーを作成し、アカウントの一元管理とLDAPサーバーが冗長化されていることの確認をします。

注意事項

  • 本記事では検証目的のため、phpLDAPadminへのアクセスはhttps通信を実装していません。実際に検討される場合は、適切な設定のもと実施してください。
  • 本記事ではユーザーのsshでの認証方式をパスワード認証としていますが、環境に応じてセキュリティを考慮し、公開鍵認証の設定を実施してください。
  • 本記事については検証結果の1つとなります。実際に検討される場合は、事前にそれぞれの要件を鑑みて実装するか確認してください。
  • 本記事ではOS上の操作についても記載していますが、ニフクラではOS以上はご利用者様の責任範囲となりますのでご留意ください。