見出し画像

394.2 認証と許可およびWinbind

主題394:Sambaのユーザとグループの管理
394.2 認証と許可およびWinbind

LinuC300の試験範囲である主題390~397まであるうちの「主題394:Sambaのユーザとグループの管理」から「394.2 認証と許可およびWinbind」についてのまとめ

  • 重要度:5

  • 説明:
    さまざまな認証方法を理解し、アクセス制御を設定できること。Winbindサービスのインストールと設定を実行できること。

  • 主要な知識範囲:
    - パスワードデータベースをセットアップする
    - パスワード同期を実行する
    - 種々の passdbバックエンドに関する知識
    - Samba passdbバックエンド間の変換
    - SambaとLDAPを統合する
    - Winbindを設定する 
    - PAMおよびNSSの設定

  • 重要なファイル、用語、ユーティリティ:
    - smb.conf
    - smbpasswd、 tdbsam、 ldapsam
    - passdb backend
    - libnss_winbind
    - libpam_winbind
    - libpam_smbpass
    - wbinfo
    - getent
    - SIDと外部のSID
    - /etc/passwd
    - /etc/group


(補足)
Sambaユーザーは事前に作成されています。
(別記事 Appendix (準備その4)ユーザーを作成する 参照)


パスワードデータベースをセットアップする

パスワードデータベースが格納されている場所は$PRIVATE_DIRでsmbd -bコマンドで確認できる。

★ ソースからインストールしたSamba3 ★
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# smbd -b | grep -i private 
   :
   PRIVATE_DIR: /usr/local/samba/private
   :
[root@rocky9-samba31 ~]#
★パッケージからインストールしたSamba4 ★
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# smbd -b | grep -i private
   :
   PRIVATE_DIR: /var/lib/samba/private
   :
[root@rocky9-samba41 ~]#

また、パスワードデータベースの種類や$PRIVATE_DIR以外の格納場所およびファイル名はsmb.confの[grobal]セクションでpassdb backendパラメータで設定ができる。

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# testparm -sv | grep passdb
     :
        passdb backend = tdbsam
     :
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ls -l /usr/local/samba/private/   <--- $PRIVATE_DIR
     :
-rw------- 1 root root 36864  621 00:56 passdb.tdb   <--- パスワードデータベース
     :
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# testparm -sv | grep passdb
     :
        passdb backend = tdbsam:/etc/samba/private/passdb.tdb 
     :
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ls -l /etc/samba/private/passdb.tdb
-rw-r--r-- 1 root root 32768  625 23:31 /etc/samba/private/passdb.tdb
[root@rocky9-samba31 ~]#

パスワード同期を実行する

SambaユーザーとLinuxユーザーを同期させることができる。
smb.confのグローバルセクションに([grobal])に以下の設定を追加する。

  • unix password sync = No
    このパラメータをYesにすることでSambaユーザーのパスワードを変更と同時にLinuxユーザーのパスワードが変更される。
    パスワード変更はpasswd programで指定されたコマンドがroot権限で実行される。
    ※下記(補足)のとおりこのパラメータを使ってパスワードの同期を実現するためにはセキュリティ的に脆弱な状態にする必要があるので検証以外の目的での使用は避けたほうが良さそうです。

  • passwd program =
    unix password sync = Yes の場合はこのパラメータにLinuxユーザーのパスワードを変更するプログラムを指定する。
    設定例)passwd program = /usr/bin/passwd %u

  • passwd chat = newpassword* %n\nnewpassword* %n\n changed
    passwd programパラメータで指定されたプログラムが呼び出されたときにユーザーにパスワード入力を求める文字列を設定する。

  • pam password change = No
    このパラメータをYesにすることでSambaユーザーのパスワードを変更と同時にLinuxユーザーのパスワードが変更される。
    パスワード変更はPAMモジュールで実行される。

(補足)
RockyLinux9でunix password syncの設定をしても以下のエラーが出て動作確認ができません。
「NISを使っているとこのようなエラーが出る」という情報を見かけるがRockyLinux9のアップストリームにあたるRHEL9からNISが使えなくなっているのでNISは関係なさそうです。
ちなみに、pam password change = Yes だとパスワード変更ができる。

[user00@rocky9-samba31 ~]$
[user00@rocky9-samba31 ~]$ smbpasswd
Old SMB password: ******** <--- 古いパスワード
New SMB password: ******** <--- 新しいパスワード
Retype new SMB password: ******** <--- 新しいパスワード再入力
SAMR connection to machine NT_STATUS_ACCESS_DENIED failed. Error was 127.0.0.1, but LANMAN password changes are disabled
[user00@rocky9-samba31 ~]$

