Samba+OpenLDAPでPDC構築

はじめに

CentOS6.4でSamba3.6.9+OpenLDAP(2.4.23)でPDCを構築する手順を説明する。

実をいうと、今回はかなりはまった。ネットを検索すると、以下のような手順が一般的なようだ。

が、これらの手順を試してみたが、Sambaの動作に必要な基本的なグループを作るコマンドで、「gidがを新規生成できないため、グループが作れない」、みたいなエラーになってしまい、先に進めない。 コマンドは"net sam provision"で、エラーメッセージは"Unable to allocate a new gid to create Domain Users group!"みたいなもの。

このエラーメッセージで検索すると、けっこうひっかかる。しかし、回避策が載っていないような気がする。

そこで、以下のように方針転換した。要は昔ながらの方法に戻した。これはうまくいき、Windows7もドメイン参加させることができた。

ちゃんと最新の方法でSamba+OpenLDAPでPDC構築ができている人もいるので、もしかしたら何か手順をまちがえているのかもしれないが、 CentOSのバージョンを変えてみるとかいろいろやったが、どうにもならないので今回はsmbldap-toolsを使う方法を採用した。

Samba+OpenLDAPシステムの基礎知識

Linuxのユーザーアカウントは、インストール直後の状態では、/etc/passwd と/etc/shadowと/etc/groupで管理されている。 /etc/passwdに、ユーザー名,UID,GID,ホームディレクトリが保存されている。/etc/shadow にはパスワードが、 /etc/groupにはグループ名とGIDの紐付けが記録されている。

Sambaもデフォルトでは、/etc/samba/smbpasswdでSambaとしてのユーザー名、パスワードを管理している。

OpenLDAPはLinuxとSambaのユーザーアカウント情報の入れ物として動作する。Linuxのユーザー認証をOpenLDAP認証に 切り替えると、SSHでログオンするときに、/etc/passwdではなく、OpenLDAPのアカウント情報を参照するようになる。 同じく、Sambaのユーザー認証も/etc/samba/smbpasswdでなく、OpenLDAPのアカウント情報を参照するようにできる。

ということで、Samba+OpenLDAPシステムを構築するには以下のことを実現すればいい。

事前準備

OSはCentOS 6.4のMinimal-Installerを使うといい。

今回のようにいくつかのシステムを組み合わせるときには、問題の切り分けをしやすいように、SELinuxやFirewallを無効化しておき、後で制限を厳しくしていくというのはアリだと思う。

先に今後必要となるパッケージをまとめてインストールしておこう。

OpenLADP関係
Samba関係
その他

OpenLDAPの設定

まずは、OpenLDAPを起動させる。

slapd.confの復活

最近のOpenLDAPは設定関係が /etc/openldap/slapd.d の下にLDAPで管理されている。 これはこれでカッコいいのだが、設定手順がおおくて説明が面倒なので、従来のslapd.confを使った設定に戻す。

/etc/sysconfig/ldap を開き、以下のように変更。これでopenldapの設定に/etc/openldap/slapd.confが使用されるようになる。

  # Options of slapd (see man slapd)
  SLAPD_OPTIONS="-f /etc/openldap/slapd.conf"
  
  ...後は同じ...
  

こうすると、OpenLDAPはslapd.confを参照するようになるので、/etc/openldap/slapd.d以下は消してもいい。

slapd.confの設定

/etc/openldap/slapd.conf を新規作成し、以下のように書き込む。

  include         /etc/openldap/schema/core.schema
  include         /etc/openldap/schema/cosine.schema
  include         /etc/openldap/schema/inetorgperson.schema
  include         /etc/openldap/schema/nis.schema
  include         /etc/openldap/schema/samba.schema
  
  allow bind_v2
  
  pidfile /var/run/openldap/slapd.pid
  argsfile /var/run/openldap/slapd.args
  
  access to *
       by self write
          by dn.base="cn=Manager,dc=example,dc=com" write
          by * read
  
  access to attrs=userPassword,sambaLMPassword,sambaNTPassword,sambaPwdLastSet,sambaPwdMustChange
          by dn.base="cn=Manager,dc=example,dc=com" write
          by self write
          by anonymous auth
          by * none
  
  database        bdb
  suffix          "dc=example,dc=com"
  rootdn          "cn=Manager,dc=example,dc=com"
  rootpw          passpass
  directory     /var/lib/ldap
  
  index objectClass                       eq,pres
  index ou,cn,mail,surname,givenname     eq,pres,sub
  index uidNumber,gidNumber,loginShell    eq,pres
  index uid,memberUid                     eq,pres,sub
  

自分の環境に合わせて書き換えるのは、以下の部分。

 

  # slappasswd -h {MD5}
  New password: passpass
  Re-enter new password: passpass
  {MD5}B4u7S/D3EX+xMexF8Vtbhw==
  

DB_CONFIGのコピー

OpenLDAPのDBファイルは、slapd.confのdirectoryで指定されたフォルダに作成される。ここにDBのパラメータファイル(DB_CONFIG)をコピーしておく。 パラメータファイルの元がどこかにあるので、それを/var/lib/ldap にコピーしておく。

  # cd /
  # find . | grep DB_CONFIG
  ./usr/share/openldap-servers/DB_CONFIG.example
  

これで元ファイルのありかがわかるので、DB_CONFIGの名前でコピーすればいい。

  # cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
  

OpenLDAPの起動

これで準備が整ったので、openLDAPを起動する。

  # /etc/init.d/slapd start
  Starting slapd:       [  OK  ]
  

ついでに自動起動も設定しておく。

  # chkconfig --add slapd
  # chkconfig --level 2345 slapd on
  

LDAPの参照

LDAPにアクセスするには、"Apache Directory Studio"がお勧め。GUIでLDAPツリーの中身をチェックできる。

SambaLDAP Toolsのセットアップ

SambaLDAP Toolsはユーザー登録時にLDAPにSambaアカウントを登録してくれたり、PCがドメイン参加してきたときに、LDAPにPC情報を追加したりするスクリプト群である。 いくつか、自分の環境に合わせた設定をしておけば、うまく動いてくれる。

SambaLDAP Toolsのインストール

SambaLDAP ToolsはCentOSの標準リポジトリには含まれてないので、FedoraCoreのリポジトリからとってくる(32bit CentOSの場合)。

  # wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
  # rpm -ivh epel-release-6-8.noarch.rpm
  

SambaLDAP Toolsの設定

変更すべきは、/etc/smbldap-tools/smbldap_bind.confとsmbldap.conf の2ファイル。

/etc/smbldap-tools/smbldap_bind.confの変更

このファイルには、LDAPサーバの管理者アカウント名とパスワードを設定する。 パスワードを平文で書いておくので、root以外が読み取れないようにパーミッションを適切に設定しておく。

  slaveDN="cn=Manager,dc=example,dc=com"
  slavePw="passpass"
  masterDN="cn=Manager,dc=example,dc=com"
  masterPw="passpass"
  

SlaveとMasterはLDAPを多重構成にしておくときに意味がある。読み取りにはSlaveの方を使い、書き込むときにはMasterの設定を使う。 LDAPが1台しかない場合は、同じ情報を設定しておけばいい。

/etc/smbldap-tools/smbldap.conf

このファイルは結構設定項目が多い。あらかじめ決めておく項目がいくつかある。

  # net getlocalsid
  
  # net setlocalsid S-1-5-21-3699049125-1939141669-948421140
  # net setdomainsid S-1-5-21-3699049125-1939141669-948421140
  

