Contents
Overview
Samba を構築します。本稿の例では以下のホストの構成を前提とします。便宜上、Samba1, Samba2 としています。
- Samba1 (LDAP + Samba): Samba は pdbedit で Samba としての認証情報を管理(ユーザー登録・削除・パスワード変更等)し、LDAP に登録する。LDAP は Linux としての認証情報を管理するとともに、Samba の認証情報も格納し、LDAP としてネットワーク上で共有可能とする。また、Samba 上のパスワード変更を LDAP と同期させる。これは Samba では NT パスワードが必要であり、NT パスワードは Samba 上の操作により生成されるためです。
- Samba2 (File server): 純粋なファイルサーバーとして使用する。認証は LDAP + Samba に問い合わせる。この際、SID が異なると認証できない(ローカル SID は通常ホスト毎に一意である)ため、LDAP + Samba と SID を合わせておく。
この構成にしない場合、ユーザーのパスワード変更はファイルサーバーとしての Samba 上で行うことになり、認証情報を管理するホストが分散してしまうことになります。この構成により、LDAP サーバー上でパスワード変更などの操作も含めて認証情報を管理することができます。
また、Samba で Active Directory を構成する方法(AD に参加すると SID は同一になる)もありますが、そもそもの目的が Samba の認証を LDAP に統合することであるため、Active Directory のような統合的な機能は不要である点と、筆者の環境では Windows が存在しないため、本稿の構成は合理的だと思っています。
前提条件
- こちらを参考に LDAP サーバーの導入が完了していること。
- コマンドの出力やプロンプトなどは例となりますので、説明に従って適宜読み替えて下さい。
インストール
Samba1, Samba2 で samba をインストールします。
myadmin@ubuntu:~$ sudo apt -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold install samba
/etc/samba/smb.conf
デフォルト値
デフォルト値は下記の通りです。testparm は現在の smb.conf の構文チェックと最小値を表示します。
myadmin@ubuntu:~$ testparm
[global]
log file = /var/log/samba/log.%m
logging = file
map to guest = Bad User
max log size = 1000
obey pam restrictions = Yes
pam password change = Yes
panic action = /usr/share/samba/panic-action %d
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
passwd program = /usr/bin/passwd %u
server role = standalone server
server string = %h server (Samba, Ubuntu)
unix password sync = Yes
usershare allow guests = Yes
idmap config * : backend = tdb
[printers]
browseable = No
comment = All Printers
create mask = 0700
path = /var/spool/samba
printable = Yes
[print$]
comment = Printer Drivers
path = /var/lib/samba/printers
設定値
Samba1 の設定値は以下のとおりです。Samba1 は認証情報の管理だけを行うため、ファイル共有設定はありません。
myadmin@ubuntu:~$ sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.orig
myadmin@ubuntu:~$ sudo tee /etc/samba/smb.conf <<"EOF"
[global]
dos charset = CP932
ldap admin dn = cn=rw,dc=si1230,dc=com
ldap group suffix = ou=groups
ldap passwd sync = yes
ldap ssl = no
ldap suffix = dc=si1230,dc=com
ldap user suffix = ou=users
load printers = No
log file = /var/log/samba/log.%m
logging = file
map to guest = Bad User
max log size = 1000
obey pam restrictions = Yes
pam password change = Yes
panic action = /usr/share/samba/panic-action %d
passdb backend = ldapsam:ldaps://ldap.si1230.com
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
passwd program = /usr/bin/passwd %u
server role = standalone server
server string = %h server (Samba, Ubuntu)
unix password sync = Yes
usershare allow guests = Yes
idmap config * : backend = tdb
EOF
Samba2 の設定値は以下のとおりです。以下の例ではホームディレクトリを共有し、ゴミ箱機能を設定しています。
myadmin@ubuntu:~$ sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.orig
myadmin@ubuntu:~$ sudo tee /etc/samba/smb.conf <<"EOF"
[global]
dos charset = CP932
ldap admin dn = cn=rw,dc=si1230,dc=com
ldap group suffix = ou=groups
ldap passwd sync = yes
ldap ssl = no
ldap suffix = dc=si1230,dc=com
ldap user suffix = ou=users
load printers = No
log file = /var/log/samba/log.%m
logging = file
map to guest = Bad User
max log size = 1000
obey pam restrictions = Yes
pam password change = Yes
panic action = /usr/share/samba/panic-action %d
passdb backend = ldapsam:ldaps://ldap.si1230.com
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
passwd program = /usr/bin/passwd %u
server role = standalone server
server string = %h server (Samba, Ubuntu)
unix password sync = Yes
usershare allow guests = Yes
idmap config * : backend = tdb
[homes]
read only = No
vfs objects = recycle
recycle:maxsize = 0
recycle:touch = No
recycle:versions = Yes
recycle:keeptree = No
recycle:repository = .recycle
EOF
SID の設定
Samba1 の SID を確認します。domain SID は、おそらく NT ドメイン / Active Directory 構成などでは正常に出力されると思います。
myadmin@ubuntu:~$ sudo net getdomainsid
SID for local machine UBUNTU is: S-1-5-21-1546203982-3549129829-4190073355
Could not fetch domain SID
Samba2 のSIDを Samba1 に合わせます。
myadmin@ubuntu:~$ sudo net setlocalsid S-1-5-21-1546203982-3549129829-4190073355
今回は Samba1 に合わせていますが、同一の SID であれば問題ありません。
ldap admin dnのパスワード登録
Samba1, Samba2 で ldap admin dn のパスワードを Samba に登録します。これを登録しないと Samba の起動に失敗します。
myadmin@ubuntu:~$ sudo smbpasswd -w password
Setting stored password for "cn=rw,dc=si1230,dc=com" in secrets.tdb
設定の有効化
設定を有効化します。このタイミングで、LDAP に Samba1, Samba2 の情報が格納されます。
myadmin@ubuntu:~$ sudo systemctl restart smbd.service && systemctl status smbd.service
下記のログの通りではありますが、LDAP の sambaminpwdlength のパスワード要件を満たしていないと Samba が起動しません。これは ldap admin dn のパスワードだけが対象の様です。具体的なパスワード要件を調べてはいませんが、ランダム英数字 20 桁にすると問題なく起動します。前述の smbpasswd を再実施後に再起動します。
Jun 06 16:38:20 ubuntu ns-slapd[949]: [06/Jun/2022:16:38:20.627496855 +0900] - ERR - oc_check_allowed_sv - Entry "sambaDomainName=UBUNTU,dc=si1230,dc=com" -- attribute "sambaminpwdlength" not allowed
Jun 06 16:38:20 ubuntu systemd[1]: smbd.service: Main process exited, code=exited, status=1/FAILURE
Samba ユーザー追加
pdbedit で Samba ユーザーを追加します。LDAP に登録しているユーザーと同じユーザー名、パスワードにします。
myadmin@ubuntu:~$ sudo pdbedit -a u3000
new password:
retype new password:
Unix username: u3000
NT username: u3000
Account Flags: [U ]
User SID: S-1-5-21-1546203982-3549129829-4190073355-1001
Primary Group SID: S-1-5-21-1546203982-3549129829-4190073355-513
Full Name: u1000
Home Directory: \\UBUNTU\u3000
HomeDir Drive:
Logon Script:
Profile Path: \\UBUNTU\u3000\profile
Domain: UBUNTU
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: never
Kickoff time: never
Password last set: Mon, 06 Jun 2022 18:36:37 JST
Password can change: Mon, 06 Jun 2022 18:36:37 JST
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
ホームディレクトリの作成
mkhomedir を有効にし、loginShell 属性を /bin/bash にしている場合、Samba2 に SSH 等でログインするとホームディレクトリが自動生成されます。手動でホームディレクトリを作成する場合はこちらを参照して下さい。
正常性確認
SMB クライアント( Windows のエクスプローラー等)から Samba2 に接続します。
パスワード変更
ユーザーのパスワードを変更するには Samba1 で下記を実行します。前述の設定に問題が無ければ unix password sync = Yes
に従って LDAP のパスワードも変更されます。反対に LDAP で変更したパスワードは Samba に同期することはできません。
myadmin@ubuntu:~$ sudo smbpasswd u3000
New SMB password:
Retype new SMB password: