Nedia What's up!

ネディアのエンジニアによるIT技術やサービスの紹介・検証などをお届け!

サーバー管理の困った!を○○で解決 LDAPを使ったユーザー管理編 2/2

CentOS7でOpenLDAPを使ってみよう!

第二回目となる今回は、OpenLDAPの導入から基本設定について詳しく説明します。

今回用いるサーバは、フリーソフトのOpenLDAPが利用できるCentOS7 です。

OpenLDAPの導入についての解説を行う前に改めてLDAPを使うことのメリット(目的)についての説明をします。

第一回目から繰り返しになりますが、LDAPを使うことでユーザ情報の一元管理が可能 になります。
例えば、A、B、C、Dという4台のサーバがある場合に、通常であればユーザ情報はそれぞれのサーバに持たせる必要があります。

そして、それぞれのサーバに重複して登録済みのあるユーザのパスワードを変更する場合、一台一台にログインしてパスワードを変更しなくてはなりません。

ここにLDAPサーバを導入することで、ユーザ情報はLDAPサーバだけに持たせて、A、B、C、Dの各サーバ側にはユーザ情報を持たせないで運用することが可能になります。
具体的には、A、B、C、Dの各サーバにログインする際のユーザ認証をLDAPサーバに問い合わせをする(任せる)ようにすることで、一元管理を実現させます。

ユーザ、パスワード情報をLDAPサーバで一元管理できれば,新規ユーザが増えた場合でも,LDAPサーバ1台にアカウントを作成するだけで全てのサーバにログインできるようになります。
また、一時的に無効にしたいユーザもLDAPサーバ側でフラグをつけてしまえば全てのサーバへログインできなくなります。

例として4台のサーバとしましたが、何十台、何百台といった大規模システムに活用することも可能ですし、また多数のアプリケーションをサポートできる豊富な機能により使い道は様々です。
今回は例としてLDAPでユーザ管理を出来るようにするところまでの説明を行います。

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

CentOSにおけるLDAPサーバの機能は、openldap-serversパッケージをインストールすることで使用可能になります。
openldap-serversをインストールするにはopenldapが必要です。
そしてLDAPサーバの基本設定を行うには、LDAP関連コマンドも必要ですので、openldap-clientsもインストールする必要があります。
さらに、libtool-ltdlはopen-clientsの依存パッケージの為、yumを使って依存パッケージも含めてインストールしてください。

ldapサービス

Unit name slapd.service
TCP Wrapper slapd
Daemon program /usr/sbin/slapd
Configuration /etc/openldap/slapd.conf,/etc/openldap/slapd.d/
Document files /usr/share/doc/openldap-servers-2.4.39/
Pid file /var/run/openldap/slapd.pid

パケットフィルタリングの設定

CentOS7で firewall-cmd を有効にしている場合には、下記のコマンドを実行して通信を許可してください。

アクセス制御の設定

CentOSでは、LDAPサーバでTCP Wrapperを使用したIPアドレスベースのアクセス制御を行うことができるようになっています。したがって、接続するクライアントに合わせて設定を行う必要があります。

LDAPサーバの基本設定とサービスの起動

データベースチューニング設定

slapdがデータを保管するデータベースファイルは、/var/lib/ldapに作成されます。slapdを起動する前に、このディレクトリにデータベースチューニングのための設定ファイルを配置しておきます。
サンプルの設定ファイルが用意されていますので、そのファイルをそのままコピーします。

サービスの起動

データベースのチューニングの設定が出来たら、サービスを起動することができます。

サービスの自動起動

インストールした時点では、セキュリティを考慮して自動的に起動されるようにはなっていません。

LDAPデータベースの設定

サービスを起動しましたが、実際にLDAPサーバを利用するには、次のような作業を行う必要があります。

LDAPサーバ利用のための準備

  • LDAPデータベースの基本設定
  • LDAPスキーマの登録
  • LDAPエントリの登録

これらの作業は、すべてldapadd、ldapmodify、ldapdeleteなどのLDAPクライアントユーティリティプログラムを使って行います。
LDAPサーバを利用して何のデータを登録・管理するかによって設定内容に若干違いがでますが、基本的な作業方法は共通の手法で行うことができます。

LDAPデータベースの基本設定

CentOSでは、openldap-serversパッケージをインストールすると、標準的なLDAPデータベースの設定がすでに行われています。
しかし、次の3つの情報は、利用者の環境に合わせて修正する必要があります。

  • LDAPディレクトリツリーのDN(olcSuffix)
  • LDAPデータベースの管理用のアクセス権である特権DN(olcRootDN)
  • 特権DNのパスワード(olcRootPW)

LDAPデータベースツリーのDNは、いわばデータベースの名前に相当するものです。ユーザデータを登録するデータベースには、自由に名前を設定することができます。
一般的にはその組織のドメイン名などを元に作成しますので、本記事ではnedia.ne.jpというドメイン名を元に作成したdc=nedia,dc=ne,dc=jpという名称にして解説します。

