SSSDとrealmdでLinuxサーバーをActive Directoryに参加させる完全手順ガイド

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

25台や50台ものサーバーに個別のローカルアカウントをプロビジョニングするのは、膨大な運用コストがかかります。新しいエンジニアが入社するたびに、すべてのインスタンスでアカウントを作成し、UIDを割り当て、SSH公開鍵を配布しなければなりません。また退職時には、分散したサーバー群から該当ユーザーの資格情報を監査・削除する必要があり、設定漏れやミスを引き起こす原因となります。

Linuxサーバー群をMicrosoft Active Directory(AD)に連携させれば、こうした運用オーバーヘッドを解消できます。エンジニアは既存のドメイン資格情報を使ってログインでき、セキュリティチームは単一のディレクトリ管理コンソールからアカウントとアクセス制御ポリシーを一元管理できるようになります。本記事では、realmdとsssdを使用して、Ubuntu、Debian、およびRHELベースのシステムをADドメインに参加させる方法を解説します。

クイックスタート(5分以内で完了)

ここでは、ドメインコントローラー(DC)のIPアドレスが192.168.10.15で、ドメイン名がcorp.example.comである環境を前提とします。Linuxサーバーから対象のDCに対して、DNS(53)、Kerberos(88)、LDAP(389)などの標準ポートで通信できる必要があります。

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

Ubuntu 22.04またはDebian 12では、aptキャッシュを更新してドメイン参加に必要なユーティリティをインストールします。

sudo apt update
sudo apt install -y realmd sssd sssd-tools adcli samba-common-bin oddjob oddjob-mkhomedir packagekit

RHEL 9、Rocky Linux 9、またはAlmaLinux 9では、dnfを使用して対応するパッケージをインストールします。

sudo dnf install -y realmd sssd adcli samba-common-tools oddjob oddjob-mkhomedir krb5-workstation

2. ドメインの検出

LinuxマシンがSRVレコードを解決でき、ドメインコントローラーに正常に到達できるか確認します。

realm discover corp.example.com

実行結果には、検出されたドメイン名、推奨クライアントソフトウェア(sssd)、不足している依存関係が表示されます。もし検出処理が停止したりNXDOMAINエラーが返されたりする場合は、/etc/resolv.confを確認してください。ホストのDNS設定が、DCまたはADレコードを適切に処理できる内部DNSリゾルバーを直接参照している必要があります。

3. ドメインへの参加

AD内でコンピューターオブジェクトを作成する権限を持つアカウントで認証を行います。

sudo realm join -U srv-join-admin corp.example.com

プロンプトが表示されたら、サービスアカウントのパスワードを入力します。コマンドが正常に完了した場合は何も出力されず、デフォルトのCN=Computersコンテナ内にマシンアカウントが作成されます。

4. ユーザー解決の確認

SSSDがADからID情報を直接取得できることを確認します。

id [email protected]

ドメイン参加が成功していれば、uid=1844800500([email protected]) gid=1844800513(domain [email protected]) groups=...のようなPOSIX属性が出力されます。SSSDはアルゴリズムに基づいたマッピングによって、これらの数値IDを自動生成します。

内部の仕組みとコンポーネント

クイックスタートの手順で迅速に認証を稼働させることができますが、主要な構成要素の役割を理解しておくことで、本番環境のメンテナンスやトラブルシューティングが格段に容易になります。

realmd、SSSD、Kerberosの連携関係

ドメイン連携は主に3つのレイヤーで成り立っています。

  • realmd:D-Bus連携ユーティリティ。初回ハンドシェイクを処理し、adcliを介してDCと通信し、keytabエントリを生成して基本的なSSSD設定を書き込みます。
  • sssd:NSSによるID検索とPAM認証リクエストを処理するバックグラウンドデーモン。ディレクトリクエリを/var/lib/sss/db/配下のLDBデータベースにローカルキャッシュするため、WAN障害時でもユーザーはログインを継続できます。
  • Kerberos(krb5)および adcli:Kerberosはチケット交付(TGT)と暗号検証を担当します。また、adcliはADに対してホストマシンアカウントのパスワードを30日ごとに自動ローテーションします。

/etc/sssd/sssd.conf のチューニング

初期設定時、/etc/sssd/sssd.confは厳格なパーミッション(モード0600、所有者root:root)で作成されます。ログオン動作をカスタマイズするには、このファイルを編集します。

sudo nano /etc/sssd/sssd.conf

以下は、本番環境で実証済みの推奨設定例です。

[sssd]
domains = corp.example.com
config_file_version = 2
services = nss, pam

[domain/corp.example.com]
default_shell = /bin/bash
krb5_store_password_if_offline = True
cache_credentials = True
krb5_realm = CORP.EXAMPLE.COM
realmd_tags = manages-system joined-with-adcli
id_provider = ad
fallback_homedir = /home/%u
ad_domain = corp.example.com
use_fully_qualified_names = False
ldap_id_mapping = True
access_provider = ad

