🐈

Ubuntu で Windows Active Directory ドメインに参加し、共有ファイルにアクセスする

2023/08/10に公開

当社では社内データの収集のため、データ収集システムを Ubuntu Server + Docker + Python 環境で構築しています。
社内には各所で様々な業務ファイルが点在しており、それら業務ファイルの情報を正規化してデータベースに集約するプロシージャですが、ユーザー環境は Windows Active Directory のため、Ubuntu から ActiveDirectory 上の共有ファイルにアクセスできるようにする必要があります。

ここでは、当社が行っている Ubuntu Server を Active Directory に参加させ、共有ファイルにアクセスする設定について共有していきます。
さらにシンプルな設定方法があれば、ぜひコメントください!

前提 & 環境

Ubuntu Server は Docker インストール済みでサーバ名は srv-ubuntu IP アドレスは 192.168.1.10 、管理者ユーザーは hoge としています。

Ubuntu Server bash
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.2 LTS
Release:        22.04
Codename:       jammy

また、Active Directory ドメインは domain-name.co.jp とし、Active Directory ドメインサーバは dc.domain-name.co.jp 、IP は 192.168.1.2 とします。

Active Directory ドメインに参加

Ubuntu Server を Active Directory に参加させます。

パッケージインストール

必要なパッケージをインストールします。

Ubuntu Server bash
$ sudo apt -y install realmd krb5-user sssd sssd-tools libnss-sss libpam-sss adcli adsys samba-common-bin oddjob oddjob-mkhomedir packagekit

インストール途中でドメインの入力を求められるので、大文字で入力します。

Ubuntu Server bash
Setting up krb5-config (2.6+nmu1ubuntu1) ...
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 78.)
debconf: falling back to frontend: Readline
Configuring Kerberos Authentication
-----------------------------------

When users attempt to use Kerberos and specify a principal or user name without specifying what
administrative Kerberos realm that principal belongs to, the system appends the default realm.  The default
realm may also be used as the realm of a Kerberos service running on the local machine.  Often, the default
realm is the uppercase version of the local DNS domain.

Default Kerberos version 5 realm: DOAMIN-NAME.CO.JP  # ← 大文字で入力

参照 DNS に AD サーバを指定する

Netplan の既存設定ファイル /etc/netplan/00-installer-config.yaml を開き、参照 DNS に Active Directory サーバが指定されているか確認します。

Ubuntu Server bash
$ sudo vi /etc/netplan/00-installer-config.yaml
network:
  ethernets:
    eth0:
      addresses:
      - 192.168.1.10/24
      nameservers:
        addresses:
        - 192.168.1.2  # ← DNS サーバ (Active Direcotry サーバ) になっているか確認
        search: []
      routes:
      - to: default
        via: 192.168.1.1
  version: 2

Active Directory サーバが設定されていない場合は、設定ファイルの IP アドレスを書き換えて、変更を適用します。

Ubuntu Server bash
$ sudo netplan apply  # Netplan の変更を適用

参照 NTP に AD サーバを指定する

NTP サーバに Active Directory サーバを指定します。

/etc/systemd/timesyncd.conf ファイルに NTP 設定を追加します。
Ubuntu Server bash
$ sudo vi /etc/systemd/timesyncd.conf
+[Time]
+NTP=dc.domain-name.co.jp
設定を適用します。
Ubuntu Server bash
$ sudo systemctl restart systemd-timesyncd
$ sudo timedatectl timesync-status
       Server: 192.168.1.2 (dc.domain-name.co.jp)
Poll interval: 1min 4s (min: 32s; max 34min 8s)
         Leap: normal
      Version: 3
      Stratum: 2
    Reference: 92F8DEB4
    Precision: 15.625ms (-6)
Root distance: 60.531ms (max: 5s)
       Offset: +22.387ms
        Delay: 290us
       Jitter: 0
 Packet count: 1
    Frequency: +190.560ppm
タイムゾーンを Asia/Tokyo にしておきます (必須ではない)
Ubuntu Server bash
$ sudo timedatectl set-timezone Asia/Tokyo
$ timedatectl
               Local time: Fri 2023-06-23 08:15:17 JST
           Universal time: Thu 2023-06-22 23:15:17 UTC
                 RTC time: Thu 2023-06-22 23:15:17
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

ホスト名変更

事前にホスト名を FQDN に変更しておきます。

Ubuntu Server bash
$ sudo hostname srv-ubuntu.domain-name.co.jp

Active Dicrctory ドメインの検索

参加するドメインを検索します。