特権DNは、Linuxシステムのrootユーザに相当するもので、そのLDAPデータベースの全てのデータにアクセスすることのできる権限を持ちます。
本記事では、特権DNをcn=Manager,dc=nedia,dc=ne,dc=jpとして解説します。

データ用ディレクトリの基本設定の確認

まずは、データ用ディレクトリの基本設定がどうなっているかを確認します。設定の確認は、次の例のようにldapserchコマントで行います。

  • ①は、実際のデータが格納されるディレクトリです。
  • ②のolcSuffixがLDAPデータベースツリーのDNです。
  • ③のolcRooDNがLDAP管理用のアクセス権である特権DNの設定です。
  • olcRootPWは設定されていないことがわかります。 ※

※例) 設定されている場合
   olcRootPW: xxxxxxxxxxxxx
と表示されます。

ldapseachの引数の「-Y EXTERNAL」は、認証方式の指定です。
また、-Hオプションは、接続するLDAPサーバの指定ですが、ここでは特殊な「ldapi:///」を指定しています。
これは、UNIXドメインソケットを使ってローカルなサーバーに設定を行うことを指定しています。
また、-dオプションは検索場所の指定です。ここでは、olcDatabase={2}hdb,cn=configを指定しています。
これはユーザデータを格納するための設定データが格納されているエントリです。

データ用ディレクトリの管理情報の変更

LDAPエントリのデータ修正は、ldapmodifyコマンドで行います。設定を行うためには次のようなLDIFファイルを作成します。

  • ①設定を行うDNです。先ほどldapsearchの-bオプションで指定したのと同じ、データベース設定設定が格納されているDNを指定します。
  • ②このLDIFファイルでは修正(modify)を行うことを宣言しています。
  • ③olcRootDNを書き換えることを指定しています。
  • ④olcRootDNの値を指定しています。
  • ⑤olcSuffixを書き換えることを指定しています。
  • ⑥olcSuffixの値をしています。
  • ⑦olcRootPWの属性を追加することを指定しています。
  • ⑧olcRootPWの値を指定しています。

③と④、⑤と⑥、⑦と⑧は、それぞれ対になっています。
olcSuffix、olcRootDNは、すでに登録されているデータがあるため、属性値の修正となります。
olcRootPWは値が登録されていませんので、属性値の追加(add)を行います。
属性値には、次のようにslappasswdで作成したパスワードを指定します。

データができたら、次のようにldapmodifyコマンドを使ってサーバへ設定を行います。

ちなみに間違った記述があった場合には、下記のようなメッセージが出て反映が行われません。
メッセージに出るヒントを元に記述内容を見直してください。

ldapmodifyコマンドの引数の-fオプションでは、先ほど作成したLDIFファイルを指定します。

先ほどのldapseachによる基本設定の確認コマンドで変更されているか確認します。

LDAPスキーマの登録

次に、このLDAPサーバで使用するスキーマを登録します。スキーマは、LDAPデータベースのエントリに登録することができるデータの種類や型を定義するものです。
LDAPでは、スキーマを柔軟に定義することができ、様々なアプリケーションのデータを格納することができます。

openldapパッケージをインストールすると、標準スキーマの登録に必要なldifファイルが/etc/openldap/schma/に用意されます。
CentOS標準では、coreスキーマだけが利用できるように設定されています。それ以外のスキーマを使いたい場合にいは、必要に応じて設定を追加する必要があります。

なお、定義されていないオブジェクトクラスは利用出来ません。今回の目的であるユーザ管理を行う上で必要となる オブジェクトクラス「account」 と 「posixAccount」は、 それぞれ、cosineスキーマ と nisスキーマ
で定義されていますので、この二つのスキーマを登録して利用出来るようにします。

スキーマの登録は、/etc/openldap/schema/に用意されているldifファイルを使い、ldapaddコマンドで行います。
下記は、スキーマ登録の例です。

LDAPエントリの登録

LDAPサーバの設定ができたら、次にLDAPサーバで管理するデータを登録します。ここではLinuxアカウントの管理を行うのに最低限必要な、LDAPデータの登録方法について解説します。
Linuxアカウントの管理を行うためにLDAPサーバを利用する場合、一般的に最初に登録すべきデータは次のようなものです。

  • 基本となる組織、ユーザアカウントを管理する組織、グループを管理する組織の登録
  • 初期グループアカウントの登録
  • 初期ユーザアカウントの登録

基本となる組織・ユーザアカウントを管理する組織・グループを管理する組織の登録

