DebianとOpenLDAPとSSSD(sudo・ldaps)

Linux

はじめに

管理するサーバが多くなってくるとユーザ管理の手間が増えます。
3台以上は管理コストが無視できなくなったので、OpenLDAPを導入して設定することにしました。
OpenLDAPとの連携にSSSDを使い、sudoとLDAPS(LDAP over SSL/TLS)を使えるようにします。

環境

Debian bullseye 64bit
OpenLDAP(slapd) 2.4.57
SSSD 2.4.1-2

Tree構成は以下の通りです。

nd
 ┣ -- user
      ┣ -- testuser

 ┣ -- group
      ┣ -- testgroup

 ┣ -- SUDOers
      ┣ -- defaults
      ┣ -- testuser

 ┣ -- policies
      ┣ -- defaults

サーバの設定

OpenLDAPをインストールして、管理者パスワードとドメイン構成要素(dc)を設定します。
今回はドメイン構成要素を簡単にするためにndにしています。
また、簡単な追加や修正はldapviを使います。
ldapviについては「debianmeetingresume201303.pdf」が参考になるのでググってください。

sudo apt install slapd ldap-utils ldapvi

再設定する場合は、以下のコマンドを実行します。

sudo dpkg-reconfigure slapd

ldapviで呼び出すデフォルトのエディタをviに変更します。

update-alternatives --config editor

設定の確認や細かな修正はldapviで行います。
ldapviで更新すると即時反映されるのでslapdの再起動が不要です。

sudo ldapvi -Y EXTERNAL -h ldapi:/// -b cn=config

アクセス権の設定

Debianの場合、管理者adminが設定されています。
このadminとテストユーザのアクセス権などを設定します。
ldapviで編集後にwqで終了してから「y」を選択すると保存して終了します。
その他には「e」でエディタに戻る、「q」でキャンセルなどがあります。
今回は「debianmeetingresume201303.pdf」と同様に以下のポリシーで設定します。
・パスワード以外のデータ参照はanonymousで可能
・データの更新はrootDNのみ行える
・パスワードのみ自身で変更可能

sudo ldapvi -Y EXTERNAL -h ldapi:/// -b cn=config

viで編集するので「Shift + g」で最下行まで移動します。
「11 olcDatabase={1}mdb,cn=config」の項目に「olcAccess」があるので、以下のように修正します。

olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,dc=nd" write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=nd" write by * read
olcAccess: {3}to dn.subtree="dc=nd" by self read by * read
olcAccess: {4}to * by * none

設定を確認します。
このコマンドではldapsearchを実行しなくても、全ての設定を確認することができます。

sudo slapcat

Schemaの登録

インストール時のデフォルトは以下です。

'cn={0}core.ldif'  'cn={1}cosine.ldif'  'cn={2}nis.ldif'  'cn={3}inetorgperson.ldif'

パスワードのSchemaを登録します。

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/ppolicy.ldif

設定を確認します。

sudo ls /etc/ldap/slapd.d/cn\=config/cn\=schema/
以下、結果。
'cn={0}core.ldif'    'cn={2}nis.ldif'            'cn={4}ppolicy.ldif'
'cn={1}cosine.ldif'  'cn={3}inetorgperson.ldif'

ouの追加

user、group、policiesを追加します。
policiesはパスワードのポリシーのことです。

sudo mkdir /etc/ldap/myldif
cd /etc/ldap/myldif
sudo vi /etc/ldap/myldif/init.ldif
    dn: ou=user,dc=nd
    objectClass: organizationalUnit
    ou: user

    dn: ou=group,dc=nd
    objectClass: organizationalUnit
    ou: group

    dn: ou=policies,dc=nd
    objectClass: top
    objectClass: organizationalUnit
    ou: policies

反映させます。

    sudo ldapadd -x -D cn=admin,dc=nd -W -f init.ldif

確認します。

    ldapsearch -x -LLL -b "dc=nd" "(objectClass=*)"

cnの追加

テスト用のユーザとグループを追加します。
初めにユーザのパスワードを生成し、「testuser-add.ldif」のuserPasswordの項目に貼り付けます。

slappasswd

設定ファイルを作成します。

