海馬のかわり

最近記憶力に難がある、地方在住サーバエンジニアの備忘録です。

ADのアカウントでLinuxサーバにログインする

■趣旨
Active Directoryのアカウントで、Linuxサーバへログインする。
ただし以下の設定は既存のまま変更しない。

  • ホスト名
  • DNS

また以下の要件を満たす事。

  • 各サーバでアカウントのUID/GIDを統一する。

->ADアカウントのRIDをキーとして使用する

  • 特定グループに所属するアカウントのみログインを許可する


■検証環境
ドメイン名:EXAMPLE.LOCAL

  • ADサーバ

OS: Windows Server 2008 Standard (x86_64)
ホスト名: dc.example.local
IPアドレス: 10.0.0.1

OS: CentOS 5.6 (x86)
ホスト名: sysa-web01.localdomain
IPアドレス: 10.0.0.2

■設定手順
1.必要パッケージのインストール

  • samba-common
  • samba-client
# yum install samba-common samba-client

2.winbind認証設定

# authconfig \
 --enablewinbind \
 --enablewinbindauth \
 --smbsecurity=ads \
 --smbworkgroup=EXAMPLE \
 --smbrealm=EXAMPLE.LOCAL \
 --smbservers=dc.example.local \   # ※1
 --enablewinbindusedefaultdomain \ # ※2
 --winbindtemplatehomedir=/tmp \   # ※3
 --winbindtemplateshell=/bin/bash \
 --enablelocauthorize \
 --update

※1 カンマ区切りで複数指定可。hostsへ対応する名前を記述する。
※2 ドメイン名自動補完設定。[EXAMPLE\testuser001]のような入力が必要無くなる。
※3 ログイン時に自動的にホームディレクトリを作りたいならこのあたりを参照

3.samba設定

# cp -p /etc/samba/smb.conf /etc/samba/smb.conf.org
# vi /etc/samba/smb.conf
---
#idmap uid = 16777216-33554431
#idmap gid = 16777216-33554431
idmap domains = EXAMPLE
idmap config EXAMPLE: default = yes
idmap config EXAMPLE: backend = rid
idmap config EXAMPLE: range = 10000-19999
idmap alloc config: range = 10000-1999
---

※デフォルト設定をコメントアウトし、上記行を追記(77行目付近)

上記は各LinuxサーバでUID/GIDの整合性を取るための設定
通常は各サーバのwinbindが早いもの順でUID/GIDを割り当てるため、同一ユーザでもサーバ毎にUID/GIDが異なる。

これをWindowsアカウントのSIDの末尾4ケタ(RIDと呼ばれる部分)+指定レンジ(10000-19999)を足し合わせたものをUID/GIDとする設定を行う。

こうする事で各サーバ間でUID/GID割り当てルールを統一される。

■参考
RIDの確認方法

# id testuser001
uid=11110(testuser001) gid=10513(domain users) 所属グループ=10513(domain users),11113(operator)

※この場合、11100がwinbindの割り当てたUID
# wbinfo -U 11110
S-1-5-21-2966872847-1102543892-2619680819-1110

※アカウントのSIDを取得するコマンド。最後の4ケタ(1110)がRID
※上記割り当てルールでは、これに10000を足し合わせた11110がこのユーザーのUIDとなる。
# wbinfo -G 11113
S-1-5-21-2966872847-1102543892-2619680819-1113

※グループのSIDを取得するコマンド。最後の4ケタ(1110)がRID
※当該グループ(operator)も同様のルールで割り当てられている事が確認できる。


4.hostsへドメイン名を追加。
既存ホスト名を変更する必要はなし。

# cp -p /etc/hosts /etc/hosts.20120112
# vi /etc/hosts
---
10.0.0.1	DC.EXAMPLE.LOCAL DC                 # ※1 
10.0.0.2	SYSA-WEB01.EXAMPLE.LOCAL SYSA-WEB01 # ※2 
---

※1 AD名前解決用。複数ある場合はその数だけ記載する。
※2 ADでの、このホストのFQDN

5.ドメイン参加

# net join -U Administrator
administrator's password:
Using short domain name -- EXAMPLE
DNS update failed!                          # ※1 
Joined 'SYSA-WEB01' to realm 'EXAMPLE.LOCAL'

※1 ADをDNSとして設定していない為に出るエラーだが認証させるだけなら問題ない?
# /etc/init.d/winbind restart

ADのユーザー/コンピューター管理ツールにて当該ホスト名のComputerが追加されたことを確認する
f:id:extrea:20120113172558p:plain

6.特定グループユーザのみアクセス許可設定
現状では全ドメインユーザーがアクセスできるため、特定グループのみ
ログイン可能とする。(本ケースではoperatorグループのSIDを追記)

# cp -p /etc/pam.d/system-auth /tmp
# vi /etc/pam.d/system-auth
# diff -wb /tmp/system-auth /etc/pam.d/system-auth
7c7
< auth        sufficient    pam_winbind.so use_first_pass
---
> auth        sufficient    pam_winbind.so use_first_pass require_membership_of=S-1-5-21-2966872847-1102543892-2619680819-1113

※許可するグループとして、SIDにて記述することで「半角スペースを含むグループ名」でも指定できる。
(一応、今回のグループ名ならそのまま「operator」と記述しても可)

7.連携テスト
・Kerberos認証

# kinit testuser001; echo $?

※正常終了する事

・winbind連携

# id testuser001

※ユーザ情報が表示されること

・ログイン認証

# ssh localhost -l testuser001

※正常にログイン出来ること。ユーザはあらかじめAD上に作成しておく。

■その他

  • winbindにてSID / UID,GID間の紐付けがおかしくなった場合の対処方法

smb.confにてidmapのUID/GID発番Rangeを変更した場合など、以前割り当てられたUID/GIDをキャッシュをクリアしたいなあという時に。

以下にキャッシュが存在するため、ディレクトリごと削除

# rm -rf /var/cache/samba
# /etc/init.d/winbind restart
  • SSHなどのログイン履歴はイベントログから拾えるようになる。

f:id:extrea:20120113172700p:plain

以上