[samba-jp:21116] Re: 一発でSamba+OpenLDAPを設定するスクリプト

gwmaster ribbon @ ns.ribbon.or.jp
2010年 7月 12日 (月) 19:56:37 JST


On Tue, Jun 22, 2010 at 04:57:43PM +0900, gwmaster wrote:
> 堀田さんが作ってます。
> 
> http://net-newbie.com/samba/
> 
> 毎回設定ファイルを1から作る、という事は思いつかなかった。
> これだと、VM環境を丸ごと配らなくてもいいかもしれませんね。

試してみたらうまく動かなかったので、このように直して見ました。

 -------------------------------------------------------------------
#!/bin/bash
#----------------------------------------------------------------------
# CentOS 5.4 をクリーンインストールした直後の環境に対して、
# コマンド一発で OpenLDAP+Samba ドメインコントローラを構築する
#----------------------------------------------------------------------
# 以下のパラメータを必要に応じて適宜変更してください。
#----------- ここから -------------------------
LDAP_TOP_DN='com'
LDAP_SECOND_DN='example'
LDAP_CONFIG_PASSWORD=secret
LDAP_ADMIN_PASSWORD=rootpwd
ADMINISTRATOR_USER=Administrator
ADMINISTRATOR_PASSWORD=adminpw
UNPRIVILEGED_USER=ldap01
UNPRIVILEGED_PASSWORD=ldap01
WORKGROUP_NAME=MYDOMAIN
MYCOMUTER_NAME=`hostname -s`
#----------- ここまで -------------------------
LDAP_BASE_DN="dc=$LDAP_SECOND_DN,dc=$LDAP_TOP_DN"
LDAP_CONFIG_DN='cn=config'
LDAP_ADMIN_DN="cn=admin,$LDAP_BASE_DN"
SAMBA_VERSION=3.4.5
KEEP_ORIGINAL_SAMBA=no
SKIP_INSTALL=yes
# コマンド表示&実行
run() {
    echo "# $@"; 
    ${1+"$@"};
}
echo -----------------------------------------------
echo LDAP 関連の依存を無効にし、サービス環境をクリア
echo -----------------------------------------------
service winbind stop    >& /dev/null
service smb stop        >& /dev/null
service ldap stop       >& /dev/null
run authconfig  --disableldap --disableldapauth \
            --disablewinbind --disablewinbindauth \
            --disablesmbauth \
            --update
service iptables stop
setenforce permissive
find /var/log/samba/ -type f -exec rm {} \;
echo ------------------------------------------
echo OS のアップデート&必要なパッケージの登録
echo ------------------------------------------
if [ "$SKIP_INSTALL" = "no" ]
then
  if ! ( yum -y update )
  then
     yum update 失敗。ネットワーク環境を確認してください。
     exit 1
  fi
  yum install -y openldap-servers openldap-clients openldap-devel openldap \
               nkf yum-priorities
  if [ "$KEEP_ORIGINAL_SAMBA" = "no" ]
  then
    (
        set -e
        wget http://repos.net-newbie.com/newbie-pub.repo
        mv newbie-pub.repo /etc/yum.repos.d/
        rpm --import http://repos.net-newbie.com/RPM-GPG-KEY-newbie
        yum --enablerepo=newbie -y install samba samba-client
    ) || exit 1
  fi
fi
echo -----------------------------------------------
echo 'LDAP 設定ファイルの投入(for Provider)'
echo -----------------------------------------------
cp /usr/share/doc/samba-doc-$SAMBA_VERSION/LDAP/samba.schema /etc/openldap/schema
ROOTPW_CONFIG=`echo -n $LDAP_CONFIG_PASSWORD | slappasswd -T /dev/stdin`
ROOTPWD_BDB=`echo -n $LDAP_ADMIN_PASSWORD | slappasswd -T /dev/stdin`
cat > /etc/openldap/slapd.conf <<_EOF_
# 全体設定
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/misc.schema
include     /etc/openldap/schema/redhat/autofs.schema
include     /etc/openldap/schema/samba.schema
pidfile     /var/run/openldap/slapd.pid
# 設定ディレクティブ用データベース定義
database    config
rootdn      cn=config
rootpw      $ROOTPW_CONFIG
index       entryCSN,entryUUID  eq
# データ格納用データベース定義
database    bdb
directory   /var/lib/ldap
suffix      "$LDAP_BASE_DN"
rootdn      "$LDAP_ADMIN_DN"
rootpw      $ROOTPWD_BDB
index       objectClass,uid,uidNumber,gidNumber,memberUid   eq,pres
index       cn,mail,surname,givenname                       eq,pres,sub
index       sambaSID,displayName,sambaDomainName            eq,pres
index       entryUUID,entryCSN,sambaGroupType,sambaSIDList  eq,pres
index       nisMapName,nisMapEntry                          eq,pres,sub
# チューニング項目
sizelimit 10000
cachesize 20000
dbcachesize 20000000
# アクセス制御
access to attrs=sambaNTPassword,sambaLMPassword,sambaPasswordHistory
        by * none