sudo vi /etc/ldap/myldif/testgroup-add.ldif
    dn: cn=testgroup,ou=group,dc=nd
    objectClass: posixGroup
    cn: testgroup
    gidNumber: 10000
    memberUid: testuser

sudo vi /etc/ldap/myldif/testuser-add.ldif
    dn: uid=testuser,ou=user,dc=nd
    objectClass: inetOrgPerson
    objectClass: posixAccount
    objectClass: shadowAccount
    cn: myoji
    sn: namae
    userPassword: {SSHA}xi/hSH/NC2tfbmtmtuHjlyDPL290PG
    loginShell: /bin/bash
    uidNumber: 10000
    gidNumber: 10000
    homeDirectory: /home/testuser

反映させます。

sudo ldapadd -x -D cn=admin,dc=nd -W -f testgroup-add.ldif
sudo ldapadd -x -D cn=admin,dc=nd -W -f testuser-add.ldif

ユーザの編集は以下のように行います。

sudo ldapvi -Y EXTERNAL -h ldapi:/// -D cn=admin,dc=nd -b ou=user,dc=nd

グループの編集は以下のように行います。

sudo ldapvi -Y EXTERNAL -h ldapi:/// -D cn=admin,dc=nd -b ou=group,dc=nd

ユーザが所属しているグループや登録済みのグループを表示して確認します。

id testuser
groups testuser
getent group

ユーザのパスワード変更

ldapviで行えば簡単ですが、以下のコマンドでも可能です。
「-W」オプションで管理者のパスワードの入力待ちになります。
管理者がユーザのパスワード変更する場合は下記となります。

sudo ldappasswd -x -h localhost -D "cn=admin,dc=nd" -S -W "uid=testuser,ou=user,dc=nd"

ユーザがログイン先で自分で変更する場合です。
最後に尋ねられる「Enter LDAP Password:」は、現在のパスワードを入力します。
「192.168.10.11」はLDAPサーバのIPアドレスです。

ldappasswd -x -h 192.168.10.11 -D "uid=testuser,ou=user,dc=nd" -S -W "uid=testuser,ou=user,dc=nd"

パスワードのポリシー設定

最小文字数や有効期限などを設定します。
はじめにモジュールを登録して反映させます。

sudo vi /etc/ldap/myldif/ppolicy-module.ldif
    dn: cn=module{0},cn=config
    changeType: modify
    add: olcModuleLoad
    olcModuleLoad: ppolicy.la

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f ppolicy-module.ldif

確認します。

sudo slapcat -n 0 | grep -i module

ouを登録して反映させます。

sudo vi /etc/ldap/myldif/ppolicy_ou.ldif
    dn: ou=pwpolicy,dc=nd
    objectClass: organizationalUnit
    objectClass: top
    ou: pwpolicy

sudo ldapadd -x -D cn=admin,dc=nd -W -f ppolicy_ou.ldif

オーバーレイを登録して反映させます。

sudo vi /etc/ldap/myldif/ppolicy_overlay.ldif
    dn: olcOverlay=ppolicy,olcDatabase={1}mdb,cn=config
    objectClass: olcOverlayConfig
    objectClass: olcPPolicyConfig
    olcOverlay: ppolicy
    olcPPolicyDefault: cn=default,ou=pwpolicy,dc=nd
    olcPPolicyHashCleartext: TRUE

sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config olcDatabase | grep mdb
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f ppolicy_overlay.ldif

ポリシーを登録して反映させます。
各パラメータの詳細はググってください。

sudo vi /etc/ldap/myldif/ppolicy_ldif.ldif
    dn: cn=default,ou=pwpolicy,dc=nd
    objectClass: top
    objectClass: inetOrgPerson
    objectClass: pwdPolicyChecker
    objectClass: pwdPolicy
    cn: pwpolicy
    sn: pwpolicy
    pwdAttribute: userPassword
    pwdMaxFailure: 10
    pwdMustChange: FALSE
    pwdMinLength: 10
    pwdInHistory: 1
    pwdCheckQuality: 1
    pwdReset: FALSE
    pwdLockoutDuration: 60
    pwdGraceAuthNLimit: 10

sudo  ldapadd -x -D cn=admin,dc=nd -W -f ppolicy_ldif.ldif

