LDAP

！！今後自分が使うのでサイトまとめて少し解釈しただけの内容！！

#参考サイト
OSS公式ドキュメント
(https://www.openldap.org/doc/)
RedHat公式日本語ドキュメント
(https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system-level_authentication_guide/openldap)
Think IT
(https://thinkit.co.jp/free/tech/18/1/1.html?nopaging=1)
piyolog
(https://wa3.i-3-i.info/word12693.html)

#LDAPとは
LDAP（Lightweight Directory Access Protocol）プロトコルは、ネットワーク上に分散する情報を統合するディレクトリサービスを提供するために生まれたプロトコル。OSI参照モデルではHTTPなどと同じアプリケーション層のプロトコル。検索(search)、追加(add)、削除(delete)、変更(modify)といった機能を利用して登録した情報にアクセスできるプロトコルを提供してくれる。特にX.500ベースのディレクトリサービスにアクセスするための軽量なプロトコルである。
その昔、DAPというOSIプロトコルスタックをフルに使って動作するヘビー級のプロトコルがあったが、かなりのコンピューティングリソースを必要としたため、より軽量なLDAPが開発された。LDAPはTCP/IP (orその他のコネクション指向の転送サービス)上で動作するように設計されており、DAPのほとんどの機能をより低コストで提供する。
LDAPはサーバクライアントモデルを採用している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975449/3505d545-8ac4-05fb-fbaa-dd08b82f9cbe.png)
＜LDAPの利点＞
__・Linux のシステムアカウント情報(/etc/passwd や /etc/shadow) の一元化__
多数の Linux クライアントがある場合、1 台 1 台に ID パスワード情報を入れることなく、LDAP サーバ 1 台だけ登録すれば、どの Linux クライアントからも同じ ID パスワードでログインできるようになり、さらに環境（プロファイル）もログイン時に取得可能。
__・Linux サーバの各種アプリでの ID パスワード統一化__
アプリサーバの ID パスワード情報を統一化することができます。さらにこの発展形として、シングルサインオン（1 つのサーバで認証すれば、他のサーバは認証無しでログインできる仕組み）も実装可能。
__・社員情報の共有__
例えば LDAP サーバに氏名、メールアドレス、電話番号、所属部署などの情報も格納しておきます。そして、別の Linux サーバに、Cybozu 等のグループウェアサーバをインストールし、適切な設定を入れます。そして、ユーザがグループウェアにログインし、検索画面で他の人の氏名を入力し検索ボタンを押すと、その人のメールアドレスや電話番号、所属部署を表示させるように構成することができます。
__・アカウント自動作成等の LDAP 連携__
グループウェアサーバ側にアカウント設定を入れなくても、LDAP にアカウントが登録されていれば、初回サーバログイン時に、LDAP に認証した結果が OK であれば自動でアカウントを作成する、といった構成が可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975449/75f270ef-6787-4fb5-7f86-700c5d3cbeda.png)


#ディレクトリサービスとは
ディレクトリと呼ばれる情報の蓄積場所から、ある「キー」に関連する情報を取り出す仕組みのこと。たとえば電話帳は名前をキーにして電話番号を取り出すディレクトリサービスの1つだと言える。LDAP において、各エントリは階層ツリー形式で管理される。最もわかりやすい方法は、下図のように、ツリーをインターネットドメイン名を元に構築する方法。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975449/0bde4781-d4e7-c574-3b33-b1bfd1aa86c3.png)
ディレクトリサービスは、ローカルに限ってサービスを提供する場合もあるが、グローバルにサービスを提供する場合もあり、大抵分散型のディレクトリサービスを用いる。DNS（Domain Name Syetem）が分散型のディレクトリサービスとして有名！
LDAP は簡単なツリー構造となっており、データベースのような複雑な構造は取れない。一般的なデータベースとは異なり、読み取りは頻繁に発生する半面書き込みはほとんど発生しないといった状態を想定し、最適化されているため、負荷が軽いため、システムアカウントの管理には適している。データベースは 1 日のうちに複数回更新することが前提だが、LDAPは数日に1回程度を想定している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975449/1a424cc0-3820-d699-5849-1b69748d302b.png)
＜ディレクトリサービスの特徴＞
---読み取りが高速
---分散型の情報格納モデル
---高度な検索機能を持つ
＋冗長性の排除 ---> 情報の一元化に成功！

