どうも、サイオステクノロジー 山田です。
今回はとある案件で調査した結果のフィードバック記事となります。
案件の要件を箇条書きにすると以下になります。
【要件】
・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)を追加します。
認証設定
今回はマッピング先のバックエンドとして、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 sssSSSD の設定を以下のように編集します。
# 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 [ドメイン名]\domainsyncSamba の設定ファイルを以下のように編集します。
・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ドライブとして、マウントされていることが確認できます。正常に書き込みもできます。
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 を参照することもできるようです。機会があればご紹介できればと思います。
ありがとうございました。