本家様 https://wiki.samba.org/index.php/Main_Page
samba-4.0からWindowsServerのActiveDirectoryの機能が提供されている。
だが、別にそれを使わなくても従来からのファイル共有は行えて、ボリュームシャドーコピーといった便利な機能が使えます。
*samba4だからADの構築が必須ではないです。
windowsとLinux、MacOSXらのアカウント管理を費用を掛けずに一元管理したいならこのsamba-4.xのAD機能は有効かも。
でも人件費を考えれば、素直にMS様のwindows serverを用意された方が安く済むし「訊けます」
研究室なら安価なwindows serverがお勧め。もし予算が厳しいのでしたら、僭越ですがこのサイトをご活用頂ければ幸いです。
ここでは RockyLinux9 に samba-4.x.yをインストールして
について記します。
ActiveDirectoryを主催するホストは ad.chaperone.jp、で故にドメイン名は「chaperone.jp」
ドメインは「.local」を使ってましたが、推奨が有効なトップレベル ドメイン (TLD) になりました. SSL証明書の観点からもまぁーそうなるね
DNSの運営方法はsamba内包の機能を使います. DNSのフォワード先は192.168.0.1です.
sambaはソースコードからコンパイルしてインストールします。
RockyLinux9(9.4) を最小構成で構築して開発環境の他、samba開発元側で提示しているパッケージをインストールします
参照先 https://wiki.samba.org/index.php/Package_Dependencies_Required_to_Build_Samba
なので
dnf groupinstall "Development Tools"
dnf install --enablerepo=devel docbook-style-xsl gcc gdb gnutls-devel gpgme-devel jansson-devel \
keyutils-libs-devel krb5-workstation libacl-devel libaio-devel \
libarchive-devel libattr-devel libblkid-devel libtasn1 libtasn1-tools \
libxml2-devel libxslt lmdb-devel openldap-devel pam-devel perl \
perl-ExtUtils-MakeMaker perl-Parse-Yapp popt-devel python3-cryptography \
python3-dns python3-gpg python3-devel readline-devel rpcgen systemd-devel \
tar zlib-devel python3-markdown perl-JSON bind-utils dbus-devel xfsprogs-devel libicu-devel
/etc/hostsファイルは下記の様に調整します。
[root@ad ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain
192.168.0.131 ad.chaperone.jp ad
[root@ad ~]# hostnamectl set-hostname ad.chaperone.jp
/etc/resolv.conf は直接編集せずnmtui経由で調整します あるいは nmcli コマンド経由で
注意自分自身がDNSサーバになるので 192.168.0.131 あるいは 127.0.0.1
その後OS再起動、もしくはnmcli を再起動すれば反映される. 「nmcli connection down <nic device>; nmcli connection up <nic device>」
[root@ad ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search chaperone.jp
nameserver 127.0.0.1
nameserver 192.168.0.1
[root@ad ~]#
ソースを取得します。
[root@ad ~]# mkdir -p /opt/src && cd /opt/src
[root@ad src]# curl -O https://download.samba.org/pub/samba/samba-latest.tar.gz
https://wiki.samba.org/index.php/Build_Samba_from_Sourceを参考に
[root@ad src]# tar -xf samba-latest.tar.gz
[root@ad src]# cd samba-4.21.0/
[root@ad samba-4.21.0]# ./configure --prefix=/opt/samba
[root@ad samba-4.21.0]# make
[root@ad samba-4.21.0]# make install
[root@ad samba-4.21.0]# echo "export PATH=/opt/samba/bin:/opt/samba/sbin:$PATH" >> $HOME/.bashrc
もしsamba-adで作ったアカウントでadサイトにログインするなら下記が必要 アカウント管理のこのノードに作ったユーザをログインさせるかどうか
[root@ad samba-4.21.0]# ( cd /lib64 ; ln -sv /opt/samba/lib/libnss_win* .)
[root@ad samba-4.21.0]# ( cd /lib64/security ; ln -sv /opt/samba/lib/security/pam_winbind.so . )
その際は、dnf install/updateでsamba関係がインストールされないように /etc/yum.conf の調整が必要です
パスの影響は無視して、ファイル名が上書きされそうなのは
/lib64/libnss_winbind.so.2 --> samba-winbind-modules
/lib64/libnss_wins.so.2 --> samba-winbind-modules
/lib64/security/pam_winbind.so --> samba-winbind-modules
なので、基本 samba-winbind-modules をdnf updateの際に適用されないようにする
[root@ad ~]# vi /etc/yum.conf
[main]
:
exclude=samba-winbind-modules
[root@ad ~]#
*ただし、他のパッケージのインストールでこの「samba-winbind-modules」が要求されると、エラーになる可能性があります
「--use-rfc2307」を忘れずに. これでuid/gidの設定が楽になる. 既に稼働しているLinux計算機と融合するなら「--use-rfc2307」は必至かな. もし初手でsamba-adで用意するなら不要かなぁ. ridベースで作るから
[root@ad ~]# which samba-tool
/opt/samba/bin/samba-tool
[root@ad ~]#
[root@ad ~]# samba-tool domain provision --use-rfc2307 --interactive
Realm [CHAPERONE.JP]:
Domain [CHAPERONE]:
Server Role (dc, member, standalone) [dc]:
DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]:
DNS forwarder IP address (write 'none' to disable forwarding) [127.0.0.1]: 192.168.0.1
Administrator password:
Retype password:
(略
(途中、python3のログに続いてsamba-toolからのメッセージが表示される. python3のログが邪魔すぎる....)
Fixing provision GUIDs
A Kerberos configuration suitable for Samba AD has been generated at /opt/samba/private/krb5.conf
Merge the contents of this file with your system krb5.conf or replace it with this one. Do not create a symlink!
Setting up fake yp server settings
Once the above files are installed, your Samba AD server will be ready to use
Server Role: active directory domain controller
Hostname: ad
NetBIOS Domain: CHAPERONE
DNS Domain: chaperone.jp
DOMAIN SID: S-1-5-21-3431957931-1346180952-3236243850
[root@ad ~]#
*他の引数はsamba-tool domain provision --help を参照
再度provisionを行うなら、設定ファイルらを予め削除してから行う事
[root@ad ~]# rm -rf /opt/samba/private/*
[root@ad ~]# rm -rf /opt/samba/etc/smb.conf
次に、上記provisionの際に指摘されたように「krb5.conf」ファイルを差し替えます。
[root@ad ~]# mv /etc/krb5.conf /etc/krb5.conf.orig
[root@ad ~]# cp /opt/samba/private/krb5.conf /etc/krb5.conf
(中身はこんな感じ)
[root@ad ~]# cat /etc/krb5.conf
[libdefaults]
default_realm = CHAPERONE.JP
dns_lookup_realm = false
dns_lookup_kdc = true
[realms]
CHAPERONE.JP = {
default_domain = chaperone.jp
}
[domain_realm]
ad = CHAPERONE.JP
[root@ad ~]#
シングルモードでテスト実行を行う
ほかのモードについてはここを参照 https://wiki.samba.org/index.php/Samba_server_process_model
[root@ad ~]# samba -i -M single
samba version 4.21.0 started.
Copyright Andrew Tridgell and the Samba Team 1992-2024
binary_smbd_main: samba: using 'single' process model
Attempting to autogenerate TLS self-signed keys for https for hostname 'AD.chaperone.jp'
TLS self-signed keys generated OK
*もしここで「stream_setup_socket: Failed to listen on 0.0.0.0:53 - NT_STATUS_ADDRESS_ALREADY_ASSOCIATED」と出たらそれはlibvrtd関連のdnsmasqが動いているから。libvirtdを止めて再起動すれば回避可能. あと「lsof -i:53」とかでも確認する
「systemctl stop systemd-resolved」とかも
他に
/opt/samba/sbin/samba_dnsupdate: Traceback (most recent call last):
/opt/samba/sbin/samba_dnsupdate: File "/opt/samba/sbin/samba_dnsupdate", line 57, in <module>
/opt/samba/sbin/samba_dnsupdate: import dns.resolver
/opt/samba/sbin/samba_dnsupdate: ModuleNotFoundError: No module named 'dns'
dnsupdate_nameupdate_done: Failed DNS update with exit code 1
と表記されたら「python3-dns.noarch」をインストールする
*CentOS7ならpython36-dns
このまま動かしておいて、別のターミナルから
別ターミナルを立ち上げて自分自身にアクセスしてみます。
[root@ad ~]# smbclient --version
Version 4.21.0
[root@ad ~]#
[root@ad ~]# smbclient -L ad.chaperone.jp -U%
Sharename Type Comment
--------- ---- -------
sysvol Disk
netlogon Disk
IPC$ IPC IPC Service (Samba 4.21.0)
SMB1 disabled -- no workgroup available
[root@ad ~]#
さらにnetlogon共有ドライブへアクセスしてみます。
[root@ad ~]# smbclient //ad.chaperone.jp/netlogon -Uadministrator
Password for [CHAPERONE\administrator]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Sun Sep 29 13:59:44 2024
.. D 0 Sun Sep 29 13:59:44 2024
49729820 blocks of size 1024. 44873008 blocks available
smb: \> pwd
Current directory is \\ad.chaperone.jp\netlogon\
smb: \> quit
[root@ad ~]#
名前解決が正しく行われているかを確認する
[root@ad ~]# host -t SRV _ldap._tcp.chaperone.jp.
_ldap._tcp.chaperone.jp has SRV record 0 100 389 ad.chaperone.jp.
[root@ad ~]# host -t SRV _kerberos._udp.chaperone.jp.
_kerberos._udp.chaperone.jp has SRV record 0 100 88 ad.chaperone.jp.
[root@ad ~]# host -t A ad.chaperone.jp.
ad.chaperone.jp has address 192.168.0.131
[root@ad ~]# host -t A www.fujitsu.co.jp
www.fujitsu.co.jp has address 20.82.31.248
[root@ad ~]#
内部も、外部も名前解決はできている。
provisionの際にsamba内蔵DNSで作られるゾーンは正引き(chaperone.jp)のみで、その逆引きは登録されない。そのため
[root@ad ~]# host 192.168.0.131
131.0.168.192.in-addr.arpa has no PTR record
[root@ad ~]#
となる. もし逆引きが必要なら samba-tool で逆引きゾーンの追加が必要になる。
注意samba-ad内部で解決できない名前を他のDNSへ回すforwarderの設定はstep4のprovisionの時に定義している。
この定義値は、smb.confの[global]セクション内で記述されている。修正が必要ならこの値を変更する。
[root@ad ~]# grep "dns forwarder" /opt/samba/etc/smb.conf
dns forwarder = 192.168.0.1
[root@ad ~]#
別ターミナルでkerberosチケット受領後のDNS動的更新を行ってみる. まずはチケットを貰います
[root@ad ~]# LANG=C kinit administrator@CHAPERONE.JP
Password for administrator@CHAPERONE.JP:
Warning: Your password will expire in 41 days on Sun Nov 10 13:59:47 2024
[root@ad ~]# klist -e
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@CHAPERONE.JP
Valid starting Expires Service principal
09/29/2024 14:06:26 09/30/2024 00:06:26 krbtgt/CHAPERONE.JP@CHAPERONE.JP
renew until 09/30/2024 14:06:22, Etype (skey, tkt): aes256-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96
[root@ad ~]#
c200.chaperone.jp(192.168.0.200) を追加してみる. これはsamba-adのDNSへの操作になります
[root@ad ~]# nsupdate -g
>
> update add c200.chaperone.jp 100 in a 192.168.0.200
> send <-- 以前発生していた「; TSIG error with server: tsig verify failure」が消えた
> quit
[root@ad ~]# host c200.chaperone.jp
c200.chaperone.jp has address 192.168.0.200
[root@ad ~]# nsupdate -g
>
> update delete c200.chaperone.jp
> send <-- 以前発生していた「; TSIG error with server: tsig verify failure」が消えた
> quit
[root@ad ~]# host c200.chaperone.jp
Host c200.chaperone.jp not found: 3(NXDOMAIN)
[root@ad ~]#
上手く行っているみたい
*読みずらいので英語環境(LANG=C)で実行してます。日本語環境(LANG=ja_JP.UTF-8)でも構いません
RockyLinux9 の時計合わせはchronyがデフォルトのご様子。
ここではそのままchronyを使います. ntpサーバ先を「ntp.nict.jp」にしていると
[root@ad ~]# chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp-a2.nict.go.jp 1 6 17 16 -361us[ -865us] +/- 3413us
[root@ad ~]#
とか表示されいると思います. ntpの参照先はそれとしてsamba-ad向けに「/etc/chrony.conf」を修正します
参照先 https://wiki.samba.org/index.php/Time_Synchronisation
[root@ad ~]# vi /etc/chrony.conf
:
ntpsigndsocket /opt/samba/var/lib/ntp_signd
:
[root@ad ~]#
そしてsocketの所有権を変更します
[root@ad ~]# id chrony
uid=987(chrony) gid=987(chrony) groups=987(chrony)
[root@ad ~]# chown -R root:chrony /opt/samba/var/lib/ntp_signd
[root@ad ~]# chmod 750 /opt/samba/var/lib/ntp_signd
[root@ad ~]# systemctl restart chronyd
一応、Step 4: Provision Sambaの際にテンプレートが /opt/samba/etc/smb.conf に用意される
パラメータのすべては「testparm -v」で表示されます.
ここではdnsmasqを全体のDNSとして使っているので少し調整を加えてます.
[root@ad ~]# cat /opt/samba/etc/smb.conf
[global]
dns forwarder = 192.168.0.1
netbios name = AD
realm = CHAPERONE.JP
server role = active directory domain controller
workgroup = CHAPERONE
idmap_ldb:use rfc2307 = yes
#追記. 「server services」の既定値は下記になるが、
#server services = s3fs, rpc, nbt, wrepl, ldap, cldap, kdc, drepl, winbindd, ntp_signd, kcc, dnsupdate, dns
# 「DNS」をdnsmasqで提供していれば「dnsupdate, dns」を削除します
server services = s3fs, rpc, nbt, wrepl, ldap, cldap, kdc, drepl, winbindd, ntp_signd, kcc
#lastコマンドでsmb利用者を表示されたいなら「utmp=yes」を入れる
utmp = yes
#LDAPはldapsで通信します. もし暗号化なしのldapで行うなら「ldap server require strong auth = no」とします
#ldap server require strong auth = no
#kerberos method = secrets and keytab
[sysvol]
path = /opt/samba/var/locks/sysvol
read only = No
[netlogon]
path = /opt/samba/var/locks/sysvol/chaperone.jp/scripts
read only = No
[root@ad ~]#
*samba-ad機能に特化させるので[homes]設定は行いません.
samba起動スクリプトを用意します。ここでは RockyLinux9 なのでsystemd向けのファイルを用意します。
[root@ad ~]# cd /opt/src/samba-4.21.0/
[root@ad samba-4.21.0]# find . -name *.service -exec ls -l {} \;
-rw-r--r--. 1 root root 484 Sep 29 13:33 ./bin/default/packaging/systemd/smb.service
-rw-r--r--. 1 root root 438 Sep 29 13:33 ./bin/default/packaging/systemd/nmb.service
-rw-r--r--. 1 root root 419 Sep 29 13:33 ./bin/default/packaging/systemd/winbind.service
-rw-r--r--. 1 root root 440 Sep 29 13:33 ./bin/default/packaging/systemd/samba.service
-rw-r--r--. 1 root root 490 Sep 29 13:33 ./bin/default/packaging/systemd/samba-bgqd.service
[root@ad samba-4.21.0]#
service稼働に読み込まれる設定ファイル(samba.sysconfig)を/etc/sysconfig/sambaとして、PIDは/run/samba/samba.pidとします
[root@ad samba-4.21.0]# cp bin/default/packaging/systemd/samba.service /etc/systemd/system/samba.service
[root@ad samba-4.21.0]# vi /etc/systemd/system/samba.service
[Unit]
Description=Samba AD Daemon
Documentation=man:samba(8) man:samba(7) man:smb.conf(5)
Wants=network-online.target
After=network.target network-online.target
[Service]
Type=notify
PIDFile=/run/samba/samba.pid <-- 修正「/opt/samba/var/run/samba.pid」から
LimitNOFILE=16384
EnvironmentFile=/etc/sysconfig/samba <-- 修正「-/opt/samba/etc/sysconfig/samba」から
ExecStart=/opt/samba/sbin/samba --foreground --no-process-group $SAMBAOPTIONS
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
[root@ad samba-4.21.0]#
[root@ad samba-4.21.0]# cp packaging/systemd/samba.sysconfig /etc/sysconfig/samba
[root@ad samba-4.21.0]# cat /etc/sysconfig/samba
## Path: Network/Samba
## Description: Samba process options
## Type: string
## Default: ""
## ServiceRestart: samba
SAMBAOPTIONS=""
## Type: string
## Default: ""
## ServiceRestart: smb
SMBDOPTIONS=""
## Type: string
## Default: ""
## ServiceRestart: nmb
NMBDOPTIONS=""
## Type: string
## Default: ""
## ServiceRestart: winbind
WINBINDOPTIONS=""
[root@ad samba-4.21.0]# echo "d /run/samba 755 root root" > /etc/tmpfiles.d/samba.conf
[root@ad samba-4.21.0]# /usr/bin/systemd-tmpfiles --create /etc/tmpfiles.d/samba.conf
留意 PIDFile は、/run/samba/samba.pid とした。
*SELinuxを有効にしているなら「chcon -R -t bin_t /opt/samba/sbin/」を実行する
現在までに「Step 5: Starting Samba」で起動しているsambaプロセスがあるならCtrl+Cで止める
その後、新しいUnitなのでsystemdで読み込んで起動時に起動させるように手配後、起動する。
[root@ad ~]# systemctl daemon-reload
[root@ad ~]# systemctl list-unit-files --type=service | grep samba
samba.service disabled disabled
[root@ad ~]# systemctl enable samba.service --now
(動作確認)
[root@ad ~]# journalctl -f -u samba --full -e
journalctl とかで正常に動いているかを確認します。
これでインストールと起動は完了。次はユーザ作成
firewallが有効なら下記を設定して外部からのアクセスを許容させます. 「/usr/lib/firewalld/services/samba-dc.xml」が該当品で、firewalldパッケージに含まれている
[root@c ~]# firewall-cmd --add-service={samba-dc,ntp} --permanent
[root@c ~]# firewall-cmd --reload