CentOS6.6のユーザ認証をADで行う

参考1：http://muramasa64.fprog.org/diary/?date=20140909
参考2：https://fedorahosted.org/sssd/
参考3：man 5 sssd.conf, man 5 sssd-ldap, man 5 sssd-ad

# 設定情報
ドメイン : saka.example.com
ドメインコントローラ(Windows Server 2012 R2) : dc1.saka.example.com, 10.211.55.13
クライアント(CentOS6.6) : cl1.saka.example.com, 10.211.55.9

# これから設定するファイル(手動で編集するもののみ)
- /etc/resolv.conf
- /etc/hosts
- /etc/krb5.conf
- /etc/samba/smb.conf
- /etc/sssd/sssd.conf

sssdについては, 1.9.2 or Above の設定なので, 注意.

# 設定準備
## /etc/resolv.confの設定
基本的にはADとDNSはセットになっていて, ADと一緒に動いているDNSにはSRVレコードが自動で登録されている.
これがないと, kerberosやldapの検索ができないので, Linux側の/etc/resolv.confにドメコンをDNSとして登録しておく.

```
nameserver 10.211.55.13
```

## /etc/hostsの編集
マシンをADに登録する際, 自身の名前解決ができる必要があるので, /etc/hostsに登録しておく.
```hostname --fqdn```ができるようにしておく.

## 必要パッケージのインストール


|パッケージ名|内容|
|:--:|:--:|
|sssd|sssdのベースパッケージ|
|sssd-ad|sssdとadをよしなに繋いでくれるパッケージ|
|krb5-workstation|krb5のクライアント|
|samba-client|マシンをADに登録するときにnetコマンドを使う|
|oddjob-mkhomedir|ホームディレクトリを自動で作成するためのモジュール|

```
# yum install sssd sssd-ad krb5-workstation samba-client oddjob-mkhomedir

===================================================================================================================================================================================================================
 Package                                                      Arch                                          Version                                              Repository                                   Size
===================================================================================================================================================================================================================
Updating:
 krb5-workstation                                             x86_64                                        1.10.3-42.el6                                        base                                        811 k
 samba-client                                                 x86_64                                        3.6.23-20.el6                                        base                                         11 M
 sssd                                                         x86_64                                        1.12.4-47.el6                                        base                                        100 k
 sssd-ad                                                      x86_64                                        1.12.4-47.el6                                        base                                        202 k
Updating for dependencies:
 krb5-libs                                                    x86_64                                        1.10.3-42.el6                                        base                                        768 k
 libipa_hbac                                                  x86_64                                        1.12.4-47.el6                                        base                                        104 k
 libsss_idmap                                                 x86_64                                        1.12.4-47.el6                                        base                                        109 k
 python-sssdconfig                                            noarch                                        1.12.4-47.el6                                        base                                        132 k
 samba-common                                                 x86_64                                        3.6.23-20.el6                                        base                                         10 M
 samba-winbind                                                x86_64                                        3.6.23-20.el6                                        base                                        2.2 M
 samba-winbind-clients                                        x86_64                                        3.6.23-20.el6                                        base                                        2.0 M
 sssd-client                                                  x86_64                                        1.12.4-47.el6                                        base                                        151 k
 sssd-common                                                  x86_64                                        1.12.4-47.el6                                        base                                        976 k
 sssd-common-pac                                              x86_64                                        1.12.4-47.el6                                        base                                        134 k
 sssd-ipa                                                     x86_64                                        1.12.4-47.el6                                        base                                        237 k
 sssd-krb5                                                    x86_64                                        1.12.4-47.el6                                        base                                        133 k
 sssd-krb5-common                                             x86_64                                        1.12.4-47.el6                                        base                                        190 k
 sssd-ldap                                                    x86_64                                        1.12.4-47.el6                                        base                                        215 k
 sssd-proxy                                                   x86_64                                        1.12.4-47.el6                                        base                                        129 k

Transaction Summary
===================================================================================================================================================================================================================
Upgrade      19 Package(s)

Total download size: 29 M
Is this ok [y/N]:
```

## authconfigでバックアップ作成
念のため作成する

```
# authconfig --savebackup=mybackup
```

# 各種設定
## Kerberosの設定
DNSが設定されていることが前提.

```
# vim /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 = SAKA.EXAMPLE.COM
 dns_lookup_realm = true
 dns_lookup_kdc = true
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]

[domain_realm]
```

DNSが設定されていない場合. realmsなどの設定が必要.

```
# vim /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 = SAKA.EXAMPLE.COM
 dns_lookup_realm = true
 dns_lookup_kdc = true
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]
SAKA.EXAMPLE.COM= {
 kdc = dc1.saka.example.com
 admin_server = dc1.saka.example.com
}

[domain_realm]
saka.example.com = SAKA.EXAMPLE.COM
.saka.example.com = SAKA.EXAMPLE.COM
```

