Samba4.0.3でActive Directoryドメイン環境を構築

Samba4がリリースされたんだってねー。
MSも協力して、Active Directoryに完全対応したんだってねー。

じゃぁ早速構築してみようではないか!!
最終的には、以下の事ができるようにする。

Samba4のインストール

今回はFedora18にインストールする。
Samba4が既にパッケージ化されているのだが、うまく行かなかった。
ADの機能が本体とは別のパッケージになっている様なのだが、まだバイナリはパッケージングされていないのか?容量が数百KBしかないし、色々と動かない。
なので、コードからコンパイルする事にした。

依存関係にあるライブラリをインストール

公式サイトで書かれていた必須・推奨のライブラリをインストールする。

yum install libacl-devel libblkid-devel gnutls-devel python-devel gdb pkgconfig libattr-devel krb5-workstation
コード取得とmake実行

公式サイトから最新版(この時点では4.0.3)を取得しコンパイルを実行してインストールする。
後にパッケージがちゃんとリリースされた際は簡単に削除できる様、デフォルトの/usr/localではなく/opt/samba4にインストールする事にした。

wget http://ftp.samba.org/pub/samba/samba-4.0.3.tar.gz
tar -xzf samba-4.0.3.tar.gz
cd samba4.0.3
./configure --prefix=/opt/samba4
make
make install

makeコマンドを実行すると、色々と不足してそうな内容が標準出力されるけど気にしないw

環境設定 (Samba3引き継ぎ)

環境設定を対話式に行ってくれる便利コマンドsamba-toolを実行する。
パッケージインストールではこれが見つからなかった。

  • ドメインはYOUR-DOMAIN.LOCAL
  • サーバのホスト名はaddc_server
  • DNSはSamba内蔵ではなく既に構築済みのBIND9.8を使用
  • LDAPはSamba内蔵を使用

今回は、既にSamba3で運用していた情報を引き継ぐ。
Samba3もLDAPも今回と同じ端末にインストールされていた場合である。
ただし、途中でこける。SIDは引き継がれるのだが、ユーザやグループは引き継がれない。なぜ・・・
きっと誰かが解決してくれる事を祈って、SIDだけ引き継ぐ。

/opt/samba4/bin/samba-tool domain classicupgrade --testparam=/usr/bin/testparam --realm=YOUR-DOMAIN.LOCAL --dns-backend=BIND9_FLATFILE /etc/samba/smb.conf
環境設定 (新規構築)

まぁ、SIDだけ引き継いでもねーとか、新規構築だぜ!って場合は以下のコマンドを実行。
rfc2307を使える用にしてLinux系アカウントをLDAPで認証できる様に対応しておく。

/opt/samba4/bin/samba-tool domain provision --use-rfc2307 --interactive


実行すると、環境を聞かれるので答えていくと色々設定していくログが表示される。
重要な箇所は、

  • Realmにレルムを入力する。既にBindで使用しているゾーンと同じにならない様にする事。
  • Server Roleはドメインコントローラであるdcを選択
  • DNSはBIND9_FLATFILEを選択
Realm [LOCALDOMAIN]: YOUR-DOMAIN.LOCAL
 Domain [YOUR-DOMAIN]: 
 Server Role (dc, member, standalone) [dc]: 
 DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]: BIND9_FLATFILE
Administrator password: 
Retype password: 
Looking up IPv4 addresses
Looking up IPv6 addresses
No IPv6 address will be assigned
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=your-domain,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=ado-tech,DC=local
rndc: 'freeze' failed: not dynamic
See /opt/samba4/private/named.conf for an example configuration include file for BIND
and /opt/samba4/private/named.txt for further documentation required for secure DNS updates
Setting up sam.ldb rootDSE marking as synchronized
Fixing provision GUIDs
A Kerberos configuration suitable for Samba 4 has been generated at /opt/samba4/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:              addc_server
NetBIOS Domain:        YOUR-DOMAIN
DNS Domain:            your-domain.local
DOMAIN SID:            S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx

これが実行結果のキャプチャ。
Administratorパスワードは複雑で推測されにくいものを設定しよう!!

/opt/samba4/sbin/samba -i -M single

上記コマンドで、シングルプロセスで起動しデーモンとしてではなくインタラクティブに起動する。
ログも標準出力されるので、お試し起動する際にはこのパラメータを渡すとよさげ。

