🏀

LinuxサーバーをActive Directoryで管理してみる

に公開

はじめに

プログデンスの佐藤です。

今回は、自宅ラボで複数のLinuxサーバーとWindowsサーバーを運用していて

  • 「このサーバーに作ったユーザーって何だっけ?」
  • 「またパスワード管理か...」
    といった悩みが日常茶飯事になってきたため、Active DirectoryでLinux環境も含めて統合認証を実現し、ユーザー/パスワード管理の煩雑さから解放された話をお届けします。

背景・課題

上述の通り、自宅ラボにLinux/Windows混在でサーバーが多く、構築時や運用時のユーザー管理が悩ましくなってきます。
推奨できるやり方ではありませんが、検証用途であると割り切って、パスワードを簡単なものにして使い回すという方法もありますが、
困ったことにそれでもパスワードを忘れます。

もはや課題は別のところにある気もしていますが、Active DirectoryでLinux環境も含めて統合認証を実現できたことを書いていきたいと思います。

今回の環境について

今回の舞台である自宅ラボの環境は以下のようになっています。

LinuxサーバーをActive Directoryに参加させるために、いくつかの技術要素を理解する必要があります。
なお、本記事ではLinuxのディストリビューションにAlmaLinuxを使用しています。

AD(Active Directory)とは

ADはMicrosoftがWindowsサーバーで提供するコンピューター、ユーザー、プリンター、アプリケーション等のリソースを一元的に管理するディレクトリサービス機能です。
そのため、多くの企業では社内でよく利用されています。最近ではリモートワークの普及とも相まって、パブリッククラウドのAzure Active Directoryも利用されていますが、そのオンプレミス版となります。

SSSD(System Security Services Daemon)によるAD参加の仕組み

今回はWinbindは使用せず、SSSDを使用して、直接ADに参加させています。
そのため、AD参加にあたり、下記の要素が存在します。

  1. SSSD
  2. AD/Kerberos認証

SSSDが担う役割

1. プロトコル変換

LinuxとADではプロトコルが異なるため、以下サービスの間で仲介役としてSSSDが動作します:

  • Linux: NSS(Name Service Switch)、PAM(Pluggable Authentication Modules)
  • Active Directory: LDAP、Kerberos

2. システムサービスとの連携

Linuxのシステム内部において、NSSやPAMを統合し、システム間の連携を担います:

  • NSS: id user01 コマンドでADユーザー情報を表示
  • PAM: ログイン時のパスワード認証をADに転送

3. 認証情報の取得とキャッシュ

SSSDは認証した情報のキャッシュも行います:

[初回アクセス時]
Linux → SSSD → Active Directory(LDAP検索)
「user01の情報を教えて」→「UID:10001, GID:10001, ホームディレクトリ:/home/user01」
[2回目以降]  
Linux → SSSD(キャッシュから即座に回答)
「user01の情報を教えて」→「UID:10001, GID:10001...(キャッシュより)」

Kerberos認証の役割

AD環境において、Kerberos認証は認証基盤として動作します。

Kerberos認証の基本的な仕組み

Kerberos認証は「チケット」という概念を使った認証方式で、一度認証を通せば、複数のサービスにパスワードを入力せずにアクセスできる、いわゆる SSO(Single Sign-On) を実現することができます。

Kerberos認証では以下2つの「チケット」を使用して認証を行います:

  • TGT(Ticket Granting Ticket)
    初回の認証が成功した際に受け取るチケットであり、このチケットが無いとAD環境内の他サービス(ファイルサーバー等)にアクセスすることができません。

  • TGS(Ticket Granting Service)
    TGTを持つクライアントが他サービスにアクセスし、アクセス許可を得られた際に受け取るチケットになります。ここでの動作が実質的にSSOとなります。

身近な例で例えると、以下のような流れになります:

[1] TGT取得フェーズ

Linux Client → KDC(AD): 「user01でログインしたい」
KDC → Linux Client: 「TGT(認証済み証明書)を発行するよ」

[2] サービス利用フェーズ

Linux Client → KDC: 「ファイルサーバーにアクセスしたい(TGT提示)」
KDC → Linux Client: 「TGS(サービス利用券)を発行するよ」
Linux Client → File Server: 「アクセスします(TGS提示)」
File Server: 「どうぞ!」

実際の認証フロー

AD参加前後の認証の流れの違い

まず、AD参加前後で認証の流れが以下のように変わります。

参加前(ローカル認証)
ユーザーログイン:SSH → ローカル認証(/etc/passwd確認 → /etc/shadow確認) → 認証OK/NG

参加後(AD統合認証)
ユーザーログイン:SSH → SSSD → AD → Kerberos認証 → 認証OK/NG

SSSDがキャッシュに保存(次回高速化)

realmとSSSDによるADへの参加

SSSDを使用してのADに参加しますが、実際にはrealmを使用します。
realmを利用することで、AD参加に必要な/etc/sssd/sssd.conf等の設定情報も自動生成されます。

realmとSSSDを使用して、ADに参加する手順は以下のようになります。

① 必要パッケージのインストール
> sudo dnf -y install realmd sssd oddjob oddjob-mkhomedir adcli samba-common-tools krb5-workstation
(snip)
>
② ADへ参加
$ realm discover example.localdomain
  example.localdomain
    type: kerberos
    realm-name: EXAMPLE.LOCALDOMAIN
    domain-name: example.localdomain
    configured: no
    server-software: active-directory
    client-software: sssd
    required-package: oddjob
    required-package: oddjob-mkhomedir
    required-package: sssd
    required-package: adcli
    required-package: samba-common-tools
    login-formats: %U@example.localdomain
    login-policy: allow-realm-logins
