Samba 4.7.xでActive Directoryを1から立てる

2019/06/14追記

Samba 4.10.xでActive Directoryを1から立てる」という記事を更新版の記事を作成しています。違いは必要となるパッケージが増えたことについてです。


CentOS7とSamba 4.7.5で環境を作成しなおしたので、記事更新

過去の記事はこちら
2014年2月版「Samba 4.xでActive Directoryを1から立てる
2016年7月版「Samba 4.4.xでActive Directoryを1から立てる


Linux上でSambaを使ってActive Directoryサーバを立てるメリット
Windows Serverを買わなくてもActive Directoryを作れる
 ライセンス費用の低減
Active Directoryユーザの作成などのユーザ管理をWindowsマシンからWindows標準ツールで行える
 ユーザ作成/変更、コンピュータアカウントの作成、DNS管理など、Active Directoryの管理を行う際に
 良く使う動作については、Linuxのコマンドではなく、WindowsのActive Directory管理ツールで行える
 具体的にはADに参加しているWindowsマシンにWindows機能のActive Directory管理ツールを追加インストールしたあと、
 ADの管理者ユーザでログオンすることでAD管理を行うことができる
設定が難しくない
 いまのsambaは、DNSサーバとLDAPサーバ機能が統合されており、AD名とAD上の役割と
 管理者パスワードを決めてしまえば、あとは良きに計らってくれるので
 設定の難易度が非常に低い

もちろん、デメリット、もあります
ActiveDirectoryの全機能が搭載されていない
 ドメイン/フォレストの機能レベルが「Windows Server 2008 R2」までとなっている。
 なお、フェールオーバクラスタについては作成できるようになっていました。
 →「samba 4.7.4で作ったActive Directory環境でWindowsServer2016フェールオーバークラスターを動作させた」というわけで動作することを確認しました

それでは、実際の手順について・・・
元ネタは公式ページの「Setting up Samba as an Active Directory Domain Controller」となります。

0. CentOS7の最小インストールを実施

1. /etc/hostsの修正
自ホスト名を/etc/hostsに追加
追加の際は、ショートのホスト名と、ドメイン付きのFQDNの両方を列挙すること。

[root@adserver ~]# cat /etc/hosts&lt;br&gt;<br>
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4&lt;br&gt;<br>
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6&lt;br&gt;<br>
172.17.44.40    adserver adserver.adosakana.local&lt;br&gt;<br>
[root@adserver ~]#

2. 好みに応じて使うツールをインストール
セッションが途中で切れても良い様に「screen」と、ファイルダウンロードするためにwget(curlでもいいのですが)をインストールします。

[root@adserver ~]# yum install wget screen&lt;br&gt;<br>
<略>&lt;br&gt;<br>
[root@adserver ~]#

3. 必要なパッケージをインストール
Samba公式の「Operating system requirements/Dependencies – Libraries and programs」に記載されているパッケージをインストール

[root@adserver ~]# yum install attr bind-utils docbook-style-xsl gcc gdb krb5-workstation \&lt;br&gt;<br>
       libsemanage-python libxslt perl perl-ExtUtils-MakeMaker \&lt;br&gt;<br>
       perl-Parse-Yapp perl-Test-Base pkgconfig policycoreutils-python \&lt;br&gt;<br>
       python-crypto gnutls-devel libattr-devel keyutils-libs-devel \&lt;br&gt;<br>
       libacl-devel libaio-devel libblkid-devel libxml2-devel openldap-devel \&lt;br&gt;<br>
       pam-devel popt-devel python-devel readline-devel zlib-devel systemd-devel&lt;br&gt;<br>
<略>&lt;br&gt;<br>
[root@adserver ~]#

4. sambaのtar.gzをダウンロード

[root@adserver ~]# wget https://download.samba.org/pub/samba/stable/samba-4.7.5.tar.gz&lt;br&gt;<br>
--2016-xx-xx xx:xx:xx--  https://download.samba.org/pub/samba/stable/samba-4.7.5.tar.gz&lt;br&gt;<br>
download.samba.org をDNSに問いあわせています... 144.76.82.156&lt;br&gt;<br>
download.samba.org|144.76.82.156|:443 に接続しています... 接続しました。&lt;br&gt;<br>
HTTP による接続要求を送信しました、応答を待っています... 200 OK&lt;br&gt;<br>
長さ: 20715838 (20M) [application/gzip]&lt;br&gt;<br>
`samba-4.7.5.tar.gz' に保存中&lt;/p&gt;<br>
&lt;p&gt;100%[======================================&amp;gt;] 16,862,398  3.71MB/s 時間 5.5s&lt;/p&gt;<br>
&lt;p&gt;2018-03-xx xx:xx:xx (2.93 MB/s) - `samba-4.7.5.tar.gz' へ保存完了 [16862398/16862398]&lt;/p&gt;<br>
&lt;p&gt;[root@adserver ~]#

5. configure実施

[root@adserver ~]# tar xfz samba-4.7.5.tar.gz&lt;br&gt;<br>
[root@adserver ~]# cd samba-4.7.5&lt;br&gt;<br>
[root@adserver samba-4.7.5]# ./configure&lt;br&gt;<br>
Checking for program gcc or cc           : /usr/bin/gcc&lt;br&gt;<br>
Checking for program cpp                 : /usr/bin/cpp&lt;br&gt;<br>
<略>&lt;br&gt;<br>
Checking if toolchain accepts -fstack-protector                                                 : yes&lt;br&gt;<br>
'configure' finished successfully (2m43.587s)&lt;br&gt;<br>
[root@adserver samba-4.7.5]#