Ubuntu Server bash
$ realm discover domain-name.co.jp
domain-name.co.jp
  type: kerberos
  realm-name: domain-name.CO.JP
  domain-name: domain-name.co.jp
  configured: no
  server-software: active-directory
  client-software: sssd
  required-package: sssd-tools
  required-package: sssd
  required-package: libnss-sss
  required-package: libpam-sss
  required-package: adcli
  required-package: samba-common-bin

Active Directory に参加

管理者パスワードを用いて Active Directory に参加します。
Active Directory 管理ユーザーは指定しなくても進みますが、経験上ここで指定しておいた方が後々のトラブルが少なくなります。
なお、Active Directory 管理ユーザーのドメイン名は大文字で記載します。(レルムは全て大文字)

Active Directory に参加
Ubuntu Server bash
$ sudo realm join -U Administrator@DOMAIN-NAME.CO.JP domain-name.co.jp -v
 * Resolving: _ldap._tcp.domain-name.co.jp
 * Performing LDAP DSE lookup on: 192.168.10.2
 * Successfully discovered: domain-name.co.jp
Password for Administrator@DOMAIN-NAME.CO.JP:
 * Unconditionally checking packages
 * Resolving required packages
 * LANG=C /usr/sbin/adcli join --verbose --domain domain-name.co.jp --domain-realm DOMAIN-NAME.CO.JP --domain-controller 192.168.10.2 --login-type user --login-user Administrator@DOMAIN-NAME.CO.JP --stdin-password
 * Using domain name: domain-name.co.jp
 * Calculated computer account name from fqdn: SRV-UBUNTU
 * Using domain realm: domain-name.co.jp
 * Sending NetLogon ping to domain controller: 192.168.10.2
 * Received NetLogon info from: DC.domain-name.co.jp
 * Wrote out krb5.conf snippet to /var/cache/realmd/adcli-krb5-lnLOdl/krb5.d/adcli-krb5-conf-FVu2Bo
 * Authenticated as user: Administrator@DOMAIN-NAME.CO.JP
 * Using GSS-SPNEGO for SASL bind
 * Looked up short domain name: DOMAIN-NAME
 * Looked up domain SID: S-8-8-88-8888888888-8888888888-8888888888
 * Using fully qualified name: srv-ubuntu.domain-name.co.jp
 * Using domain name: domain-name.co.jp
 * Using computer account name: SRV-UBUNTU
 * Using domain realm: domain-name.co.jp
 * Calculated computer account name from fqdn: SRV-UBUNTU
 * Generated 120 character computer password
 * Using keytab: FILE:/etc/krb5.keytab
 * A computer account for SRV-UBUNTU$ does not exist
 * Found well known computer container at: CN=Computers,DC=domain-name,DC=co,DC=jp
 * Calculated computer account: CN=SRV-UBUNTU,CN=Computers,DC=domain-name,DC=co,DC=jp
 * Encryption type [3] not permitted.
 * Encryption type [1] not permitted.
 * Created computer account: CN=SRV-UBUNTU,CN=Computers,DC=domain-name,DC=co,DC=jp
 * Sending NetLogon ping to domain controller: 192.168.10.2
 * Received NetLogon info from: DC.domain-name.co.jp
 * Set computer password
 * Retrieved kvno '2' for computer account in directory: CN=SRV-UBUNTU,CN=Computers,DC=domain-name,DC=co,DC=jp
 * Checking RestrictedKrbHost/srv-ubuntu.domain-name.co.jp
 *    Added RestrictedKrbHost/srv-ubuntu.domain-name.co.jp
 * Checking RestrictedKrbHost/SRV-UBUNTU
 *    Added RestrictedKrbHost/SRV-UBUNTU
 * Checking host/srv-ubuntu.domain-name.co.jp
 *    Added host/srv-ubuntu.domain-name.co.jp
 * Checking host/SRV-UBUNTU
 *    Added host/SRV-UBUNTU
 ! Couldn't authenticate with keytab while discovering which salt to use: SRV-UBUNTU$@DOMAIN-NAME.CO.JP: Client 'SRV-UBUNTU$@DOMAIN-NAME.CO.JP' not found in Kerberos database
 * Added the entries to the keytab: SRV-UBUNTU$@DOMAIN-NAME.CO.JP: FILE:/etc/krb5.keytab
 * Added the entries to the keytab: host/SRV-UBUNTU@DOMAIN-NAME.CO.JP: FILE:/etc/krb5.keytab
 * Added the entries to the keytab: host/srv-ubuntu.domain-name.co.jp@DOMAIN-NAME.CO.JP: FILE:/etc/krb5.keytab
 * Added the entries to the keytab: RestrictedKrbHost/SRV-UBUNTU@DOMAIN-NAME.CO.JP: FILE:/etc/krb5.keytab
 * Added the entries to the keytab: RestrictedKrbHost/srv-ubuntu.domain-name.co.jp@DOMAIN-NAME.CO.JP: FILE:/etc/krb5.keytab
 ! Failed to update Kerberos configuration, not fatal, please check manually: Setting attribute standard::type not supported
 * /usr/sbin/update-rc.d sssd enable
 * /usr/sbin/service sssd restart
 * Successfully enrolled machine in realm