エラーの後半部分に”LANMAN password changes are disabled”と出ているので、以下の設定をして無理やりLANMANを有効化すればunix password syncによるパスワード変更が可能になるが、LANMANは脆弱なので検証以外の目的では使わないほうが良さそうです。
[global]
   lanman auth = Yes
   client lanman auth = Yes
   client NTLMv2 auth = No

[user00@rocky9-samba31 ~]$
[user00@rocky9-samba31 ~]$ smbpasswd
Old SMB password: ******** <--- 古いパスワード
New SMB password: ******** <--- 新しいパスワード
Retype new SMB password: ******** <--- 新しいパスワード再入力
cli_oem_change_password: Failed to send password change for user user00
machine 127.0.0.1 rejected the password change: Error was : NT_STATUS_OK.
Password changed for user user00
[user00@rocky9-samba31 ~]$
  • client ntlmv2 auth = Yes | No
    - Yes:NTLM、client lanman auth、client plaintext auth が無効になる
    - Yes:NTLMv2のみ対応
    - No:client lanman auth に従う※既定値※

  • client lanman auth = Yes | No
    - Yes:LANMANが使える
    - No:client plaintext auth = No になる※既定値※

  • lanman auth = Yes | No
    - Yes:LANMANが使える
    - No:LANMANが使えない※既定値※

  • (Sabma3)ntlm auth = Yes | No
    - Yes:NTLMが使える※既定値※
    - No:NTLMが使えない(LANMANかNTMLv2が使える)

  • (Sabma4)ntlm auth = ntlmv1-permitted | ntlmv2-only | mschapv2-and-ntlmv2-only | disabled
    - ntlmv1-permitted(Yes):NTLM以上が使える
    - ntlmv2-only(no):NTLMv2が使える※既定値※
    - mschapv2-and-ntlmv2-only:MSCHAPv2 認証を提供することが確実である場合に限って NTLMv1 認証
    - disabled → LANMAN、NTLMが使えない


種々の passdbバックエンドに関する知識

passdbにはユーザーとグループの情報が格納されている。
passdbの種類にはsmbpasswd、tdbsam、ldapsamがあり、[grobal]セクションのpassdb backendパラメータで指定する。既定値はtdbsamである。

  • passdb backend = smbpasswd
    テキスト形式の古いタイプのデータベース

  • passdb backend = tdbsam
    TDB(Trivial Database)形式のデータベース
    (別記事 Appendix SambaのTDBファイル 参照)
    TDBを操作するにはtdbtool、tdbbackup、tdbrestore、tdbdumpといったツールがある。
    (別記事 392.4 Sambaのトラブルシューティング 参照)

  • passdb backend = ldapsam
    Sambaの外部にあるLDAP(Lightweight Directory Access Protocol)サーバーを使う。


Samba passdbバックエンド間の変換

passdbの相互変換はpdbeditコマンドで実現できる。

(準備)
passdbを保存するディレクトリ(/root/passdb_backup)を用意しておく。

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# mkdir passdb_backup
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ls -ld passdb_backup/
drwxr-xr-x 2 root root 2  625 21:30 passdb_backup/
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# cd passdb_backup/
[root@rocky9-samba31 passdb_backup]#
[root@rocky9-samba31 passdb_backup]# pwd
/root/passdb_backup
[root@rocky9-samba31 passdb_backup]#
[root@rocky9-samba31 passdb_backup]# ls -la
合計 2
drwxr-xr-x 2 root root  2  625 22:09 .
dr-xr-x--- 5 root root 17  625 21:30 ..
[root@rocky9-samba31 passdb_backup]#

passdb backendがtdbsamで、TDBファイルが存在し、ユーザーが登録されていることを確認する

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# testparm -sv | grep passdb
     :
        passdb backend = tdbsam
     :
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# smbd -b | grep -i private 
   :
   PRIVATE_DIR: /usr/local/samba/private
   :
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ls -l /usr/local/samba/private
   :
-rw------- 1 root root 36864  621 00:56 passdb.tdb
   :
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# tdbbackup -v /usr/local/samba/private/passdb.tdb
/usr/local/samba/private/passdb.tdb : 11 records
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# pdbedit -L
user01:1001:
user00:1000:
user02:1002:
user03:1003:
[root@rocky9-samba31 ~]#

~tdbsam形式 → smbpasswd形式~
pdbedit -i tdbsam:<ファイル名> -e smbpasswd:<ファイル名>

