(ヽ´ω`) < OpenLDAP + SSSDでLinuxログインアカウント一元管理がさっぱりわからん - 1. OpenLDAP初期設定 -
(ヽ´ω`) < ログインアカウント一元管理したいよね、公開鍵で
多分Linuxのアカウントを一元管理したい、あるいはできるようにしろと上から命令されてググってみたけど古い情報も多くて涙目の人に送る。
何回かのエントリに分けて投稿するが、最終的にこんな感じのことができるようになる想定。
- 複数台のLinuxサーバに対して、それぞれユーザを作成しなくてもログインが可能になる
- ログイン情報はOpenLDAPで一元管理
- ユーザの所属グループも
- 各サーバのsudoersも
- もう今更パスワード認証にも戻れないので公開鍵認証でお願いします
(ヽ´ω`) < まずはOpenLDAP側の設定について
実際に設定するにはSSSDやらNSSやらPAMやらといろいろと設定が必要になるのだが、それは後回しにしておいてOpenLDAP側の設定。
OSはみんな大好きAmazon Linux2で。多分、CentOS7までならほとんど一緒なはず。8からは389 Directory Serverに置き換えられてるかも。
(ヽ´ω`) < インストール
サーバの設定を流し込んだり確認するのに ldap***
系のコマンドを使用するので、 openldap-clients
もインストールしておく。
# yum install openldap-servers openldap-clients
(ヽ´ω`) < 管理者ユーザのパスワード作成とルートサフィックス変更
下記の記事でも書いたのだが、ちょっと前のバージョンまでは /etc/openldap/slapd.conf
に設定を記載する素直な子だったのだが、2.3以降では ldifファイルからデータを読み込ませる方式に変わってしまった。
slapd.conf
による設定も完全に無効というわけではなく、推奨しないながらも可能なようなので、ディストリビューションによっては slapd.conf
が残されているようだが、Amazon Linux2では消えているようだ。
インストール直後のデフォルト設定から、自分の環境に合わせた内容に変更。
と簡単に言ってしまったが、そもそもOpenLDAPなんてよくわからんという人が多いと思うので、一旦は小難しいことは置いておいて、
tsugihagi.local
というグループのようなものを作る(デフォルトではmy-domain.comに設定されている)- 管理者はManagerという名前(これはデフォルトと同じ)
という設定を行う。
まずはパスワード作成 slappasswd
コマンドでパスワードを生成してメモしておく。
# slappasswd New password: (パスワードを入力) Re-enter new password: (パスワードを再入力) {SSHA}SFlHUkAMFkH6xUPA61IEqDnTY2lN2YwF (ここでは hogehoge というパスワード設定)
次にルートサフィックスを dc=tusgihagi, dc=local
、管理者を cn=Manager,dc=tsugiahgi,dc=local
としたLDIFファイルを作成。
# 下記内容をinit.ldifという名前で保存 dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=tsugihagi,dc=local dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=Manager,dc=tsugihagi,dc=local dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}SFlHUkAMFkH6xUPA61IEqDnTY2lN2YwF
作成した init.ldif
を流し込む。(デフォルトでローカルのrootユーザは各Backendに対して書き込みが可能)
# ldapmodify -Y EXTERNAL -H ldapi:/// -f init.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" modifying entry "olcDatabase={2}hdb,cn=config" modifying entry "olcDatabase={2}hdb,cn=config"
(ヽ´ω`) < スキーマ追加
インストール直後の状態では、Linuxのユーザ情報を保持するためのスキーマ情報が読み込まれていないので、手動で読み込んでやる必要がある。
基本的なスキーマファイルは /etc/openldap/schema
ディレクトリに存在するのだが、今回はさらに
- sudo権限を管理するためのオブジェクト用スキーマ
- 公開鍵認証のための属性用スキーマ
が必要となる。
cosine, inetorgperson, nisスキーマのインストール
基本的なスキーマファイルは /etc/openldap/schema
ディレクトリ以下に揃っているので、下記の通り ldapadd
で追加してやる。
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
sudo用スキーマのインストール
ありがたいことにスキーマファイルからLDIFに変換されたものがGithub上に存在するのでそちらを使わせてもらう。
# curl -L https://raw.githubusercontent.com/Lullabot/openldap-schema/master/sudo.ldif -o /etc/openldap/schema/sudo.ldif
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/sudo.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=sudo,cn=schema,cn=config"
ちなみにsudo用のスキーマは sudo
パッケージに付属している。
下記のスキーマは OpenLDAP 用の形式になっており、 sudo のソースやバイナリの配布には schema.OpenLDAP として収録されている。その schema.OpenLDAP ファイルをスキーマ・ディレクトリ (たとえば /etc/openldap/schema) にそのままコピーし、適切な include 行を slapd.conf に追加して、 slapd をリスタートすればよい。
## バージョンが違うかもしれないのでそれぞれの環境で場所チェック # rpm -ql sudo | grep schema.OpenLDAP /usr/share/doc/sudo-1.8.23/schema.OpenLDAP
すでに説明したとおり slapd.conf
は存在せず、ldifファイルをschemaファイルから変換しなくてはいけないので、今回はそのままダウンロードして楽をさせてもらった。
公開鍵認証用スキーマのインストール
公開鍵認証に必要な openssh-lpk-openldap.ldif
は openssh-ldap
パッケージに付属している。
yum install openssh-ldap rpm -ql openssh-ldap | grep openssh-lpk-openldap.ldif cp /usr/share/doc/openssh-ldap-7.4p1/openssh-lpk-openldap.ldif /etc/openldap/schema
パッケージがインストールできたら流し込み。
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openssh-lpk-openldap.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=openssh-lpk,cn=schema,cn=config"
これにてOpenLDAPの初期設定は完了。
ぶっちゃけそんなに大したことはやってなくて、スキーマの追加が少し特殊なぐらい。