CentOS5.0のSamba3.0でユーザ認証をLDAP化する

CentOS5.0でユーザ認証をLDAP化し、仮想サーバ間のホームディレクトリをNFS4で共有した。次にこれをSambaを使って共有するし、Windows XP端末からアクセスできるようにする。SambaでLDAP認証をするために、ちょっと細かい設定が必要になる。

Sambaの設定はバージョンによって違いがあり、Webや書籍でいろいろ調べてもうまく行かなかった。結局smbldap-toolsというものが標準で用意されているという情報にたどり着いてから先に進んだ。まずマニュアルを読め!という教訓。

LDAPサーバ側の作業

①Samba用のLDAPスキーマをLDAPサーバのOpenLDAPのディレクトリにコピー
[root@ns1 ~]# cp /usr/share/doc/samba-3.0.23c/LDAP/samba.schema /etc/openldap/schema/

※samba.schemaはSambaサーバからFTPなどで持ってきてもいいし、LDAPサーバにもともと入っていればそれを使ってもいい

②/etc/openldap/slapd.confを修正し、以下を追加

...
include         /etc/openldap/schema/samba.schema
...
access to attrs=SambaLMPassword
     by dn="cn=Manager,dc=grandarbre,dc=net" write
     by self read
     by anonymous auth
     by * none

access to attrs=SambaNTPassword
     by dn="cn=Manager,dc=grandarbre,dc=net" write
     by self read
     by anonymous auth
     by * none

上記2つのアクセス制限設定はaccess to *の前に書くこと。

③LDAPサーバを再起動

[root@ns1 ~]# service ldap restart
Stopping slapd:                                            [  OK  ]
Checking configuration files for slapd:  config file testing succeeded
                                                           [  OK  ]
Starting slapd:                                            [  OK  ]

Sambaサーバ側の作業

※基本的に/usr/share/doc/samba-3.0.23c/LDAP/smbldap-tools-0.9.2/INSTALLの手順に従えばOK

①Sambaサーバでsambaのインストール(たぶんデフォルトで入っている)

[root@storage1 ~]# yum install samba
[root@storage1 ~]# yum install samba-common

②/usr/share/doc/samba-3.0.23c/LDAP/smbldap-tools-0.9.2/にあるスクリプトを/usr/local/sbinにコピーして実行属性を付与する

[root@storage1 ~]# cp /usr/share/doc/samba-3.0.23c/LDAP/smbldap-tools-0.9.2/smbldap-* /usr/local/sbin
[root@storage1 ~]# cp /usr/share/doc/samba-3.0.23c/LDAP/smbldap-tools-0.9.2/smbldap_tools.pm /usr/local/sbin
[root@storage1 ~]# chmod 544 /usr/local/sbin/smbldap-* 
[root@storage1 ~]# chmod 544 /usr/local/sbin/smbldap_tools.pm

③/usr/share/doc/samba-3.0.23c/LDAP/smbldap-tools-0.9.2/にある設定ファイルを/etc/smbldap-tools/にコピーしてパーミッションを設定する

[root@storage1 ~]# mkdir /etc/smbldap-tools
[root@storage1 ~]# cp /usr/share/doc/samba-3.0.23c/LDAP/smbldap-tools-0.9.2/smbldap.conf /etc/smbldap-tools/
[root@storage1 ~]# cp /usr/share/doc/samba-3.0.23c/LDAP/smbldap-tools-0.9.2/smbldap_bind.conf /etc/smbldap-tools/

[root@storage1 ~]# chmod 644 /etc/smbldap-tools/smbldap.conf
[root@storage1 ~]# chmod 600 /etc/smbldap-tools/smbldap_bind.conf

④SIDを取得する

[root@storage1 ~]# net getlocalsid
SID for domain STORAGE1 is: S-1-5-21-2279266102-347069318-3913411543

⑤/etc/smbldap-tools/smbldap.confを編集する。変更したのは以下の場所。

SID="S-1-5-21-2279266102-347069318-3913411543"
sambaDomain="GRANDARBRE"
masterLDAP="ns1"
masterPort="389"
ldapTLS="0"
suffix="dc=grandarbre,dc=net"
userdn="ou=People,${suffix}"
computersdn="ou=Computers,${suffix}"
groupsdn="ou=Groups,${suffix}"
idmapdn="ou=Idmap,${suffix}"
sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"

⑥/etc/smbldap-tools/smbldap_bind.confを編集する。下記のPASSWORDはLDAPサーバの/etc/openldap/slapd.confでrootpwに設定してあるもの。

slaveDN="cn=Manager,dc=grandarbre,dc=net"
slavePw="PASSWORD"
masterDN="cn=Manager,dc=grandarbre,dc=net"
masterPw="PASSWORD"

⑦設定スクリプトを実行する。この作業は⑧や⑨の後かも...。

[root@storage1 ~]# /usr/local/sbin/smbldap-populate

これの実行にはNet::LDAP、Crypt::SmbHash、Unicode::MapUTF8などがperlにインストールされている必要がある。ここでは詳述しないがCPANなどでインストールする。

[root@storage1 ~]# /usr/bin/perl -MCPAN -e shell
...
install Net::LDAP

テストがうまくいかないときは無理やりインストール。

force install Net::LDAP