ユーザやグループの情報を登録する前に、その受け皿となる基本の組織、ユーザアカウントを管理するための組織、グループを管理するための組織を登録する必要があります。
登録するためには、次のようなLDIFファイル(init.ldif)を用意します。

  • ①最も基本となるnedia組織のエントリです。このエントリの下位にすべてのエントリを作成します。
  • ②特権DN(cn=Manager,dc=nedia,dc=ne,dc=jp)のエントリです。特権DNのobjectClassには、必ずorganizationalRoleを指定します。
  • ③ユーザを管理するための組織単位(ou=People,dc=nedia,dc=ne,dc=jp)です。/etc/passwdに相当するものです。
  • ④グループを管理するための組織単位(ou=Group,dc=nedia,dc=ne,dc=jp)です。/etc/gruopに相当するものです。

このファイルを、次のようにldapaddコマンドで登録します。

ldapaddの-Dオプションで指定しているのは、先ほどolcRootDNに登録したデータベース特権DNです。-fオプションで、先ほど作成したファイルを指定しています。

LDAP初期エントリ登録内容の確認

グループアカウントの登録

/etc/groupに設定されているグループアカウントと同等のエントリを登録します。
グループアカウントはposixGroupオブジェクトクラスを用いて設定します。
posixGroupオブジェクトクラスは、先ほど登録したnisスキーマで定義されているオブジェクトクラスです。

posiGroupオブジェクトクラス(nisスキーマ)

属性タイプ 説明
cn 一般名称 [Organization Unit]
gidNubber グループ番号(必須項目)
memberUid 所属メンバーのユーザ番号
description 説明

以下にsystem01,system02というグループを登録する場合の例を示しますので、この例にならって、必要なグループを指定してください。

このファイルを使って、次の例のようにエントリを登録します。

ユーザアカウントの登録

/etc/passwdに設定されているユーザアカウントと、同等のエントリを登録します。
ユーザアカウントはposixAccountオブジェクトクラスを用いて設定します。

posixAccountオブジェクトクラス

属性タイプ 説明
cn 一般名称 [Common Name](必須項目)
uid ユーザ名(必須項目)
uidNumber ユーザ番号(必須項目)
homeDirectory ホームディレクトリ(必須項目)
userPassword パスワード
loginShell ログインシェル
gecos フルネームなど
description 説明

以下に、user01、user02というユーザを登録する場合の例を示しますので、この例にならって、必要なユーザをしてください。

オブジェクトクラスtopは基本となるオブジェクトクラスで、objectClass属性が必須項目となっています。
オブジェクトクラスaccountはコンピュータアカウントを表すもので、uidが必須項目となっています。

このファイルを使って、次の例のようにエントリを登録します。

以上の作業でLDAPへのユーザ登録作業は完了です。

LDAPに登録したユーザを利用可能にする

LDAPユーザでログインできるよう認証方法の設定を変更します。
はじめにLDAP認証させるためのモジュールがインストールされていなければそれをインストールする必要があります。

Linuxアカウントのパスワード、グループ情報の参照にLDAPディレクトリサービスを使用するようにネームサービススイッチの設定変更を行います。
設定ファイルは/etc/nsswitch.confで以下のように編集を行います。

Linux上に登録されていないアカウントでLDAP上に登録されているアカウントは認証は可能ですがホームディレクトリが存在しない状態です。
ログインできなくはないですがWarningが出るので、これを回避するためログインすると自動的にホームディレクトリが作成されるよう設定を変更します。

この設定後、LDAPに登録されているアカウントでSSHログインなどをすると自動的にホームディレクトリが作成されます。

最後に、idコマンドを使ってLDAPに登録したユーザのユーザIDやグループIDを確認してみます。

ここまで出来れば作成したユーザでFTP接続なども出来るようになっているはずです。

クライアントサーバの設定

LDAPサーバ側の設定は完了しましたので、最後にクライアントサーバ側の設定方法について説明します。本記事の冒頭でA、B、C、Dの各サーバと表現した方のサーバとなります。

OpenLDAP クライアントをインストールしす。

Linuxアカウントのパスワード、グループ情報の参照にLDAPディレクトリサービスを使用するようにネームサービススイッチの設定変更を行います。
設定ファイルは/etc/nsswitch.confで以下のように編集を行います。

LDAP有効化、LDAP認証有効化、LDAPサーバ設定、LDAPベースDN設定、ホームディレクトリ自動生成設定を行います。

LDAPに登録したユーザが利用できるか確認します。

最後に、idコマンドを使ってLDAPに登録したユーザのユーザIDやグループIDを確認してみます。

LDAPで行うユーザ管理の説明は以上となります。
いかがでしたでしょうか?

私が実際にLDAPサーバを構築してみてわかりにくいと感じた部分は、一番最初のサーバ管理者パスワードを設定するところと、スキーマの追加の部分です。逆に言うとこれさえできてしまえば他の部分は特に難しいと感じた場所はありませんでした。

ユーザ管理の一元管理は企業のセキュリティ事故を防ぐ意味でもとても重要です。
削除したと思っていたユーザアカウントが実は残っていて、外部から重要機密を持ち出させてしまった。
ということのないようにユーザ管理はLDAPで一元管理するのがオススメです。

それでは。