use_fully_qualified_names = Falseに設定すると日常の作業がシンプルになります。ユーザーは[email protected]ではなくjdoeとしてログインできるようになり、@記号をうまく扱えないスクリプトやツールとの互換性も維持されます。また、fallback_homedir = /home/%uを設定することで、ホームディレクトリのパスをすっきりと分かりやすい構造に保てます。

設定の変更を保存したら、デーモンを再起動します。

sudo systemctl restart sssd

初回ログイン時のホームディレクトリ自動作成

ADオブジェクトにはネイティブなLinuxホームディレクトリのパス情報が含まれていません。自動作成フックを設定していない場合、ユーザーログイン時にNo home directory, logging in with HOME=/というフォールバック警告が表示されてしまいます。

UbuntuおよびDebianでは、PAMのホームディレクトリ作成モジュールを有効化します。

sudo pam-auth-update --enable mkhomedir

RHEL 9およびRocky Linuxでは、authselectを使用してこの機能を有効にし、ヘルパーサービスを起動します。

sudo authselect select sssd with-mkhomedir --force
sudo systemctl enable --now oddjobd

本番環境におけるアクセス制御

許可されたグループへのSSHアクセス制限

ドメインに参加させた直後の状態では、認証されたすべてのADユーザーに対話型セッションの開始が許可されていることが少なくありません。本番環境のデータベースノードやアプリケーションノードでは、指定された運用チームのみにアクセスを制限すべきです。

ログインを許可する対象を制御するにはrealm permitを使用します。

# デフォルトですべてのドメインアカウントを拒否
sudo realm deny --all

# 特定のActive Directoryセキュリティグループを許可
sudo realm permit -g "Linux Engineers"

# 緊急用の個別ユーザーを許可
sudo realm permit srv-auditor

このコマンドを実行すると、/etc/sssd/sssd.conf内のad_access_filterまたはsimple_allow_groupsパラメータにフィルターが挿入されます。ホワイトリストに含まれていないアカウントは、PAMステージでアクセス拒否エラーとなりログインが遮断されます。

ADグループへのsudo権限の委任

ドメインアカウントを/etc/sudoersに直接追記することは避けてください。代わりに、/etc/sudoers.d/配下に専用の設定ファイルを配置します。

構文チェックが有効な状態で専用の設定ファイルを開きます。

sudo visudo -f /etc/sudoers.d/ad-linux-engineers

スペースをバックスラッシュでエスケープして、次のルールを追加します。

%Linux\ Engineers ALL=(ALL:ALL) ALL

SSSDでuse_fully_qualified_names = Trueのままにしている場合は、完全なレルムサフィックスを指定してください。

%Linux\ [email protected] ALL=(ALL:ALL) ALL

保存して終了します。visudoはディスクへ書き込む前に構文を検証するため、タイポによってシステム全体のsudoが動作しなくなるトラブルを防止できます。

トラブルシューティングと運用のヒント

Kerberosの時刻同期ズレ(Clock Skew)への注意

クライアントとDCの間で時刻が300秒(5分)を超えてズレている場合、Kerberosはチケットを拒否します。この時刻ズレが発生すると、Clock skew too greatというエラーが発生し、即座に認証に失敗します。

ホストをchronyを使用して内部のPDCエミュレーターまたはローカルNTPアプライアンスと同期させます。同期ステータスは以下で確認できます。

chronyc sources -v
timedatectl status

古いグループ所属情報のキャッシュクリア

SSSDはドメインコントローラーへのネットワーク負荷を軽減するため、IDオブジェクトをキャッシュします。「Active Directory ユーザーとコンピューター」(ADUC)でエンジニアをLinux Engineersグループに追加した場合、ローカルサーバーに反映されるまで数分かかることがあります。変更を即座に反映させるには、ローカルキャッシュをクリアします。

sudo sss_cache -E
sudo systemctl restart sssd

導入作業中のセッション遮断対策

認証設定を変更するとPAMパイプラインが直接影響を受けます。設定を一つ誤るだけで、SSHから完全に締め出されるリスクがあります。

本番環境で認証周りを設定する際は、以下の3つの防御策を徹底してください。

  • すべての動作確認が完了するまで、別のターミナルウィンドウでアクティブなrootセッションを開いたままにしておく。
  • /etc/passwdに登録されているローカル管理者アカウントのパスワードが確認済みであり、正常にsudoアクセスできる状態であることを確認しておく。
  • テストログインの実行中は、/var/log/auth.log(Ubuntu/Debian)または/var/log/secure(RHEL/Rocky)をtailでリアルタイム監視し、失敗したPAMモジュールやKerberosの拒否コードを即座に把握できるようにする。
Share: