LinuxサーバーをWindows Server 2022のADドメインに参加させる手順と確認方法

## はじめに
ふと、自宅のADサーバーに対して、Windowsクライアント端末がドメイン参加できるのは当たり前ですが、Linuxではどうなのか疑問に思いました。

そもそもOSが異なり、LinuxにはActive Directory（AD）という概念が存在しないと思っていましたが、調べた結果、Linuxでもドメイン参加が可能であることが分かりました。

そこで、実際に検証して試してみることにしました。


## 前提条件
・VirtualBox上で稼働しているWindows Server 2022 を使用
・VirtualBox上で稼働しているAlmaLinux（CentOSの後継）を使用

**自宅のVirtualBox環境**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/33af6977-165b-8eb5-728b-f959eeab005e.png)

:::note info
※検証には「Windows Server 2022」と「AlmaLinux」を使用します。
:::

## 全体像および自宅検証環境
前回の記事では、構築したAD兼DNSサーバーにWindows 10のクライアント端末を「honda.co.jp」という自宅環境のドメインに参加させる検証を行いました。

:::note warn
その続きとして、同じ環境でLinuxクライアント端末をドメインに参加させる方法を説明します。
[Windows Server 2022で自宅ネットワークにADサーバーを構築し、Windows 10端末をドメインに参加させる方法](https://qiita.com/free-honda/items/2fcdc8343aa878c17d9e)
:::

イラストイメージ図通りに、Linuxクライアント端末をドメインに参加（登録）させるイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c721faed-6bc7-85fd-4b57-fb2e9ee15d75.png)

引用画像：https://www.anet.co.jp/design/infrastructure/activedirectory.html

Linuxクライアント端末をActive Directory (AD) ドメインに参加させることで、ADによるユーザー管理や認証を利用することができます。

## 知識整理
前回の記事と重複する内容がありますが、基礎的な前提知識はマストですので、お手すきの際に目を通していただければと思います。

### Active Directory（AD）の役割と機能
```
役割:
Active Directoryは、ユーザー、コンピューター、グループ、ネットワークリソースを一元管理するディレクトリサービスです。
主な役割は、ユーザー認証、アクセス管理、リソースの割り当て、セキュリティポリシーの適用です。

機能:
- ユーザーとグループ管理: ユーザーやグループを作成、管理し、アクセス権限を設定できる。
- 認証: Kerberosプロトコルを使用したセキュアな認証を提供。
- グループポリシー: 組織全体のセキュリティやシステム設定を一元的に管理。
- ドメインコントローラー（DC）: Active Directoryをホストするサーバーで、認証やディレクトリ情報の管理を行う。
```

### DNSサーバの役割と機能
```
役割:
DNS（Domain Name System）は、ドメイン名とIPアドレスを相互に変換するシステムです。
Active DirectoryはDNSと密接に連携しており、ADドメイン内での名前解決をサポートします。

機能:
- 名前解決: ホスト名（例: server.local）をIPアドレスに変換する。
- リバースルックアップ: IPアドレスをホスト名に変換する。
- Active Directoryとの連携: ADのドメイン名やリソースレコードの自動登録と管理を行う。
```

今回は、ADやDNSにある程度慣れている方向けの内容となります。

:::note warn
基本的な前提知識については、以下のサイトをご参照ください。

**Active Directoryについて**
参考サイト：https://business.ntt-east.co.jp/content/cloudsolution/column-498.html
参考サイト：https://www.sbbit.jp/article/cont1/37798

**DNSについて**
参考サイト：https://www.xdomain.ne.jp/column/about-dns/
参考サイト：https://xtech.nikkei.com/it/article/COLUMN/20060414/235341/

**ドメイン参加について**
参考サイト：https://www.buffalo.jp/support/faq/detail/16331.html
公式サイト：https://learn.microsoft.com/ja-jp/windows-server/identity/ad-fs/deployment/join-a-computer-to-a-domain

**ドメインコントローラー について**
参考サイト：https://jousys-force.deepapex.com/blogs/domain-controller
参考サイト：https://atmarkit.itmedia.co.jp/ait/articles/1405/26/news024.html

**AlmaLinuxについて**
詳細サイト: https://www.designet.co.jp/ossinfo/almalinux/
公式サイト: https://almalinux.org/ja/
:::

## 構築の流れ

