LoginSignup
1
0

自宅サーバー構築譚:LDAPサーバー OpenLDAP・SSSD を利用したログイン

Last updated at Posted at 2023-03-25

能書き

自宅サーバー構築譚:基本構想に基づく自宅サーバー構築、Ubuntu22.04LTSインストールその2の続きです。Hyper-Vに構築したクライアントマシンもどきも使用します。

OpenLDAP をインストールし、利用環境を整えています。その3回目です。

目標

OpenLDAP 関連作業初回に掲げた作業の題目を再掲します。

  1. LDAPインストール。そしてログを rsyslog に出力する設定。 ←完了
  2. LDAP over TLS を設定。そしてサーバーマシンとは別のクライアントマシンから ldaps アクセス。 ←完了
  3. クライアントマシンに sssd をインストールしてログイン。LDAP でのアカウント管理を実現。 ←イマココ
  4. SSH の公開鍵接続。公開鍵の LDAP 管理を実現。クライアントマシンから SSH 接続。

という訳で今回は SSSD をクライアントマシンにインストールし、LDAP 認証してログインするシステムを構築します。

参考文献

ユーザー登録と関連操作

スナップショット

スナップショットだいじ。超だいじ。

ソフトのインストールではないので apt と dpkg のスナップショットは撮りません。

サーバー
sudo zfs snapshot tank/ROOT/ubuntu@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_User

LDAP コマンド覚え書き

私は誰でしょう。

サーバー
$ ldapwhoami -x -H ldapi:///
anonymous

この匿名ユーザがアクセス可能な範囲で、home ドメインに登録されている情報を表示してみます。

サーバー
$ ldapsearch -x -LLL -H ldapi:/// -b dc=home
dn: dc=home
objectClass: top
objectClass: dcObject
objectClass: organization
o: infra
dc: home

前回と違って admin.home の情報が表示されません。良く分かりません。追及すると沼に嵌まりそうなので放置します。

slapcatというコマンドもありますが、こちらは root ユーザーでないと権限が足りないようです。

サーバー
$ slapcat
ldif_read_file: Permission denied for "/etc/ldap/slapd.d/cn=config.ldif"
slapcat: bad configuration file!
$ sudo slapcat
dn: dc=home
objectClass: top
objectClass: dcObject
objectClass: organization
o: infra
dc: home
structuralObjectClass: organization
entryUUID: f40e786e-5a79-103d-9bd7-dff321dcfef9
creatorsName: cn=admin,dc=home
createTimestamp: 20230319081528Z
entryCSN: 20230319081528.648097Z#000000#000#000000
modifiersName: cn=admin,dc=home
modifyTimestamp: 20230319081528Z

インストール時に設定したユーザ admin.home でバインドする事も出来るようです。当然パスワード入力を求められますが。

サーバー
$ ldapwhoami -Y EXTERNAL -H ldapi:/// -Q -D cn=admin,dc=home -W
Enter LDAP Password:
dn:gidNumber=1000+uidNumber=1000,cn=peercred,cn=external,cn=auth

admin.home のパスワードは下記コマンドで変更できる(cn=configの rootDN とは別)筈ですが、なぜか失敗しますな。

サーバー
$ ldappasswd -x -D cn=admin,dc=home -W -S -H ldapi:///
New password:
Re-enter new password:
Enter LDAP Password:
Result: No such object (32)

これ以上の詳細は私も良く分かりません。色々と勉強が進んだらまた少し書き足すかも知れませんが、今はこの辺で勘弁して下さい。

ユーザー登録の準備

ldif ファイルは/opt/ldapディレクトリに保管する事にします。

基本となる組織単位を登録します。

サーバー
cat <<___ | sudo tee /opt/ldap/base.ldif >/dev/null
dn: ou=people,dc=home
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=home
objectClass: organizationalUnit
ou: groups 
___
サーバー
ldapadd -x -D cn=admin,dc=home -W -f /opt/ldap/base.ldif -H ldapi:///

ユーザー登録

例えばアカウント名を taro、姓を familyname、パスワードを適当に生成した8文字 Ma9H%6jg とする場合。姓を指定するのは、それが必須属性だからです。

更に uid と gid を決めます。uid と gid は指定しないといけないようですな。不便。

2023.07.05.追記:
電子メールアドレスは必須ではありません。登録しないならば下記のmail:行は不要です。登録するならば、EMAILとして正しい電子メールアドレスを設定して下さい。

