Samba4ではActiveDirecotryが構築できるようになり、またCentOS6からは新しい認証サービスとしてSystem Security Services Daemon (SSSD)が導入されたため、WindowsとLinuxのユーザ管理が非常に簡単にできるようになりました。
今回は、Samba4とCentOS7を利用して、WindowsとLinuxの認証統合環境を構築します。
ざっくり要件をまとめると、
- WindowsとLinuxのユーザID/パスワードをActiveDirecotry で一元管理
- Windows/Linuxどちらにも同じユーザID/パスワードでログインできる
- LinuxのホームディレクトリにWindowsからアクセスできる
- ドメインコントローラにファイルサーバを共存させる
- ユーザはドメインコントローラにsssd経由でログインできる
です。構成環境は下記を想定します。
- ドメイン名 : TESTDOMAIN.LOCAL
- ドメインコントローラ : dc01.testdomain.local
- ドメインコントローラIP : 192.168.24.57
ドメインコントローラの冗長化は次回解説します。
ではさっそく構築に移ります。
1. 不要な機能の停止
構築時のエラーを防ぐため、ファイアーウォールの停止とSELinuxを無効化します。
# systemctl stop firewalld.service
# systemctl disable firewalld.service
# systemctl list-unit-files | grep firewalld.service
firewalld.service disabled
# getenforce
Enforcing
# vi /etc/selinux/config
<略>
#SELINUX=enforcing # コメントアウト
SELINUX=disabled # 追記
<略>
# reboot
# getenforce
Disabled
2. hostsファイルの編集
hostsファイルに自ホストの完全修飾ドメイン名(FQDN)と短いホスト名を追記します。
# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.24.57 dc01.testdomain.local dc01 # 追記
3. 必要なパッケージのインストール
ディストリビューションにあわせて必要なパッケージをインストールします。
今回の環境はCentOS7なので下記になりますが、その他ディストリビューションの場合はこちらを参照してください。
# yum install perl gcc attr libacl-devel libblkid-devel \
gnutls-devel readline-devel python-devel gdb pkgconfig \
krb5-workstation zlib-devel setroubleshoot-server libaio-devel \
setroubleshoot-plugins policycoreutils-python \
libsemanage-python perl-ExtUtils-MakeMaker perl-Parse-Yapp \
perl-Test-Base popt-devel libxml2-devel libattr-devel \
keyutils-libs-devel cups-devel bind-utils libxslt \
docbook-style-xsl openldap-devel autoconf python-crypto pam-devel
4. Samba4のダウンロードとインストール
最新のSambaをこちらから入手してインストールします。
# wget https://download.samba.org/pub/samba/stable/samba-4.5.1.tar.gz
# tar zxvf samba-4.5.1.tar.gz
# cd samba-4.5.1/
# ./configure
# make
# make install
5. Active Directoryのセットアップ
WindowsとLinuxの認証統合を構築するため、オプションに 「--use-rfc2307」 を加えます。
# /usr/local/samba/bin/samba-tool domain provision --use-rfc2307 --interactive
Realm [TESTDOMAIN.LOCAL]: (変更がなければEnter)
Domain [TESTDOMAIN]: (変更がなければEnter)
Server Role (dc, member, standalone) [dc]: (変更がなければEnter)
DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]: (変更がなければEnter)
DNS forwarder IP address (write 'none' to disable forwarding) [192.168.24.1]: (変更がなければEnter)
Administrator password: (←入力してください)
Retype password: (←入力してください)
Looking up IPv4 addresses
More than one IPv4 address found. Using 192.168.24.57
Looking up IPv6 addresses
Setting up share.ldb
Setting up secrets.ldb
Setting up the registry
Setting up the privileges database
Setting up idmap db
Setting up SAM db
Setting up sam.ldb partitions and settings
Setting up sam.ldb rootDSE
Pre-loading the Samba 4 and AD schema
Adding DomainDN: DC=testdomain,DC=local
Adding configuration container
Setting up sam.ldb schema
Setting up sam.ldb configuration data
Setting up display specifiers
Modifying display specifiers
Adding users container
Modifying users container
Adding computers container
Modifying computers container
Setting up sam.ldb data
Setting up well known security principals
Setting up sam.ldb users and groups
Setting up self join
Adding DNS accounts
Creating CN=MicrosoftDNS,CN=System,DC=testdomain,DC=local
Creating DomainDnsZones and ForestDnsZones partitions
Populating DomainDnsZones and ForestDnsZones partitions
Setting up sam.ldb rootDSE marking as synchronized
Fixing provision GUIDs
A Kerberos configuration suitable for Samba 4 has been generated at /usr/local/samba/private/krb5.conf
Setting up fake yp server settings
Once the above files are installed, your Samba4 server will be ready to use
Server Role: active directory domain controller
Hostname: dc01
NetBIOS Domain: TESTDOMAIN
DNS Domain: testdomain.local
DOMAIN SID: S-1-5-21-2957873491-915732319-25383699412
下記エラーが発生する場合は
ERROR(ldb): uncaught exception - operations error at ../source4/dsdb/samdb/ldb_modules/password_hash.c:2816
Samba4でエラー /source4/dsdb/samdb/ld b_modules/password_hash.c
を参照ください。
6. Kerberosの設定
Sambaが必要なファイルを用意してくれるのでコピーします。
# cat /usr/local/samba/private/krb5.conf
[libdefaults]
default_realm = TESTDOMAIN.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = true
# cp /usr/local/samba/private/krb5.conf /etc/krb5.conf
ただし上記だけでは設定が足らないので記述を追加します。
# vi /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 = TESTDOMAIN.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
[realms]
TESTDOMAIN.LOCAL = {
kdc = dc01.testdomain.local
admin_server = dc01.testdomain.local
}
[domain_realm]
.testdomain.local = TESTDOMAIN.LOCAL
testdomain.local = TESTDOMAIN.LOCAL
7. Sambaの起動
起動までの準備がすべて完了したのでSambaを起動します。
CentOS7はsystemdが採用されているので、それにあわせた起動スクリプトを用意します。
# vi /etc/systemd/system/samba.service
[Unit]
Description= Samba 4 Active Directory
After=syslog.target
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/samba/var/run/samba.pid
ExecStart=/usr/local/samba/sbin/samba
[Install]
WantedBy=multi-user.target
Sambaを起動します。
# systemctl start samba
# systemctl enable samba
8. Sambaの動作確認
無事Sambaが起動したら smbclient を利用してSambaへの接続確認を行います。
# /usr/local/samba/bin/smbclient -L localhost -U%
Domain=[TESTDOMAIN] OS=[Windows 6.1] Server=[Samba 4.5.1]
Sharename Type Comment
--------- ---- -------
netlogon Disk
sysvol Disk
IPC$ IPC IPC Service (Samba 4.5.1)
Domain=[TESTDOMAIN] OS=[Windows 6.1] Server=[Samba 4.5.1]
Server Comment
--------- -------
Workgroup Master
--------- -------
次にDNSにSRVレコードが登録されているか確認を行います。
# host -t SRV _ldap._tcp.testdomain.local 127.0.0.1
_ldap._tcp.testdomain.local has SRV record 0 100 389 dc01.testdomain.local.
# host -t SRV _kerberos._udp.testdomain.local 127.0.0.1
_kerberos._udp.testdomain.local has SRV record 0 100 88 dc01.testdomain.local.
# host -t A dc01.testdomain.local 127.0.0.1
dc01.testdomain.local has address 192.168.24.57
最後にKeroberosの動作確認を行います。
# kinit administrator
Password for このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。:
# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。
Valid starting Expires Service principal
2016-11-22T23:38:41 2016-11-23T09:38:41 krbtgt/このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。
renew until 2016-11-29T23:38:36
全てエラー無く結果が表示されれば動作確認完了です。
9. DNSの設定変更
参照先のDNSをsambaで構築したDNSに変更します。
# nmcli device
デバイス タイプ 状態 接続
enp0s3 ethernet 接続済み System enp0s3
lo loopback 管理無し --
# nmcli connection modify "System enp0s3" ipv4.dns "192.168.24.57"
# systemctl restart NetworkManager
/etc/resolv.confファイルの中身を確認して、参照先DNSが自サーバになっていることを確認します。
# more /etc/resolv.conf
# Generated by NetworkManager
search testdomain.local
nameserver 192.168.24.57
10. Windowsクライアントのドメイン参加
Windowsクライアントを構築したActiveDirectoryに参加させます。
11. Linuxの認証をSSSD経由でActiveDirectoryと連携
必要なパッケージをインストールします。
# yum install sssd sssd-ad krb5-workstation oddjob-mkhomedir openldap-clients
kerberosのkeytabファイルを作成します。
# /usr/local/samba/bin/samba-tool domain exportkeytab /etc/krb5.keytab --principal=dc01$
Export one principal to /etc/krb5.keytab
sssdの設定ファイルを編集します。
# vi /etc/sssd/sssd.conf
[sssd]
config_file_version = 2
domains = testdomain.local
services = nss, pam
debug_level = 0
[nss]
[pam]
[domain/testdomain.local]
id_provider = ad
auth_provider = ad
access_provider = ad
chpass_provider = ad
entry_cache_netgroup_timeout = 15
entry_cache_timeout = 15
ldap_id_mapping = false
ldap_sasl_authid = dc01$@TESTDOMAIN.LOCAL
# ad_server = server.ad.example.com
# ad_hostname = server.ad.example.com
ad_domain = testdomain.local
設定のポイントはこちらです。
- ldap_id_mapping
true に設定するとIDを自動生成します。false に設定するとActive DirectoryからIDを取得します。今回は false です。
sssdの設定ファイルのアクセス権を変更します。
# chown root:root /etc/sssd/sssd.conf
# chmod 0600 /etc/sssd/sssd.conf
NSS/PAMの設定をSSSDに切り替えます。
# authconfig --enablesssd --enablesssdauth --enablemkhomedir --update
SSSDを起動します。
# systemctl restart sssd.service
エラーなく起動したら接続テストを行います。
まずはユーザを作成します。
# /usr/local/samba/bin/samba-tool user create test01 Passw0rd \
--must-change-at-next-login \
--surname=test01 \
--given-name=test01 \
--description="テストユーザ01" \
--nis-domain=testdomain \
--uid=test01 \
--uid-number=200001 \
--gid-number=100000 \
--login-shell=/bin/bash \
--unix-home=/home/testdomain.local/test01
作成したユーザの情報をidコマンドで取得します。
# id test01
uid=200001(test01) gid=100000 groups=100000
取得できれば接続テストは完了です。
12. 共有フォルダの作成
LinuxユーザのホームディレクトリにWindowsからアクセスできるようにします。
ついで(?)に共有フォルダも作成します。
# vi /usr/local/samba/etc/smb.conf
下記を追記します。
[home$]
path = /home/testdomain.local
browseable = no
read only = no
guest ok = no
[share]
path = /opt/share
read only = no
Sambaを再起動します。
# systemctl restart samba
13. Domain usersグループのNIS設定
ドメイン参加したWindowsクライアントに testdomain.local ドメインの administrator でログインします。
[Active Directory ユーザーとコンピューター]にて Domain Users グループのプロパティを表示します。
UNIX属性タブを選択し、
- NISドメイン (例: testdomain)
- GID(グループID) (例:100000)
を設定します。
[Active Directory ユーザーとコンピューター]がインストールされていない場合は、
リモートサーバー管理ツール(RSAT)のインストール を参考にインストールしてください。
14. パスワードポリシーの確認と変更
デフォルトのパスワードポリシーを確認します。
# /usr/local/samba/bin/samba-tool domain passwordsettings show
Password informations for domain 'DC=testdomain,DC=local'
Password complexity: on # パスワードの複雑さ要求
Store plaintext passwords: off # パスワードを平文で保管
Password history length: 24 # 過去のパスワードを保持する件数
Minimum password length: 7 # 最小パスワード長
Minimum password age (days): 1 # パスワード変更禁止期間
Maximum password age (days): 42 # パスワード有効期間
Account lockout duration (mins): 30 # アカウントのロックアウト期間
Account lockout threshold (attempts): 0 # アカウントのロックアウトのしきい値
Reset account lockout after (mins): 30 # 後のアカウントのロックアウトをリセット
非常に厳しい内容になっていますので少し見直します。
過去のパスワードを保持する件数を5に変更
# /usr/local/samba/bin/samba-tool domain passwordsettings set --history-length=5
パスワードの長さを8文字以上に変更
# /usr/local/samba/bin/samba-tool domain passwordsettings set --min-pwd-length=8
パスワード変更禁止期間を0日に変更
# /usr/local/samba/bin/samba-tool domain passwordsettings set --min-pwd-age=0
パスワード有効期間を30日に変更
# /usr/local/samba/bin/samba-tool domain passwordsettings set --max-pwd-age=30
アカウントのロックアウトのしきい値を50回に変更
# /usr/local/samba/bin/samba-tool domain passwordsettings set --account-lockout-threshold=50
以上で全ての設定が完了です。
15. ログインの確認
まずはLinuxにログインします。
初回ログインにパスワード変更を求められる設定の為、パスワード変更後に一旦セッションがクローズします。
# ssh test01@localhost
test01@localhost's password:
Password expired. Change your password now.
Creating home directory for test01.
WARNING: Your password has expired.
You must change your password now and login again!
ユーザー test01 のパスワードを変更。
現在のパスワード:
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
Connection to localhost closed.
新しいパスワードでログインします。
# ssh test01@localhost
test01@localhost's password:
$ id;pwd
uid=200001(test01) gid=100000(domain users) groups=100000(domain users)
/home/testdomain.local/test01
ログインできれば確認完了です。
検証用にtouchコマンドでホームディレクトリと共有フォルダにファイルを作成します。
$ touch test.txt
$ touch /opt/share/test.txt
次にWindowsログオンと共有フォルダアクセスの確認します。
ドメイン参加したPCにLinuxと同じユーザでログインします。
ログオンできたらホームディレクトリにアクセスできるか確認をします。
パスは \\dc01\home$\test01 です。
共有フォルダも同様にアクセスできるか確認します。パスは \\dc01\share です。
問題なくアクセスできれば確認完了です。
お疲れさまでした。