[root@rocky9-samba31 passdb_backup]#
[root@rocky9-samba31 passdb_backup]# pdbedit -i tdbsam:/usr/local/samba/private/passdb.tdb -e smbpasswd:/root/passdb_backup/passdb.smbpasswd
startsmbfilepwent_internal: file /root/passdb_backup/passdb.smbpasswd did not exist. File successfully created.
Importing account for user01...ok
Importing account for user00...ok
Importing account for user02...ok
Importing account for user03...ok
[root@rocky9-samba31 passdb_backup]#
[root@rocky9-samba31 passdb_backup]# ls -lF
合計 1
-rw------- 1 root root 424  625 22:12 passdb.smbpasswd
[root@rocky9-samba31 passdb_backup]#
[root@rocky9-samba31 passdb_backup]# cat passdb.smbpasswd
user01:1001:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:B2641AEA8EB4C00EDE89CD2B7C78F6FB:[U          ]:LCT-648F2872:
user00:1000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:3F9F8BF549B40C59CACD6F80620FB4D5:[U          ]:LCT-6491CC3A:
user02:1002:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:8E2D88571AAA9BB30188A99834E619A2:[U          ]:LCT-648F287D:
user03:1003:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:67BBEC696A82DC182CAE409589F896ED:[U          ]:LCT-648F29AB:
[root@rocky9-samba31 passdb_backup]#

~smbpasswd形式 → tdbsam形式~
pdbedit -i smbpasswd:<ファイル名> -e tdbsam:<ファイル名>

[root@rocky9-samba31 passdb_backup]#
[root@rocky9-samba31 passdb_backup]# pdbedit -i smbpasswd:/root/passdb_backup/passdb.smbpasswd -e tdbsam:/root/passdb_backup/passdb.tdb
Importing account for user01...ok
Importing account for user00...ok
Importing account for user02...ok
Importing account for user03...ok
[root@rocky9-samba31 passdb_backup]#
[root@rocky9-samba31 passdb_backup]# ls -l
合計 3
-rw------- 1 root root   424  625 22:12 passdb.smbpasswd
-rw------- 1 root root 36864  625 22:16 passdb.tdb
[root@rocky9-samba31 passdb_backup]#
[root@rocky9-samba31 passdb_backup]# tdbbackup -v passdb.tdb
passdb.tdb : 11 records
[root@rocky9-samba31 passdb_backup]#
[root@rocky9-samba31 passdb_backup]# pdbedit -L -b tdbsam:/root/passdb_backup/passdb.tdb
user01:1001:
user00:1000:
user02:1002:
user03:1003:
[root@rocky9-samba31 passdb_backup]#
[root@rocky9-samba31 passdb_backup]#

~tdbsam形式 → ldapsam形式~
pdbedit -i tdbsam:<ファイル名> -e ldapsam:<LDAPサーバー>

[root@rocky9-samba31 passdb_backup]#
[root@rocky9-samba31 passdb_backup]# pdbedit -i tdbsam:/root/passdb_backup/passdb.tdb -e ldapsam:ldap://192.168.56.21
Importing account for user01...ok
Importing account for user02...ok
Importing account for user03...ok
[root@rocky9-samba31 passdb_backup]#

~smbpasswd形式 → ldapsam形式~
pdbedit -i smbpasswd:<ファイル名> -e ldapsam:<LDAPサーバー>

[root@rocky9-samba31 passdb_backup]#
[root@rocky9-samba31 passdb_backup]# pdbedit -i smbpasswd:/root/passdb_backup/passdb.smbpasswd -e ldapsam:ldap://192.168.56.21
Importing account for user01...ok
Importing account for user02...ok
Importing account for user03...ok
[root@rocky9-samba31 passdb_backup]#

(補足)
pdbedit -i でファイル名の指定を省略するとpassdbファイルが格納されている$PRIVATE_DIRのファイルが読み込まれる。
pdbedit -eでファイル名の指定を省略するとpassdbファイルが格納されている$PRIVATE_DIRに書き出される。


SambaとLDAPを統合する

Sambaのユーザーデータベースをldapsamにすることで、ユーザー認証についてLDAPと統合が可能です。

~LDAP関連の設定~
LDAPと統合するための設定はsmb.confの[grobal]セクションで定義する。

  • ldap admin dn =
    LDAPから情報を取得するためのアカウントを定義する。

  • ldap suffix =
    LDAPから情報を取得する際の起点となるDNを指定する。

  • ldap user suffix =
    ユーザー情報を取得する際の起点となるDNをldap suffixからの相対パスで指定する。

  • ldap group suffix =
    グループアカウント情報を取得する際の起点となるDNをldap suffixからの相対パスで指定する。

  • ldap machine suffix =
    コンピューターアカウント情報を取得する際の起点となるDNをldap suffixからの相対パスで指定する。

  • ldap passwd sync(ldap password sync) = no
    LDAPではSambaユーザーのパスワードとLinuxユーザーのパスワードは別々に格納されているので、Sambaユーザーのパスワード変更操作でLinuxユーザーのパスワードを同時に変更するかを設定する。
    - yes:SambaユーザーとLinuxユーザーを変更する
    - No:Sambaユーザーのみ変更する
    - Only:Linuxユーザーのみ変更する

  • ldap delete dn = No
    LDAP上のSambaユーザーが削除された場合、Samba関連の属性(アトリビュート)だけ削除するか、それ以外の属性も同時に削除するかどうかを設定する。
    Yesとすると削除されたユーザーのSamba属性もその他の属性も削除される。