構築手順については前回の記事で説明していますので、興味のある方はそちらをご参照ください。
[Windows Server 2022で自宅ネットワークにADサーバーを構築し、Windows 10端末をドメインに参加させる方法](https://qiita.com/free-honda/items/2fcdc8343aa878c17d9e)

:::note info
ここでは、Windows Server 2022でのADサーバーの構築が完了している前提で、後続の手順をご紹介します。
**ステップ1：必要なパッケージのインストールとネットワーク設定**
**ステップ2：ADドメインへの参加と動作確認**
:::

LinuxクライアントをADドメインに参加させるための手順を、大きく2つのステップに分けて解説します。

## ステップ1：必要なパッケージのインストールとネットワーク設定
**パッケージのインストール**
ADドメインに参加するために必要なパッケージをインストールします。これにより、ADとLinuxクライアント間の通信や認証が可能になります。

**Ubuntuの場合:**
```
sudo apt update
sudo apt install realmd sssd sssd-tools adcli krb5-user packagekit
```
**CentOS/RHELの場合:**
```
sudo yum install realmd sssd oddjob oddjob-mkhomedir adcli samba-common-tools krb5-workstation
```

これらのパッケージには、以下の機能があります。

```
realmd: ADドメインに参加するためのツール。
sssd: 認証情報の管理を行うデーモン。
adcli: ドメインに参加するためのCLIツール。
krb5-user: Kerberos認証に必要なライブラリ。
```

:::note info
**DNS設定の確認・修正**
ADドメインコントローラーと通信できるように、LinuxマシンのDNS設定を行います。これにより、ADサーバーの名前解決が可能になります。
:::

/etc/resolv.confファイルを編集し、DNSサーバーのIPアドレスを追加します。 私の環境では、プライマリーDNSにADドメインコントローラーのIPアドレスを設定しました。
```
vi /etc/resolv.conf
```
**設定例:**

```/etc/resolv.conf
# Generated by NetworkManager
nameserver <ADドメインコントローラーのIPアドレス>
nameserver 192.168.1.1
```

※/etc/resolv.conf編集後も、NetworkManager によってこの設定が上書きされることがありますので、上書きを防ぐための設定を以下に紹介します。
```
sudo vi /etc/NetworkManager/NetworkManager.conf
```
[main] セクションに次の行を追加します。この設定により、NetworkManager が DNS 設定を管理しなくなります。
```/etc/NetworkManager/NetworkManager.conf
[main]
dns=none
```

設定を変更した後、NetworkManager を再起動して変更を反映させます。
```
sudo systemctl restart NetworkManager
```

DNSのキャッシュをクリアするために、以下のコマンドを使用しました。
```
sudo systemctl restart dnsmasq
```

/etc/resolv.conf ファイルが正しく設定されていることを確認し、NetworkManager やその他のネットワークサービスを再起動して、設定変更を適用します。
```
sudo systemctl restart NetworkManager
```

**名前解決のテスト(ADサーバーとの接続確認)**
DNS 設定が正しく反映されているか確認するために、以下のコマンドで名前解決をテストします。
```
ping <ADドメイン名>
```

## ステップ2：ADドメインへの参加と動作確認
必要なパッケージがインストールされ、ネットワークが構成されたら、realmdを使用してLinuxマシンをADドメインに参加させます。

**ADドメインへの参加**
まず、ドメインを検出するには以下のコマンドを実行します。
```
realm discover <ドメイン名>
```

**コマンド実行結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/581e533b-f684-b11a-95f0-2b3445d3275f.png)

次に、ADドメインに参加するには以下のコマンドを実行します。
```
sudo realm join --user=<AD管理者アカウント> <ドメイン名>
```
**コマンド実行結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9b408b5d-794a-629f-a61c-d12f1822b897.png)

ドメインの管理者アカウントで認証し、パスワードを入力してエンターを押してください。

 ## 検証結果
ここまでの手順での検証結果を、ADサーバーに対してLinuxクライアント端末から確認していきます。

 **ドメイン参加の確認**
ADドメインへの参加が正しく完了したかどうかを確認します。以下のコマンドで参加中のドメインを確認できます。
```
realm list
```
**コマンド実行結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/6265fdd5-cc37-c601-55d7-686994905295.png)

:::note info
私のLinuxサーバーが「honda.co.jp」というドメインに参加していることが確認できました。
:::

次に、ADサーバーからの確認も行います。Linuxクライアント端末のドメイン参加前の状態は以下の通りで、Windows 10端末1台のみが参加している状況です。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f333636323537312f31353836376133612d346137632d623539612d393863612d6639633830343866636338332e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/846a7f0a-9c84-5d64-da3e-b59c037a2c30.png)

「honda.co.jp」のドメインに参加後の状態は以下の通りで、正常に参加できていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/6869d419-37c9-b775-7d21-2d85092bb26e.png)


## まとめ
LinuxサーバーをADドメインに参加させるためには、まず必要なパッケージをインストールし、DNS設定を正しく行いました。次に、realmコマンドを使ってADドメインを検出し、ドメインに参加させました。

参加後は、realm listコマンドでドメイン参加の確認を行い、ADサーバー側でもLinuxクライアントの参加状況を確認しました。最終的に、ADドメインに正しく参加していることが確認できれば、今回の構築は成功と言えそうです。

Linuxサーバーのドメインに参加の動作確認もこれでばっちりですね！


## 参考記事
https://qiita.com/TakSewo/items/b870e45ee9b72d6b0ad3

https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/integrating_rhel_systems_directly_with_windows_active_directory/proc_joining-samba-to-a-domain_connecting-rhel-systems-directly-to-ad-using-samba-winbind

https://ryuichi1208.hateblo.jp/entry/2018/03/12/000000

https://tamnology.com/linux001/