Linux のログイン認証に Active Directory を使う

Linux の認証に Active Directory を使うよう設定することがありました。 備忘録としてまとめておきます。

何ができるようになるのか

今回は WinBind という Samba のコンポーネントを使って Linux と Active Directory を連携させます。 これを使用すると Linux 上のユーザー/グループ管理に Active Directory を用いることができるようになります。 具体的には以下のことができるようになります。

  • Active Directory に登録されたアカウントとグループを使って Linux にログインすることができるようになります。
  • 事前に個々のユーザーを各 Linux サーバーへ登録する必要はありません。 /etc/passwd や /etc/groups は全くいじりません。 また、ホームディレクトリは sshd 等で最初にログオンしたときに自動生成されます。
  • Active Directory の RID をそのまま uid/gid として用います。 これにより、複数の Linux サーバー上でも一意の uid/gid を使ってユーザー/グループを識別することができます。
  • passwd コマンドを使って Active Directory に登録されているパスワードを変更できます。

uid/gid の扱いについて補足します。 Active Directory 上のユーザー/グループを Linux 上の uid/gid にマップさせる方法はいくつか用意されていますが、今回は Active Directory の RID (SID のドメイン内相対識別部分) を用いる方法を採用します。 idmap_rid と呼ばれる方法です。 ただし、マルチドメイン環境では RID は一意にならないため、シングルドメイン環境での運用が前提となります。 マップ方法にはその他にも tdb (テーブルによるマッピング。デフォルトの方法) や ad (AD 上のユーザー属性を読む。いちいち属性を設定しなければならず管理が面倒) 等があります。 信頼関係を構築していたりマルチドメイン環境ではこれらが必要となりますので興味があれば調べてみてください。

設定方法

設定方法については実は Microsoft の「Active Directory を使用して Linux クライアントを認証する」という記事に詳しく解説されています。 ビルドの部分は飛ばして良いので、まずこれを読んでいただければと思います。 ここではこの記事を補足のみ書きます。

DNS 関連

DNS は Windows ドメインの名前が引けるように /etc/resolv.conf を設定しなければなりません。 一番簡単なのは DNS として Windows のドメインコントローラーをしてしまうことでしょうが、環境によっては DNS サーバーの構成を見直す必要が出てくるかもしれませんね。 また、ホスト名はきちんと設定しておきましょう。 「localhost」という名前のコンピューターが AD に登録されてしまった、などということのないように…。

ホームディレクトリの自動作成

先に紹介した Microsoft の記事中 /etc/pam.d/system-auth の pam_mkhomedir の umask の指定はちょっと怪しい感じがします。 例えば自分のみアクセス可能 (700) なホームディレクトリを作成するには以下のようにします。

session     optional      pam_mkhomedir.so skel=/etc/skel umask=0077

krb5.conf の設定

system-config-authentication を実行した後は krb5.conf で kdc = * となってしまうと思いますが、このままではまずいようです。 以下のようにドメイン名を指定します。

[realms]
 EXAMPLE_DOMAIN.LOCAL = {
  kdc = example.local
 }

Windows の DNS にはドメイン名の A レコードも用意されており、ドメインコントローラーのホスト名を使うよりもこの例のようにドメイン名を使った方が可用性が高くなります。 (マニュアルを見るとこのケースは設定がなくても動作しそうですが、未検証です)

端末エミュレータ上で動作する設定ツール

先の記事では system-config-authentication が使用されていますが、X が利用できない場合、authconfig-tui や authconfig コマンドを利用することができます。 下は authconfig-tui の画面です。

authconfig-tui

ID マップについて

ID のマップについてもう少し詳しく説明します。 Windows の RID とは SID の一部でそのドメインの中で一意となるオブジェクトの識別子です。 Windows で通常発行される RID は 500 以降なのでそれをそのまま uid/gid 使います。 以下は SID の例ですが、このうちの最後の 500 が RID となります。 RID はユーザー/グループ等のオブジェクトが作成されるたびに連番で割り当てられていきます。

S-1-5-21-917267712-1342860078-1792151419-500

以下は 500 以上の RID についてそのまま uid/gid としてマップするための smb.conf の設定です。

idmap domains = EXAMPLE_DOMAIN        (samba 3.3 以降はこの行は削除)
idmap config EXAMPLE_DOMAIN:backend   = rid
idmap config EXAMPLE_DOMAIN:base_rid  = 500
idmap config EXAMPLE_DOMAIN:range     = 500 - 10000

今回はこの RID をそのまま uid/gid として使いますが、もちろん Linux のローカルユーザー/グループと衝突しないようにしなければなりません。 すなわち 500 以上の uid/gid は Linux システム上に存在していないという前提です。 もし、Linux 上のローカルアカウントで 500 以上の uid/gid も使うのであれば range をうまく調整する必要があります。 「Administrator (= 500) のマップなど不要!」というケースは多いかも知れませんが、ログイン時に所属グループがきちんと gid にマップできないとログインできないので、’Domain Users’ (= 513) がマップできないと恐らく困ると思います。

うまく行けば id コマンドで以下のようにユーザー情報を取得できるようになるはずです。 AD 上に RID = 1110 で ad_user というアカウントが登録されている想定です。

$ id ad_user
uid=1110(ad_user) gid=513(domain users) 所属グループ=513(domain users) context=user_u:system_r:unconfined_t

ちょっと考えればわかりますが、そのままでは AD ユーザー全員がログインできるようになってしまいます。 アクセス制御は Windows のグループを用い、認証を行う各サービスで適切に行わなければなりません。 例えば ssh ログインを制限するのであれば /etc/ssh/sshd_config に AllowGroups の設定を入れます。 あるいは pam_winbind のオプションに require_membership_of というパラメータがあるので、これを使ってそもそもの連携するグループを絞ってしまっても良いかもしれません。(ただし動作未検証)

ちなみに smb.conf の設定ではネストされたグループの扱いのためのフラグもあります。 デフォルト値は Yes です。

winbind nested groups = Yes

Linux と Windows の混在環境では、このように Active Directory を活用することができます。 一発でうまく設定できないかも知れませんが、ハマった時は一時的に tdb を利用して問題を切り分けしてみると良いと思います。