## sambaの設定
マシンをADに登録するときに使う.

```
# vim /etc/samba/smb.conf

[global]
   workgroup = SAKA
   client signing = yes
   client use spnego = yes
   kerberos method = secrets and keytab
   log file = /var/log/samba/%m.log
   realm = SAKA.EXAMPLE.COM
   security = ads
```

## sssdの設定
sssdもkrb5と同じように, DNS前提で設定できるが, 冗長構成の時にDC接続が不安定(というか, 落ちているDCに何度も接続にいっちゃう)ので, 直接記載する.
いろいろな項目は、man 5 sssd.conf, man 5 sssd-adを見て下さい. ここにみんな書いてあります. 
サイトはsssdがDNSから見てくれる.```ad-site = ...```で明示的にサイトを指定することも可能.

```
# vim /etc/sssd/sssd.conf

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

[domain/saka.example.com]
# デバッグレベルの設定
debug_level = 5

# adなので, id_providerはad
id_provider = ad

# adのホスト名を記載
# DNSをADのDNSにしておくこと
# ここを入れなくてもDNSで解決できれば基本的にはOK
ad_server = dc1.saka.example.com

# 冗長構成のとき
# ad_server = dc1.saka.example.com, dc2.saka.example.com

# sssdのキャッシュが効くようにする
# ADが落ちていてもログイン可能になる
cache_credentials = true

# idを自動でマッピングしないようにする
# 自動でマッピングしない場合、ADのエントリーのuid, gidが使用される
ldap_id_mapping = False

# adのmemberOf属性でアクセス制限をかける
# LDAPクエリで設定可能
access_provider = ad
ad_access_filter = (&(memberOf=cn=admin,ou=groups,dc=saka,dc=example,dc=com)(unixHomeDirectory=*))

[nss]

[pam]
```

ファイルのパーミッション設定

```
# chown root:root /etc/sssd/sssd.conf
# chmod 0600 /etc/sssd/sssd.conf
```

これで認証する側の設定は完了です.

# ADにホストを登録する
## kerberosチケットの発行
ADのAdministratorのパスワードを入力する. 成功すると, 何も言われない.

```
# kinit Administrator
Password for Administrator@SAKA.EXAMPLE.COM:
```

## ホストの登録
```hostname --fqdn```ができるなら, DNSの自動更新も成功する.


```
# hostname --fqdn
cl1.saka.example.com

# net ads join -U administrator
Enter administrator's password:
Using short domain name -- SAKA
Joined 'CL1' to dns domain 'saka.example.com'
```

## sssdの有効化
authconfigで行う

```
# authconfig --enablesssd --enablesssdauth --enablelocauthorize --enablemkhomedir --update
```
これでsssdが起動できたらOK.
起動できなかったら,

```
# service sssd start
```
エラーになる場合は, /var/log/sssd/配下のログ もしくは /var/log/messagesを確認する.

# 認証テスト
ADにUNIX属性を持つsakamotoというユーザを作成済み.

sakamotoユーザは, メイングループがsaka, サブグループがadmin.
adminはsudo用. 管理者だけこのサブグループが付く.

```
# id sakamoto
uid=10000(sakamoto) gid=10000(saka) groups=10000(saka),10001(admin)
```

# sudoを使えるようにする
sudoのパッケージにAD用のスキーマがあるので, それを追加しても良いが, 各属性を目grepで検索orADなのにLDIFファイルを作成して読込, をしなければならず, 結構きつい. 
ということで, sudoはsudersで行う.

それでもADでsudo管理したい場合は, ここが参考になる.
【参考】ADにsudoのスキーマを追加する：http://jhrozek.livejournal.com/3860.html
linux側のAD連携sudoの設定は, ldapの場合と同じ.

```
# visudo

# 下記を追記
%admin ALL=(ALL) ALL
```

AD側で「初回パスワード変更」の設定にしていたので, パスワード変更が求められた(ユーザには```su - ```でログイン).

```
[sakamoto@cl1 ~]$ sudo -l

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for sakamoto:
Password expired. Change your password now.
sudo: Account or password is expired, reset your password and try again
Current Password:
New password:
Retype new password:
Matching Defaults entries for sakamoto on this host:
    !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
    LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User sakamoto may run the following commands on this host:
    (ALL) ALL
    
```
パスワードも認証できたし, sudoersとの連携も確認できました.
以外と普通にユーザ認証ができます.

# その他
## 公開鍵について
opensshはopenldap用のスキーマしか準備していないので, 自作したスキーマで拡張するしかないです.
ADを使うところで自作スキーマは使わない気がします.
ただ, $HOME/.ssh/authorized_keysでの認証は可能です.


## RHEL7系から
今回はsssd-adを利用したけど, RHEL7からはrealmdというパッケージがあります.
こっちのほうが設定が簡単みたいです.