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
コマンドを実行すると確認の上書き換えられてしまいますので、実行の度にコメントアウトする必要があります。