このへんを、smbldap.confに反映させていく

  # SIDの設定
  SID="S-1-5-21-3699049125-1939141669-948421140"
  
  # ドメイン名の設定
  sambaDomain="TECHNOTES"
  
  # LDAPの設定(LDAPが動いているサーバのIPかホスト名。同じマシン内なら127.0.0.1)
  slaveLDAP="127.0.0.1"
  slavePort="389"
  masterLDAP="127.0.0.1"
  masterPort="389"
  
  # LDAPアクセスにTLSを使うなら1、未使用なら0
  ldapTLS="0"
  
  # LDAPアクセスにSSLを使うなら1、未使用なら0
  ldapSSL="0"
  
  # このへんは変更しなくていい
  verify="require"
  cafile="/etc/pki/tls/certs/ldapserverca.pem"
  clientcert="/etc/pki/tls/certs/ldapclient.pem"
  clientkey="/etc/pki/tls/certs/ldapclientkey.pem"
  
  # LDAP Suffix(自分の環境にあわせて変更)
  suffix="dc=example,dc=com"
  
  # ユーザー、ドメイン参加のPC、グループ、IDMAPをどの枝の下で管理するか決める
  # smb.confの設定とあわせる必要あり
  usersdn="ou=People,${suffix}"
  computersdn="ou=Computers,${suffix}"
  groupsdn="ou=Group,${suffix}"
  idmapdn="ou=Idmap,${suffix}"
  
  # しばらく変更しないでいいものが続く
  sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"
  scope="sub"
  hash_encrypt="SSHA"
  crypt_salt_format="%s"
  userLoginShell="/bin/bash"
  userHome="/home/%U"
  userHomeDirectoryMode="700"
  userGecos="System User"
  defaultUserGid="513"
  defaultComputerGid="515"
  skeletonDir="/etc/skel"
  defaultMaxPasswordAge="45"
  
  # ドメインログオンしてきたときの各ユーザーのホームディレクトリ
  # ユーザーの個人フォルダを置くSambaサーバを指定する
  userSmbHome="\\centos\%U"
  userProfile="\\centos\profiles\%U"
  
  # ドメインログオンしたときに、個人フォルダをどのドライブにつなぐか指定。
  # H:ドライブが\\FILESVR\%Uにつながる
  userHomeDrive="H:"
  
  # しばらく変更しないものが続く
  userScript="logon.bat"
  mailDomain="example.com"
  with_smbpasswd="0"
  smbpasswd="/usr/bin/smbpasswd"
  with_slappasswd="0"
  slappasswd="/usr/sbin/slappasswd"
  

smbldap-populateで基本情報を設定(smbldap-toolsのテストを兼ねて)

ここまで設定したら、smbldap-populateでSambaでPDC動作に必要な基本アカウントを登録しておく。 最後にパスワードを聞いてくるが、これは"root"ユーザーのパスワード。

ただ、なんとなくrootはLDAPで管理しないほうがいいような気がする。 あとで削除しておくので、パスワードは適当でいい。

  # smbldap-populate
  Populating LDAP directory for domain TECHNOTES (S-1-5-21-3699049125-1939141669-948421140)
  (using builtin directory structure)
  
  entry dc=example,dc=com already exist.
  entry ou=People,dc=example,dc=com already exist.
  entry ou=Group,dc=example,dc=com already exist.
  entry ou=Computers,dc=example,dc=com already exist.
  entry ou=Idmap,dc=example,dc=com already exist.
  entry uid=root,ou=People,dc=example,dc=com already exist.
  entry uid=nobody,ou=People,dc=example,dc=com already exist.
  entry cn=Domain Admins,ou=Group,dc=example,dc=com already exist.
  entry cn=Domain Users,ou=Group,dc=example,dc=com already exist.
  entry cn=Domain Guests,ou=Group,dc=example,dc=com already exist.
  entry cn=Domain Computers,ou=Group,dc=example,dc=com already exist.
  entry cn=Administrators,ou=Group,dc=example,dc=com already exist.
  entry cn=Account Operators,ou=Group,dc=example,dc=com already exist.
  entry cn=Print Operators,ou=Group,dc=example,dc=com already exist.
  entry cn=Backup Operators,ou=Group,dc=example,dc=com already exist.
  entry cn=Replicators,ou=Group,dc=example,dc=com already exist.
  entry sambaDomainName=TECHNOTES,dc=example,dc=com already exist. Updating it...
  
  Please provide a password for the domain root:
  Changing UNIX and samba passwords for root
  New password:
  Retype new password:
  

これで、基本的なグループとパスワードが設定される。 Apache Directory Studioでチェックしておく。rootアカウントはPeopleの枝の下に配置されているがちょっと怖いので削除しておく。

ユーザー登録のテスト

さっそくadministratorを登録してみよう。あとでWindowsをドメイン参加させるときには、このアカウントが必要になる。

  # smbldap-useradd -a -g Administrators Administrator
  # smbldap-passwd Administrator
  Changing UNIX and samba passwords for Administrator
  New password:
  Retype new password:
  

Administratorが登録されているのがわかる。 Administratorのアカウント情報

Linuxの認証をLDAPに切り替え

Linux上のユーザー認証もLDAPに切り替えておく。これにはauthconfig-tuiというコマンドを使う。 このコマンドで以下のようにチェックを入れておく。

  # authconfig-tui
  

  ユーザー認証の切り替え

SambaをPDCにする設定

ようやく準備も整ったので、SambaをPDCとして動作させるための設定を行う。

/etc/samba/smb.confの設定