ここでは次のようなエラーが出ました。

 ! Couldn't authenticate with keytab while discovering which salt to use: SRV-UBUNTU$@DOMAIN-NAME.CO.JP: Client 'SRV-UBUNTU$@DOMAIN-NAME.CO.JP' not found in Kerberos database
 ! Failed to update Kerberos configuration, not fatal, please check manually: Setting attribute standard::type not supported

Active Directory の最新バージョンでは認証方式の問題で初回の設定は中途半端に成功することがあります。アップデートをしっかり行っている意識高い系ほど、罠にハマりやすい気がします・・環境によっては問題なく進むこともあり、その都度判断しましょう。

  • ! Failed to update Kerberos configuration, not fatal, please check manually: Setting attribute standard::type not supported
    このエラーは後で /etc/krb5.conf を修正するので放っておきましょう。

  • ! Couldn't authenticate with keytab while discovering which salt to use: SRV-UBUNTU$@DOMAIN-NAME.CO.JP: Client 'SRV-UBUNTU$@DOMAIN-NAME.CO.JP' not found in Kerberos database
    このエラーが出た場合は、Kerberos 認証に問題が起きていますので、以下の操作で再度ドメイン認証を行います。

Active Directory ユーザーの情報を取得できれば認証は完了です。

Ubuntu Server bash
$ id Administrator@DOMAIN-NAME.CO.JP
uid=199600500(administrator) gid=199600513(domain users) groups=199600513(domain users)...

設定ファイルの変更

続けて、使いやすいように設定ファイルを変更していきます。

SSSD サービスの設定変更
/etc/sssd/sssd.conf
[sssd]
domains = domain-name.co.jp
config_file_version = 2
services = nss, pam

[domain/domain-name.co.jp]
default_shell = /bin/bash
krb5_store_password_if_offline = True
cache_credentials = True
krb5_realm = DMAIN_NAME.CO.JP
realmd_tags = manages-system joined-with-adcli
id_provider = ad
+fallback_homedir = /home/%u  # ユーザーフォルダ名を変更
-fallback_homedir = /home/%u@%d
ad_domain = domain-name.co.jp
+use_fully_qualified_names = False  # Active Directory ユーザーのドメイン名を省略
-use_fully_qualified_names = True
ldap_id_mapping = True
access_provider = ad
Kerberos の設定変更
/etc/krb5.conf
[libdefaults]
udp_preference_limit = 0
default_realm = DOMAIN-NAME.CO.JP
+
+[logging]
+default = FILE:/var/log/krb5libs.log  # ログファイルを設定
+
+[domain_realm]
+.domain-name.co.jp = DOMAIN-NAME.CO.JP  # 小文字ドメインをレルムにマッピング
+domain-name.co.jp = DOMAIN-NAME.CO.JP
PAM の設定
Ubuntu Server bash
$ sudo pam-auth-update
PAM configuration
-----------------

Pluggable Authentication Modules (PAM) determine how authentication, authorization, and password changing
are handled on the system, as well as allowing configuration of additional actions to take when starting
user sessions.

Some PAM module packages provide profiles that can be used to automatically adjust the behavior of all
PAM-using applications on the system.  Please indicate which of these behaviors you wish to enable.

  1. Pwquality password strength checking  5. Register user sessions in the systemd control group hierarchy
  2. Unix authentication                   6. Create home directory on login
  3. SSS authentication                    7. Inheritable Capabilities Management
  4. ADSys authentication                  8. none of the above

(Enter the items or ranges you want to select, separated by spaces.)