6. make & make install

[root@adserver samba-4.7.5]# make&lt;br&gt;<br>
WAF_MAKE=1 python ./buildtools/bin/waf build&lt;br&gt;<br>
Waf: Entering directory `/root/samba-4.7.5/bin'&lt;br&gt;<br>
<略>&lt;br&gt;<br>
Note: Writing nmblookup4.1&lt;br&gt;<br>
Waf: Leaving directory `/root/samba-4.7.5/bin'&lt;br&gt;<br>
'build' finished successfully (22m56.876s)&lt;br&gt;<br>
[root@adserver samba-4.7.5]# make install&lt;br&gt;<br>
WAF_MAKE=1 python ./buildtools/bin/waf install&lt;br&gt;<br>
Waf: Entering directory `/root/samba-4.7.5/bin'&lt;br&gt;<br>
<略>&lt;br&gt;<br>
* installing bin/default/pidl/Parse::Pidl::Wireshark::NDR.3pm as /usr/local/samba/share/man/man3/Parse::Pidl::Wireshark::NDR.3pm&lt;br&gt;<br>
Waf: Leaving directory `/root/samba-4.7.5/bin'&lt;br&gt;<br>
'install' finished successfully (6m48.094s)&lt;br&gt;<br>
[root@adserver samba-4.7.5]#

7. インストール完了確認

sambaのバージョン確認

[root@adserver ~]# /usr/local/samba/sbin/samba -V&lt;br&gt;<br>
Version 4.7.5&lt;br&gt;<br>
[root@adserver ~]#

8. Active Directoryのセットアップ
ドメイン「adosakana.local」を作成します。
また、sambaの機能を使ってAD DNSを構築するので「SAMBA_INTERNAL」を選択します。

なお、「–use-rfc2307」はADにNIS連携機能を追加するオプションです。AD上にUnix用のUID/GID/shell情報なども格納できるようにします。Samba環境では有効にしておくべきものです。

[root@adserver ~]# /usr/local/samba/bin/samba-tool domain provision --use-rfc2307 --interactive&lt;br&gt;<br>
Realm [ADOSAKANA.LOCAL]:&lt;br&gt;<br>
 Domain [ADOSAKANA]:&lt;br&gt;<br>
 Server Role (dc, member, standalone) [dc]:&lt;br&gt;<br>
 DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]:&lt;br&gt;<br>
 DNS forwarder IP address (write 'none' to disable forwarding) [172.30.50.100]:&lt;br&gt;<br>
Administrator password:&lt;br&gt;<br>
Retype password:&lt;br&gt;<br>
Looking up IPv4 addresses&lt;br&gt;<br>
Looking up IPv6 addresses&lt;br&gt;<br>
No IPv6 address will be assigned&lt;br&gt;<br>
Setting up secrets.ldb&lt;br&gt;<br>
Setting up the registry&lt;br&gt;<br>
Setting up the privileges database&lt;br&gt;<br>
Setting up idmap db&lt;br&gt;<br>
Setting up SAM db&lt;br&gt;<br>
Setting up sam.ldb partitions and settings&lt;br&gt;<br>
Setting up sam.ldb rootDSE&lt;br&gt;<br>
Pre-loading the Samba 4 and AD schema&lt;br&gt;<br>
Adding DomainDN: DC=adosakana,DC=local&lt;br&gt;<br>
Adding configuration container&lt;br&gt;<br>
Setting up sam.ldb schema&lt;br&gt;<br>
Setting up sam.ldb configuration data&lt;br&gt;<br>
Setting up display specifiers&lt;br&gt;<br>
Modifying display specifiers&lt;br&gt;<br>
Adding users container&lt;br&gt;<br>
Modifying users container&lt;br&gt;<br>
Adding computers container&lt;br&gt;<br>
Modifying computers container&lt;br&gt;<br>
Setting up sam.ldb data&lt;br&gt;<br>
Setting up well known security principals&lt;br&gt;<br>
Setting up sam.ldb users and groups&lt;br&gt;<br>
Setting up self join&lt;br&gt;<br>
Adding DNS accounts&lt;br&gt;<br>
Creating CN=MicrosoftDNS,CN=System,DC=adosakana,DC=local&lt;br&gt;<br>
Creating DomainDnsZones and ForestDnsZones partitions&lt;br&gt;<br>
Populating DomainDnsZones and ForestDnsZones partitions&lt;br&gt;<br>
Setting up sam.ldb rootDSE marking as synchronized&lt;br&gt;<br>
Fixing provision GUIDs&lt;br&gt;<br>
A Kerberos configuration suitable for Samba AD has been generated at /usr/local/samba/private/krb5.conf&lt;br&gt;<br>
Setting up fake yp server settings&lt;br&gt;<br>
Once the above files are installed, your Samba AD server will be ready to use&lt;br&gt;<br>
Server Role:           active directory domain controller&lt;br&gt;<br>
Hostname:              adserver&lt;br&gt;<br>
NetBIOS Domain:        ADOSAKANA&lt;br&gt;<br>
DNS Domain:            adosakana.local&lt;br&gt;<br>
DOMAIN SID:            S-1-5-21-98280047-2622333268-1688910966&lt;/p&gt;<br>
&lt;p&gt;[root@adserver ~]#

なお、password_hashでエラーとなるとおもいます。
現状の /etc/krb5.conf の内容が問題で発生しています。
この後の手順で正しいものに置き換えるので、この段階では単純に「mv /etc/krb5.conf /etc/krb5.conf.org」などの手段で別の名前として使わなくすれば大丈夫です。