⑧sambaにLDAPの管理者パスワードを教える。こちらのPASSWORDも⑥と同様。smbpassword -Wと打つと対話式で設定できる。管理者パスワードはsecretsw.tdbというバイナリファイルに保存される。

[root@storage1 ~]# /usr/bin/smbpasswd -w PASSWORD

⑨Sambaの設定をする。/etc/samba/smb.confを編集してもいいが、LDAP用に用意されているものを編集したほうが早い。

[root@storage1 ~]# cp /usr/share/doc/samba-3.0.23c/LDAP/smbldap-tools-0.9.2/smb.conf /etc/samba/

[root@storage1 ~]# vi /etc/samba/smb.conf
[global]
        dos charset = CP932
        workgroup = GRANDARBRE
        server string = Samba Server %v
        map to guest = Bad User
        obey pam restrictions = Yes
        passdb backend = ldapsam:ldap://ns1/
        passwd program = /usr/local/sbin/smbldap-passwd -u %u
        passwd chat = "Changing password for*\nNew password*" %n\n "*Retype new password*" %n\n"
        unix password sync = Yes
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 100000
        time server = Yes
        deadtime = 10
        socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
        printcap name = cups
        add user script = /usr/local/sbin/smbldap-useradd -m "%u"
        delete user script = /usr/local/sbin/smbldap-userdel "%u"
        add group script = /usr/local/sbin/smbldap-groupadd -p "%g"
        add user to group script = /usr/local/sbin/smbldap-groupmod -m "%u" "%g"
        delete user from group script = /usr/local/sbin/smbldap-groupmod -x "%u" "%g"
        set primary group script = /usr/local/sbin/smbldap-usermod -g '%g' '%u'
        add machine script = /usr/local/sbin/smbldap-useradd -t 0 -w "%u"
        logon script = logon.bat
        logon path =
        logon drive = H:
        logon home =
        domain logons = Yes
        os level = 65
        preferred master = Yes
        domain master = Yes
        wins support = Yes
        ldap admin dn = cn=Manager,dc=grandarbre,dc=net
        ldap group suffix = ou=Groups
        ldap machine suffix = ou=Computers
        ldap suffix = dc=grandarbre,dc=net
        ldap ssl = no
        ldap user suffix = ou=People
        printer admin = "@Print Operators"
        create mask = 0640
        directory mask = 0750
        nt acl support = No
        case sensitive = No
        dont descend = /proc,/dev,/etc,/lib,/lost+found,/initrd

[homes]
        browseable = No
        path = /home/%U
        read only = No

[share]
        path = /home/share
        read only = No

⑩Sambaデーモンを再起動

[root@storage1 ~]# service smb restart

⑪SELinuxでホームディレクトリの使用を許可

[root@storage1 ~]# setsebool -P samba_enable_home_dirs on

⑫iptablesでSambaの通信を許可

[root@storage1 ~]# vi /etc/sysconfig/iptables
...
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.0/24 --dport 139 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp -s 192.168.0.0/24 --dport 138 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp -s 192.168.0.0/24 --dport 137 -j ACCEPT
...

[root@storage1 ~]# service iptables reload

⑬ユーザの管理

LDAPサーバに登録済みのUnixユーザへのSambaアカウント情報の追加

[root@storage1 ~]# /usr/local/sbin/smbldap-usermod -a ishii

新しいSambaユーザの追加

[root@storage1 ~]# /usr/local/sbin/smbldap-useradd -m -a newuser

ユーザ情報の表示

[root@storage1 ~]# /usr/local/sbin/smbldap-usershow ishii
dn: uid=ishii,ou=People,dc=grandarbre,dc=net
objectClass: top,person,organizationalPerson,inetOrgPerson,posixAccount,shadowAccount,sambaSamAccount
uid: ishii
homeDirectory: /home/ishii
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647
sambaPwdCanChange: 0
displayName: System User
sambaSID: S-1-5-21-2279266102-347069318-3913411543-2000
uidNumber: 500
gecos: Taiki Ishii,,,,
cn: Taiki Ishii
sn: Ishii
givenName: Taiki
loginShell: /bin/bash
userPassword: {SSHA}(削除)
sambaLMPassword: (削除)
sambaAcctFlags: [U]
sambaNTPassword: (削除)
sambaPwdLastSet: 1193874837
sambaPwdMustChange: 1197762837
gidNumber: 500

クライアントで動作確認

まずはLinuxから

[ishii@www1 ~]$ smbclient  //storage1/ishii  -U ishii
Password:
Domain=[GRANDARBRE] OS=[Unix] Server=[Samba 3.0.23c-2.el5.2.0.2]
smb: \> ls
  .                                   D        0  Thu Nov  1 18:50:45 2007
  ..                                  D        0  Thu Nov  1 08:59:46 2007
  .bash_logout                        H       24  Wed Oct 31 07:02:07 2007
  .ssh                               DH        0  Thu Nov  1 06:41:43 2007
  .bashrc                             H      124  Wed Oct 31 07:02:15 2007
  .lesshst                            H       72  Thu Nov  1 19:50:57 2007
  .bash_profile                       H      176  Wed Oct 31 07:02:11 2007
  .bash_history                       H     5223  Thu Nov  1 20:04:23 2007

                64443 blocks of size 131072. 60000 blocks available
smb: \> pwd
Current directory is \\storage1\ishii\

Windows XPからもログインできた。