FJcloud実践
OpenLDAPでの冗長化したLDAPサーバーの構築検証~構築編~
この記事は、ニフクラブログで2019-05-15に公開された記事を移転したものです。
こんにちは、ニフクラテクニカルアカウントチームです。
複数のネットワークに接続する機器やユーザーなどのリソース情報をまとめて管理する目的で利用されているのが、ディレクトリサービスです。 代表的なディレクトリサービスとして、Microsoft社のActive DirectoryやオープンソースのOpenLDAPなどがよく知られています。
今回は、OpenLDAPをLinuxサーバーにインストールし、基本的なアカウント管理機能を試しました。
ユーザーのホームディレクトリはNAS上に作成し、ファイルを一元管理できるようにしています。また、phpLDAPadminによるユーザー作成 や、LDAPサーバーを冗長化する検証も行っています。
構築編となる本記事では、LDAPサーバー、LDAPクライアントを構築し、phpLDAPadminの導入とLDAPサーバーの冗長化設定までを行います。
前提条件
本記事は、以下の前提知識がある方を想定しています。
- ニフクラの基本的なコントロールパネルの操作、サービスを利用する知識
(サーバー作成、ネットワーク構築など) - Linuxの基本的な操作、知識
検証概要
本記事は、以下の検証を実施しています。
※検証内容の詳細は、検証編でご紹介します。
検証(1)
- 1.LDAPサーバー(プロバイダ)でグループ、ユーザーを作成し(CLI)、ユーザーのホームディレクトリをNAS上に設定する。
- 2.Linuxのユーザー管理と連携して、作成したユーザーでLDAPクライアントからログインする。
- 3.ログインしたユーザーのホームディレクトリ上でファイルの読み書きを行う。
- 4.phpLDAPadminを使用してプロバイダでグループ、ユーザーを作成し(GUI)、ユーザーのホームディレクトリをNAS上に設定する。
- 5.Linuxのユーザー管理と連携して、作成したユーザーでLDAPクライアントからログインする。
検証(2)
- 1.LDAPサーバーを冗長化する(プロバイダ、コンシューマ)。
- 2.プロバイダ側のLDAPサーバーをダウンさせ、LDAPクライアントからコンシューマ経由でログインできることを確認する。
利用リソース
本検証を実施するにあたり、利用したニフクラのリソース情報に関して以下に記載します。
※各リソースのアクセス制限に関しては、ニフクラのファイアウォール等を用いて適切に設定の上実施しています。
モジュール情報について以下に記載します。
※本検証結果は以下バージョンでの検証結果となります。
モジュール名 | バージョン |
---|---|
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:
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/」にアクセスします。
左ペインから「ログイン」を選択し、「User Name」に管理者DN、「パスワード」に管理者のパスワードを入力後、「Authenicate」をクリックします。
ログイン後、ホーム画面が表示されることを確認します。
以上で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=
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以上はご利用者様の責任範囲となりますのでご留意ください。