>slapd-configのコンフィグレーションツリーは、非常に特殊な構造をしています。ツリーのルートは cn=config という名前で、グローバルなコンフィギュレーション設定が含まれています。その他の設定は、個別の子エントリに含まれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975449/d4329ddc-3f65-1180-2998-130413ea6c82.png)

#LDAP用語
###エントリ(=属性記述子)
ツリーには「エントリ」と呼ばれる単位で情報が登録される。一つのエントリにはDN(Distinguished Name)と呼ばれるツリー構造内のエントリの位置を示す識別子がグローバルに一意であるように付与される。一つのエントリは複数の「属性」で構成される。属性は「属性名:値」のセットで登録されている。エントリには必ず「objectClass」と呼ばれる属性が指定され、エントリに登録されるべき属性などを定義できる。objectClassはスキーマと呼ばれ、LDAPサーバーごとに定義できるが、標準的なスキーマはRFCで定義されている。独自の属性情報を追加したい場合などにはobjectClassに追加したい独自の属性情報を定義すればOK！

★cn=config
ルートとして存在するグローバルなコンフィグファイル。当該サーバの全体に適用される。多くはシステムやネットワークに関するシステムスキーマ(slapd内にハードコード済)であり、データベース関連のものはない。その他の設定は、個別の子エントリに含まれる。コンフィグエントリはolcGlobal objectClass所持必須。
★cn=module
モジュールエントリはolcModuleList objectClass所持必須。
★cn=schema
システムスキーマ（slapd にハードコードされているすべてのスキーマ）が含まれている。スキーマエントリは olcSchemaConfig objectClass所持必須。

※cn=schema,cn=config の子エントリには、コンフィグファイルから読み込まれたり、ランタイムで追加されたユーザのスキーマが含まれる。
・バックエンド固有の構成
・データベース固有の構成
・OverlaysはDatabaseエントリの子で定義される。
・データベースとオーバーレイには、その他の子もある。

###識別名(DN)
ディレクトリツリー内のエントリを識別するもの。ツリー構造の末尾から「,」でつないだもの。

###相対識別名(RDN)
属性とそれに対応する値のアサーションのこと。グローバルに一意な識別名とは異なり、相対識別名はエントリーごとにのみ一意である。
 
###属性 (=属性値)
格納ファイル__[/etc/openldap/slapd.d/cn=config | cn=schema]__ディレクトリ配下にある各種スキーマファイル
【注意】--------------------
/etc/openldap/slapd.d配下のファイルはviなどで書き換えたりすると正常に動作しない可能性があるので、書き換えたりしないこと。必ず専用のユーティリティ(コマンド)を使用する必要がある。なお、各lidfファイルにはCRCで誤り検出の値が記載されている為、設定内容だけ書き換えてもslapd起動時にエラーとなる。
\------------------------------
エントリーに直接関連付けられた情報。エントリが表す具体的ものの種類や、エントリで利用できる属性を定義したもので、何らかのオブジェクトクラスに属する。

ex.エントリ：属性値
組織：organization
ユーザーアカウント：account,hogeuser

同様に、個人の電話番号やメールアドレスなどの共通の属性を含むエントリーとして表現できる。属性には値を1つ持つか、順序のないスペースで区切られた値のリストになる。特定の属性は任意だが、それ以外の属性は必須。必要な属性はオブジェクトクラス定義を使用して指定し 、/etc/openldap/slapd.d/cn=config/cn=schema/ディレクトリーにあるスキーマファイルに配置する。属性とそれに対応する値のアサーションは、相対識別名 (RDN)とも呼ばれる。グローバルに一意な識別名とは異なり、相対識別名はエントリーごとにのみ一意である。 