PAM profiles to enable: 2 3 6  # ← ここでは 2, 3, 6 を選択
SSSD サービス再起動
Ubuntu Server bash
$ sudo systemctl restart sssd
$ sudo systemctl status sssd
● sssd.service - System Security Services Daemon
     Loaded: loaded (/lib/systemd/system/sssd.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-06-24 08:19:11 JST; 3s ago
   Main PID: 107390 (sssd)
      Tasks: 4 (limit: 154452)
     Memory: 45.8M
        CPU: 183ms
     CGroup: /system.slice/sssd.service
             ├─107390 /usr/sbin/sssd -i --logger=files
             ├─107391 /usr/libexec/sssd/sssd_be --domain domain-name.co.jp --uid 0 --gid 0 --logger=files
             ├─107392 /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files
             └─107393 /usr/libexec/sssd/sssd_pam --uid 0 --gid 0 --logger=files

Jun 24 08:19:11 srv-ubuntu.domain-name.co.jp systemd[1]: Starting System Security Services Daemon...
Jun 24 08:19:11 srv-ubuntu.domain-name.co.jp sssd[107390]: Starting up
Jun 24 08:19:11 srv-ubuntu.domain-name.co.jp sssd_be[107391]: Starting up
Jun 24 08:19:11 srv-ubuntu.domain-name.co.jp sssd_nss[107392]: Starting up
Jun 24 08:19:11 srv-ubuntu.domain-name.co.jp sssd_pam[107393]: Starting up
Jun 24 08:19:11 srv-ubuntu.domain-name.co.jp systemd[1]: Started System Security Services Daemon.

認証確認

念のため認証関係に問題がないか確認しておきます。

Ubuntu Server bash
$ kinit Administrator
Password for Administrator@DOMAIN-NAME.CO.JP:
$ klist -e
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: Administrator@DOMAIN-NAME.CO.JP

Valid starting     Expires            Service principal
06/24/23 08:34:27  06/24/23 18:34:27  krbtgt/DOMAIN-NAME.CO.JP@DOMAIN-NAME.CO.JP
        renew until 06/25/23 08:34:23, Etype (skey, tkt): aes256-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96
$ kdestroy
Ubuntu Server bash
$ id Administrator
uid=199600500(administrator) gid=199600513(domain users) groups=199600513(domain users)...
Ubuntu Server bash
$ getent passwd Administrator
administrator:*:1474800500:1474800585:Administrator:/home/administrator:/bin/bash
Ubuntu Server bash
$ groups Administrator
Administrator : domain users group policy creator owners enterprise admins domain admins schema admins ...

Active Directory ユーザーでログイン

Active Directory ユーザーでログインします。

Ubuntu Server bash
$ sudo login
srv-ubuntu.domain-name.co.jp login: Administrator
Password:
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-72-generic x86_64)
...
Creating directory '/home/administrator'.

無事ログインできることが確認できたら、Active Directory の設定は終了です。
これで Active Directory ユーザーで Kerberos 認証する準備が整いました。

Windows Active Directory 共有フォルダのマウント

必要なパッケージをインストールします。

Ubuntu Server bash
$ sudo apt install cifs-utils

マウントポイントを作成します。

Ubuntu Server bash
$ sudo mkdir -p /mnt/n

今回は固定ユーザーで共有フォルダをマウントします。
認証ファイルに Active Directory ユーザー情報を設定します。

username=
password=
domain=

認証ファイル権限を設定します。

Ubuntu Server bash
$ sudo chmod 600 /root/.credentials

マウントを永続化するため、/etc/fstab にエントリを作成します。

/etc/fstab
+//file-server-name/share-dir /mnt/n cifs credentials=/root/.credentials,uid=0

以上の設定を行い再起動すると、/mnt/n に共有ディレクトリがマウントされているのが確認できます。

Ubuntu Server bash
$ ls /mnt/n
ShareDirectory1 ShareDirectory2 ShareDirectory3 ...

おわり

以上で、Windows Active Dicretory 環境に Ubuntu Server をドメイン参加させて、共有フォルダまでアクセスできる環境が整いました。
マウントポイントをバインドすることで Docker 内からも共有フォルダにアクセスできるため、運用条件の幅も大きく広がります。
Kerberos 認証周りはトラブルも多いですが、認証の仕組みを把握することで比較的簡単に解決することができると共に知識の向上に繋がると思います。
実運用ではこれらを応用していくことになりますが、こんな設定良いよ!というお話があればぜひ教えてください!

ご参考・謝辞

https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/decrypting-the-selection-of-supported-kerberos-encryption-types/ba-p/1628797
https://pkiwithadcs.com/details_about_kerberos_authentication/
https://devopstales.github.io/home/ubuntu-22.04-ad-join/

GitHubで編集を提案

Discussion