SambaファイルサーバのWindowsマウントについて

どうも、サイオステクノロジー 山田です。

今回はとある案件で調査した結果のフィードバック記事となります。
案件の要件を箇条書きにすると以下になります。

【要件】
・Samba でファイルサーバを構築
・Windows クライアントからホームディレクトリとしてファイルサーバをマウント
・Windows/Linux 同一ユーザ名でログインした場合、双方からマウント先のファイル/ディレクトリに対して読み書きができること
・Windows のユーザ管理は Active Director
・Linux のユーザ管理は OpenLDAP

という内容になります。
一見簡単そうに見えますが、この要件の肝は「双方で読み書きができること」という点になります。
読み書きができることということは、Windows クライアントからマウントした場合でも、Linux にログインした場合と同様のパーミッションの付加が必要であるということになります。

IDMAP について

この問題を解決する方法として、Samba には「IDMAP」という機能があります。
IDMAP とは簡単に言うと、Windows ユーザが個々で持つセキュリティ識別子 (SID) を UNIX の UID と GID にマッピングするという機能です。

SID とはこんな感じで、あまり見慣れない文字列ですね。
“S-1-5-21-810730202-729036218-1108881492-1107”

IDMAP はセキュリティ識別子 (SID) と UID と GID をどのようにマッピングするかを指定できます。
ただ、今回利用する Samba 4.8 から IDMAP を利用する際は、「winbind」にてAD認証を行うことが必須となったようです。
https://www.samba.org/samba/history/samba-4.8.0.html

では、動作を確認していきたいと思います。

検証環境を構築していきますが、主要箇所以外は結果だけとします。
OS は CentOS7 とし、Selinux や firewall などは全て停止している状態です。

ユーザ追加

OpenLDAP と Active Director にユーザを追加します。

OpenLDAP

OpenLDAP にユーザ(user01)及びグループ(domain users)を追加します。

# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "dc=sios,dc=com" uid=user01
dn: uid=user01,ou=People,dc=sios,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
cn: User01
sn: User01
displayName: User01
loginShell: /bin/bash
uidNumber: 1101
gidNumber: 1101
homeDirectory: /home/user01
uid: user01

# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "dc=sios,dc=com" cn="domain users"
dn: cn=domain users,ou=Group,dc=sios,dc=com
objectClass: posixGroup
objectClass: top
cn: domain users
gidNumber: 1101

ただ、グループ(domain users)は作成しなくても、動作はします。(してしまいます。。)

Active Director

Active Director にユーザ(user01)を追加します。

1
2

認証設定

今回はマッピング先のバックエンドとして、Name Service Switch (NSS) を利用して OpenLDAP に接続します。
CentOS6 以前では「nss_ldap」をバックエンドモジュールとして OpenLDAP に接続していましたが、CentOS7 では「nss_sss」を利用して LDAP に接続することが推奨されています。
System Security Services Daemon (SSSD) は様々な認証プロバイダーへのアクセスを提供するサービスです。

SSSD 有効化

以下のコマンドにて、NSS サービスを設定して SSSD を有効化します。

# authconfig --enablesssd --update
# grep sss /etc/nsswitch.conf
passwd:     files sss
shadow:     files sss
group:      files sss
services:   files sss
netgroup:   files sss
automount:  files sss

SSSD の設定を以下のように編集します。

# vi /etc/sssd/sssd.conf
-----ここから-----
[sssd]
config_file_version = 2
services = nss, pam
domains = default

[domain/default]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldap://127.0.0.1
ldap_search_base = ou=People,dc=sios,dc=com
ldap_group_search_base = ou=Group,dc=sios,dc=com
ldap_id_use_start_tls = False
ldap_tls_reqcert = never
cache_credentials = false
enumerate = true

[nss]

[pam]
-----ここまで-----

SSSD 起動

SSSD サービスを起動します。

# systemctl start sssd
# systemctl enable sssd

ユーザ情報が OpenLDAP から引けることを確認します。

# id user01
uid=1101(user01) gid=1101(domain users) groups=1101(domain users)

Samba 設定

Linux から Active Director に登録されているユーザを確認することができるように設定します。

インストール

一旦、Samba や winbind など必要なパッケージをインストールします。

# yum install -y samba samba-winbind samba4-winbind-clients

設定

設定及び、Linux サーバをドメインに参加させます。

# cp -p /etc/samba/smb.conf /etc/samba/smb.conf.orig

# authconfig --enablewinbindauth --smbsecurity ads --disablewinbindoffline --smbservers=[Active DirectorのFQDN] --smbworkgroup=[ワークグループ] --smbrealm [レルム] --winbindtemplateshell=/sbin/nologin --update

# net ads join -S [Active DirectorのFQDN] -U administrator
Enter administrator's password:[ADパスワード]

Active Director に登録されているユーザを確認できることを確認します。

# wbinfo -u
[ドメイン名]\administrator
[ドメイン名]\guest
[ドメイン名]\defaultaccount
[ドメイン名]\krbtgt
[ドメイン名]\user01
[ドメイン名]\user02
[ドメイン名]\user03
[ドメイン名]\domainsync

Samba の設定ファイルを以下のように編集します。

・idmap config で指定ドメインに対して、バックエンドを nss に指定
・idmap config で指定ドメインに対して、紐付ける UID/GID の範囲を指定
・ホームディレクトリの Path を “/home/[ユーザ名]” に指定
 ※ デフォルトでは “/home/[ドメイン名]/[ユーザ名]”

# vi /etc/samba/smb.conf
-----ここから-----
[global]

   workgroup = [ワークグループ]
   password server = [Active DirectorのFQDN]
   realm = [レルム]
   security = ads

   idmap config * : range = 16777216-33554431
   idmap config [ドメイン名] : backend = nss
   idmap config [ドメイン名] : range = 1100 - 16777215

   template shell = /sbin/nologin
   kerberos method = secrets only
   winbind use default domain = false
   winbind offline logon = false

[homes]
        comment = Home Directories
        valid users = %S
        browseable = No
        writable = yes
        Path = /home/%S
-----ここまで-----

# systemctl stop smb nmb winbind
# systemctl start smb nmb winbind
# systemctl enable smb nmb winbind

動作確認

実際に動作を確認してみましょう。

Windows

Windows クライアントにて、ユーザ名を user01 としてログインします。
ドライブを見ると Zドライブとして、マウントされていることが確認できます。

3

正常に書き込みもできます。

4

Linux

次に Linux から user01 としてログインし、ホームディレクトリを確認します。

$ pwd
/home/user01

$ ls -l
合計 0
-rwxr--r-- 1 user01 domain users 0  4月 24 14:49 新しいテキスト ドキュメント.txt
drwxr-xr-x 2 user01 domain users 6  4月 24 14:50 新しいフォルダー

$ cat "新しいテキスト ドキュメント.txt"
TEST

最後に

Samba についてご紹介しました。
自分自身、あまり Samba について詳しくなかったのですが、こういう要件を実装することを通して勉強できてとてもよかったです。何も考えずに実装できそうかなと初めは思ったのですが、やはり Samba は一筋縄ではいかないですね。
今回はバックエンドを nss に指定していますが、idmap_rfc2307 というプラグインをバックエンドに指定することで、直接 LDAP を参照することもできるようです。機会があればご紹介できればと思います。
ありがとうございました。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です