サーバー
ACCOUNT=taro
SURNAME=familyname
PASSWORD=Ma9H%6jg
USERID=10000
GROUPID=10000
EMAIL=taro@example.com
サーバー
cat <<___ | sudo tee /opt/ldap/user_$ACCOUNT.ldif >/dev/null
dn: uid=$ACCOUNT,ou=people,dc=home
objectClass: inetOrgPerson
objectClass: posixAccount
sn: $SURNAME
uid: $ACCOUNT
cn: $ACCOUNT
uidNumber: $USERID
gidNumber: $GROUPID
homeDirectory: /home/$ACCOUNT
loginShell: /bin/bash
userPassword: $(slappasswd -T <(echo -n $PASSWORD))
mail: $EMAIL

dn: cn=$ACCOUNT,ou=groups,dc=home
objectClass: posixGroup
cn: $ACCOUNT
gidNumber: $GROUPID

___

ldif ファイルを作成したら、ユーザー(及びプライマリグループ)は下記コマンドで追加します。

サーバー
ldapadd -x -D cn=admin,dc=home -W -f /opt/ldap/user_$ACCOUNT.ldif -H ldapi:///

ユーザーとグループが追加された事を確認します。

サーバー
cat <(ldapsearch -x -LLL -H ldapi:/// -b uid=$ACCOUNT,ou=people,dc=home) <(ldapsearch -x -LLL -H ldapi:/// -b cn=$ACCOUNT,ou=groups,dc=home) | diff -s -U0 /opt/ldap/user_$ACCOUNT.ldif -

実行結果は下記。パスワードのみ取得できず、それが差分となって現れます。

サーバー
$ cat <(ldapsearch -x -LLL -H ldapi:/// -b uid=$ACCOUNT,ou=people,dc=home) <(ldapsearch -x -LLL -H ldapi:/// -b cn=$ACCOUNT,ou=groups,dc=home) | diff -s -U0 /opt/ldap/user_$ACCOUNT.ldif -
--- /opt/ldap/user_taro.ldif    2023-03-25 14:16:31.880164480 +0900
+++ -   2023-03-25 14:17:04.849034647 +0900
@@ -11 +10,0 @@
-userPassword: {SSHA}PjZ+X9FChA3auz6tLC5RJvnuxmmwBn2f

差分が現れるのを嫌うなら、こんなコマンドで。

サーバー
cat <(ldapsearch -x -LLL -H ldapi:/// -b uid=$ACCOUNT,ou=people,dc=home) <(ldapsearch -x -LLL -H ldapi:/// -b cn=$ACCOUNT,ou=groups,dc=home) | diff -s -U0 -L user_$ACCOUNT.ldif <(grep -v ^userPassword: /opt/ldap/user_$ACCOUNT.ldif) -

綺麗に一致します。

サーバー
$ cat <(ldapsearch -x -LLL -H ldapi:/// -b uid=$ACCOUNT,ou=people,dc=home) <(ldapsearch -x -LLL -H ldapi:/// -b cn=$ACCOUNT,ou=groups,dc=home) | diff -s -U0 -L user_$ACCOUNT.ldif <(grep -v ^userPassword: /opt/ldap/user_$ACCOUNT.ldif) -
Files user_taro.ldif and - are identical

ユーザー登録内容の変更

例えば taro のログインシェルを/bin/shに、ホームディレクトリを/home/everyoneに変更したい場合。

サーバー
cat <<___ | sudo tee /opt/ldap/user_taro_01.ldif >/dev/null
dn: uid=taro,ou=people,dc=home
changetype: modify
replace: loginShell
loginShell: /bin/sh
-
replace: homeDirectory
homeDirectory: /home/everyone
___
サーバー
ldapmodify -x -D cn=admin,dc=home -W -f /opt/ldap/user_taro_01.ldif -H ldapi:///

確認。変更点、及び出力されない userPassword が差分として出てきます。

サーバー
$ cat <(ldapsearch -x -LLL -H ldapi:/// -b uid=$ACCOUNT,ou=people,dc=home) <(ldapsearch -x -LLL -H ldapi:/// -b cn=$ACCOUNT,ou=groups,dc=home) | diff -s -U0 /opt/ldap/user_$ACCOUNT.ldif -
--- /opt/ldap/user_taro.ldif    2023-03-25 14:16:31.880164480 +0900
+++ -   2023-03-25 14:28:00.450036074 +0900
@@ -9,3 +9,2 @@
-homeDirectory: /home/taro
-loginShell: /bin/bash
-userPassword: {SSHA}PjZ+X9FChA3auz6tLC5RJvnuxmmwBn2f
+loginShell: /bin/sh
+homeDirectory: /home/everyone

ユーザー削除

ユーザー taro を削除する場合は下記コマンドを実行します。

サーバー
ldapdelete -x -D cn=admin,dc=home -W uid=taro,ou=people,dc=home -H ldapi:///

プライマリグループも明示的に削除する必要があります。

サーバー
ldapdelete -x -D cn=admin,dc=home -W cn=taro,ou=groups,dc=home -H ldapi:///

ldapmodifyコマンドで削除する方法もあるようですが、そちらは必要ならば調べて下さい。

SSSD インストールと設定

スナップショット

クライアントマシンでもスナップショットだいじ。超だいじ。

クライアント
sudo zfs snapshot tank/ROOT/ubuntu@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_User
sudo zfs snapshot tank/ROOT/ubuntu/var/lib/apt@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_User
sudo zfs snapshot tank/ROOT/ubuntu/var/lib/dpkg@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_User

インストール

クライアントマシンに関連パッケージをインストールします。

クライアント
sudo apt install -y sssd-ldap

/etcは下記のように変化しました。

クライアント
$ sudo svn st /etc
?       /etc/apparmor.d/force-complain/usr.sbin.sssd
?       /etc/apparmor.d/local/usr.sbin.sssd
?       /etc/apparmor.d/usr.sbin.sssd
?       /etc/cracklib
?       /etc/cron.daily/cracklib-runtime
?       /etc/default/sssd
M       /etc/group
M       /etc/gshadow
?       /etc/init.d/sssd
M       /etc/ld.so.cache
?       /etc/logcheck/ignore.d.paranoid
?       /etc/logrotate.d/sssd-common
M       /etc/nsswitch.conf
M       /etc/pam.d/common-account
M       /etc/pam.d/common-auth
M       /etc/pam.d/common-password
M       /etc/pam.d/common-session
?       /etc/pam.d/sssd-shadowutils
M       /etc/passwd
?       /etc/rc0.d/K01sssd
?       /etc/rc1.d/K01sssd
?       /etc/rc2.d/S01sssd
?       /etc/rc3.d/S01sssd
?       /etc/rc4.d/S01sssd
?       /etc/rc5.d/S01sssd
?       /etc/rc6.d/K01sssd
?       /etc/security/pwquality.conf
M       /etc/shadow
?       /etc/sssd
?       /etc/systemd/system/multi-user.target.wants/sssd.service
?       /etc/systemd/system/sssd.service.wants

AppArmor は、Linux のセキュリティモジュールですな。それが設定されたのだと思われます。

CrackLib はパスワードを強力にするモジュールだそうです。ごく普通の単語を選ばないようにするとか。

passwd と shadow と group と gshadow は、SSSD 用の新しいユーザー追加の影響ですね。差分は次のようになります。

クライアント
$ sudo svn di --diff-cmd diff -x -U0 /etc/passwd /etc/shadow /etc/group /etc/gshadow
Index: /etc/passwd
===================================================================
--- /etc/passwd (リビジョン 1)
+++ /etc/passwd (作業コピー)
@@ -41,0 +42 @@
+sssd:x:122:131:SSSD system user,,,:/var/lib/sss:/usr/sbin/nologin
Index: /etc/shadow
===================================================================
--- /etc/shadow (リビジョン 1)
+++ /etc/shadow (作業コピー)
@@ -41,0 +42 @@
+sssd:*:19441:0:99999:7:::
Index: /etc/group
===================================================================
--- /etc/group  (リビジョン 1)
+++ /etc/group  (作業コピー)
@@ -70,0 +71 @@
+sssd:x:131:
Index: /etc/gshadow
===================================================================
--- /etc/gshadow        (リビジョン 1)
+++ /etc/gshadow        (作業コピー)
@@ -70,0 +71 @@
+sssd:!::

ld.so.cache は、まあ、いつもの差分ですな。

Logcheck はサーバーログの監視ソフトだそうです。 syslog の出力するログファイルなどを監視していて、問題があれば通知してくれるようなシステムだとか。これは良いかも。色々と区切りが付いたら勉強してみましょう。

nsswitch.confは、色んな参考文献を読むと書かれている、nsswitchへの追記のようです。今の Ubuntu22.04LTS では SSSD のインストール時に勝手に追記してくれるようです。

クライアント
$ sudo svn di --diff-cmd diff -x -U0 /etc/nsswitch.conf
Index: /etc/nsswitch.conf
===================================================================
--- /etc/nsswitch.conf  (リビジョン 1)
+++ /etc/nsswitch.conf  (作業コピー)
@@ -7,3 +7,3 @@
-passwd:         files systemd
-group:          files systemd
-shadow:         files
+passwd:         files systemd sss
+group:          files systemd sss
+shadow:         files sss
@@ -16 +16 @@
-services:       db files
+services:       db files sss
@@ -20 +20,2 @@
-netgroup:       nis
+netgroup:       nis sss
+automount:      sss

common-* 系ファイル4つも同じでしょうか。以下のような差分になっています。

クライアント
sudo svn di --diff-cmd diff -x -U0 /etc/pam.d/common-account /etc/pam.d/common-auth /etc/pam.d/common-password /etc/pam.d/common-session
Index: /etc/pam.d/common-account
===================================================================
--- /etc/pam.d/common-account   (リビジョン 1)
+++ /etc/pam.d/common-account   (作業コピー)
@@ -24,0 +25,2 @@
+account        sufficient                      pam_localuser.so
+account        [default=bad success=ok user_unknown=ignore]    pam_sss.so
Index: /etc/pam.d/common-auth
===================================================================
--- /etc/pam.d/common-auth      (リビジョン 1)
+++ /etc/pam.d/common-auth      (作業コピー)
@@ -17 +17,2 @@
-auth   [success=1 default=ignore]     pam_unix.so nullok
+auth   [success=2 default=ignore]     pam_unix.so nullok
+auth   [success=1 default=ignore]     pam_sss.so use_first_pass
Index: /etc/pam.d/common-password
===================================================================
--- /etc/pam.d/common-password  (リビジョン 1)
+++ /etc/pam.d/common-password  (作業コピー)
@@ -25 +25,3 @@
-password       [success=1 default=ignore]     pam_unix.so obscure yescrypt
+password       requisite                      pam_pwquality.so retry=3
+password       [success=2 default=ignore]     pam_unix.so obscure use_authtok try_first_pass yescrypt
+password       sufficient                     pam_unix.so use_authtok
Index: /etc/pam.d/common-session
===================================================================
--- /etc/pam.d/common-session   (リビジョン 1)
+++ /etc/pam.d/common-session   (作業コピー)
@@ -28,0 +29 @@
+session        optional                       pam_sss.so

/etc/rc?.d/の一連の追加も、いつもの変化ですな。

pwquality.confは、パスワードポリシーの設定だそうです。

これ以外は SSSD の設定ファイル達、だと思います。

取り敢えず Subversion 登録。

クライアント
sudo svn st /etc | grep "^?" | cut -b9- | xargs -I{} sudo find {} -type f -or -type d -or -type l | xargs -t sudo svn add
sudo svn ci /etc -m"SSSD initial settings"

初期設定

/etc/sssd/sssd.confを作成し、パーミッションを 0600、所有権を root:root にします。
なお LDAP サーバー は secondary.home とします。

クライアント
cat <<___ | sudo tee /etc/sssd/sssd.conf >/dev/null
[sssd]
config_file_version = 2
domains = home

[domain/home]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldaps://secondary.home
cache_credentials = True
ldap_search_base = dc=home
___
クライアント
sudo chmod 600 /etc/sssd/sssd.conf

この後に SSSD サービスを開始する事を忘れないように。

クライアント
sudo systemctl start sssd

起動を確認します。

クライアント
systemctl status sssd

最後に、ホームディレクトリの自動作成を有効にします。

クライアント
sudo pam-auth-update --enable mkhomedir

動作確認

前述の LDAP へのユーザー登録手順に従い、ユーザー taro をパスワード Ma9H%6jg で登録しておきます。

まずはその taro を認識している事を、下記コマンドで確認します。

クライアント
getent passwd taro
id taro

成功すれば下記のような結果になります。ちなみにコマンドが終了するまで数秒待たされます。2回目以降は一瞬ですが。

クライアント
$ getent passwd taro
taro:*:10000:10000:taro:/home/taro:/bin/bash
$ id taro
uid=10000(taro) gid=10000(taro) groups=10000(taro)

コンソールで認証してみます。

クライアント
sudo login

案外あっさり成功しました。もっとトラブルが発生するかと思ったんですが、良かった良かった。

これが成功したら、クライアントから一度ログアウトして、GUI でログインしてみましょう。と思ったんですが、これが上手くいきません。

Lubuntu でのログイン画面は、なぜか、ユーザー名を入力できません。既に存在する(恐らくは/etc/passwdかどこかから持ってきた)ユーザーが表示されていて、それしか選択できません。

困りました。これ、セキュリティ的にも問題だと思うんですけどね。ユーザー名を絞り込めるという意味で。どうしてこんな仕様になっているのでしょう。

差し当たって Lubuntu ではここまで、になります。仕方が無いので Xubuntu に乗り換えますか。それはまた後日。

ともあれ、SSSD を利用したログインの設定が(恐らくは)出来た、という事で。マシンを新規追加してもユーザー登録する必要は無くなりました。やったね:thumbsup_tone1:

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0