Ubuntu で Windows Active Directory ドメインに参加し、共有ファイルにアクセスする
当社では社内データの収集のため、データ収集システムを Ubuntu Server + Docker + Python 環境で構築しています。
社内には各所で様々な業務ファイルが点在しており、それら業務ファイルの情報を正規化してデータベースに集約するプロシージャですが、ユーザー環境は Windows Active Directory のため、Ubuntu から ActiveDirectory 上の共有ファイルにアクセスできるようにする必要があります。
ここでは、当社が行っている Ubuntu Server を Active Directory に参加させ、共有ファイルにアクセスする設定について共有していきます。
さらにシンプルな設定方法があれば、ぜひコメントください!
前提 & 環境
Ubuntu Server は Docker インストール済みでサーバ名は srv-ubuntu
IP アドレスは 192.168.1.10
、管理者ユーザーは hoge
としています。
$ 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 に参加させます。
パッケージインストール
必要なパッケージをインストールします。
$ sudo apt -y install realmd krb5-user sssd sssd-tools libnss-sss libpam-sss adcli adsys samba-common-bin oddjob oddjob-mkhomedir packagekit
インストール途中でドメインの入力を求められるので、大文字で入力します。
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 サーバが指定されているか確認します。
$ 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 アドレスを書き換えて、変更を適用します。
$ sudo netplan apply # Netplan の変更を適用
参照 NTP に AD サーバを指定する
NTP サーバに Active Directory サーバを指定します。
/etc/systemd/timesyncd.conf
ファイルに NTP 設定を追加します。
$ sudo vi /etc/systemd/timesyncd.conf
+[Time]
+NTP=dc.domain-name.co.jp
設定を適用します。
$ 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
にしておきます (必須ではない)
$ 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 に変更しておきます。
$ sudo hostname srv-ubuntu.domain-name.co.jp
Active Dicrctory ドメインの検索
参加するドメインを検索します。
$ 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 に参加
$ 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 ユーザーの情報を取得できれば認証は完了です。
$ id Administrator@DOMAIN-NAME.CO.JP
uid=199600500(administrator) gid=199600513(domain users) groups=199600513(domain users)...
設定ファイルの変更
続けて、使いやすいように設定ファイルを変更していきます。
SSSD サービスの設定変更
[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 の設定変更
[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 の設定
$ 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 サービス再起動
$ 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.
認証確認
念のため認証関係に問題がないか確認しておきます。
$ 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
$ id Administrator
uid=199600500(administrator) gid=199600513(domain users) groups=199600513(domain users)...
$ getent passwd Administrator
administrator:*:1474800500:1474800585:Administrator:/home/administrator:/bin/bash
$ groups Administrator
Administrator : domain users group policy creator owners enterprise admins domain admins schema admins ...
Active Directory ユーザーでログイン
Active Directory ユーザーでログインします。
$ 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 共有フォルダのマウント
必要なパッケージをインストールします。
$ sudo apt install cifs-utils
マウントポイントを作成します。
$ sudo mkdir -p /mnt/n
今回は固定ユーザーで共有フォルダをマウントします。
認証ファイルに Active Directory ユーザー情報を設定します。
username=
password=
domain=
認証ファイル権限を設定します。
$ sudo chmod 600 /root/.credentials
マウントを永続化するため、/etc/fstab
にエントリを作成します。
+//file-server-name/share-dir /mnt/n cifs credentials=/root/.credentials,uid=0
以上の設定を行い再起動すると、/mnt/n
に共有ディレクトリがマウントされているのが確認できます。
$ ls /mnt/n
ShareDirectory1 ShareDirectory2 ShareDirectory3 ...
おわり
以上で、Windows Active Dicretory 環境に Ubuntu Server をドメイン参加させて、共有フォルダまでアクセスできる環境が整いました。
マウントポイントをバインドすることで Docker 内からも共有フォルダにアクセスできるため、運用条件の幅も大きく広がります。
Kerberos 認証周りはトラブルも多いですが、認証の仕組みを把握することで比較的簡単に解決することができると共に知識の向上に繋がると思います。
実運用ではこれらを応用していくことになりますが、こんな設定良いよ!というお話があればぜひ教えてください!
ご参考・謝辞
Discussion