###オブジェクトクラス
「objectClass」はオブジェクトクラスで、ldif内で属性を指定する際に、その属性の所属元となるもの。原則objectClassがないと、属性が使えない。


###LDIF
LDIFデータベース __[/usr/local/etc/openldap/slapd.d/*]__
LDAP Data Interchange Format（LDIF）はASCIIテキストのフォーマットを利用した、LDAPエントリの表示形式。DNSでいうところのゾーンファイルにあたり、多数のマッピング情報が記述されている。後述するldapadd コマンドなどでLDAPサーバーへデータをインポートする場合、LDIF形式のデータファイルを使用する。ldifファイルは管理者パスワードやベースエントリを変更する場合は個人でviで作成し、スキーマを投入する際はデフォルトで用意されている/etc/openldap/schema配下のldifファイルや、特殊なスキーマについては関連サイトから必要なものをダウンロードして投入していく。「~~~/slapd.d/*」内のファイルは編集しないこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975449/ee1ebac3-160e-8d54-dd19-e4eaaa2dd430.png)

```sample.ldif
dn: uid=linucuser,ou=education,dc=linuc,dc=jp
uid: linucuser
objectclass: posixAccount
cn: linucuser
uidNumber: 700
gidNumber: 700
homeDirectory: /home/linucuser
loginShell: /bin/bash
```

```
[属性記述子]                  [説明]
dc（domainComponent）   ---  FQDN単一ドメインコンポーネント
c（countryName）        ---  2文字の国コード
l（localityName）       ---  地理的な場所名
ou（organizationalUnit）---  該当エントリが所属する部局
o （organizationName）  ---  組織名
cn（commonName）        ---  オブジェクトの名前（フルネーム）
sn（surname）           ---  姓
st                     ---  州や県などのフルネーム
mail                   ---  メールアドレス
telephoneNumber        ---  電話番号
mobile                 ---  携帯電話
uid                    ---  該当アカウントのログイン名
userPassword           ---  エントリのパスワード
serialNumber           ---  装置のシリアルナンバー
description            ---  説明、特徴など
```

###スキーマ
格納ファイル__[/etc/openldap/schema]__
オブジェクトクラスや属性の定義。LDAPでは様々なスキーマが予め用意されているので、一般的な用途では個別に定義しなくてもOK。

|スキーマファイル|説明|
|::|::|
|core.schema|OpenLDAPで必須のスキーマ|
|cosine.schema|ディレクトリサービスのX.500規格で規定された属性が定義されたスキーマ|
|inetorgperson.schema|アドレス帳など個人情報を扱うためのスキーマ|
|nis.schema|UNIX/Linuxのユーザーやグループ情報を扱うためのスキーマ|

###オブジェクト識別子(OID)
オブジェクトラスや属性には、オブジェクト識別子(OID)が割り当てられる。OIDは重複しないようにIANAで管理されている。

###ホワイトページ
個人別電話帳。作成するには、inetorgperson.schema で定義されている。inetOrgPerson を利用するのが一般的。

```
[属性]                [説明]
cn              ---  一般名(common name)
sn              ---  苗字
mail            ---  メールアドレス
o               ---  組織名
ou              ---  組織単位名
streetAddress   ---  住所
postalCode      ---  郵便番号
telephoneNumber ---  電話番号
description     ---  説明
```

#インストール

|openldapパッケージ|説明|
|:-:|:-:|
|openldap|OpenLDAP サーバーおよびクライアントアプリケーションの実行に必要なライブラリーを含むパッケージ|
|openldap-clients|LDAP サーバーでディレクトリーを表示および変更するコマンドラインユーティリティーを含むパッケージ|
|openldap-servers|LDAP サーバーを設定して実行するサービスおよびユーティリティーの両方を含むパッケージ|これには、スタンドアロンの LDAP Daemon (slapd )が含まれます。
|compat-openldap|OpenLDAP 互換ライブラリーを含むパッケージ|

```
一般的なインストール
# yum install openldap openldap-clients openldap-servers
```

#設定項目
デーモンは__slapd__
設定ファイル __[/etc/openldap/slapd.conf]__
デフォルトでは、OpenLDAP 設定は /etc/openldap/ディレクトリ配下に保存される。
※現在、OpenLDAP は /etc/openldap/slapd.conf ファイルから設定を読み取らなくなり、代わりに、/etc/openldap/slapd.d/ ディレクトリーにある設定データベースを使用するようになっている。

通常、OpenLDAPサーバーユーティリティコマンド([詳細](#LDAPサーバユーティリティ(コマンド)))を使って、動的に変更を行う。

|ディレクトリパス|説明|
|::|::|
|/etc/openldap/ldap.conf|OpenLDAP ライブラリーを使用するクライアントアプリケーションの設定ファイル。これには ldapadd、ldapsearch、Evolution などが含まれる。|
|/etc/openldap/slapd.d/|slapd 設定が含まれるディレクトリ|
※LDIFファイルのエラーは、slapd サービスを開始できない場合があるため、「/etc/openldap/slapd.d/*」 内のLDIFファイルを編集は非推奨！

##グローバル設定オプション
設定ファイル[/etc/openldap/slapd.d/cn=config.ldif]

>設定: slapd は単一の設定ファイルで高度な設定を行うことができ、変更したいことをすべて変更することができます。設定オプションには合理的なデフォルト値が設定されており、作業が簡便。また、LDAP自体を使って動的に設定を行うこともでき、管理性が大幅に向上した。

|ディレクティブ|説明|デフォルト記述例|
|::|::|::|
|olcAllows|有効にする機能を指定|olcAllows: bind_v2|
|olcConnMaxPending|匿名セッションの保留中のリクエストの最大数を指定|olcConnMaxPending: 100|
|olcConnMaxPendingAuth|認証されたセッションの保留中のリクエストの最大数を指定|olcConnMaxPendingAuth: 1000|
|olcDisallows|無効にする機能を指定|デフォルトでは無効にできる機能なし|
|olcIdleTimeout|アイドル状態の接続を閉じるまで待機する時間を指定|デフォルトで無効(=0)|
|olcLogFile|ログメッセージを書き込むファイルを指定|olcLogFile: /var/log/slapd.log|
|olcReferral|サーバーが処理できない場合に要求を処理するためのサーバーURLを指定|デフォルトで無効|

##フロントエンド設定
設定ファイル__[/etc/openldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif]__
アクセス制御リスト(ACL)などのグローバルデータベースオプションを定義する。
##Monitorバックエンド設定
設定ファイル__[/etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif]__
OpenLDAP モニターバックエンドを制御する。有効にすると、自動で生成され、OpenLDAP によって動的に更新される。この際、デーモンの実行中のステータスに関する情報とともに、OpenLDAPによって動的に更新される。
バックエンドのエントリは、olcBackendConfig objectClass所持必須。

##DB固有の設定
設定ファイル[/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif]
デフォルトで、OpenLDAP サーバーは hdb データベースバックエンドを使用する。

|ディレクティブ|説明|デフォルト記述例|
|::|::|::|
|olcReadOnly|データベースを読み取り専用モードに指定|olcReadOnly:FALSE|
|olcRootDN|LDAP ディレクトリーの操作に対してアクセス制御または管理制限パラメーターが設定されたユーザーを指定(識別名:DNを受け入れる)|cn=Manager,dn=my-domain,dc=com|
|olcRootPW|olcRootDNディレクティブを使用して指定されるユーザーのパスワードを指定|olcRootPW: {SSHA}WczWsyPEnMchFf1GRTweq2q7XJcvmSxD|
|olcSuffix ディレクティブでは、情報を提供するドメインを指定(FQDN受け入れる)|olcSuffix: dc=example,dc=com|

man slapd.confで詳細調べること！

#LDAPサーバユーティリティ(コマンド)

```
slapacl    --- 属性の一覧へのアクセスを確認
slapadd	   --- LDIFファイルからLDAPディレクトリにエントリ追加
slapauth   --- 認証および承認パーミッションのID一覧を確認
slapcat	   --- デフォルトの形式のLDAPディレクトリからエントリを取得して、LDIF ファイルに保存
slapdn     --- 利用可能なスキーマ構文に基づいて識別名(DN)の一覧を確認
slapindex  --- 設定ファイルのインデックスオプションを変更(現在のコンテンツに基づいて再インデックス化)
slappasswd --- 暗号化されたユーザーパスワードをldapmodify or slapd設定ファイルに基づいて生成
slapschema --- データベースと対応するスキーマへの準拠を確認
slaptest   --- LDAPサーバの設定を確認
```
※オプションについては後日検索
※rootのみslapadd実行可能だが、slapdサービスはデフォルトでldapユーザーとして実行されるため、ディレクトリーサーバーは slapadd で作成されたファイルを変更することができなくなっている。この問題を修正するには、slapdadd ユーティリティーの実行後に、シェルプロンプトで以下を入力すること。

```
~]# chown -R ldap:ldap /var/lib/ldap
```

#LDAPクライアントユーティリティ(コマンド)
openldap-client パッケージには、複数のLDAP クライアントプログラムが含まれている。これらのツールを使用することで、LDAP サーバー内に存在するデータを検索、追加、修正、削除などを行うことが可能となる。

```
ldapsearch  --- データ検索許可
ldapadd     --- データ追加
ldapmodify  --- データ更新
ldapdelete  --- データ削除
ldappasswd  --- データ？LDAPユーザのパスワード変更
ldapmodrdn  --- データ名(RDN値)の変更
ldapcompare --- 指定の属性を LDAP ディレクトリーエントリーと比較

ldapexop    --- 拡張 LDAP 操作を実行
ldapurl     --- LDAP URLの作成またはコンパイルを許可
ldapwhoami  --- LDAP サーバーで whoami 操作を実行
```
※オプションについては後日検索

#ここまでの内容を実践
「ldapadd」はLDIF 形式のファイルを必要とするので、最初にLDIF ファイルを作成して、そのファイルをldapadd に渡すことでデータを登録する。

スキーマファイルの追加

```
# include	/etc/openldap/schema/samba.schema
```

ベースサフィックスの定義

```
# suffix  “dc=miraclelinux, dc=com
```

LDAPサーバー管理者の指定

```
# rootdn  “cn=Manager, dc=miraclelinux, dc=com”
```

LDAPサーバー管理者のパスワード設定

```
1) プレーンテキストではなく暗号化して発行
# /usr/sbin/slappasswd -s secret -h {MD5}
{MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
or
# ldappasswd  ---> こっちの方が一般的
{SSHA}aKOuytcI8c+O(y;
【注意】
slapasswordは単に指定した文字列をSSHAで出力してくれるだけで、どこかにそのパスワードが設定されるわけではない。単にパスワード生成ツール。ソルト付きSHAなので毎回生成される値は異なる。
2) 上記の結果をもとに、slapd.confのrootpwエントリーに追記
#olcrootPW {MD5} Xr4ilOzQ4PCOq3aQ0qbuaQ==
or
#olcrootPW {SSHA} aKOuytcI8c+O(y;
```

下記は上記までとソースページ別
詳細はこちら(https://qiita.com/leomaro7/items/f87fe43e372d48f739b7)

``` example.ldif
dn: dc=miraclelinux,dc=com
objectclass: dcObject
objectclass: organization
dc: miraclelinux
dn: cn=Manager,dc=miraclelinux,dc=com
objectclass: posixAccount
cn: Manager
uid: Manager
```

ファイルを作成したら、ldapadd でこれらのエントリを追加。

```
# /usr/bin/ldapadd -x -f example.ldif
```

#LDAPのアクセス制御
詳細はこちら(https://qiita.com/leomaro7/items/f87fe43e372d48f739b7)
アクセス制御がされていない場合は、すべてのユーザーがすべてのエントリを読み込むことができる。ただし、エントリの更新はrootdnだけが可能。

#セキュアな接続の確立
OpenLDAP スイートおよびサーバーのセキュリティーは Transport Layer Security(TLS)フレームワークを使用して保護できる。TLS は、ネットワーク上の通信セキュリティーを提供するために設計された暗号化プロトコルで、Red Hat Enterprise Linux 7 の OpenLDAP スイートは、TLS 実装として OpenSSL を使用する。
TLS を使用してセキュアな接続を確立するには、必要なサーバ証明書&クライアント証明書を取得する。
>トランスポート レイヤー セキュリティ：slapd は、TLS (または SSL) を使用して、証明書ベースの認証とデータ セキュリティ (整合性と機密性) サービスをサポートします。slapd の TLS 実装は、OpenSSL または GnuTLS ソフトウェアを利用できます。

##サーバ設定
OpenLDAPサーバの__「/etc/openldap/slapd.d/cn=config.ldif」__設定ファイルで以下のslapdグローバル設定ディレクティブを指定する。

---補足------------------------------------------------------------------
以下のディレクティブは、SSL を確立するためにも有効である。TLS ディレクティブに加えて、サーバー側で SSL 専用のポートを有効にする必要がある。通常はポート636。これを行うには、/etc/sysconfig/slapd ファイルを編集して、SLAPD_URLS ディレクティブで指定された URL 一覧に ldaps:/// 文字列を追加する。
\-----------------------------------------------------------------------

|ディレクティブ|説明|デフォルト記述例|
|::|::|::|
|olcTLSCACertificateFile|信頼されるCA証明書を含むPrivacy-enhanced mail(PEM)スキーマでエンコードされたファイルを指定|olcTLSCACertificateFile: path|
|olcTLSCACertificatePath|個別のCA証明書を含むディレクトリーへのパスを指定|olcTLSCACertificatePath: path|
|olcTLSCertificateFile|lapdサーバー証明書が含まれるファイルを指定|olcTLSCertificateFile: path|
|olcTLSCertificateKeyFile|olcTLSCertificateFileで指定されたファイルに保存されている証明書に一致する秘密鍵が含まれるファイルを指定|olcTLSCertificateKeyFile: path|

##クライアント設定
OpenLDAPクライアントの __「/etc/openldap/ldap.conf」__設定ファイルで以下のディレクティブを指定する。サーバと同じ意味合いを持つ項目が多数あるが、設定項目としては異なる名称になっているので注意！

|ディレクティブ|説明|デフォルト記述例|
|::|::|::|
|TLS_CACERT|クライアントが認識するすべての認証局の証明書が含まれるファイルを指定<br>※サーバー上の olcTLSCACertificateFile<br>|TLS_CACERT path|
|TLS_CACERTDIR|別のファイルに認証局証明書が含まれるディレクトリーへのパスを指定<br>※サーバー上の olcTLSCACertificatePath<br>|TLS_CACERTDIR directory|
|TLS_CERT|クライアント証明書を含むファイルを指定<br>※ユーザーの ~/.ldaprc ファイルでのみ指定可能<br>|TLS_CERT path|
|TLS_KEY|TLS_CERTディレクティブで指定されたファイルに保存されている証明書に一致する秘密鍵が含まれるファイルを指定<br>※サーバー上のolcTLSCertificateFile|TLS_KEY path|

#レプリケーション設定
---> ミラーリング/冗長化のため？

>レプリケーションは、ある LDAP サーバー（プロバイダー）から他のサーバーまたはクライアント（コンシューマー）に更新をコピーするプロセスです。プロバイダーはコンシューマーに対してディレクトリーの更新を複製します。受信した更新は、コンシューマーによってさらに別のサーバーに伝搬されるため、コンシューマーがプロバイダーと同時に動作します。

>レプリケーション: slapd は、ディレクトリ情報のシャドー・コピーを維持するように設定できます。このシングル・プロバイダー/マルチ・コンシューマー・レプリケーション・スキームは、単一のslapdインストールでは必要な可用性や信頼性が得られないような大容量の環境では不可欠です。また、単一障害点が許されないような非常に厳しい環境では、マルチプロバイダーレプリケーションも利用できます。マルチプロバイダーレプリケーションでは、2つ以上のノードが書き込み操作を受け付け、プロバイダーレベルでの冗長性を実現します。

#認証システム概要
auth Configuration ツール(authconfig)は、異なる ID バックエンドを設定し、システムの認証（パスワード、フィンガープリント、スマートカードなど）を指す。 
###Identity バックエンドの設定
★SSSD(Security System Services Daemon)
Microsoft Active Directory や Red Hat Enterprise Linux IdM などの複数のアイデンティティープロバイダー（主に LDAP ベースのディレクトリー）を設定する。これは、ローカルシステムとアプリケーションの両方で使用できます。パスワードとチケットがキャッシュされ、オフライン認証とシングルサインオンの両方が可能となる。
★realmdサービス
IdM の SSSD である認証バックエンドを設定できるようにするコマンドラインユーティリティー。realmd サービスは DNS レコードに基づいて利用可能な IdM ドメインを検出し、SSSD の設定を行い、システムをドメインにアカウントとして参加する。
★Name Service Switch(NSS)
ユーザー、グループ、またはホストの情報を返す低レベルのシステムコールのメカニズム。NSS は、必要な情報を取得するために使用するモジュールであるソースを決定する。たとえば、ユーザー情報は、/etc/passwd ファイルや LDAP ベースのディレクトリーなどの従来の UNIX ファイルに配置が可能。ホストアドレスは /etc/hosts ファイルや DNS レコードなどのファイルから読み込むことができる。NSS は情報の保存先を特定する。

###認証メカニズム
プラグ可能な認証モジュール(PAM)は、認証ポリシーを設定するシステムを提供する。認証に PAM を使用するアプリケーションは、さまざまな認証機能を制御するさまざまなモジュールを読み込む。アプリケーションが使用する PAM モジュールは、アプリケーションの設定方法をもとにしており、利用可能な PAM モジュールには、Kerberos、Winbind、またはローカルの UNIX ファイルベースの認証が含まれる。

##認証設定
認証は、ユーザーがシステムに識別され、検証されるプロセスである。ユーザー名とパスワードなど、一定種の ID と認証情報が必要。次に、システムは設定された認証サービスに対して認証情報を比較する。認証情報が一致して、ユーザーアカウントがアクティブである場合、ユーザーは認証される。
ユーザーが認証されると、情報はアクセス制御サービスに渡され、ユーザーが実行できる内容を決定する。これらのリソースは、ユーザーのアクセスが許可されているリソースであり、__認証と承認は別々のプロセス__であることに注意すること！
ユーザー認証を確認するには、システムには、__有効なアカウントデータベースの一覧を設定する必要__がある。ユーザーがローカルシステムにあるか、ローカルシステム（LDAP、Kerberos など）のユーザーデータベースを参照できる。ローカルシステムは、LDAP、ネットワーク情報サービス(NIS)、Winbind などのさまざまなユーザー情報に、さまざまなデータストアを使用でききる。LDAP および NIS データストアの両方で Kerberos を使用してユーザーを認証できる。 

ipa-client-installユーティリティーとrealmd システムを使用して、Identity Management マシンでシステム認証を自動的に設定していく。

★ipa-client-installユーティリティー
Identity Management ドメインに参加するようにシステムを設定する。ipa-client-installの詳細は、『Linux 『ドメインID、認証、およびポリシーガイド』を参照のこと。
※Identity Management システムでは、ipa-client-installがrealmd よりも推奨される。
★realmd
realmdシステムは、Identity Management や Active Directory ドメインなどのアイデンティティードメインに参加する。realmdの詳細は、『Windows 『』 統合ガイド』を参照のこと。

★autoconfig
"これは柔軟性を低下させるので、上記のipa-client-installかrealmdを強く推奨する"とのことなので、ここでは説明のみに留めておく。
authconfig ツールは、LDAP などのユーザー認証情報に使用するデータストアの種類の設定に役立つ。Red Hat Enterprise Linux では、authconfig には、ユーザーデータストアを設定する GUI とコマンドラインオプションの両方があります。authconfig ツールは、異なる認証メカニズム形式を使用して、ユーザーデータベースの特定のサービス（SSSD、LDAP、NIS、または Winbind）を使用するようにシステムを設定できる。
authconfig ユーティリティーは、認証設定向けに利用できます。

|ユーティリティ|説明|
|::|::|
|authconfig-gtk|完全なGUIを提供|
|authconfig|手動設定用のCLIを提供|
|authconfig-tui|テキストベースの UI を提供<br>※非推奨<br>|

###PAM認証
プラグ可能な認証モジュール(PAM)は、一元的に設定されたフレームワークに認証をリレーするために使用できる集中型認証メカニズムを提供する。PAMは、さまざまな認証ソース（Kerberos、SSSD、NIS、ローカルファイルシステムなど）用の PAM モジュールがあるためにプラグ可能。異なる認証ソースを優先することができる。
このモジュラーアーキテクチャーでは、管理者がシステムの認証ポリシーを設定する際に柔軟性をもたらす。
＜PAMの利点＞
・PAM は、多様なアプリケーションで使用できる共通の認証スキームを提供する。
・PAM は、認証における制御と多大な柔軟性をシステム管理者に提供する。
・PAM は、完全に文書化された単一ライブラリーを提供します。開発者は、独自の認証スキームを作成することなくプログラムの作成ができる。 
>---> 要は、PAMを設定しておけば様々な認証の共通の設定を指定しておけるので、後で他の認証方式を採用するとなったら便利だよー！ということ？

###Kerberos認証
LDAPの認証は Kerberos 認証方法をサポートしている。シンプルなパスワードベースの認証では、インターネットに接続されているネットワークが安全である前提で運用されるが、Kerberos はネットワーク全体で暗号化されていないパスワード送信をなくし、攻撃者がネットワークを傍受する可能性のある脅威を取り除く。それにより、ユーザーがKerberosを使用してネットワークサービスに対して認証を行うと、ネットワークトラフィックを監視してパスワードの収集を知らう不正なユーザーを効果的に阻止することが可能となる。

＜Kerberosの利点＞
・標準ポートを介した接続を許可しつつも通信にセキュリティー層を使用する。
・SSSD で認証情報キャッシュを自動的に使用する。これにより、オフラインログインが可能となる。 

####Kerberosのメカニズム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975449/a98a0a9e-d3f0-a562-2d7b-11cb7e3da225.png)

Kerberos 認証を使用するには、以下のパッケージが必要。

|パッケージ名|説明|
|::|::|
|krb5-libs||
|krb5-workstation||

#その他のslapの機能

>トポロジーコントロール：slapd は、ネットワークトポロジー情報に基づいて、ソケットレイヤーでのアクセスを制限するように設定できます。この機能は TCP ラッパーを利用します。

>アクセスコントロール： slapd は豊富で強力なアクセスコントロール機能を提供しており、データベース内の情報へのアクセスをコントロールすることができます。LDAP認証情報、IPアドレス、ドメイン名、その他の基準に基づいてエントリーへのアクセスを制御することができます。slapdは静的および動的なアクセス制御情報をサポートしています。

>複数のデータベースインスタンス: slapd は複数のデータベースを同時に提供するように設定できます。これは、単一の slapd サーバが、同じまたは異なるデータベースバックエンドを使用して、 LDAP ツリーの多くの論理的に異なる部分のリクエストに応答できることを意味します。

>汎用モジュールAPI。slapdは、LDAPクライアントとの通信プロトコルを処理するフロントエンドと、データベース操作などの特定のタスクを処理するモジュールの2つの異なる部分から構成されています。この2つの部分は、明確に定義されたC言語のAPIを介して通信するため、独自のカスタマイズされたモジュールを書いて、slapdを様々な方法で拡張することができます。また、プログラマブルなデータベースモジュールも多数用意されています。これらにより、一般的なプログラミング言語（Perl、SQL）を使用して、外部のデータソースをslapdに公開することができます。

>プロキシ・キャッシュ：slapd はキャッシュ機能を持つ LDAP プロキシ・サービスとして設定できます。