LinuxをActiveDirectoryドメインに参加させる

#やりたいこと
LinuxへActive Directoryのアカウントでログインできるようにしたい。
統合認証とかいうやつです。

#システム概要
・ドメインコントローラ
  －OS                   :Windows Server 2012 R2 Standard
  －フォレストの機能レベル :Windows Server 2012 R2
  －ドメインの機能レベル   :Windows Server 2012 R2

・メンバサーバ（Linux）
　－OS　　　　　　　　　　　：RHEL6

#方式について
色々な方式があります。
色々調べたところ、SSSDというものを使う方式がRedHat的におすすめのようです。
今回は古い手法ですが、samba+winbindでのLinuxドメイン参加となります。

#前提条件
##ドメイン参加時の注意点
ホスト名が16文字以上だとドメイン参加時にエラーとなります。
ホスト名は15文字までにする必要があります。

##本手順における登場人物整理
ドメイン名：exsample.com
ドメインコントローラ１：dc1(192.168.1.1)
ドメインコントローラ２：dc2(192.168.1.2)
参加Linuxサーバ名：linux1(192.168.100.1)

##名前解決について
ドメイン名・ドメインコントローラ名・字ホスト名が名前解決ができることが前提条件となります。
必要に応じてDNSへレコード登録を実施してください。
また、/etc/resolv.confの設定を行ってください。

```
nslookup exsample.com
nslookup dc1.exsample.com
nslookup dc2.exsample.com
nslookup linux1
nslookup linux1.exsample.com
```

```/etc/resolv.conf
nameserver 192.168.1.1
nameserver 192.168.1.2
search exsample.com
```

#インストール手順
##パッケージの追加
・パッケージの事前確認
`rpm -qa samba-winbind krb5-workstation samba-client oddjob-mkhomedir`

・yumの確認
`yum list samba-winbind krb5-workstation samba-client oddjob-mkhomedir`

・必要パッケージのインストール
`yum -y install samba-winbind krb5-workstation samba-client oddjob-mkhomedir`

以下のようにインストールされます。

```
Installed:
krb5-workstation.x86_64 0:1.10.3-15.el6_5.1
oddjob-mkhomedir.x86_64 0:0.30-5.el6
samba-client.x86_64 0:3.6.9-169.el6_5
samba-winbind.x86_64 0:3.6.9-169.el6_5

Dependency Installed:
dbus.x86_64 1:1.2.24-7.el6_3
libtalloc.x86_64 0:2.0.7-2.el6
libtdb.x86_64 0:1.2.10-1.el6
libtevent.x86_64 0:0.9.18-3.el6
oddjob.x86_64 0:0.30-5.el6
samba-common.x86_64 0:3.6.9-169.el6_5
samba-winbind-clients.x86_64 0:3.6.9-169.el6_5

Complete!
```

・パッケージがインストールされたことの確認
`rpm -qa samba-winbind krb5-workstation samba-client oddjob-mkhomedir`

・認証方法にwinbindを追加します。
`vi /etc/nsswitch.conf`

```/etc/nsswitch.conf(修正箇所のみ)
passwd: files winbind　←winbindを追加
shadow: files winbind　←winbindを追加 
group: files winbind 　←winbindを追加
```

・/etc/krb5.conf の修正
`vi /etc/krb5.conf`

```/etc/krb5.conf
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = EXSAMPLE.COM
 dns_lookup_realm = true
 dns_lookup_kdc = true
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]
 EXSAMPLE.COM = {
  kdc = dc1.exsample.com　←認証を行うドメインコントローラ
  kdc = dc2.exsample.com　←認証を行うドメインコントローラ
  admin_server = dc2.exsample.com　←デフォルトの認証先
 }

[domain_realm]
 .exsample.com = EXSAMPLE.COM
 exsample.com = EXSAMPLE.COM
```

・ドメイン認証を実施
`kinit administrator@EXSAMPLE.COM`

認証状況の確認
`klist`

・sambaの設定
`vi /etc/samba/smb.conf`