または

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f ppolicy_ldif.ldif

確認します。

sudo ldapsearch -x -LLL -H ldap:/// -D cn=admin,dc=nd -W -b dc=nd "(objectClass=pwdPolicy)"

sudoの設定

sudoをOpenLDAPで管理するために設定を行います。
sudoのschemaはsudo-ldapパッケージに含まれているので、クライアントでインストールしてからサーバに持ってきます。
該当ファイルは「/usr/share/doc/sudo-ldap/schema.olcSudo」になります。

sudo cp ~/schema.olcSudo /etc/ldap/myldif/
cd /etc/ldap/myldif

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f schema.olcSudo

確認します。

sudo ls /etc/ldap/slapd.d/cn\=config/cn\=schema/

ouを登録して反映させます。

sudo vi /etc/ldap/myldif/sudo_ou.ldif
    dn: ou=SUDOers,dc=nd
    objectClass: top
    objectClass: organizationalUnit
    ou: SUDOers

sudo ldapadd -x -D cn=admin,dc=nd -W -f sudo_ou.ldif

cnを登録して反映させます。

sudo vi /etc/ldap/myldif/sudo_ldif.ldif
    dn: cn=defaults,ou=SUDOers,dc=nd
    objectClass: top
    objectClass: sudoRole
    cn: defaults
    sudoOption: env_keep+=SSH_AUTH_SOCK

sudo ldapadd -x -D cn=admin,dc=nd -W -f sudo_ldif.ldif

ldapviでユーザとグループを登録します。
全てのホストで全ての操作を許可する設定です。

sudo ldapvi -h ldap://localhost -D cn=admin,dc=nd -b ou=SUDOers,dc=nd

add cn=testuser,ou=SUDOers,dc=nd
objectClass: top
objectClass: sudoRole
cn: testuser
sudoUser: testuser
sudoHost: ALL
sudoCommand: ALL

add cn=%testgroup,ou=SUDOers,dc=nd
objectClass: top
objectClass: sudoRole
cn: %testgroup
sudoUser: %testgroup
sudoHost: ALL
sudoCommand: ALL

自己証明書の作成

LDAPSで使う自己証明書を作成します。
はじめに秘密キーを作成します。

su -
cd /etc/ssl/private
openssl genrsa -aes256 -out server.key 2048
openssl rsa -in server.key -out server.key

証明書リクエストを発行します。

openssl req -new -days 36500 -key server.key -out server.csr 

CA証明書と対応するキーとファイルで証明書リクエストに署名してサーバーの証明書を生成します。

openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 36500
cp /etc/ssl/private/server.key /etc/ssl/private/server.crt /etc/ssl/certs/ca-certificates.crt /etc/ldap/sasl2/
cd /etc/ldap/sasl2
chown openldap.openldap server.crt server.key ca-certificates.crt
chown openldap. /etc/ldap/sasl2/server.key /etc/ldap/sasl2/server.crt /etc/ldap/sasl2/ca-certificates.crt 

ファイルのオーナーとパーミッションに注意します。

-rw-r--r-- 1 openldap openldap 200313  1月 1 14:51 ca-certificates.crt
-rw-r--r-- 1 openldap openldap   1318  1月 1 14:51 server.crt
-rw------- 1 openldap openldap   1679  1月 1 14:51 server.key

ldifファイルを作成します。(ハイフンは必要です。)

cd /etc/ldap/myldif
sudo vi mod_ssl.ldif
dn: cn=config
changetype: modifyll 
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ldap/sasl2/server.crt
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/sasl2/server.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/sasl2/server.key

登録します。

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f mod_ssl.ldif

SSL対応のためにプロトコルを追加します。

sudo vi /etc/default/slapd
    SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"

sudo systemctl restart slapd

ポートはldap:389、ldaps:636になります。
それぞれポートが開いているか確認します。

ss -nl | egrep '389|636'

接続テストを行います。

ldapsearch -x -LLL -b "dc=nd" "(objectClass=*)" -W -H ldaps:///

Teratermや他の端末からクライアントにログインする過程をtcpdumpで閲覧します。
クライアントの/etc/sssd/sssd.confで「ldap_id_use_start_tls = true」の場合、ldaps(ポート686)を使います。
サーバでコマンドを実行して、ldap_id_use_start_tlsがtrueのときは686ポート、falseのときは389ポートでdumpが取れます。
また、686ポートでは暗号化されているのでdumpで取得したデータは判別できません。