DNS設定

ADではDNSとの連携が必須となる。
別件で既にDNSサーバ (bind9.8) を構築してあるので、今回は内蔵DNSを使用せずにそちらを利用する。
samba-toolが既にSamba側の設定ファイルを用意してくれているので、それを読み込む用にするだけ。
bindのバージョンが9.8より古いと設定方法が違うので要注意。詳しくは公式サイトなどを参照。

named.conf修正

/etc/named.confのoptionタグ内とグローバル領域に以下の項目を追加する。
optionタグ内は他の設定が既にあるので、タグ内の最終行あたりに追加すればいい。

options {
    ## [他の設定] ##
    tkey-gssapi-keytab "/opt/samba4/private/dns.keytab"
}
include "/opt/samba4.private/named.conf"

設定を終えたらnamedプロセスを再起動。

systemctl restart named.service
namedの確認
host -v SRV _ldap._tcp.your-domain.local

上記コマンドを実行する。以下のような結果が返れば問題なく稼働している。

_ldap._tcp.your-domain.local has SRV record 0 100 389 addc_server.your-domain.local

自動起動設定

/opt/samba4/sbin/samba4 を実行するだけでサーバが起動する。
けどこのままでは、毎回rootでログインしてsambaを実行してからでないと他のアカウントでログインできない。

OSが起動したら自動でサーバが起動できる様にする必要がある。
自動起動するにはサービスに登録する。Fedoraのサービスはsystemdで管理されている。
まずは/lib/systemd/system/samba.serviceファイルを作成。

[Unit]
Description=Samba Active Directory Domain Controller Daemon

[Service]
PIDFile=/opt/samba4/var/run/samba.pid
ExecStart=/opt/samba4/sbin/samba

[Install]
WantedBy=multi-user.target

forkする様にすると調子悪いので、単純に起動させる。
これを自動実行できる様にコマンドで登録する。

systemctl enable samba.service

Windows7 ProのADドメイン参加

Samba3で構築したNTドメインに参加する設定とほぼ一緒。(Fedora14でWindowsドメインサーバ構築 - クマーのえんじにありんぐ)
レジストリ変更を行わなくてよいので、その処理を省く。既にレジストリ追加している場合は削除。

Linux(Fedora18)をSamba4提供のLDAP認証へ

OpenLDAP認証の設定とほぼ一緒。(Fedoa14でLDAPサーバを構築 - クマーのえんじにありんぐ)
/etc/sssd/sssd.conf の内容が違うだけ。変更箇所は[domain/default]セクション。
以下の設定ファイルは、ADサーバにOU=kumaに所属に所属しているユーザでunix設定を施したアカウントをログイン対象にする。
ユーザ検索用に別途アカウントを用意しておく。
(今回はアカウント名がldapbindでパスワードをPASSWORD_FOR_BIND_DNとした場合)

[domain/default]
ldap_tls_reqcert = never
id_provider = ldap
min_id = 1000
ldap_id_user_start_tls = True
entry_cache_timeout = 60
ldap_uri = ldap://addc_server.your-domain.local
ldap_search_base = dc=your-domain,dc=local
ldap_schema = ad
ldap_default_bind_dn = cn=ldapbind,cn=Users,dc=your-domain,dc=local
ldap_default_authtok_type = password
ldap_default_authtok = PASSWORD_FOR_BIND_DN
ldap_access_filter = memberOf=ou=kuma,dc=your-domain,dc=local

ldap_user_search_base = ou=kuma,dc=your-domain,dc=local
ldap_user_object_class = user
ldap_user_search_filter = (&(objectClass=user)(uidNumber=*))
ldap_user_name = sAMAccountName
ldap_user_uid_number = uidNumber
ldap_user_gid_number = gidNumber
ldap_user_home_directory = unixHomeDirectory
ldap_user_shell = loginShell
ldap_account_expire_policy = ad
ldap_user_principal = userPrincipalName

ldap_group_search_base = ou=kuma,dc=your-domain,dc=local
ldap_group_object_class = group
ldap_group_name = msSFU30Name
ldap_group_gid_number = gidNumber
ldap_group_search_filter = (&(objectClass=group)(gidNumber=*))