$ sudo realm join example.localdomain -U <ADの管理ユーザー>
$
$ realm discover example.localdomain
  example.localdomain
    type: kerberos
    realm-name: EXAMPLE.LOCALDOMAIN
    domain-name: example.localdomain
    configured: kerberos-member ★configuredがno->kerberos-memberに変わる
    server-software: active-directory
    client-software: sssd
    required-package: oddjob
    required-package: oddjob-mkhomedir
    required-package: sssd
    required-package: adcli
    required-package: samba-common-tools
    login-formats: %U@example.localdomain
    login-policy: allow-realm-logins
$
$ id user01@example.localdomain ★ADユーザー情報が取得できる
  uid=595001000(user01@example.localdomain) gid=595000512(domain admins@example.localdomain) 
  groups=595000512(domain admins@example.localdomain),595000513(domain users@example.localdomain),
  595000572(denied rodc password replication group@example.localdomain)
$
③ユーザー名だけでログインできるように設定を変更
$ cat /etc/sssd/sssd.conf

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

[domain/example.localdomain]
default_shell = /bin/bash
krb5_store_password_if_offline = True
cache_credentials = True
krb5_realm = EXAMPLE.LOCALDOMAIN
realmd_tags = manages-system joined-with-adcli
id_provider = ad
fallback_homedir = /home/%u@%d
ad_domain = example.localdomain
use_fully_qualified_names = False ★ここをTrue -> Falseに変更する
ldap_id_mapping = True
access_provider = ad
$
$ systemctl restart sssd
$
④ ログインして、ユーザーディレクトリが作成されることを確認
$ ls -l /home
合計 0
drwxr-xr-x.  3 root   root           35 121  2024 .
dr-xr-xr-x. 19 root   root          247 1117  2024 ..
drwx------.  5 user01 domain users  140  721 22:06 user01@example.localdomain

AD参加により可能なこと

ADユーザーとADグループを指定できる

Linux上でADユーザーとADグループを指定できるため、以下のようなことも可能です。

sudo(管理者権限)設定

ADユーザー又はADグループに対しても通常のユーザーやグループ同様にsudoの実行権限を付与することが可能です。
書き方にパターンがいくつかありますが、以下のように/etc/sudoersファイルを編集するか、/etc/sudoers.d/配下に同様の記載をしたファイルを配置します。
① ユーザーに対して権限を付与する場合

[ユーザー名]@[ADドメイン] ALL=(ALL) ALL
[ユーザー名] ALL=(ALL) ALL ★FQDNの使用を無効にしている場合はADドメインは不要

② グループに対して権限を付与する場合

%[ADグループ]@[ADドメイン] ALL=(ALL) ALL

Domain Adminsのようにスペースを挟むグループ名の場合は""(ダブルクォーテーション)で囲みます。

"%Domain Admins@[ADドメイン]" ALL=(ALL) ALL

ディスククォータ

個人で使用する分にはさほど気にすることはないですが、共用サーバーのように複数ユーザーが利用する環境では気づかないうちにディスクやディレクトリを圧迫します。
ディスククォータもsudoers同様にADユーザー又はADグループ単位で指定できるようになります。

$ sudo xfs_quota -x -c 'report -ug /home'
User quota on /home (/dev/mapper/almalinux-home)
                               Blocks
User ID          Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
root                0          0          0     00 [--------]
user01             64          0          0     00 [--------]

Group quota on /home (/dev/mapper/almalinux-home)
                               Blocks
Group ID         Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
root                0          0          0     00 [--------]
domain admins      64          0          0     00 [--------]

AD参加後のメリット

ここまで記載した内容でLinuxサーバーは晴れて、ADに参加できました。
やや仰々しい書き方になりますが、以降はADに参加することによって、得られるメリットの紹介となります。

運用面での利点

最もわかりやすい点としては、Windows OS同様にユーザーを作成する必要が無くなります。
パスワードもADユーザーのパスワードで認証可能なため、初期パスワードを発行して、初回ログイン時にパスワードを変更…といった手間も不要です。非常に地味なところですが、楽です。

セキュリティ面での利点

ADに参加することで、Linuxにログインする場合はローカルのユーザーではなく、ADユーザーとなります。その結果、ユーザーが乗っ取られることはなくなります。
/etc/passwdにも/etc/groupにもADユーザーやADグループは存在していません。

$ sudo cat /etc/passwd | grep -i "user01"
$
$ sudo cat /etc/group | grep -i "domain"
$

もちろん、SSSDは認証情報を一時的にキャッシュしていますし、ユーザーディレクトリに保存されているような情報は除きます。

まとめ

冒頭で書いていたように、LinuxサーバーをADで管理できないかという思いに至ったのは、パスワードを忘れたり、ユーザーを忘れたりして、サーバーの作り直しを繰り返していた状況をどうにかしたかった、という非常に片付けができないものぐさな理由でした。

そんな出だしだったため、以下のような頭を悩ませるトラブルを人知れず繰り返していました:

ただ、結果的に思っていた以上にサーバーの管理は楽になっています。
加えて、トラブルシュートの中で多少なりともLinuxにおける認証やAD…特にKerberos認証については理解が深まりました。

次回は、上記トラブルの詳細とAD管理での利点をサーバーの半自動デプロイを絡めた内容を書いてみようと思っています。

末筆ですが、最後までお読みいただき、ありがとうございました。

株式会社プログデンス
設定によりコメント欄が無効化されています