```/etc/samba/smb.conf（修正箇所のみ）
# 74行目
workgroup = EXSAMPLE

# 101行目　コメントアウトします
# security = user
# passdb backend = tdbsam

# 123行目 Domain Members Options 以下の定義を追加
security = ads
realm = EXSAMPLE.COM

# winbind の設定
winbind use default domain = true
winbind offline logon = yes　←オフラインログインを有効
winbind cache time = 300　←オフラインログインに使うキャッシュの有効期限（秒）

# UIDとGIDのマッピング
idmap config EXSAMPLE:backend = rid ←ADのRIDからUID/GID作成
idmap config EXSAMPLE:range = 10000-15000
idmap uid = 10000-15000
idmap gid = 10000-15000

# ADユーザのhomeディレクトリを自動作成
template homedir = /home/%U
template shell = /bin/bash

# その他設定
client signing =yes
client use spnego=yes
kerberos method =secrets and keytab
password server = *
```

・ドメイン参加
`net ads join -U administrator`

参加状況の確認
`net ads info`
`net ads status`

ドメイン接続確認
`net ads testjoin`

##認証周りの設定
・winbindに必要になるサービスの起動設定
`chkconfig --list messagebus`
onであること

`service messagebus restart`

・ /etc/pam.d/system-authの設定
`authconfig --enablewinbind --enablewinbindauth --enablemkhomedir --update`

・winbind起動設定
`chkconfig --list winbind`
onであること

`service winbind restart`

#動作確認

・ドメイン接続テスト
`net ads testjoin`

・ADから情報を取得
`wbinfo -u`
`wbinfo -g`
`id administrator`

・ADとwinbindの接続状況確認
`wbinfo -t`

・簡易認証テスト
`wbinfo -a administrator%パスワード`

・外部からのログインテスト
テラタームなどでドメインユーザ/パスワードでログインできるかを確認

#その他メモ
##認証について
/etc/nsswitch.confの設定どおりローカル認証が優先になります。
同一のユーザ名やグループ名があった場合は、ローカルのUID・GIDが優先されます。
ローカルユーザを消すことでAD側のUID・GIDが反映されます。
それまではセカンダリのUID・GIDになるようです。

##UID、GIDについて
通常は各サーバのwinbindがUID/GIDの割り振りを決めるため、サーバ毎にUID/GIDが異なってしまう。

［対策］
sambaの設定ファイル（/etc/samba/smb.conf）に以下を追記することで、WindowsアカウントのSIDの末尾4ケタ（RIDと呼ばれる部分）＋指定レンジ（1000-19999）を足したものをUID/GIDとすることができる。
sambaのバージョンによって記述が異なるため注意が必要です。

```/etc/samba/smb.conf
idmap config ドメイン名:backend = rid
idmap config ドメイン名:range = 10000-12000
idmap uid = 10000-12000
idmap gid = 10000-12000
```

［UID/GIDの紐付の保管場所］
通常のユーザ管理系ファイル（/etc/passwd、/etc/group）には情報が保管されません。
/var/lib/samba配下に「.tdb」というファイルができ、その中に保存されます。

挙動がおかしい場合や、設定を変更したい場合は一度上記のファイルを削除します。

```
service winbind stop
rm -f /var/lib/samba/*.tdb
service winbind start
```

##ドメインコントローラダウン時（キャッシュログオン）
winbindのキャッシュを有効にすることで、ドメインコントローラダウン時にもログインが可能となります。

「winbind cache time」のデフォルトは300秒（5分）です。
最大で2147483647秒の設定が可能です。

キャッシュは以下に保持されます。再起動するとキャッシュがクリアされます。
/var/lib/samba/winbindd_cashe.tdb

```/etc/samba/smb.conf
winbind offline logon = yes
winbind cache time = キャッシュを保持したい時間（秒）
```

##ドメインコントローラダウン時（認証先切り替わり）
/etc/krb5.confのkdcに記述したサーバに接続が変わります。
変更になるのはadmin_server指定したサーバがダウンした後の初回ドメイン接続時です。
net ads infoで確認ができます。

##ドメインの離脱不法
以下のコマンドでドメインから離脱が可能です。
`net ads leave -U administrator`