LDAPサーバに認証を任せて smb を利用するお話
*sambaでNTドメインを作るお話ではありません
必要な事
留意点としてたとえLDAPを使ったとしてもパスワードは2つ存在する形になります
1つはログインとかに利用される「userPassword」attribute
もう一つはsmb認証のための「sambaNTPassword」attribute
LDAP/smbldap-passwdはこの2つのパスワードの統合について示しています
smb機能を提供するノードには「dnf install samba」としてるだろうから
そこにある「/usr/share/doc/samba-4.10.16/LDAP/samba.ldif」をLDAPサーバに持ってくる
[root@ldap-smb01 ~]# cat /etc/redhat-release
Rocky Linux release 8.6 (Green Obsidian)
[root@ldap-smb01 ~]# dnf provides */samba.ldif
Last metadata expiration check: 3:16:50 ago on Fri 11 Nov 2022 08:55:23 AM JST.
samba-4.15.5-5.el8.x86_64 : Server and Client software to interoperate with Windows machines
Repo : baseos
Matched from:
Filename : /usr/share/doc/samba/LDAP/samba.ldif
samba-4.15.5-8.el8_6.x86_64 : Server and Client software to interoperate with Windows machines
Repo : baseos
Matched from:
Filename : /usr/share/doc/samba/LDAP/samba.ldif
samba-4.15.5-10.el8_6.x86_64 : Server and Client software to interoperate with Windows machines
Repo : baseos
Matched from:
Filename : /usr/share/doc/samba/LDAP/samba.ldif
[root@ldap-smb01 ~]# dnf install samba
[root@ldap-smb01 ~]# scp /usr/share/doc/samba/LDAP/samba.ldif root@ldap-server:
「ldap-server」にコピーしたsambaスキーマ「samba.ldif」を反映させます
[root@ldap-server ~]# ls -l samba.ldif
-rw-r--r--. 1 root root 14892 Nov 11 12:13 samba.ldif
[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /root/samba.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=samba,cn=schema,cn=config"
[root@ldap-server ~]#
確認してみます
[root@ldap-server ~]# ldapsearch -x -LLL -W -D cn=config -b cn=config dn
Enter LDAP Password:
dn: cn=config
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: cn={1}cosine,cn=schema,cn=config
dn: cn={2}nis,cn=schema,cn=config
dn: cn={3}inetorgperson,cn=schema,cn=config
dn: cn={4}samba,cn=schema,cn=config <-- sambaスキーマ
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}monitor,cn=config
dn: olcDatabase={2}hdb,cn=config
[root@ldap-server ~]#
LDAP/Clientを参照
smbで共有する際にアカウント情報(uid,gid,$HOME)は必要だから.
ここでは「ldap-smb01」にて「authselect - sssd」形式でldap-serverに繋げるようにします
mkhomedrがpamで有効だったとしても、smb経由のアクセスで/home/$HOMEが用意される訳ではないみたい
smbサイトを作ります.
そこにsambaパッケージをインストールします
っで設定ファイルを修正します
[root@ldap-smb01 ~]# vi /etc/samba/smb.conf
[global]
workgroup = SAMBA
security = user
load printers = no
passdb backend = ldapsam:ldap://192.168.0.81
ldap suffix = dc=sybyl,dc=local
ldap user suffix = ou=People
ldap group suffix = ou=Group
ldap admin dn = cn=Manager,dc=sybyl,dc=local
ldap passwd sync = yes
ldap ssl = off
[homes]
comment = Home Directories
valid users = %S, %D%w%S
browseable = No
read only = No
inherit acls = Yes
[root@ldap-smb01 ~]#
次に、「cn=Manager,dc=sybyl,dc=local」のパスワードを登録します
[root@ldap-smb01 ~]# smbpasswd -W
Setting stored password for "cn=Manager,dc=sybyl,dc=local" in secrets.tdb
New SMB password:
Retype new SMB password:
[root@ldap-smb01 ~]# systemctl enable smb --now
これでsmbデーモンを起動すると自動的に ldap-server と通信して「sambaDomainName=LDAP-SMB01」が登録されます
こんな感じに
sambaDomainNameなのでsyblとかsmb.confの「workgroup」値かなと思ったがsmbホスト名が登録されます
smb共有をサービス提供するので、smbの穴を作ります
[root@ldap-smb01 ~]# firewall-cmd --add-service=samba --zone=public --permanent
[root@ldap-smb01 ~]# firewall-cmd --reload
SELinuxを有効のままにするなら、「samba_enable_home_dirs」を有効にしておく.
[root@ldap-smb ~]# getsebool samba_enable_home_dirs
samba_enable_home_dirs --> off
[root@ldap-smb ~]#
[root@ldap-smb ~]# setsebool -P samba_enable_home_dirs 1
[root@ldap-smb ~]# getsebool samba_enable_home_dirs
samba_enable_home_dirs --> on
[root@ldap-smb ~]#
もし、この設定の前にユーザのホームディレクトリがあるなら下記コマンドで書き換えが必要です
[root@ldap-smb ~]# restorecon -R /home
*これが定義されていると、smbサイトの pdbedit -L でユーザ情報が表示される
sambaのattributeを追記する方法としては下記2つの方法がある
smbldap-toolsは便利だけど、使う場所は1つのsmbサイトに留めましょう
LDAP/Browseで示したLDAP Adminを使います.
LDAP/data#f66670f1にてユーザを登録した直後ではこのsmbサイトにアクセスできません.
っでLDAP Adminにて当該ユーザ[foo]を選択して、右クリックから「Properties..」を選びます. ダブルクリックでも可
開いた「Properties of foo」にて画面下の「Account properties」から「Samba Acount」を有効にします。
すると「Properties of foo」画面の上部タブに「samba」が追加されます。
sambaスキーマの追加をLDAP Adminが認識して出しているみたい
「samba」タブをクリックして「Domain」欄のプルダウンからsmbサイトとなる「LDAP-SMB01」を選びます。
そうて「OK」ボタンを押下して、反映させます。
これで元の画面に戻りますが、対象ユーザに新たなobjectClassとして「sambaSamAccount」が追加されたり、
「sambaKickoffTime」「sambaAccFlags」「sambaSID」「sambaDomainName」らが追加されます
ですが、samba向けのパスワード欄がなく、これではsmb共有に入れません. userPasswordはsshログインとかに使うパスワードです
ここで、再度当該ユーザ[foo]を選択して、右クリックから「Set Password...」を選びます
すると下記「Set Password」画面が表示され、「Posix password」「Samba password」のチェックボックスがあるようにどちらか、あるいは両方ともでパスワードの定義が行えます。
「OK」ボタンを押下して画面が閉じられると新たなAttribute「sambaNTPassowrd」「sambaPwdLastSet」が定義されます
これでユーザfooはsmbサイトにアクセスできるようになります
コマンドツールで LDAP内ユーザの sambaスキーマを有効にしてみる.
インストール先は smb が稼働するサイトです
まずはコマンドの準備.
[root@ldap-smb01 ~]# curl -O http://repo.iotti.biz/CentOS/8/noarch/smbldap-tools-0.9.11-17.el8.lux.noarch.rpm
[root@ldap-smb01 ~]# dnf install epel-release
[root@ldap-smb01 ~]# dnf localinstall smbldap-tools-0.9.11-17.el8.lux.noarch.rpm
次にその設定.
[root@ldap-smb01 ~]# smbldap-config
:
. ldap master bind password [] > <---- ディレクトリ管理者のパスワード cn=Manager,dc=sybyl,dc=local
:
. ldap slave bind password [] > <---- 同じ
:
[root@ldap-smb01 ~]#
「/etc/smbldap-tools/smbldap_bind.conf」と「/etc/smbldap-tools/smbldap.conf」が更新される
っで方法ですが、既にLDAPに新規のユーザがいて(ldifで登録とか)、それをLDAP Adminで確認すると下記のようになる.
objectClassに注目. アカウントのアイコンが緑色はposix有効なアカウントっぽい. それが青色になるとsambaに解脱したアカウントっぽい
そしてsmbサイト(ldap-smb01)にて「smbldap-usermod」コマンドでLDAP情報を更新させます
[root@ldap-smb01 ~]# smbldap-populate <--初回のみ.
[root@ldap-smb01 ~]# smbldap-usermod -a saber
この直後のLDAP Adminは下記になります
objectClassに「SambaSmbAccount」が追加され、ユーザアイコンの色が変わりました. 他、root,nobodyユーザ追加されます
これで「pdbedit -L」でもリストに連なるアカウントに成れました.
[root@ldap-smb01 ~]# pdbedit -L
foo:3000:foo sybyl
saber:3001:sybyl saber
root:0:root
nobody:65534:Kernel Overflow User
[root@ldap-smb01 ~]# pdbedit -L -v saber
Unix username: saber
NT username: saber
Account Flags: [UX ]
User SID: S-1-5-21-1996916613-3451273948-1131555374-1001
Primary Group SID: S-1-5-21-1996916613-3451273948-1131555374-513
Full Name: sybyl saber
Home Directory: \\LDAP-SMB01\saber
HomeDir Drive:
Logon Script:
Profile Path: \\LDAP-SMB01\saber\profile
Domain: LDAP-SMB01
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: Tue, 19 Jan 2038 12:14:07 JST
Kickoff time: Tue, 19 Jan 2038 12:14:07 JST
Password last set: 0
Password can change: 0
Password must change: 0
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
[root@ldap-smb01 ~]#
samba向けのパスワードは初回はランダムな値が入っているので「smbldap-passwd」でパスワードを定義します
このツール「smbldap-passwd」はUNIXパスワードも同時に更新してくれます.
[root@ldap-smb01 ~]# smbldap-passwd -?
(c) Jerome Tournier - (jtournier@gmail.com)- Licensed under the GPL
Usage: /usr/sbin/smbldap-passwd [hpsuB?] [username]
-h, -?, --help show this help message
-p read password from STDIN without verification (root only)
-s update only samba password
-u update only UNIX password
-B must change Samba password at logon
[root@ldap-smb01 ~]# smbldap-usershow saber <-- なにもフラグを付けないと samba、UNIXパスワードが同時に更新されます
注意
LDAP server側でユーザのパスワード変更操作が「sambaNTPassword」も許可されるようにLDAPの設定を変更する必要があります
参照LDAP/smbldap-passwd#k2a2db4a
そうしないと下記のようにエラーが出ます.
[saber@ldap-smb01 ~]$ smbldap-passwd
Identity validation...
Enter your UNIX password:
Changing UNIX and samba passwords for saber
New password:
Retype new password:
Failed to modify SMB password: Insufficient access at /usr/sbin/smbldap-passwd line 182, <STDIN> line 3.
[saber@ldap-smb01 ~]$
*smbサイトにユーザをログインさせたくないのなら /etc/ssh/sshd_config で制限する
「smbldap-tools」を入れたのなら、その中にある「smbldap-useradd」とかでUNIXアカウントとsmbアカウントを調整すれば
いいのでしょうが、正直 UNIX アカウントは LDAP に直接登録して、smbが必要な方のみを「smbldap-usermod」で有効化すればいいかなと思っている.
そしてLDAP/smb-multiでも述べるが、「smbldap-usermod」の実行は1つのsmbサイトで行う事.
複数のsmbが立っていてそれぞれで「smbldap-tools」をインストールして「smbldap-usermod」を行うとそのsmbサイトしか入れないとかの問題が起こります