~LDAPと統合する方法~

  1. LDAPサーバーを構築する。

  2. LDAPサーバーにSambaのスキーマを登録する。

  3. Sambaサーバーにsmblcap-toolをインストールする。
    (別記事 Appendix (準備その5)smbldap-toolsをインストールする 参照)

  4. Sambaサーバーでsmbldap-configやsmbldap-populateコマンドを実行し、LDAP統合の準備をする。

  5. Sambaサーバーでpdbeditコマンドを使って既存のSambaユーザーをLDAPサーバーに登録する。

  6. Sambaのpassdb backendをldapsamに変更する。

  7. SambaサーバーのLinuxユーザーの認証設定をLDAPサーバーを参照するように変更する。
    RHEL7系だとauthconfig、RHEL8,9系だとauthselectを使う。

ここまで設定ができると、smbldap-tools(smbldap-groupadd、smbldap-useradd、smbldap-passwdなど)でユーザーの追加/削除操作をすると、LDAPサーバーに反映され、Sambaの共有リソースにアクセスが可能になり、なおかつLinuxユーザーを作る手間がなくなる。

=宣伝=
私の書いたKindle本に詳しく書かれているので参考にどうぞ


Winbindを設定する

~Winbindとは~
Windowsドメイン(ActiveDirectoryドメイン)のユーザーデータベースを使ってSambaサーバーにアクセスできるように認証を統合する仕組みのこと 。

~WindowsのActiveDirectoryドメインと構築する~
WinbindはWindowsのActiveDirectoryにあるユーザー情報でログインできるようにする仕組みなので、ActiveDirectoryでドメインを構築しておく必要がある。

(補足)
本記事執筆時点では評価版WindowsServer2022を使用しています。
Samba3のSambaサーバーをドメインに参加させるにはWindowsServer側で "役割と機能の追加" で「SMB 1.0/CIFS ファイル共有サポート」を追加しておく必要がある。
Sambaサーバー側はmax protocolのパラメータを規定値(NT1) とする。SMB2が設定可能だがADドメインに参加できなかった。

~SambaサーバーをActiveDirectoryドメインに参加させる~
smbは一旦停止させ、Sambaサーバーが参照するDNSサーバーをWindowsServerのアドレスに変更してから、net ads joinコマンドでドメインに参加する。
本記事では、WindowsServerのIPアドレスは192.168.56.91としている。

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# systemctl stop smb
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# cat /etc/resolv.conf
nameserver 192.168.56.91
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# net ads join -U Administrator
Enter Administrator's password: ******** 
Using short domain name -- EXAMPLE
Joined 'ROCKY9-SAMBA31' to dns domain 'example.local'
No DNS domain configured for rocky9-samba31. Unable to perform DNS Update.
DNS update failed!
[root@rocky9-samba31 ~]#

Smabaの設定を変更してsmbを起動する。

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# vi /usr/local/samba/lib/smb.conf
  :
[global]
      :
        workgroup = EXAMPLE   <--- ActiveDirectoryのNetBIOSドメイン名にする
        realm = EXAMPLE.LOCAL   <--- ActiveDirectoryのドメイン名にする
        security = ADS   <--- USER から ADS にする
        idmap config * : backend = tdb   <--- 追加する
        idmap config * : range = 10000-19999   <--- 追加する
      :
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# systemctl start smb
[root@rocky9-samba31 ~]#

idmapはWindowsシステムでユーザーに割り当てられるSIDと、Linuxシステムでユーザーに割り当てられるUID,GIDをマッピング(対応付け)する機構です。

ID マッピングの検討項目
SMBプロトコル中では、ユーザ、グループとコンピュータは、それぞれのセキュリティ識別子(SID) によって表現される。POSIXシステム上での Samba プロセスは、ある POSIX ユーザと 補助的な グループ 権限を持つファイルにアクセスするため、そのユーザIDとグループ配下で動かす必要がある。 SID から POSIX ユーザとグループへのマッピングプロセスは、IDENTITY MAPPING、 あるいは単に、ID MAPPINGと呼ばれる。
Samba は、複数の、SID から POSIX ユーザとグループへのマッピング方法をサポートしている。 設定は、各ドメインごとに分離された、ID マッピング (idmap) オプションを指定できる idmap config DOMAIN : OPTION オプションによって行う。

Samba4 マニュアル 日本語訳 smb.conf(5)
  • idmap config * : backend = tdb
    ( * )でドメイン名を指定できるので、ドメインごとにバックエンドデータベースの種類を変えることができる。
    tdb, tdb2, ldap, rid, hash, autorid, ad, adexが指定可能。

  • idmap config * : range = 10000-19999
    ( * )でドメイン名を指定できるので、ドメインごとにUID/GIDのレンジを変えることができる

  • idmap uid(winbind uid)=
    idmap 設定の ユーザーID(uid) の範囲を指定する。
    idmap configで設定可能なので廃止予定

  • idmap uid(winbind uid)=
    idmap 設定の グループID(gid) の範囲を指定する。
    idmap configで設定可能なので廃止予定

~必要なライブラリを準備する~
Samba3のマニュアルを参考にlibnss_winbind.soをとpam_winbind.soを準備します。 

・・・ libnss_winbind.so を /lib に、 pam_winbind.so を /lib/security にコピーする。 /lib/libnss_winbind.so から /lib/libnss_winbind.so.2 へのシンボリックリンクも用意する必要がある。・・・

Samna3 マニュアル 日本語訳 winbindd(8)
  • libnss_winbind.so:
    Samba3のソースに含まれているので、それを/lib64にコピーする。
    また、libnss_winbind.so.2へのシンボリックリンクも設定する。

★ Sambaのインストールディレクトリからライブラリを探す ★
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# find ./samba-3.6.25 -type f -name "libnss_winbind.so"
samba-3.6.25/nsswitch/libnss_winbind.so
[root@rocky9-samba31 ~]#

★ ファイルをコピーする ★
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# cp samba-3.6.25/nsswitch/libnss_winbind.so /lib64/
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ls -l /lib64/libnss_winbind.so
lrwxrwxrwx 1 root root 38  72 00:50 /lib64/libnss_winbind.so
[root@rocky9-samba31 ~]#

★ シンボリックリンクを設定する ★
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ln -s /lib64/libnss_winbind.so /lib64/libnss_winbind.so.2
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ls -l /lib64/libnss_winbind*
lrwxrwxrwx 1 root root 38  72 00:50 /lib64/libnss_winbind.so
lrwxrwxrwx 1 root root 24  72 00:52 /lib64/libnss_winbind.so.2 -> /lib64/libnss_winbind.so
[root@rocky9-samba31 ~]#

★ ライブラリを読み込む ★
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ldconfig
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ldconfig -p | grep winbind
        libnss_winbind.so.2 (libc6,x86-64) => /lib64/libnss_winbind.so.2
[root@rocky9-samba31 ~]#
  • pam_winbind.so:
    ActiveDirectoryを参照する認証モジュール
    Samba3のソースに含まれているので、それを/lib64/securityにコピーする。

★ Sambaのインストールディレクトリからライブラリを探す ★
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# find ./samba-3.6.25/ -type f -name "pam_winbind.so"
./samba-3.6.25/source3/bin/pam_winbind.so
[root@rocky9-samba31 ~]#

★ ファイルをコピーする ★
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# cp ./samba-3.6.25/source3/bin/pam_winbind.so /lib64/security
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ls -l /lib64/security/pam_winbind.so
lrwxrwxrwx 1 root root 44  72 00:21 /lib64/security/pam_winbind.so
[root@rocky9-samba31 ~]#
  • pam_smbpass.so:
    Sambaパスワードファイル(smbpasswd)を参照する認証モジュール。
    Samba3のソースに含まれているので、それを/lib64/securityにコピーする。
    ※Winbind機能を確認するだけであれば必要ないが試験範囲に含まれているので参考までに※

pam_smbpass は PAM モジュールのひとつであり、 システム上で smbpasswd (Sambaのパスワード) データベースと UNIX のパスワードファイルとの同期を取るために 使われる。

第28章 PAM ベースの分散型認証
★ Sambaのインストールディレクトリからライブラリを探す ★
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# find ./samba-3.6.25/ -type f -name "pam_smbpass.so"
/usr/local/samba/lib/security/pam_smbpass.so
[root@rocky9-samba31 ~]#

★ シンボリックリンクを設定する ★
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# cp ./samba-3.6.25/source3/bin/pam_smbpass.so /lib64/security
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ls -l /lib64/security/pam_smbpass.so
lrwxrwxrwx 1 root root 44  72 00:21 /lib64/security/pam_smbpass.so
[root@rocky9-samba31 ~]#

~/etc/nsswitch.confを編集する~
passwdとgroupにwinbindを追加する。

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# vi /etc/nsswitch.conf
 :
