Ubuntuでsssdを用いてLDAPサーバにユーザー認証を任せるようにする設定方法です。sssdではなくnslcdとnscdを組み合わせる方法もありますが、手順もトラブルも多いようなのでsssdを推奨します。Red Hatがsssd推奨なのも理由の一つです。

必要なパッケージのインストール

というわけでsssd関連パッケージを下記のようにインストールします。

sudo apt install -y sssd sssd-ldap libpam-sss libnss-sss

SSL証明書のインストール

sssdは暗号化通信が必須です。そのため、QNAP NASなどのLDAPサーバ側の公開鍵証明書を登録しておく必要があります。QNAP NASの場合、管理画面から「コントロールパネル→セキュリティ→証明書とプライベートキー」を開くと、「証明書のダウンロード」ボタンがあるので押します。証明書とプライベートキーを選択するダイアログが出るので、証明書にチェックを入れてダウンロード、展開します。このファイルから、下記の部分が証明書となります。

-----BEGIN CERTIFICATE-----
省略
-----END CERTIFICATE-----

ひとまずホームディレクトリにSERVERNAME.crtを作成して上記内容を貼り付け、/etc/ssl/certs/にコピーします。

ne ~/SERVERNAME.crt
sudo cp SERVERNAME.crt /etc/ssl/certs/

sssdの設定

下記のコマンドで設定ファイルを編集します。

sudo ne /etc/sssd/sssd.conf

内容は下記のようになります。

[sssd]
services = nss, pam
config_file_version = 2
debug_level = 0
domains = default

[domain/default]
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
access_provider = ldap
default_shell = /bin/bash
case_sensitive = False
enumerate = True
cache_credentials = True
ldap_search_base = dc=SECONDLEVELDOMAIN,dc=TOPLEVELDOMAIN
ldap_uri = ldap://SERVERIP
ldap_default_bind_dn = cn=admin,dc=SECONDLEVELDOMAIN,dc=TOPLEVELDOMAIN
ldap_default_authtok_type = password
ldap_default_authtok = PASSWORD
ldap_id_mapping = False
ldap_id_use_start_tls = True
ldap_tls_reqcert = never
ldap_tls_cacert = /etc/ssl/certs/SERVERNAME.crt
ldap_search_timeout = 5
ldap_network_timeout = 5
ldap_enumeration_search_timeout  = 60
ldap_enumeration_refresh_timeout = 300
ldap_connection_expire_timeout   = 600
ldap_access_order = filter
ldap_access_filter = (objectClass=posixAccount)
ldap_user_uid_number = uidNumber
ldap_user_gid_number = gidNumber

[nss]
entry_negative_timeout = 20
entry_cache_nowait_percentage = 50

[pam]
offline_credentials_expiration = 60

cn=adminなのは、私のところではLDAPサーバがQNAP NASで、QNAP NASのLDAPサーバはcn=adminに決め打ちだからです。他のLDAPサーバでは適宜変更して下さい。なお、QNAP NASのLDAPサーバはログインシェルの項目を持たないので、ユーザーごとにログインシェルを変えることができません。

この設定ファイルのパーミッションは600でないといけないので、chmodします。

sudo chmod 600 /etc/sssd/sssd.conf

あとはsssdを再起動すればLDAP認証の設定は完了です。

sudo systemctl restart sssd
sudo systemctl status sssd

ここでエラーが出るなら、何かが間違っています。エラーが出ないなら、下記のコマンドでマシンの起動時に自動的にロードされるように設定します。

sudo systemctl enable sssd

sudoの設定

このままではユーザーは誰もsudoができません。そこで、LDAPサーバにsudoするための「Domain Admins」グループを作成し(グループ名は他でも構いません)、sudo権限を持たせたいユーザーを登録します。それが終わったら、Ubuntuマシン側で下記コマンドで設定ファイルを編集します。

sudo visudo

末尾に下記の行を追加します。

%domain\ admins   ALL=(ALL:ALL) ALL

%がグループ名であることを示しており、グループ名は小文字化、グループ名中のスペースはバックスラッシュでエスケープします。

いくつかの問題への対処

この状態では、UbuntuのAppArmorのメッセージでログが埋め尽くされてしまう問題があります。そこで、sssdを対象外にするように設定します。

sudo ln -sf /etc/apparmor.d/usr.sbin.sssd /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.sssd

この時点でコンソールやSSH経由ではログインできますが、ホームディレクトリがないために色々不都合が生じます。また、GUIではログインできません。下記のコマンドでログイン時にホームディレクトリがない場合は自動的に作成するように設定します。

sudo pam-auth-update

上記コマンドを実行するとメニュー画面が出ますので、「Create home directory on login」にチェックを入れて「OK」します。これでログイン時にホームディレクトリが自動的に作成され、/etc/skelの内容が初期設定としてコピーされます。

最近のUbuntuの更新の際、ドメインユーザーでSSHログインができなくなってしまいました。原因は、/etc/pam.d/common-accountに下記の行が追加されたためでした。

account        [default=bad success=ok user_unknown=ignore]    pam_sss.so

この行をコメントアウトすることでSSHで再度ログインできるようになります(即時有効)。ただし、pam-auth-updateコマンドを実行すると確認の上書き換えられてしまいますので、実行の度にコメントアウトする必要があります。