Setting up sam.ldb users and groups&lt;br&gt;<br>
ERROR(ldb): uncaught exception - operations error at ../source4/dsdb/samdb/ldb_modules/password_hash.c:3132&lt;br&gt;<br>
  File "/usr/local/samba/lib64/python2.7/site-packages/samba/netcmd/__init__.py", line 176, in _run&lt;br&gt;<br>
    return self.run(*args, **kwargs)&lt;br&gt;<br>
  File "/usr/local/samba/lib64/python2.7/site-packages/samba/netcmd/domain.py", line 474, in run&lt;br&gt;<br>
    nosync=ldap_backend_nosync, ldap_dryrun_mode=ldap_dryrun_mode)&lt;br&gt;<br>
  File "/usr/local/samba/lib64/python2.7/site-packages/samba/provision/__init__.py", line 2175, in provision&lt;br&gt;<br>
    skip_sysvolacl=skip_sysvolacl)&lt;br&gt;<br>
  File "/usr/local/samba/lib64/python2.7/site-packages/samba/provision/__init__.py", line 1787, in provision_fill&lt;br&gt;<br>
    next_rid=next_rid, dc_rid=dc_rid)&lt;br&gt;<br>
  File "/usr/local/samba/lib64/python2.7/site-packages/samba/provision/__init__.py", line 1447, in fill_samdb&lt;br&gt;<br>
    "KRBTGTPASS_B64": b64encode(krbtgtpass.encode('utf-16-le'))&lt;br&gt;<br>
  File "/usr/local/samba/lib64/python2.7/site-packages/samba/provision/common.py", line 55, in setup_add_ldif&lt;br&gt;<br>
    ldb.add_ldif(data, controls)&lt;br&gt;<br>
  File "/usr/local/samba/lib64/python2.7/site-packages/samba/__init__.py", line 229, in add_ldif&lt;br&gt;<br>
    self.add(msg, controls)

9. sambaを起動

[root@adserver ~]# ps -ef|grep samba&lt;br&gt;<br>
root     11129 23028  0 16:01 pts/0    00:00:00 grep --color=auto samba&lt;br&gt;<br>
[root@adserver ~]# /usr/local/samba/sbin/samba&lt;br&gt;<br>
[root@adserver ~]# ps -ef|grep samba&lt;br&gt;<br>
root     11131     1 14 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11132 11131  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11133 11131  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11134 11132  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11135 11134 19 16:01 ?        00:00:00 /usr/local/samba/sbin/smbd -D --option=server role check:inhibit=yes --foreground&lt;br&gt;<br>
root     11136 11131  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11137 11131  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11138 11131 21 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11139 11131  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11140 11131  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11141 11131  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11142 11131  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11143 11131  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11144 11131  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11145 11142  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11146 11131  2 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11147 11145 18 16:01 ?        00:00:00 /usr/local/samba/sbin/winbindd -D --option=server role check:inhibit=yes --foreground&lt;br&gt;<br>
root     11148 11131  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11151 11146  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11152 11151 17 16:01 ?        00:00:00 python /usr/local/samba/sbin/samba_dnsupdate&lt;br&gt;<br>
root     11153 11146  0 16:01 ?        00:00:00 /usr/local/samba/sbin/samba&lt;br&gt;<br>
root     11154 11153 17 16:01 ?        00:00:00 python /usr/local/samba/sbin/samba_spnupdate&lt;br&gt;<br>
root     11157 11135  0 16:01 ?        00:00:00 /usr/local/samba/sbin/smbd -D --option=server role check:inhibit=yes --foreground&lt;br&gt;<br>
root     11158 11135  0 16:01 ?        00:00:00 /usr/local/samba/sbin/smbd -D --option=server role check:inhibit=yes --foreground&lt;br&gt;<br>
root     11160 23028  0 16:01 pts/0    00:00:00 grep --color=auto samba&lt;br&gt;<br>
root     11161 11147  0 16:01 ?        00:00:00 /usr/local/samba/sbin/winbindd -D --option=server role check:inhibit=yes --foreground&lt;br&gt;<br>
[root@adserver ~]#

10.動作確認
CentOS内部からSMB接続を行うテストを実施。

[root@adserver ~]# /usr/local/samba/bin/smbclient --version&lt;br&gt;<br>
Version 4.7.5&lt;br&gt;<br>
[root@adserver ~]# /usr/local/samba/bin/smbclient -L localhost -U%&lt;/p&gt;<br>
&lt;p&gt;        Sharename       Type      Comment&lt;br&gt;<br>
        ---------       ----      -------&lt;br&gt;<br>
        netlogon        Disk&lt;br&gt;<br>
        sysvol          Disk&lt;br&gt;<br>
        IPC$            IPC       IPC Service (Samba 4.7.5)&lt;br&gt;<br>
Reconnecting with SMB1 for workgroup listing.&lt;/p&gt;<br>
&lt;p&gt;        Server               Comment&lt;br&gt;<br>
        ---------            -------&lt;/p&gt;<br>
&lt;p&gt;        Workgroup            Master&lt;br&gt;<br>
        ---------            -------&lt;br&gt;<br>
[root@adserver ~]#

以前は「Domain=[ADOSAKANA.LOCAL] OS=[Unix] Server=[Samba x.y.z]」という出力もあったのですが、Samba 4.7.5では無くなったようです。

netlogon共有にAdministrator権限でアクセスできるか確認。