access to attrs=userPassword
        by self write
        by anonymous auth
        by * none
access to *
        by self write
        by * read
# レプリケーション関連
overlay     syncprov
syncprov-sessionlog 100
_EOF_
chown root:ldap /etc/openldap/slapd.conf
chmod 640 /etc/openldap/slapd.conf
if ( ! grep local4 /etc/syslog.conf >& /dev/null )
then
    echo 'local4.*   -/var/log/ldap.log' >> /etc/syslog.conf
    service syslog restart
fi
echo -----------------------------------------------
echo LDAP 初期データの投入
echo -----------------------------------------------
rm -f /var/lib/ldap/*
install -o ldap -g ldap /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
echo "
dn: $LDAP_BASE_DN
objectClass: dcObject
objectClass: organization
o: $LDAP_SECOND_DN
dc: $LDAP_SECOND_DN

dn: ou=users,$LDAP_BASE_DN
objectClass: top
objectClass: organizationalUnit
ou: users

dn: ou=groups,$LDAP_BASE_DN
objectClass: top
objectClass: organizationalUnit
ou: groups

dn: ou=idmap,$LDAP_BASE_DN
objectClass: top
objectClass: organizationalUnit
ou: idmap

dn: ou=computers,$LDAP_BASE_DN
objectClass: top
objectClass: organizationalUnit
ou: computers
" | slapadd
chown -R ldap.ldap /var/lib/ldap
service ldap start
echo "BASE    $LDAP_BASE_DN"   > /etc/openldap/ldap.conf

echo -----------------------------------------------
echo Samba ドメイン環境の生成
echo -----------------------------------------------
cat > /etc/samba/smb.conf <<_EOF_
# ==== General Settings =====
dos charset = CP932
unix charset = UTF-8
display charset = UTF-8
security = user
workgroup = $WORKGROUP_NAME
server string = %L-samba-%v
log level = 0
syslog = 0
log file = /var/log/samba/%m.log
max log size = 50
load printers = No
printing = bsd
domain logons = yes
logon path =
dns proxy = No
template homedir = /home/%U
obey pam restrictions = yes
# ==== ldap backend specific ====
passdb backend = ldapsam
ldap passwd sync = yes
ldapsam:trusted=yes
ldapsam:editposix=yes
ldap suffix = $LDAP_BASE_DN
ldap admin dn = $LDAP_ADMIN_DN
ldap delete dn = yes
ldap group suffix = ou=groups
ldap machine suffix = ou=computers
ldap user suffix = ou=users
ldap replication sleep = 5000
ldap ssl = no
# こちらは参照のみなので Consumer でよい
idmap backend = ldap:ldap://localhost/
idmap uid = 50000-500000
idmap gid = 50000-500000
# 書き込み先は、Consumer であっても Provider を指すようにする
idmap alloc backend = ldap
idmap alloc config : ldap_url = ldap://localhost
idmap alloc config : ldap_base_dn = ou=idmap,$LDAP_BASE_DN
idmap alloc config : ldap_user_dn = $LDAP_ADMIN_DN
# ==== performance tuning ====
case sensitive = yes
preserve case = no
short preserve case = no
#==== PDC Specific ====
os level = 65
preferred master = Yes
domain master = Yes
wins support = Yes
_EOF_

echo -----------------------------------------------
echo LDAP 管理者パスワードの保存
echo -----------------------------------------------
rm -f /etc/samba/secrets.tdb
( echo $LDAP_ADMIN_PASSWORD; echo $LDAP_ADMIN_PASSWORD ) | run smbpasswd -W -s
net idmap secret alloc $LDAP_ADMIN_PASSWORD

rm -f /var/cache/samba/winbind.pid
run service winbind start
run net getlocalsid
if ( ! service winbind status )
then
    echo winbind failed.
    exit 2
fi
run net sam provision

echo ------------------------------------------------------
echo LDAP 認証&winbind を有効にする
echo ------------------------------------------------------
run authconfig --enableldap --enableldapauth \
           --ldapbasedn $LDAP_BASE_DN \
           --enablewinbind \
           --enablesmbauth \
           --update
echo 'session   optional    pam_mkhomedir.so skel=/etc/skel' umask=0022 \
    >>  /etc/pam.d/system-auth
echo ------------------------------------------------------
echo "$ADMINISTRATOR_USER の SMB パスワード設定&権限設定"
echo ------------------------------------------------------
echo -e $ADMINISTRATOR_PASSWORD\\n$ADMINISTRATOR_PASSWORD | smbpasswd -s $ADMINISTRATOR_USER
net sam rights grant $ADMINISTRATOR_USER SeMachineAccountPrivilege
net sam rights grant $ADMINISTRATOR_USER SeTakeOwnershipPrivilege
net sam rights grant $ADMINISTRATOR_USER SeBackupPrivilege
net sam rights grant $ADMINISTRATOR_USER SeRestorePrivilege
net sam rights grant $ADMINISTRATOR_USER SeRemoteShutdownPrivilege
net sam rights grant $ADMINISTRATOR_USER SePrintOperatorPrivilege
net sam rights grant $ADMINISTRATOR_USER SeAddUsersPrivilege
net sam rights grant $ADMINISTRATOR_USER SeDiskOperatorPrivilege
echo ------------------------------------------
echo Samba サービス起動
echo ------------------------------------------
service smb start
echo "ドメイン $WORKGROUP_NAME が利用可能になるまで待ちます"
CMD="net rpc info -U $ADMINISTRATOR_USER%$ADMINISTRATOR_PASSWORD"
echo "# $CMD"
OK=1
for i in `seq 1 10`
do
    if $CMD 2> /dev/null
    then
        echo "ドメイン $WORKGROUP_NAME が利用可能になりました"
        OK=0
        break
    else
        echo $i 回目
        sleep 1
    fi
done
if [ ! $OK ]
then
    echo "ドメイン $WORKGROUP_NAME が利用可能になりませんでした"
    exit 3
fi
echo ------------------------------------------------------------------
echo 動作確認用の一般ユーザー作成
echo ユーザID:$UNPRIVILEGED_USER  パスワード:$UNPRIVILEGED_PASSWORD   ユーザ名:'LDAP User 01'
echo ホームディレクトリ:\\\\$MYCOMUTER_NAME\\$UNPRIVILEGED_USER  マウントドライブ:H:
echo パスワード期限:無期限
echo ------------------------------------------------------------------
echo -e $UNPRIVILEGED_PASSWORD\\n$UNPRIVILEGED_PASSWORD | run pdbedit -a -t -u $UNPRIVILEGED_USER -t -D H: -h \\\\$MYCOMUTER_NAME\\$UNPRIVILEGED_USER -f 'LDAP User 01'
echo ------------------------------------------------------------------
echo 動作確認
echo ------------------------------------------------------------------
run net rpc user -U $UNPRIVILEGED_USER%$UNPRIVILEGED_PASSWORD
run net rpc group -U $UNPRIVILEGED_USER%$UNPRIVILEGED_PASSWORD
run id $ADMINISTRATOR_USER
run getent passwd $ADMINISTRATOR_USER
run id ldap01
run getent passwd $UNPRIVILEGED_USER
DN_COUNT=`ldapsearch -x -LLL '(objectclass=*)' dn | grep -v ^$ | wc -l`
if [ "$DN_COUNT" -lt 12 ]
then
    echo LDAP データが正常に登録されていない可能性があります。
fi



samba-jp メーリングリストの案内