passwd:     sss files winbind  <--- winindを追加
 :
group:      sss files winbind  <--- winindを追加
 :
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# 

~winbinddを起動する~

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# systemctl start winbind
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# systemctl status winbind
● winbind.service - SYSV: Starts and stops the Samba winbind daemon
     Loaded: loaded (/etc/rc.d/init.d/winbind; generated)
    Drop-In: /run/systemd/system/service.d
             mqzzz-lxc-service.conf
     Active: active (running) since Sat 2023-07-01 01:11:08 JST; 2s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 578 ExecStart=/etc/rc.d/init.d/winbind start (code=exited, status=>
   Main PID: 583 (winbindd)
      Tasks: 2 (limit: 24308)
     Memory: 3.5M
     CGroup: /system.slice/winbind.service
             tq583 /usr/local/samba/sbin/winbindd -D
             mq585 /usr/local/samba/sbin/winbindd -D

 701 01:11:08 rocky9-samba31 systemd[1]: Starting SYSV: Starts and stops the>
 701 01:11:08 rocky9-samba31 winbind[578]: Starting Winbind services:
 701 01:11:08 rocky9-samba31 winbindd[583]: [2023/07/01 01:11:08.302299,  0]>
 701 01:11:08 rocky9-samba31 systemd[1]: Started SYSV: Starts and stops the >
 701 01:11:08 rocky9-samba31 winbindd[583]:   initialize_winbindd_cache: cle>
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# systemctl enable winbind
winbind.service is not a native service, redirecting to systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable winbind
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# systemctl is-enabled winbind
winbind.service is not a native service, redirecting to systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install is-enabled winbind
enabled
[root@rocky9-samba31 ~]#

~wbinfoコマンド~

-t, --check-secret
ActiveDirectoryドメインに参加できていることがわかる

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# wbinfo -t
checking the trust secret for domain EXAMPLE via RPC calls succeeded
[root@rocky9-samba31 ~]#

-p, --ping
Winbinddと通信できることがわかる

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# wbinfo -p
Ping to winbindd succeeded
[root@rocky9-samba31 ~]#

-P, --ping-dc
ActiveDirectoryドメインと通信できることがわかる

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# wbinfo -P
checking the NETLOGON for domain[EXAMPLE] dc connection to "WINSV2022-01.example.local" succeeded
[root@rocky9-samba31 ~]#

-u, --domain-users
SambaユーザーとActiveDirectoryユーザーが取得できる

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# wbinfo -u
ROCKY9-SAMBA31\user01   ---┐
ROCKY9-SAMBA31\user00      │ Sambaサーバー上のユーザー
ROCKY9-SAMBA31\user02      │
ROCKY9-SAMBA31\user03   ---┘
EXAMPLE\administrator   ---┐
EXAMPLE\guest              │
EXAMPLE\krbtgt             │
EXAMPLE\winuser00          │ ActiveDirectory上のユーザー
EXAMPLE\winuser01          │
EXAMPLE\winuser02          │
EXAMPLE\winuser03       ---┘
[root@rocky9-samba31 ~]#

-g, --domain-groups
SambaユーザーとActiveDirectoryグループが取得できる

[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# wbinfo -g
EXAMPLE\access-denied assistance users
EXAMPLE\domain computers
EXAMPLE\domain controllers
EXAMPLE\schema admins
EXAMPLE\enterprise admins
EXAMPLE\cert publishers
EXAMPLE\domain admins
EXAMPLE\domain users
EXAMPLE\domain guests
EXAMPLE\group policy creator owners
EXAMPLE\ras and ias servers
EXAMPLE\allowed rodc password replication group
EXAMPLE\denied rodc password replication group
EXAMPLE\read-only domain controllers
EXAMPLE\enterprise read-only domain controllers
EXAMPLE\cloneable domain controllers
EXAMPLE\protected users
EXAMPLE\key admins
EXAMPLE\enterprise key admins
EXAMPLE\dnsadmins
EXAMPLE\dnsupdateproxy
EXAMPLE\wingroup00   <--- 検証用に追加したグループ 
[root@rocky9-samba41 ~]#

~getentコマンド~
nsswitch.confで設定されたユーザーデータベースから情報を取得することができる。

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# getent passwd 'EXAMPLE\administrator'
EXAMPLE\administrator:*:10002:10006:Administrator:/home/EXAMPLE/administrator:/bin/false
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# getent passwd 'EXAMPLE\winuser00'
EXAMPLE\winuser00:*:10000:10006:Windows user00:/home/EXAMPLE/winuser00:/bin/false
[root@rocky9-samba31 ~]#
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# getent group 'EXAMPLE\wingroup00'
EXAMPLE\wingroup00:x:10001:
[root@rocky9-samba41 ~]#

~idコマンド~
ActiveDirectoryユーザー(ドメイン名\ユーザー名)はLinuxユーザーとして作成していないが、idコマンドで確認できる。

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# id 'EXAMPLE\administrator'
uid=10002(EXAMPLE\administrator) gid=10006(EXAMPLE\domain users) groups=10006(EXAMPLE\domain users),10008(EXAMPLE\denied rodc password replication group),10009(EXAMPLE\enterprise admins),10010(EXAMPLE\schema admins),10011(EXAMPLE\group policy creator owners),10012(EXAMPLE\domain admins),10001(BUILTIN\users),10000(BUILTIN\administrators)
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# id 'EXAMPLE\winuser00'
uid=10000(EXAMPLE\winuser00) gid=10006(EXAMPLE\domain users) groups=10006(EXAMPLE\domain users),10007(EXAMPLE\wingroup00),10001(BUILTIN\users)
[root@rocky9-samba31 ~]#

~WindowsクライアントからSambaサーバーにアクセスする~
WindowsクライアントからSambaサーバーのファイル共有にアクセスする。
ユーザー名とパスワードの入力を求められるので、ユーザ名はドメイン名\ユーザー名(例 EXAMPLE\winuser00)とし、パスワードはActiveDirectoryにユーザーを追加したときに設定したパスワードを入力するとファイル共有にアクセスができる。
ただし、Winbindはユーザー情報についてActiveDirectoryのユーザー情報を参照するだけで、Sambaサーバー上にホームディレクトリは作成されない。
後述する/etc/pam.d/sambaでpam_winbind.soのmkhomedirの機能を有効化しsmb.confの[global]セクションでobey pam restrictions = Yesとすることでホームディレクトリが自動で生成されるようになる。

EXAMPLE\winuser00でアクセスした様子


EXAMPLE\winuser00がwindows10-example-winuser00.txtを新規作成
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ls -l /var/samba_share/share1
合計 5
-rw-r--r-- 1 root              root                  0  65 22:47 samba31-test01.txt
-rw-r--r-- 1 root              root                  0  65 22:47 samba31-test02.txt
-rw-r--r-- 1 root              root                  0  65 22:47 samba31-test03.txt
-rw-r--r-- 1 user00            user00                0  65 23:03 samba41-test02.txt
-rwxr--r-- 1 EXAMPLE\winuser00 EXAMPLE\domain users  0  71 21:08 windows10-example-winuser00.txt
-rw-r--r-- 1 user00            user00               80  611 23:19 windows10-user00.txt
-rw-r--r-- 1 user00            user00                0  612 01:19 windows10-user00a.txt
-rw-r--r-- 1 user01            user01               38  611 23:13 windows10-user01.txt
-rw-r--r-- 1 user02            user02               17  611 23:05 windows10-user02.txt
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# smbstatus

Samba version 3.6.25
PID     Username      Group         Machine
-------------------------------------------------------------------
190       EXAMPLE\winuser00  EXAMPLE\domain users  **********   (192.168.56.1)

Service      pid     machine       Connected at
-------------------------------------------------------
IPC$         190   **********    Sat Jul  1 19:51:11 2023
share1       190   **********    Sat Jul  1 21:08:14 2023

Locked files:
Pid          Uid        DenyMode   Access      R/W        Oplock           SharePath   Name   Time
--------------------------------------------------------------------------------------------------
190          10000      DENY_NONE  0x81        RDONLY     NONE             /var/samba_share/share1   .   Sat Jul  1 21:09:42 2023
190          10000      DENY_NONE  0x81        RDONLY     NONE             /var/samba_share/share1   .   Sat Jul  1 21:09:42 2023

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ls -ld /home/EXAMPLE/winuser00/
drwx------ 2 EXAMPLE\winuser00 EXAMPLE\domain users 2  72 00:28 /home/EXAMPLE/winuser00/
[root@rocky9-samba31 ~]#

PAMおよびNSSの設定

~PAM(Pluggable Authentication Modules)~
アプリケーションごとにどのような認証を用いるかをコントロールする仕組みで、設定ファイルは/etc/pam.d/以下にある。
Sambaの認証をPAMで設定するには/etc/pam.d/sambaというファイル作成しPAMの設定をする必要があるが、RockyLinux9では当該ファイルは存在していないので新規で作成する必要がある。

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# vi /etc/pam.d/samba
auth           required        pam_nologin.so
auth            include         password-auth
account         include         password-auth
session         include         password-auth
password        include         password-auth
session         optional        pam_winbind.so mkhomedir  <--- ホームディレクトリを自動生成する設定。
[root@rocky9-samba31 ~]#

/etc/pam.d/sambaでincludeしているpassword-authの設定。

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# cat /etc/pam.d/password-auth
auth        required                                     pam_env.so
auth        required                                     pam_faildelay.so delay=2000000
auth        [default=1 ignore=ignore success=ok]         pam_usertype.so isregular
auth        [default=1 ignore=ignore success=ok]         pam_localuser.so
auth        sufficient                                   pam_unix.so nullok
auth        [default=1 ignore=ignore success=ok]         pam_usertype.so isregular
auth        sufficient                                   pam_sss.so forward_pass
auth        required                                     pam_deny.so

account     required                                     pam_unix.so
account     sufficient                                   pam_localuser.so
account     sufficient                                   pam_usertype.so issystem
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required                                     pam_permit.so

password    requisite                                    pam_pwquality.so local_users_only
password    sufficient                                   pam_unix.so sha512 shadow nullok use_authtok
password    sufficient                                   pam_sss.so use_authtok
password    required                                     pam_deny.so

session     optional                                     pam_keyinit.so revoke
session     required                                     pam_limits.so
-session    optional                                     pam_systemd.so
session     [success=1 default=ignore]                   pam_succeed_if.so service in crond quiet use_uid
session     required                                     pam_unix.so
session     optional                                     pam_sss.so
[root@rocky9-samba31 ~]#

pam_xxx.soというライブラリは/lib64/security/配下に格納する。

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ls /lib64/security/
pam_access.so     pam_issue.so       pam_pwquality.so       pam_time.so
pam_cap.so        pam_keyinit.so     pam_rhosts.so          pam_timestamp.so
pam_chroot.so     pam_lastlog.so     pam_rootok.so          pam_tty_audit.so
pam_console.so    pam_limits.so      pam_securetty.so       pam_umask.so
pam_debug.so      pam_listfile.so    pam_selinux.so         pam_unix.so
pam_deny.so       pam_localuser.so   pam_selinux_permit.so  pam_unix_acct.so
pam_echo.so       pam_loginuid.so    pam_sepermit.so        pam_unix_auth.so
pam_env.so        pam_mail.so        pam_setquota.so        pam_unix_passwd.so
pam_exec.so       pam_mkhomedir.so   pam_shells.so          pam_unix_session.so
pam_faildelay.so  pam_motd.so        pam_smbpass.so         pam_userdb.so
pam_faillock.so   pam_namespace.so   pam_sss.so             pam_usertype.so
pam_filter        pam_nologin.so     pam_sss_gss.so         pam_warn.so
pam_filter.so     pam_permit.so      pam_stress.so          pam_wheel.so
pam_ftp.so        pam_postgresok.so  pam_succeed_if.so      pam_winbind.so
pam_group.so      pam_pwhistory.so   pam_systemd.so         pam_xauth.so
[root@rocky9-samba31 ~]#

(補足)
RHEL7では、PAMの設定ファイルを編集するのではなくauthconfigで設定する
RHEL8,9では、PAMの設定ファイルを編集するのではなくauthselectやsssctlで設定する
第1章 authselect でユーザー認証の設定 Red Hat Enterprise Linux 9 | Red Hat Customer Portal

~NSS(Name Service Switch)~
認証情報の参照先をコントロールする仕組み。
設定ファイルは/etc/nsswitch.confで、前述の「wibindの設定」で/etc/nsswitch.confのpasswdとgroupの行にwinbindを追記している。

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# vi /etc/nsswitch.conf
 :
passwd:     sss files winbind   <--- winbindを追記
shadow:     files
group:      sss files winbind   <--- winbindを追記
hosts:      files dns myhostname
services:   files sss
netgroup:   sss
automount:  files sss

aliases:    files
ethers:     files
gshadow:    files
# Allow initgroups to default to the setting for group.
# initgroups: files
networks:   files dns
protocols:  files
publickey:  files
rpc:        files
[root@rocky9-samba31 ~]#

(補足)
RHEL8,9では、/etc/nsswitch.confを編集するのではなく/etc/authselect/user-nsswitch.confauthselectで設定する
1.3. 既製の authselect プロファイルの変更 Red Hat Enterprise Linux 9 | Red Hat Customer Portal


(補足)SSSD(System Security Services Daemon)

第2章 SSSD とその利点について Red Hat Enterprise Linux 8 | Red Hat Customer Portal

執筆するための検証環境はRockyLinux9ですが、systemctl status smbで状態を確認すると「PAM unable to dlopen(/usr/lib64/security/pam_sss.so): /usr/lib64/security/pam_sss.so: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません」というエラーが表示される。
これを解消するためにsssdのパッケージをインストールしました。

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# dnf install -y sssd
[root@rocky9-samba31 ~]#

参考文献


この記事が気に入ったらサポートをしてみませんか?