[root@adserver ~]# /usr/local/samba/bin/smbclient //localhost/netlogon -UAdministrator -c 'ls'&lt;br&gt;<br>
Enter Administrator's password:&lt;br&gt;<br>
  .                                   D        0  Fri Mar  2 15:53:48 2018&lt;br&gt;<br>
  ..                                  D        0  Fri Mar  2 15:58:16 2018&lt;/p&gt;<br>
&lt;p&gt;                14034944 blocks of size 1024. 11789628 blocks available&lt;br&gt;<br>
[root@adserver ~]#

11.AD DNSの動作テスト
AD DNSが想定通りに動作しているかテストします。

まず、どんなzoneが登録されているのか確認

[root@adserver ~]# /usr/local/samba/bin/samba-tool dns zonelist 127.0.0.1 -U Administrator&lt;br&gt;<br>
Password for [ADOSAKANA\Administrator]:&lt;br&gt;<br>
  2 zone(s) found&lt;/p&gt;<br>
&lt;p&gt;  pszZoneName                 : adosakana.local&lt;br&gt;<br>
  Flags                       : DNS_RPC_ZONE_DSINTEGRATED DNS_RPC_ZONE_UPDATE_SECURE&lt;br&gt;<br>
  ZoneType                    : DNS_ZONE_TYPE_PRIMARY&lt;br&gt;<br>
  Version                     : 50&lt;br&gt;<br>
  dwDpFlags                   : DNS_DP_AUTOCREATED DNS_DP_DOMAIN_DEFAULT DNS_DP_ENLISTED&lt;br&gt;<br>
  pszDpFqdn                   : DomainDnsZones.adosakana.local&lt;/p&gt;<br>
&lt;p&gt;  pszZoneName                 : _msdcs.adosakana.local&lt;br&gt;<br>
  Flags                       : DNS_RPC_ZONE_DSINTEGRATED DNS_RPC_ZONE_UPDATE_SECURE&lt;br&gt;<br>
  ZoneType                    : DNS_ZONE_TYPE_PRIMARY&lt;br&gt;<br>
  Version                     : 50&lt;br&gt;<br>
  dwDpFlags                   : DNS_DP_AUTOCREATED DNS_DP_FOREST_DEFAULT DNS_DP_ENLISTED&lt;br&gt;<br>
  pszDpFqdn                   : ForestDnsZones.adosakana.local&lt;br&gt;<br>
[root@adserver ~]#

Active Directoryで使用するDNSのSRVレコードが登録されているかをhostコマンドを使って確認。

[root@adserver ~]# host -t SRV _ldap._tcp.adosakana.local 127.0.0.1&lt;br&gt;<br>
Using domain server:&lt;br&gt;<br>
Name: 127.0.0.1&lt;br&gt;<br>
Address: 127.0.0.1#53&lt;br&gt;<br>
Aliases:&lt;/p&gt;<br>
&lt;p&gt;_ldap._tcp.adosakana.local has SRV record 0 100 389 adserver.adosakana.local.&lt;br&gt;<br>
[root@adserver ~]# host -t SRV _kerberos._udp.adosakana.local 127.0.0.1&lt;br&gt;<br>
Using domain server:&lt;br&gt;<br>
Name: 127.0.0.1&lt;br&gt;<br>
Address: 127.0.0.1#53&lt;br&gt;<br>
Aliases:&lt;/p&gt;<br>
&lt;p&gt;_kerberos._udp.adosakana.local has SRV record 0 100 88 adserver.adosakana.local.&lt;br&gt;<br>
[root@adserver ~]#

ADサーバのホスト名が登録されているか確認

[root@adserver ~]# host -t A adserver.adosakana.local 127.0.0.1&lt;br&gt;<br>
Using domain server:&lt;br&gt;<br>
Name: 127.0.0.1&lt;br&gt;<br>
Address: 127.0.0.1#53&lt;br&gt;<br>
Aliases:&lt;/p&gt;<br>
&lt;p&gt;adserver.adosakana.local has address 172.17.44.40&lt;br&gt;<br>
[root@adserver ~]#

12. DNSサーバの変更
ADサーバの/etc/resolv.confを、ADサーバ自身を使う様に書き換え

13. /etc/krb5.conf の変更
/usr/local/samba/private/krb5.conf に元となるものがあるので、それを使用する。

[root@adserver ~]# cat /etc/krb5.conf&lt;br&gt;<br>
[logging]&lt;br&gt;<br>
 default = FILE:/var/log/krb5libs.log&lt;br&gt;<br>
 kdc = FILE:/var/log/krb5kdc.log&lt;br&gt;<br>
 admin_server = FILE:/var/log/kadmind.log&lt;/p&gt;<br>
&lt;p&gt;[libdefaults]&lt;br&gt;<br>
 default_realm = EXAMPLE.COM&lt;br&gt;<br>
 dns_lookup_realm = false&lt;br&gt;<br>
 dns_lookup_kdc = false&lt;br&gt;<br>
 ticket_lifetime = 24h&lt;br&gt;<br>
 renew_lifetime = 7d&lt;br&gt;<br>
 forwardable = true&lt;/p&gt;<br>
&lt;p&gt;[realms]&lt;br&gt;<br>
 EXAMPLE.COM = {&lt;br&gt;<br>
  kdc = kerberos.example.com&lt;br&gt;<br>
  admin_server = kerberos.example.com&lt;br&gt;<br>
 }&lt;/p&gt;<br>
&lt;p&gt;[domain_realm]&lt;br&gt;<br>
 .example.com = EXAMPLE.COM&lt;br&gt;<br>
 example.com = EXAMPLE.COM&lt;br&gt;<br>