sudo apt install tcpdump

ldapの場合
    sudo tcpdump -s0 -A -i any port 389

LDAPSの場合
    sudo tcpdump -s0 -A -i any port 636

マルチマスターの設定

冗長な構成にするために2台のOpenLDAPサーバで構成します。
マルチマスターにすることで、どのサーバで情報を更新しても全てのサーバに反映されます。
クライアントのSSSDでは、設定した複数のサーバを参照するように設定します。
全てのサーバでデータ以外の設定を同様に行います。
SSLの自己証明書(3個のファイル)は1代目のマスターからコピーします。(オーナーとパーミッションに注意。)

cd /etc/ldap/myldif

sudo vi syncprov_add.ldif
    dn: cn=module,cn=config
    objectClass: olcModuleList
    cn: module
    olcModulePath: /usr/lib/ldap
    olcModuleLoad: syncprov.la

sudo vi syncprov_overlay.ldif
    dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config
    objectClass: olcOverlayConfig
    objectClass: olcSyncProvConfig
    olcOverlay: syncprov
    olcSpSessionLog: 100

設定を反映させます。

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov_add.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov_overlay.ldif

他のサーバを参照するための設定ファイルです。

sudo vi master.ldif

providerからintervalまでの項目は行の先頭に半角スペースを2個挿入します。
Master01は「192.168.10.100」、Master02は「192.168.10.200」とします。
下記はMaster01の設定です。
Master02では「olcServerID」、「olcSyncRepl」、「provider」だけが異なります。
SSLで通信させようと思い「provider=ldaps://192.168.10.100:639/」と指定しましたが、私の環境ではできませんでした。
「man slapd-config」を参照。

dn: cn=config
changetype: modify
replace: olcServerID
# Master01の識別子。
# Master02の設定ファイルでは「002」とする。
olcServerID: 001

dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcSyncRepl
# Master01の識別子。
# Master02の設定ファイルでは「002」と指定する。
olcSyncRepl: rid=001
  # Master02のアドレス。
  # Master02の設定ファイルでは「ldap://192.168.10.100/ 」と指定する。
  provider=ldap://192.168.10.200/
  bindmethod=simple
  binddn="cn=admin,dc=nd"
  credentials=adminの平文パスワード
  # クライアントの/etc/sssd/sssd.confにある「ldap_search_base」の値と揃える。
  searchbase="dc=nd"
  scope=sub
  schemachecking=on
  type=refreshAndPersist
  retry="30 3 300 3"
  interval=00:00:05:00
-
add: olcMirrorMode
olcMirrorMode: TRUE

dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov

設定を反映させます。
片側でデータを追加、修正、削除を行うと他方に反映されます。

Master01側
    cd /etc/ldap/myldif
    sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f master01.ldif
    sudo systemctl restart slapd

Master02側
    cd /etc/ldap/myldif
    sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f master02.ldif 
    sudo systemctl restart slapd

SSSDのキャッシュ削除(クライアント側)

新規にユーザやグループを追加して、クライアント(SSSD)で正しく登録されたかを確認するときに、キャッシュが残っていると邪魔になるので削除します。
sudo認証はLDAPで管理しているためsssdを停止するとsudoできないのでsuして行います。

