UbuntuでのActive Directoryドメインへの参加方法です。

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

最初にsssd関連パッケージを下記のようにインストールします。

sudo apt install -y sssd sssd-ad sssd-tools libpam-sss libnss-sss krb5-user realmd adcli samba-common-bin

途中、Kerberos関連の質問に答える必要があります。以下のように答えて下さい。

  • Default Kerberos version 5 realm: ドメイン名(hogehoge.lanとかhogehoge.tohoku.ac.jpとか)
  • Kerberos servers for your realm: ドメインコントローラの名前
  • Administrative server for your Kerberos realm: ドメインコントローラの名前

DNSの名前解決の設定

ここではデスクトップ系のUbuntuでNetworkManagerでネットワーク接続を管理しており、1000BASE-Tが外向け、ドメイン専用ネットワークとして10GbEがあると想定しています。また、QNAPも同様に1000BASE-Tが外向け、ドメイン専用ネットワークの10GbEがあると仮定します。大変困ったことに、QNAP NASでは外向け、つまりインターネットに到達可能なネットワークでしかドメインコントローラのDNSサーバが提供されません。10GbEでは名前解決ができません。この状態では、クライアントではドメインコントローラのDNSが使われずに外向けの1000BASE-T側のDNSサーバが使われてしまいます。これを修正する手っ取り早い方法は、あまり好ましい方法ではありませんが、/etc/hostsでドメインコントローラだけは名前解決できるようにしてしまうことです。以下のコマンドで編集します。

sudo ne /etc/hosts

以下の行を加えます。

ドメインコントローラのIP ドメインコントローラ名 ドメインコントローラ名.ドメイン名 ドメイン名
# 例
192.168.99.1 qnapnas qnapnas.hogehoge.lan hogehoge.lan

NetworkManagerの設定で、外向けの1000BASE-TでのDNSサーバをQNAPの外向けの1000BASE-Tに設定し、検索ドメインをドメインコントローラで設定したドメインにすることができるなら、その方が良いでしょう。ただし、Ubuntuマシンの外向けの1000BASE-TとQNAPの外向けの1000BASE-Tが同じセグメントに接続されている必要があります。nmcliコマンドでの設定は下記のようになります。

# Disable auto DNS
sudo nmcli connection modify CONNECTIONID ipv4.ignore-auto-dns yes
# Set DNS server
sudo nmcli connection modify CONNECTIONID ipv4.dns IPADDRESS
# Set DNS search domain
sudo nmcli connection modify CONNECTIONID ipv4.dns-search DOMAINNAME
# Restart NetworkManager
sudo systemctl restart NetworkManager

CONNECTIONIDはNetworkManagerでの接続名です。nmcli connection showでも表示できますし、modifyまで入力してからスペースを入れてタブキーを押せば候補として表示されるはずです。

もう一つの解決策は、1000BASE-TネットワークのルータでDHCPでIPアドレスを自動割当する際に、DNSサーバとしてQNAPの外向けの1000BASE-TのIPアドレスを通知し、検索ドメインもドメインコントローラで設定したドメインとするように設定することです。これはルータが対応していないとできませんが、対応していれば各クライアントマシンの設定をする必要がなく、ルータに集約できるので手間が減らせます。一番スマートな解決方法だと思います。

Active Directoryドメインへの参加

次に、realmコマンドでActive Directoryに参加します。

# Discover AD domain
sudo realm discover DOMAINNAME
# Join AD domain
sudo realm join DOMAINNAME

Administratorのパスワードを訊かれたらQNAPの管理画面でドメインコントローラを有効化するときに入力したパスワードを入力します。設定が正常に完了すれば、下記のコマンドでユーザー情報が表示されるはずです。

id USERNAME@DOMAINNAME

sssdの設定変更

この状態ではドメインのユーザー名に@DOMAINNAMEを付けないといけないので、設定を変更します。下記のコマンドで設定ファイルを編集します。

sudo ne /etc/sssd/sssd.conf

変更する行と追加する行は以下の通りです。いずれも[domain/DOMAINNAME]セクションにあります。

# Change the following lines
use_fully_qualified_names = False
ldap_id_mapping = False
fallback_homedir = /home/%u/UbuntuHome
# Add the following lines
ad_server = DOMAINNAME
ad_gpo_ignore_unreadable = True
ad_gpo_access_control = permissive
override_homedir = /home/%u/UbuntuHome
ldap_user_uid_number = uidNumber
ldap_user_gid_number = gidNumber

この設定では、ユーザーのホームディレクトリは/home/USERNAME/UbuntuHomeになるようにしています。/home/USERNAMEはWindowsでホームディレクトリにしているため、プログラムによっては設定ファイルを統一できるのですが、設定ファイル内にディレクトリパスが入っていたりするとWindowsとは表記方法もマウント位置も異なるのでまずいですし、プログラムの行儀が悪いと障害の原因になりかねないので、互いにアクセスはできるが完全に一致はしないようにするため、こうしてあります。また、Windowsはホームディレクトリを予めサーバ上で作成しておかないといけないのですが、Ubuntu側は初回ログイン時にホームディレクトリが存在しなければ作成して/etc/skelの設定ファイルがコピーされるようになっています(というかこの後でそう設定します)。初回ログイン時に既に存在していると設定ファイルをコピーしてくれなくてユーザーが個別にコピーしないといけないのが面倒なので、こういう設定にするとそれがうまく回避できるんですね。

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

sudo chmod 600 /etc/sssd/sssd.conf

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

sudo systemctl restart sssd
sudo systemctl status sssd

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

sudo systemctl enable sssd

sudoの設定

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