[root@adserver ~]# cat /usr/local/samba/private/krb5.conf&lt;br&gt;<br>
[libdefaults]&lt;br&gt;<br>
        default_realm = ADOSAKANA.LOCAL&lt;br&gt;<br>
        dns_lookup_realm = false&lt;br&gt;<br>
        dns_lookup_kdc = true&lt;br&gt;<br>
[root@adserver ~]# cp /usr/local/samba/private/krb5.conf /etc/krb5.conf&lt;br&gt;<br>
cp: `/etc/krb5.conf' を上書きしてもよろしいですか(yes/no)? y&lt;br&gt;<br>
[root@adserver ~]# cat /etc/krb5.conf&lt;br&gt;<br>
[libdefaults]&lt;br&gt;<br>
        default_realm = ADOSAKANA.LOCAL&lt;br&gt;<br>
        dns_lookup_realm = false&lt;br&gt;<br>
        dns_lookup_kdc = true&lt;br&gt;<br>
[root@adserver ~]#

14. Kerberosの動作確認

kinitコマンドを実行して確認します。

[root@adserver ~]# kinit administrator@ADOSAKANA.LOCAL&lt;br&gt;<br>
Password for administrator@ADOSAKANA.LOCAL:&lt;br&gt;<br>
Warning: Your password will expire in 41 days on 2018年04月13日 15時58分15秒&lt;br&gt;<br>
[root@adserver ~]#

正常に設定されていれば、上記の様にAdministratorユーザのパスワード有効期限が表示されます。

ドメイン名指定の大文字/小文字を間違えると下記の様なエラーとなります。

[root@adserver ~]# kinit administrator@adosakana.local&lt;br&gt;<br>
Password for administrator@adosakana.local:&lt;br&gt;<br>
kinit: KDC reply did not match expectations while getting initial credentials&lt;br&gt;<br>
[root@adserver ~]#

また、DNSサーバ指定が誤っている場合は下記の様なエラーです。

[root@adserver ~]# kinit administrator@ADOSAKANA.LOCAL&lt;br&gt;<br>
kinit: Cannot resolve servers for KDC in realm "ADOSAKANA.LOCAL" while getting initial credentials&lt;br&gt;<br>
[root@adserver ~]#

「klist」コマンドを実行することでも確認出来ます。

[root@adserver ~]# klist&lt;br&gt;<br>
Ticket cache: FILE:/tmp/krb5cc_0&lt;br&gt;<br>
Default principal: administrator@ADOSAKANA.LOCAL&lt;/p&gt;<br>
&lt;p&gt;Valid starting       Expires              Service principal&lt;br&gt;<br>
2018-03-02T16:06:21  2018-03-03T02:06:21  krbtgt/ADOSAKANA.LOCAL@ADOSAKANA.LOCAL&lt;br&gt;<br>
        renew until 2018-03-03T16:06:18&lt;br&gt;<br>
[root@adserver ~]#

15. フォレストとドメインの機能レベル確認
作成したActive Directoryのドメインの機能レベルとフォレストの機能レベルを確認します。

[root@adserver ~]# /usr/local/samba/bin/samba-tool domain level show&lt;br&gt;<br>
Domain and forest function level for domain 'DC=adosakana,DC=local'&lt;/p&gt;<br>
&lt;p&gt;Forest function level: (Windows) 2008 R2&lt;br&gt;<br>
Domain function level: (Windows) 2008 R2&lt;br&gt;<br>
Lowest function level of a DC: (Windows) 2008 R2&lt;br&gt;<br>
[root@adserver ~]#

Samba 4.7.5では、Windows Sevrer 2008R2と設定されているようです。

16. firewalldの設定

CentOS7ではfirewalldによりポートが制限されています。
現状を「firewall-cmd –list-all」で確認。

# firewall-cmd --list-all&lt;br&gt;<br>
public (active)&lt;br&gt;<br>
  target: default&lt;br&gt;<br>
  icmp-block-inversion: no&lt;br&gt;<br>
  interfaces: ens160&lt;br&gt;<br>
  sources:&lt;br&gt;<br>
  services: ssh dhcpv6-client&lt;br&gt;<br>
  ports:&lt;br&gt;<br>
  protocols:&lt;br&gt;<br>
  masquerade: no&lt;br&gt;<br>
  forward-ports:&lt;br&gt;<br>
  source-ports:&lt;br&gt;<br>
  icmp-blocks:&lt;br&gt;<br>
  rich rules:&lt;br&gt;<br>
# 

開けるべきポートのテンプレートがあらかじめ用意されているので「firewall-cmd –get-services」を実行して確認します。

# firewall-cmd --get-services&lt;br&gt;<br>
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server&lt;br&gt;<br>
#

SambaをADとして使う場合のポートを「Samba AD DC Port Usage」で確認します。

CentOS7のfirewalldで定義されているものと待避させてみると・・・

サービス ポート プロトコル firewalld定義
DNS 53 tcp/udp dns
Kerberos 88 tcp/udp kerberos,freeipa-ldap,freeipa-ldaps
End Point Mapper (DCE/RPC Locator Service) 135 tcp freeipa-trust
NetBIOS Name Service 137 udp samba,samba-client
NetBIOS Datagram 138 udp samba,samba-client,freeipa-trust
NetBIOS Session 139 tcp samba,freeipa-trust
LDAP 389 tcp/udp freeipa-trust(ldap,freeipa-ldapはtcpのみ)
SMB over TCP 445 tcp samba,freeipa-trust(freeipa-trustはudpも含む)
Kerberos kpasswd 464 tcp/udp kpasswd,freeipa-ldap,freeipa-ldaps
LDAPS 636 tcp ldaps,freeipa-ldaps
Dynamic RPC Ports(4.7以前) 1024-1300 tcp freeipa-trust
Dynamic RPC Ports(samba 4.7以降) 49152-65535 tcp ?
Global Catalog 3268 tcp freeipa-trust
Global Catalog SSL 3269 tcp なし

・firewalldの定義「samba」「dns」「freeipa-ldaps」「freeipa-trust」を使用
・「Dynamic RPC Ports(samba 4.7以降):49152-65535」を追加するか、smb.confで「rpc server port」を定義するか。
・「Global Catalog SSL:3269」を追加

# firewall-cmd --permanent --zone=public --add-service=samba&lt;br&gt;<br>
success&lt;br&gt;<br>
# firewall-cmd --permanent --zone=public --add-service=dns&lt;br&gt;<br>
success&lt;br&gt;<br>
# firewall-cmd --permanent --zone=public --add-service=freeipa-ldaps&lt;br&gt;<br>
success&lt;br&gt;<br>
# firewall-cmd --permanent --zone=public --add-service=freeipa-trust&lt;br&gt;<br>
success&lt;br&gt;<br>
# firewall-cmd --reload&lt;br&gt;<br>
success&lt;br&gt;<br>
# firewall-cmd --list-all&lt;br&gt;<br>
public (active)&lt;br&gt;<br>
  target: default&lt;br&gt;<br>
  icmp-block-inversion: no&lt;br&gt;<br>
  interfaces: ens160&lt;br&gt;<br>
  sources:&lt;br&gt;<br>
  services: ssh dhcpv6-client samba dns freeipa-ldaps freeipa-trust&lt;br&gt;<br>
  ports:&lt;br&gt;<br>
  protocols:&lt;br&gt;<br>
  masquerade: no&lt;br&gt;<br>
  forward-ports:&lt;br&gt;<br>
  source-ports:&lt;br&gt;<br>
  icmp-blocks:&lt;br&gt;<br>
  rich rules:&lt;/p&gt;<br>
&lt;p&gt;#

# firewall-cmd --permanent --zone=public --add-port=49152-65535/tcp&lt;br&gt;<br>
success&lt;br&gt;<br>
# firewall-cmd --permanent --zone=public --add-port=3269/tcp&lt;br&gt;<br>
success&lt;br&gt;<br>
# firewall-cmd --reload&lt;br&gt;<br>
success&lt;br&gt;<br>
# firewall-cmd --list-all&lt;br&gt;<br>
public (active)&lt;br&gt;<br>
  target: default&lt;br&gt;<br>
  icmp-block-inversion: no&lt;br&gt;<br>
  interfaces: ens160&lt;br&gt;<br>
  sources:&lt;br&gt;<br>
  services: ssh dhcpv6-client samba dns freeipa-ldaps freeipa-trust&lt;br&gt;<br>
  ports: 49152-65535/tcp 3269/tcp&lt;br&gt;<br>
  protocols:&lt;br&gt;<br>
  masquerade: no&lt;br&gt;<br>
  forward-ports:&lt;br&gt;<br>
  source-ports:&lt;br&gt;<br>
  icmp-blocks:&lt;br&gt;<br>
  rich rules:&lt;br&gt;<br>
#

17. systemdへの登録
systemdへの登録については「Managing the Samba AD DC Service Using Systemd」を参照のこと
CentOS6の場合は「Managing the Samba AD DC Service Using an Init Script

以上で設定は終了です。

既存のSamba 4.5以前を4.7へアップデートする場合の注意点

あまり考えずに既存のSamba 4.4.x環境を最新のSamba 4.7.xにアップデートをした。
ようは、configure;make;make install。

が・・・「Updating Samba」を見ると、Samba 4.5.0で「replPropertyMetaData」の取り扱いが変わったので修正しなければならない、という記載が・・・

修正が必要かどうかは「samba-tool dbcheck –cross-ncs」で確認出来る、とのこと

問題なければ、下記の出力・・・

# samba-tool dbcheck --cross-ncs
Checking 3602 objects
Checked 3602 objects (0 errors)
#

問題がある場合は下記の様な形でエラーが報告されます。
ちなみに、エラーのテキスト出力が6.5MBありました・・・

# samba-tool dbcheck --cross-ncs --fix --yes
Checking 3602 objects
CN=MHS-OR-Address,CN=Schema,CN=Configuration,DC=adosakana,DC=local: 0x0009030e
CN=MHS-OR-Address,CN=Schema,CN=Configuration,DC=adosakana,DC=local: 0x00090177
<略>
Checked 3602 objects (3467 errors)
#

「samba-tool dbcheck –cross-ncs –fix –yes」を実行することで修正されました。

また、4.0以前のバージョンからアップデートした場合にSYSVOLの修復を行うために「samba-tool ntacl sysvolreset」を実行するという記述があったので、試しにSYSVOLのチェック「samba-tool ntacl sysvolcheck」を実行してみると、下記のエラーが発生。

# samba-tool ntacl sysvolcheck

ERROR(<class 'samba.provision.ProvisioningError'>): uncaught exception - ProvisioningError: DB ACL on GPO directory /usr/local/samba/var/locks/sysvol/adosakana.local/Policies/{20AA5877-2399-4CBC-8BA4-7F23D8810774} O:DAG:DAD:PAI(A;OICI;0x001f01ff;;;DA)(A;OICI;0x001f01ff;;;EA)(A;OICIIO;0x001f01ff;;;CO)(A;OICI;0x001f01ff;;;DA)(A;OICI;0x001f01ff;;;SY)(A;OICI;0x001200a9;;;AU)(A;OICI;0x001200a9;;;ED) does not match expected value O:DAG:DAD:P(A;OICI;0x001f01ff;;;DA)(A;OICI;0x001f01ff;;;EA)(A;OICIIO;0x001f01ff;;;CO)(A;OICI;0x001f01ff;;;DA)(A;OICI;0x001f01ff;;;SY)(A;OICI;0x001200a9;;;AU)(A;OICI;0x001200a9;;;ED) from GPO object
  File "/usr/local/samba/lib64/python2.6/site-packages/samba/netcmd/__init__.py", line 176, in _run
    return self.run(*args, **kwargs)
  File "/usr/local/samba/lib64/python2.6/site-packages/samba/netcmd/ntacl.py", line 270, in run
    lp)
  File "/usr/local/samba/lib64/python2.6/site-packages/samba/provision/__init__.py", line 1723, in checksysvolacl
    direct_db_access)
  File "/usr/local/samba/lib64/python2.6/site-packages/samba/provision/__init__.py", line 1674, in check_gpos_acl
    domainsid, direct_db_access)
  File "/usr/local/samba/lib64/python2.6/site-packages/samba/provision/__init__.py", line 1621, in check_dir_acl
    raise ProvisioningError('%s ACL on GPO directory %s %s does not match expected value %s from GPO object' % (acl_type(direct_db_access), path, fsacl_sddl, acl))
#

「samba-tool ntacl sysvolreset」を実行して修正。

# samba-tool ntacl sysvolreset
# samba-tool ntacl sysvolcheck
#

samba 4.7.4で作ったActive Directory環境でWindowsServer2016フェールオーバークラスターを動作させた

以前試したときはうまくいかなかったが、どうやら、動くらしい、という話を聞いて試してみた。

Samba 4.7.4で、ドメインレベル/フォレストレベルをWindows Server 2008R2に設定した状態で実施。
(レベルの確認・変更については「samba 4.xでドメイン/フォレストの機能レベルを変更する」を参照のこと)

クラスタの検証は問題なく通過し、実際に組んで見るとネットワークへのリソース名登録周りでエラーが発生。

ログの名前:         System
ソース:           Microsoft-Windows-FailoverClustering
日付:            2018/02/28 18:41:44
イベント ID:       1194
タスクのカテゴリ:      ネットワーク名リソース
レベル:           エラー
キーワード:         
ユーザー:          SYSTEM
コンピューター:       server1.adosakana.local
説明:
クラスター ネットワーク名リソース 'クラスタリソース1' は、ドメイン 'adosakana.local' の関連付けられたコンピューター オブジェクトを作成できませんでした (期間: Resource online)。

関連するエラー コードのテキストは次のとおりです: アクセスが拒否されました。

ドメイン管理者と協力して、次のことを確認してください。
- クラスター ID 'クラスタ名$' が、コンピューター オブジェクトを作成するためのアクセス許可を持っていること。既定では、すべてのコンピューター オブジェクトがクラスター ID 'クラスタ名$' と同じコンテナー内に作成されます。
- コンピューター オブジェクトのクォータに達していないこと。
- 既存のコンピューター オブジェクトがある場合は、[Active Directory ユーザーとコンピューター] のツールを使用して、クラスター ID 'クラスタ名$' にそのコンピューター オブジェクトに対するフル コントロールのアクセス許可があることを確認してください。

解決方法はMicrosoftのKB「クラスター環境においてクライアント アクセス ポイントを作成または削除した際、イベント ID 1222 と 1197 が記録される。」にあるままでした。
下記の設定を行ったところ、クラスタが起動するようになりました。

1. Domain Administrator権限を持っているユーザで「Active Directory ユーザーとコンピューター」を開く
2. 「表示」-「拡張機能」を選択し、セキュリティなどの設定が表示される状態に変更
3. 「Computers」コンテナのプロパティを開く
4. 「セキュリティ」タブの「詳細設定」を開く
5. 「追加」を開く
6. まず、「プリンシパルの選択」のリンクをクリック
 「オブジェクトの種類」を開き、「コンピュータ」にチェックを入れる
 「選択するオブジェクト名を入力してください」の下の欄にエラーがでた「クラスタ名」を入力
 「名前を確認」してOK
7. 種類「許可」、適用先「このオブジェクトとすべての子オブジェクト」が選択されていることを確認
8. アクセス許可は「すべてのプロパティの読み取り」と「すべての子オブジェクトの作成」にチェック
 他の項目は標準設定のままで良い
9. この設定でセキュリティの追加を完了する

CephのOSD毎のPlacement Groupの数を確認する

Cephのテスト環境を構築してみた。

シナリオ通りに構築を進めていき、とりあえずは問題なくは終わった。
終わったんだけど、最後にステータスでも確認してみるかとceph healthを実行してみたところHEALTH_WARNが・・・

[root@ceph01 ~]# ceph health
HEALTH_WARN too many PGs per OSD (480 > max 300)
[root@ceph01 ~]#

OSDにたくさんのPGが割り当てられてる、といってるけど、具体的にはどれくらいあるんだろう?

と調べていくと、stackoverflowにある、下記のPGとOSDの関係性に関する質問を発見
Ceph too many pgs per osd: all you need to know

そこで紹介されている「Get the Number of Placement Groups Per Osd」に、OSD毎のPG数をコマンドで確認する手法が掲載されていた。

「ceph pg dump」の出力結果を整形して見やすいようにしている、というものだった。

ceph pg dump | awk '
BEGIN { IGNORECASE = 1 }
 /^PG_STAT/ { col=1; while($col!="UP") {col++}; col++ }
 /^[0-9a-f]+\.[0-9a-f]+/ { match($0,/^[0-9a-f]+/); pool=substr($0, RSTART, RLENGTH); poollist[pool]=0;
 up=$col; i=0; RSTART=0; RLENGTH=0; delete osds; while(match(up,/[0-9]+/)>0) { osds[++i]=substr(up,RSTART,RLENGTH); up = substr(up, RSTART+RLENGTH) }
 for(i in osds) {array[osds[i],pool]++; osdlist[osds[i]];}
}
END {
 printf("\n");
 printf("pool :\t"); for (i in poollist) printf("%s\t",i); printf("| SUM \n");
 for (i in poollist) printf("--------"); printf("----------------\n");
 for (i in osdlist) { printf("osd.%i\t", i); sum=0;
   for (j in poollist) { printf("%i\t", array[i,j]); sum+=array[i,j]; sumpool[j]+=array[i,j] }; printf("| %i\n",sum) }
 for (i in poollist) printf("--------"); printf("----------------\n");
 printf("SUM :\t"); for (i in poollist) printf("%s\t",sumpool[i]); printf("|\n");
}'

これをテスト環境で実行してみると下記の様な出力を得られた

[root@ceph01 ~]# ceph pg dump | awk '
BEGIN { IGNORECASE = 1 }
 /^PG_STAT/ { col=1; while($col!="UP") {col++}; col++ }
 /^[0-9a-f]+\.[0-9a-f]+/ { match($0,/^[0-9a-f]+/); pool=substr($0, RSTART, RLENGTH); poollist[pool]=0;
 up=$col; i=0; RSTART=0; RLENGTH=0; delete osds; while(match(up,/[0-9]+/)>0) { osds[++i]=substr(up,RSTART,RLENGTH); up = substr(up, RSTART+RLENGTH) }
 for(i in osds) {array[osds[i],pool]++; osdlist[osds[i]];}
}
END {
 printf("\n");
 printf("pool :\t"); for (i in poollist) printf("%s\t",i); printf("| SUM \n");
 for (i in poollist) printf("--------"); printf("----------------\n");
 for (i in osdlist) { printf("osd.%i\t", i); sum=0;
   for (j in poollist) { printf("%i\t", array[i,j]); sum+=array[i,j]; sumpool[j]+=array[i,j] }; printf("| %i\n",sum) }
 for (i in poollist) printf("--------"); printf("----------------\n");
 printf("SUM :\t"); for (i in poollist) printf("%s\t",sumpool[i]); printf("|\n");
}'
dumped all in format plain

pool :  4       5       6       7       8       9       10      11      12      13      14      1       2       15      3       | SUM
----------------------------------------------------------------------------------------------------------------------------------------
osd.4   39      29      25      36      27      24      35      34      30      28      34      33      35      29      32      | 470
osd.5   36      35      28      31      21      29      27      37      37      30      32      36      37      27      37      | 480
osd.6   38      37      30      35      30      24      37      33      32      31      27      32      33      31      27      | 477
osd.7   33      34      30      31      25      34      35      42      32      33      21      30      31      28      33      | 472
osd.8   29      32      39      35      28      39      31      34      36      35      38      34      35      24      21      | 490
osd.9   32      34      33      33      37      38      39      27      30      31      28      29      27      26      26      | 470
osd.10  39      31      34      24      35      36      35      40      34      37      37      45      32      31      37      | 527
osd.11  25      26      30      33      36      42      27      30      42      31      28      32      28      35      31      | 476
osd.0   27      39      38      29      35      24      34      26      28      31      38      23      33      31      32      | 468
osd.1   29      30      29      28      43      24      34      30      22      34      30      37      34      44      29      | 477
osd.2   27      32      35      33      31      38      21      24      30      26      37      26      26      36      33      | 455
osd.3   30      25      33      36      36      32      29      27      31      37      34      27      33      42      46      | 498
----------------------------------------------------------------------------------------------------------------------------------------
SUM :   384     384     384     384     384     384     384     384     384     384     384     384     384     384     384     |
[root@ceph01 ~]#

また、NAKAMURA Minoru’s Home Pageにある「RADOS の概略 (RADOS と CRUSH と Placement Group の関係)」は、Cephの理解に役に立った

LTFS Bulk Transferとは何か?

LTFSの記事を更新する為にSNIAの「LTFS規格書ページ」を見たら「LTFS Bulk Transfer v1.0」なるものを発見。
見てみると2016年10月11日発行の規格書だった。

しかし、SNIA以外のページで見かけない・・・
一体どういうものなのか、規格書を流し読みしてみた。

大量のファイルをひとまとめにして、システム間で転送できるようにする仕組み
Windows/Linux/MacOSX間で可搬性があるLTFSを流用し、
ファイルのアーカイブ処理はLTFSに任せ、システム間転送に司る部分を「LTFS Bulk Transfer」として定義している
というものであるようだ。

対象となるテープは1本だけとは限らないので、LTFS Bulk Transferの定義ファイル内では、xml記述でファイルと格納されているテープのIDを列挙し、それぞれにsha256によるチェックサムを記載し、コード化けを検出できるようにしている。

規格書内の使用例には、クラウドへの移行やクラウド間移行という模式図があり、汎用的な移行に使えるツールとしてLTFSを使用していくような感じも見受けられる。

特に明記はされていないが、物理LTOテープだけではなく、仮想LTOテープ的なものへの適用も考えられていそうな感じではある。

モバイルバージョンを終了