Permalink: 2015-10-18 02:45:00+09:00 by ruy@ainoniwa.net in technical tags: freebsd samba zfs social:

今日のお話

つい最近、ファイルサーバを新しくした のですけど、

旧ファイルサーバではSamba36と連携しているOpenLDAPも動いてるのでこれの移行もする必要があった。

と言ってもコールドスタンバイな移行なので、BDBからMDBへの変更も特に意識する必要は無くて、結果的にはFreeBSD 10にOpenLDAPをSamba連携するように入れ直す程度。

なんか既に記憶とメモが曖昧だけど...まぁ、ね。

ではゴー。

やること

  1. OpenLDAPサーバのインストール
  2. Samba42のインストール
  3. OpenLDAPのバックアップ取得とデータの移行
  4. グループのためにPAM対応(ついでにSSHも)
  5. おしまい

簡単そう!

OpenLDAPサーバのインストール

まぁ大体こんな感じです。:

# pkg install openldap-server
# sysrc slapd_enable="YES"
# sysrc slapd_flags="-h 'ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/'"
# sysrc slapd_sockets="/var/run/openldap/ldapi"
# pkg install -y curl
# curl -o /usr/local/etc/openldap/schema/samba.schema "https://git.samba.org/samba.git/?p=samba.git;a=blob_plain;f=examples/LDAP/samba.schema"
# vi /usr/local/etc/openldap/slapd.conf
include         /usr/local/etc/openldap/schema/core.schema

include         /usr/local/etc/openldap/schema/corba.schema
include         /usr/local/etc/openldap/schema/cosine.schema
include         /usr/local/etc/openldap/schema/inetorgperson.schema
include         /usr/local/etc/openldap/schema/nis.schema
include         /usr/local/etc/openldap/schema/misc.schema
include         /usr/local/etc/openldap/schema/openldap.schema
include         /usr/local/etc/openldap/schema/samba.schema

pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

modulepath      /usr/local/libexec/openldap
moduleload      back_mdb

access to attrs=userPassword,sambaLMPassword,sambaNTPassword
        by self write
        by users read
        by anonymous auth

access to *
        by self write
        by users read
        by anonymous read

database        mdb
maxsize         1073741824
suffix          "dc=example,dc=net"
rootdn          "cn=root,dc=example,dc=net"
rootpw          secret
directory       /var/db/openldap-data

index   default         pres,eq
index   objectClass
index   uid,uidNumber
index   cn
index   memberUid,gidNumber
index   sambaSID
index   sambaGroupType
index   sambaSIDList
index   sambaDomainName
index   member
index   uniqueMember
# service slapd start

以下のようなエラーが出る場合があります:

# service slapd onestart
Starting slapd.
Unrecognized database type (mdb)
/usr/local/etc/rc.d/slapd: WARNING: failed to start slapd

以下コメントアウトして有効に。:

moduleload      back_mdb

参考: http://www.openldap.org/lists/openldap-technical/201310/msg00010.html

Samba42のインストール

まず、古いSambaサーバと同名で作る場合は、古いファイルサーバのSIDの変更を合わせて実行しておきます:

(old)# service samba stop
(old)# net getlocalsid
SID for domain REMILIA is: S-1-5-21-1337328856-2773713346-4051707553
(old)# hostname remilia_old
(old)# sysrc hostname="remilia_old.example.net"
(old)# net getlocalsid
SID for domain REMILIA_OLD is: S-1-5-21-2186846296-1789796161-3191077940
(old)# service samba start

で、新しい方にSamba42をインストール:

(new)# pkg install samba42
(new)# vi /usr/local/etc/smb4.conf
<前略>
passdb backend = ldapsam:ldap://localhost
ldap suffix = dc=example,dc=net
ldap admin dn = cn=root,dc=example,dc=net
ldap ssl = no
ldap user suffix = ou=users
ldap group suffix = ou=groups
<以下略>
(new)# sysrc samba_server_enable="YES"
(new)# service samba_server start
(new)# smbpasswd -W

OpenLDAPのバックアップ取得とデータの移行

これは適当に吐き出させれば良い。

個人環境なので普通に常用しているまま出力。:

(old)# slapcat > ldap-backup.ldif

次に、新しいSambaサーバのSIDを取得:

# slapcat | grep sambaSID
sambaSID: S-1-5-21-120019609-1632863270-3876271938

で、これに置換:

(new)# service samba_server stop
(new)# service slapd stop
(new)# rm /var/db/openldap-data/*
(new)# vi ldap-backup.ldif
// ここで、旧SIDを新SIDに全置換
(new)# slapadd -l ldap-backup.ldif
(new)# service slapd start
(new)# service samba_server start

こういう機会に ldap-backup.ldif のdcとかを変更してから slapadd してやれば組織名の調整とかもできますね。

ただし、この時点では、少なくともグループ名を取得することが出来ず、こんな感じになっちゃう:

# pdbedit -L
root:0:root
nobody:65534:nobody
test_user:4294967295:test_user

グループのためにPAM対応(ついでにSSHも)

まずはSambaでグループがちゃんと認識できるようにする。

ざっと流す。:

# pkg install pam_ldap nss_ldap
# vi /etc/nsswitch.conf
group: files ldap
passwd: files ldap
# cd /usr/local/etc/
# ln -s nss_ldap.conf ldap.conf
# vi nss_ldap.conf
host 127.0.0.1
base dc=example,dc=net
pam_filter objectclass=posixAccount
bind_policy soft
# service samba_server restart

これで見えるはず:

# pdbedit -L
root:0:root
nobody:65534:nobody
test_user:12001:test_user

他にも、 getent passwd とか getent group 辺りで確認しておいても良い。

SSHもPAM対応

ハンドブックによればこうらしい。 https://www.freebsd.org/doc/en/articles/ldap-auth/article.html

ので、そのように追加する:

# vi /etc/pam.d/sshd
auth            sufficient      pam_opie.so             no_warn no_fake_prompts
auth            requisite       pam_opieaccess.so       no_warn allow_local
#auth           sufficient      pam_krb5.so             no_warn try_first_pass
#auth           sufficient      pam_ssh.so              no_warn try_first_pass
auth            sufficient      /usr/local/lib/pam_ldap.so      no_warn
auth            required        pam_unix.so             no_warn try_first_pass

account         required        pam_login_access.so
account         required        /usr/local/lib/pam_ldap.so      no_warn ignore_authinfo_unavail ignore_unknown_user

あとはSSHでLDAPユーザを対象に色々制限をかければいい。

例えばこんな感じ:

# vi /etc/ssh/sshd_config
Match User test_user
  ChrootDirectory /var/home/test_user
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp
# service sshd restart

おしまい

まぁそういうわけでした(雑)