Samba4を使ったファイルサーバの構築と外部LDAPサーバとの連携

#概要
本エントリでは、以下の2つについて紹介します。
1. Samba4を使ってファイルサーバを構築すること。
2. Sambaサーバから、別のサーバに構築されているLDAPに対して認証を行えるようにすること。
※LDAPサーバは既に構築済みという前提です。

今回使用したSambaのバージョンは4.8.3、使用したLDAPはopenLDAPです。

#サーバの構成
想定しているサーバの構成は、以下の通りです。
![構成図.png](https://qiita-image-store.s3.amazonaws.com/0/367074/ff324782-1e48-5b32-57a3-cbf8377cef6c.png)
SambaサーバとLDAPサーバは、別々のサーバという想定です。
また、両者のOSはCentOS7を想定しています。

#必要なパッケージのインストール
Sambaの構築とLDAPとの連携を行うために、Sambaサーバに必要なパッケージをインストールします。
以下のコマンドを実行してください。
`yum -y install samba samba-client samba-common nscd nss-pam-ldapd rsyslog`

#Sambaの設定
まずは、Sambaの設定について説明します。
smb.confの設定と、アクセスログの設定を行います。

##smb.confの設定
smb.confは、共有ディレクトリの場所や認証時に参照するパスワードの場所などを設定するファイルです。
以下は、LDAPとの連携を前提としたsmb.confの例です。

```
    [global]
       # 共通設定
       workgroup = WORKGROUP
       server string = Samba Server %v
       netbios name = [SambaサーバのNetBIOS名]
       security = user
       dos charset = CP932
       wins support = no

       # Linuxユーザ登録・削除用スクリプトのパス
       add user script = [ユーザ追加コマンドのフルパス] %u
       delete user script = [ユーザ削除コマンドのフルパス] -r %u

       # デバッグログ設定
       log level = 3
       log file = [デバッグログ出力先のフルパス]
       max log size = 1000
       utmp = yes

       # LDAP通信設定
       tls enable = off
       passdb backend = ldapsam:ldap://[LDAPサーバのIPアドレス]
       ldap ssl = off
       ldap suffix = [ユーザ情報が登録されているLDAPのsaffix]
       ldap admin dn = [LDAPの管理者ユーザのsuffix]
       ldap passwd sync = yes
       ldap debug level = 3

       # 認証方式設定
       ntlm auth = yes

    [ShareName]
       # ディレクトリの共有設定
       comment = [ディレクトリの説明]
       path = [共有ディレクトリのフルパス]
       browsable = yes
       public = yes
       writable = yes
       read only = no
       guest ok = no
       guest only = no

       # アクセスログ設定
       vfs objects = full_audit
       full_audit:facility = local7
       full_audit:prefix = [出力したい情報のパラメータ]
       full_audit:success = [出力したい情報のパラメータ]
       full_audit:failure = [出力したい情報のパラメータ]
```

上記の各項目については、[こちら](http://www.samba.gr.jp/project/translation/current/htmldocs/manpages/smb.conf.5.html)を参照してください。
アクセスログ設定の項目については、[こちら](http://www.samba.gr.jp/project/translation/current/htmldocs/manpages/vfs_full_audit.8.html)を参照してください。

##アクセスログの設定
Sambaのアクセスログを出力するための設定方法を紹介します。
アクセスログを出力することで、共有ディレクトリ内のファイルごとに、どのユーザがどんな操作を行ったかを記録することができます。
rsyslog.confに、以下の設定を追加します。

```
### begin forwarding rule ###
～(省略)～
# Sambaのアクセスログ設定
local7.*                                                /var/log/samba/accesslog
```

`facility`は、samb.confの`full_audit:facility`に設定したものと合わせてください。
[こちらのページ](http://hakoniwahaniwa.hatenablog.com/entry/2014/05/02/141506)が参考になります。

#SambaサーバのLDAP認証設定
次に、SambaサーバからLDAPサーバに対して認証を行えるように設定します。

##nslcdの設定
nslcdの設定を行います。
nslcd(Name Service LDAP Connection Daemon)とは、LDAPへの接続を担うサービスです。
以下の2つのファイルを編集する必要があります。

①nsswitch.conf
nsswitch.confについてはgroup, passwd, shadowを以下のように編集するだけです。

```
passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap
```

②nslcd.conf
nslcd.confについては、以下の個所を修正するだけです。
この設定を行うことで、認証に使用するLDAPサーバのURIと、認証の際に参照するサフィックスを決めることができます。

```
uri ldap://[LDAPサーバのIPアドレス]
base   group  dc=sample,dc=com
base   passwd dc=sample,dc=com
base   shadow dc=sample,dc=com
```

上記の2つのファイルを設定したら、以下のコマンドを実行します。
`authconfig-tui`
すると、以下の画面が表示されます。
![authconfig-tui.png](https://qiita-image-store.s3.amazonaws.com/0/367074/ffe82c36-e798-2ddd-a28f-3e2a1f35c56e.png)
認証(右側)の「LDAP認証を使用」にチェックを入れ、「次」を押下します。
次は、以下の画面が表示されます。
![authconfig-tui2.png](https://qiita-image-store.s3.amazonaws.com/0/367074/e6349e3d-9117-ccb3-a964-65575e86d994.png)
ここで、「サーバ」にLDAPサーバのIPアドレス、ベースDNには、ユーザ情報が登録されているLDAPのサフィックスをそれぞれ指定してください。

nslcdの設定は以上です。

##secret.tdbへのパスワード登録
LDAPの管理者パスワードを、secret.tdbに登録します。
これを行うことにより、SambaがLDAP認証を行う際にLDAPの情報を参照できるようになります。
以下のコマンドを実行します。
`smbpasswd -W`
するとLDAPパスワードを聞かれるため、LDAPの管理者パスワードを入力してください。
設定が完了したら、以下のコマンドでLDAPのユーザ情報が参照できるか確認してください。
`pdbedit --list`

#各種サービスの再起動
ここまで設定したら、Sambaサーバの各種サービスを再起動します。
以下のコマンドを実行してください。
`systemctl restart smb nmb nslcd rsyslog`
全てが正常に再起動したら、Sambaサーバの設定は完了です。

#LDAPに必要なユーザ情報
Sambaサーバの設定が完了したら、後はLDAPのユーザ情報に必要な項目を追加するだけです。
追加する項目は以下です。

* objectClass: posixAccount
* objectClass: sambaSamAccount
* sambaSID: [SambaサーバのSID]
* sambaHomePath: [Sambaの共有ディレクトリのフルパス]
* sambaHomeDrive: [Sambaのホームドライブ]
* sambaAccountFlags: [U          ]
* uid: [ユーザID]
* uidNumber: [ユーザIDに紐付く番号]
* gidNumber: [ユーザが所属するグループに紐付く番号]
* homeDirectory: [linux上のホームディレクトリ]
* loginShell: /bin/bash
* sambaPasswordHistory: 00000000000000000000000000000000000000000000000000000000
* sambaLMPassword: [Samba用パスワードのハッシュ値]
* sambaNTPassword: [Samba用パスワードのハッシュ値]
* sambaPwdLastSet: [パスワードが設定された日時(UNIX時刻形式)]

上記の各項目については、[こちら](https://prev.net-newbie.com/samba/samba-schema.html)を参照してください。
ただし、sambaSIDについては[こちら](https://prev.net-newbie.com/samba/samba-tips.html)を参照してください。
※上記のリンク先はどちらもSamba3のドキュメントですが、Samba4でも十分参考になります。

以上で、設定は完了です。
これで、Sambaによってファイルサーバを構築し、外部のLDAPサーバに対して認証を行うことができます。