SambaをPDCにして、アカウントDBをLDAPに、ドメインにPCを参加させたりユーザーのパスワードを変更するための設定を行う。 "admin users"には、先ほど作成したSambaドメインの管理者アカウント名を設定する。複数指定するなら、admin users = administrator,domadd のようにカンマ区切りで並べればいい。

  [global]
      server string = TechNotes PDC
  
      load printers = no
      cups options = raw
  
      log file = /var/log/samba/samba.log
      max log size = 500
      log level = 4
  
      dns proxy = no
  
      add machine script = /usr/sbin/smbldap-useradd -w '%u'
      add user script = /usr/sbin/smbldap-useradd -m '%u'
      delete user script = /usr/sbin/smbldap-userdel -r '%u'
      add group script = /usr/sbin/smbldap-groupadd -p '%g'
      delete group script = /usr/sbin/smbldap-groupdel '%g'
      add user to group script = /usr/sbin/smbldap-groupmod -m '%u' '%g'
      delete user from group script = /usr/sbin/smbldap-groupmod -x '%u' '%g'
      set primary group script = /usr/sbin/smbldap-usermod -g '%g' '%u'
  
      workgroup = TECHNOTES
      netbios name = centos
  
      security = user
      domain logons = Yes
      preferred master = Yes
      local master = Yes
      domain master = Yes
  
      passdb backend = ldapsam:ldap://127.0.0.1
      os level = 64
      admin users = administrator
      wins support = Yes
      logon path =
      logon home = \\centos\%U
      logon drive = H:
      logon script = 
  
      encrypt passwords = yes
      update encrypted = yes
      ldap passwd sync = Yes
      ldap ssl = No
  
      ldap admin dn = cn=Manager,dc=example,dc=com
      ldap suffix = dc=example,dc=com
      ldap user suffix = ou=People
      ldap group suffix = ou=Group
      ldap machine suffix = ou=Computers
  
  
  
      dos charset = CP932
      unix charset = UTF-8
      display charset = UTF-8
  
  
      dos filetimes = Yes
      dos filetime resolution = Yes
      force unknown acl user = yes
  
  [homes]
      comment = Home Directories
      browseable = no
      writable = yes
  

SambaがLDAPにアクセスするためのパスワードの登録

SambaがLDAPにアクセスするパスワードを登録しておく。

  # smbpasswd -W
  Setting stored password for "cn=Manager,dc=example,dc=com" in secrets.tdb
  New SMB password: passpass
  Retype new SMB password: passpass
  

この情報は、secrets.tdbというファイルに保存されるようだ。

  # cd /
  # find . | grep secrets.tdb
  → /var/lib/samba/private/secrets.tdb にあることがわかる。
  

このファイルの中身は、tdbdumpというコマンドで表示させることができる。

ドメイン名やSIDを変えてテストしなおすときには、このファイルをいったん消去するといい。

Sambaの起動

Sambaを起動しておく。自動起動も設定しておく。 ここはよくわかってないんだけど、Windowsがドメインコントローラを探すときにWINSに頼っているような気がする。WINSも動作させておこう。

  # /etc/init.d/smb start
  # chkconfig --level 2345 smb on
  # /etc/init.d/nmb start
  # chkconfig --level 2345 nmb on
  

Windowsのドメイン参加

Windowsからドメイン参加させてみよう。

参加するドメイン名からドメインコントローラを探すのに、WINSを使っているような気がする。 Windowsのネットワーク設定で、WINSサーバの指定もわすれずに行っておこう。 WINSサーバの設定

WindowsXPの場合、そのまま参加可能。 Windows7/8の場合、レジストリの追加が必要。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanWorkstation\Parameters に、以下のレジストリを追加する。

これで、コントロールパネル→システム→設定の変更→「コンピュータ名」タブ→変更 と進み、「ドメイン」にチェックを入れて、ドメイン名にSambaに設定したドメイン名を入れる。

ドメインへの参加パネル

パスワードを聞いてきたら、あらかじめ設定しておいたSambaドメインの管理者のユーザー名とパスワードを入れる。 これは、samba.confの"admin users"で指定し、smbldap-useraddで登録しておいた管理者アカウントのこと。

「ドメインへようこそ」と表示されれば、ドメイン参加は成功である。

なお、ドメイン参加させるWindowsをお手軽に用意するなら、Engineer's Notesbookで紹介されている modern.IEとVMWare Playerを使うといい。WinXP〜Win8の仮想マシンで手軽に試すことができる(本来はIEの互換性テストの ためだが、ドメイン参加のテストにも利用できる)。英語版だけどね。


戻る