su
systemctl stop sssd
rm /var/lib/sss/db/*.ldb
systemctl restart sssd
ユーザーレコードの削除
     sudo sss_cache -u testuser

グループレコードの削除
     sudo sss_cache -g testgroup

確認
    id testuser
    group testuser
    getent group

SambaとOpenLDAPの連携

ワークグループとWindows Domainの2通りがあります。
今回はWindowsパソコンを対象とせず、複数のSambaサーバを管理するのでワークグループで行います。
/usr/share/doc/smbldap-tools/README.Debian.gzも参照すると良いです。

はじめにLDAPサーバでSambaのSchemaをLDAPに登録します。
Sambaがインストールされたパソコンからsamba.ldifを持ってきます。

sudo cp /usr/share/doc/samba/examples/LDAP/samba.ldif /etc/ldap/myldif/

追加
    sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/myldif/samba.ldif

確認
    sudo ls /etc/ldap/slapd.d/cn\=config/cn\=schema/

LDAPに登録してあるアクセス権を修正します。
「sambaPwdMustChange,sambaLMPassword,sambaPwdLastSet,sambaNTPassword」の属性値を追加します。

sudo ldapvi -Y EXTERNAL -h ldapi:/// -b cn=config

olcAccess: {0}to attrs=userPassword,shadowLastChange,sambaPwdMustChange,sambaLMPassword,sambaPwdLastSet,sambaNTPassword by dn="cn=admin,dc=xxx,dc=xxx" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=nd" write by * read
olcAccess: {3}to dn.subtree="dc=nd" by self read by * read
olcAccess: {4}to * by * none

複数台のSambaサーバを運用する場合、共通のSID(sambaSID)を使います。
代表とするSambaサーバで「sudo net getlocalsid」コマンドを実行してSID(sambaSID)を調べます。

sudo net getlocalsid
    S-1-5-21-xxx-xxx-xxx

LDAPにSambaサーバを登録します。
例えばホスト名が「ほげほげ.example.com」の場合は以下となります。
全てのSambaサーバを登録します。
ldapviで新規登録するので、番号の部分を「add」とすると自動で番号を割り振ってくれます。
登録するSambaサーバのsambaSIDは「S-1-5-21-xxx-xxx-xxx」となります。

sudo ldapvi -Y EXTERNAL -h ldapi:/// -D cn=admin,dc=nd -b dc=nd
add sambaDomainName=ほげほげ,dc=nd
sambaDomainName: ほげほげ
objectClass: sambaDomain
sambaSID: S-1-5-21-xxx-xxx-xxx    <-- ここ
sambaAlgorithmicRidBase: 1000
sambaNextUserRid: 1000
sambaMinPwdLength: 5
sambaPwdHistoryLength: 0
sambaLogonToChgPwd: 0
sambaMaxPwdAge: -1
sambaMinPwdAge: 0
sambaLockoutDuration: 30
sambaLockoutObservationWindow: 30
sambaLockoutThreshold: 0
sambaForceLogoff: -1
sambaRefuseMachinePwdChange: 0
https://www.ietf.org/rfc/rfc2849.txt

以降の作業はSmabaサーバで行います。

sudo apt install samba smbldap-tools
sudo vi /etc/smb/smb.conf

/etc/smb/smb.confの内容は下記のとおりです。
既存ユーザがある場合は、後ほどLDAPにコンバートするまで「passdb backend = tdbsam」にしておきます。


[global]
log level = 3

unix charset=UTF-8
dos charset=CP932

workgroup = test
security = user
case sensitive = yes
load printers = no
dns proxy = no
log file = /var/log/samba/log.%m
max log size = 1000

passdb backend = tdbsam
;passdb backend = ldapsam:ldap://192.168.10.100, ldap://192.168.10.200

ldap suffix = dc=nd
ldap user suffix = ou=user
ldap group suffix = ou=group
ldap admin dn = cn=admin,dc=nd
ldap ssl = off
;ldap ssl = start_tls

ldap passwd sync = yes

passwd program = /usr/sbin/smbldap-passwd -u %u
passwd chat = *New*password* %n\n *Retype*new*password* %n\n *all*authentication*tokens*updated*

[homes]
valid users = %S
comment = Home
browseable = no
writable = yes
;create mask = 0644
;directory mask = 0755

OpenLDAPにアクセスするためにOpenLDAP管理者(今回はadmin)のパスワードを設定します。
これはOpenLDAPに参加させる全てのSambaサーバで行います。

sudo systemctl restart nmbd
sudo systemctl restart smbd

sudo smbpasswd -W

/etc/samba/smb.confを元にsmbldapの設定ファイルを生成します。
OpenLDAPの管理者(今回はadmin)のパスワードを入力します。
また、今回はマルチマスターで構成しているので「ldap slave server」には他方の「192.168.10.200」を入力します。
単一の場合はmasterと同じ「192.168.10.100」を入力します。

sudo smbldap-config

    OpenLDAPの管理者(今回はadmin)のパスワードを入力する
    ldap master bind password [] >

    「192.168.10.200」を入力します。
    ldap slave server [] >

    共通のSIDを入力します。
    SID for domain [] >

2ファイルが生成されます。
    /etc/smbldap-tools/smbldap.conf
    /etc/smbldap-tools/smbldap_bind.conf

ワークグループで運用するので、全てのSambaサーバで/etc/smbldap-tools/smbldap.confの「SID」項目は同じ値にします。
値は、上記にもある、代表にするSambaサーバ上で「sudo net getlocalsid」コマンドで出力した「S-1-5-21-xxx-xxx-xxx」です。

sudo vi /etc/smbldap-tools/smbldap.conf
    SID="S-1-5-21-xxx-xxx-xxx"

以下のコマンドでLDAPにTreeを登録します。
これは主にWindows Domain用で不要なものもあるのでldapviで削除しても良いです。

sudo smbldap-populate
   最後に入力するパスワードはLDAPのadminパスワード。

不要項目を削除する場合は、
    sudo ldapvi -Y EXTERNAL -h ldapi:/// -D cn=admin,dc=nd -b dc=nd

既存ユーザをLDAPに移行します。

sudo pdbedit -i tdbsam -e ldapsam:ldap://192.168.10.100/

/etc/smb/smb.confの「passdb backend」を修正します。

sudo vi /etc/smb/smb.conf
   ;passdb backend = tdbsam
    passdb backend = ldapsam:ldap://192.168.10.100, ldap://192.168.10.200

sudo systemctl restart nmbd
sudo systemctl restart smbd

LDAPサーバでLDAPに移行した既存ユーザのsambaSIDを修正する作業を行います。
ユーザのsambaSIDは「S-1-5-21-xxx-xxx-xxx」にハイフンとUID番号(uidNumberと同じ番号)を付加したものになります。
sambaSIDをハイフンとUID番号はそのままでSIDの部分だけを「S-1-5-21-xxx-xxx-xxx」に修正します。

sudo ldapvi -Y EXTERNAL -h ldapi:/// -D cn=admin,dc=nd -b dc=nd
10 uid=user_name,ou=user,dc=nd
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: sambaSamAccount
sn: user_name
cn: user_name
uid: user_name
uidNumber: 1010
gidNumber: 1010
sambaSID: S-1-5-21-xxx-xxx-xxx-1010   <-- ここ
loginShell: /bin/bash
homeDirectory: /home/user_name
shadowLastChange: 19159
userPassword: {SSHA}asdfasdfasdfas+asdfasdf+3+asdfasdf
sambaLogonTime: 0
sambaLogoffTime: 2085923199
sambaKickoffTime: 2085923199
sambaPwdCanChange: 0
sambaPasswordHistory: 0000000000000000000000000000000000000000000000000000000000000000
sambaLogonHours: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
sambaAcctFlags: [U          ]
sambaBadPasswordCount: 0
sambaBadPasswordTime: 0
sambaPwdLastSet: 1655362716
sambaNTPassword: 1E6E0F9D41BEB98303A61FCFDDCB3466
sambaLMPassword: 85010FE11E5AE4785753435894A05C67

クライアントの設定

Debianではnscdとnslcdが標準ですが、私の技量が足りずsudoとOpenLDAPの連携ができなかったのでsssdを使いました。
サーバで使うsudo用のSchemaはsudo-ldapに含まれます。
「man sssd.conf」を参考に設定します。

sudo apt purge nscd nslcd
sudo apt install sssd sssd-tools libsss-sudo sudo-ldap

/etc/nsswitch.conf

/etc/nsswitch.confにsssが登録されているか確認します。

/etc/nsswitch.conf
    passwd:         files systemd sss
    group:          files systemd sss
    shadow:         files  sss
    gshadow:        files

    hosts:          files dns
    networks:       files

    protocols:      db files
    services:       db files sss
    ethers:         db files
    rpc:            db files

    netgroup:       nis sss
    sudoers:        files sss
    automount:      sss

ログイン時にホームディレクトリを自動作成する1

1つ目の方法です。
oddjobを使ってログイン時にホームディレクトリを自動で作成します。

sudo apt install oddjob-mkhomedir

/etc/pam.d/common-sessionの最終行に追記します。

sudo vi /etc/pam.d/common-session
    session optional        pam_oddjob_mkhomedir.so umask=077

ログイン時にホームディレクトリを自動作成する2

2つ目の方法です。
以下のコマンドで自動で設定してくれるので「Create home directory on login」にチェックします。
また、sssなどにチェックが入っていることを確認します。

sudo pam-auth-update

自分で記述するなら以下のようにします。

sudo vi /etc/pam.d/common-session
    session optional pam_mkhomedir.so skel=/etc/skel umask=077

sshdでパスワード認証を有効にする

テストのため、パスワード認証を有効にします。

sudo apt install sshd

sudo vi /etc/ssh/sshd_config
    PasswordAuthentication yes

sudo systemctl restart ssh

秘密鍵

LDAPSを使うので、サーバで生成した秘密鍵をコピーして持ってきます。

sudo mkdir -p /etc/ssl/openldap/certs/
sudo mv ~/server.key /etc/ssl/openldap/certs/
sudo chmod 600 /etc/ssl/openldap/certs/server.key
sudo chown root. /etc/ssl/openldap/certs/server.key

/etc/sssd/sssd.conf

下記の内容でsssd.confファイルを新規に作成します。
自己証明書なので「ldap_tls_reqcert = never」とします。


[sssd]
debug_level         = 1
services            = nss, pam, ssh, sudo
config_file_version = 2
domains             = default

[domain/default]
ldap_id_use_start_tls = true
ldap_tls_reqcert      = never

#ldap_tls_reqcert      = allow
#ldap_id_use_start_tls = false

id_provider     = ldap
auth_provider   = ldap
chpass_provider = ldap
sudo_provider   = ldap
#access_provider = simple
#access_provider = permit

ldap_search_timeout = 5
ldap_network_timeout = 5

ldap_tls_cacert    = /etc/ssl/openldap/certs/server.key
ldap_tls_cacertdir = /etc/ssl/openldap/certs

enumerate         = false
cache_credentials = false
case_sensitive    = false

entry_cache_timeout = 30

;ldap_uri = ldaps://slapdのサーバ名
ldap_uri = ldaps://192.168.10.100, ldaps://192.168.10.200

ldap_search_base      = dc=nd
ldap_user_search_base = ou=user,dc=nd
ldap_sudo_search_base = ou=SUDOers,dc=nd

パーミッションなどを変更してsssdを再起動ます。

sudo chmod 600 /etc/sssd/sssd.conf
sudo chown root. /etc/sssd/sssd.conf
sudo systemctl restart sssd

LDAPサーバへの接続テスト

サーバ、クライアントのどちらでも良いのでテストします。

ldapsearch -x -LLL -b "dc=nd" "(objectClass=*)" -h LDAPサーバのIPアドレス・ホスト名

TeraTermでログインのテスト

「プレインパスワード」をチェックして、testuserでログインできるかテストします。

Sambaパスワードの変更

LDAPとSmabaと連携させた場合、ユーザはpaswdコマンドではなく、smbldap-passwdコマンドでパスワードを変更します。
初めにLinuxのパスワードを入力してから、Smaba(LDAP)のパスワードを2回入力します。

バックアップ

念のため2台のLDAPサーバーでそれぞれcronを使ってバックアップします。

sudo mkdir /home/www/cron/backup-ldap
sudo vi /home/www/cron/ldap-backup.sh
sudo chmod 755 /home/www/cron/ldap-backup.sh

スクリプトです。

#!/bin/sh

DATE=`date +\%Y\%m\%d\%H\%M`
BACKUP_DIR=/home/www/cron/backup-ldap

cd ${BACKUP_DIR}
mkdir `date '+%Y%m%d'`

# config
/sbin/slapcat -b cn=config -l ${BACKUP_DIR}/`date '+%Y%m%d'`/ldap-config-${DATE}.ldif

# data
/sbin/slapcat -n 1 -l ${BACKUP_DIR}/`date '+%Y%m%d'`/ldap-data-${DATE}.ldif

cronに登録します。

sudo crontab -e

crontabの内容です。
毎朝6時1分にバックアップします。

01 6 * * * /home/www/cron/ldap-backup.sh

Comments