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