[samba]Ubuntu14.04+Samba4.1.6 ユーザ認証の統合の続きになります。
今回はグループ登録スクリプトです。
グループ登録スクリプト
単にADのグループ作成だけであれば、samba-tool group addや、ADUCを使って登録してもよいのですが、ADのグループとUbuntuサーバのグループを同じように扱えるようにするには、それだけでは問題があります。
そのためには、
- posixGroup
- gidNumber
- msSFU30NisDomain
- msSFU30Name
このような属性を持つグループデータを作成する必要があります。そこで、以下の様なShellScriptを作成してみました。
#!/bin/bash
# samba4 にグループを登録するshellscript
# スーパーユーザで実行
FS=$'\n'
BASE_CN="CN=Users"
BASE_DN="DC=mydomain,DC=local"
# ドメイン名
DOMAIN=$(wbinfo --own-domain)
# ドメイン名(英小文字)
DOMAIN_LC=$(echo ${DOMAIN}|tr "[:upper:]" "[:lower:]")
SAM_LDB="/var/lib/samba/private/sam.ldb"
IDMAP_LDB="/var/lib/samba/private/idmap.ldb"
function usage() {
echo -e "usage: s4-default-group [ ]\n"
exit 2
}
function fail() {
echo -e "ERROR: operation failed."
exit 1
}
# 引数のチェック
if [[ $# -gt 2 || $# -lt 1 ]]; then
usage
fi
NAME=$1
# GIDのチェック
if [ $# -eq 2 ]; then
GIDNUM=$2
# 数字であるかどうか
expr "${GIDNUM}" + 1 >/dev/null 2>&1
if [ $? -ge 2 ]; then
echo -e "ERROR: invalid gidnumber.($GIDNUM)"
fail
fi
fi
# システムに同じグループNAMEのあるなし
if [ $(getent group|cut -d: -f1|grep -wxci "${NAME}") -ne 0 ]; then
echo -e "ERROR: groupname \"${NAME}\" is already exists."
fail
fi
# samba にグループの追加
samba-tool group add "${NAME}"
if [ $? -ne 0 ]; then
echo -e "ERROR: samba-tool group add \"${NAME}\" failed."
fail
fi
# 先に登録したグループのGIDを取得
_GID=$(wbinfo --group-info="${NAME}"|cut -d: -f3)
if [ $? -ne 0 ]; then
echo -e "ERROR: getting gidnumber is failed."
fail
fi
# GIDNUMが未定義であれば、_GIDで上書きする
GIDNUM=${GIDNUM:=${_GID}}
echo -e "gidNumber: ${_GID} to ${GIDNUM}"
# グループのSIDを取得
_SID=$(wbinfo -n "${NAME}"|cut -d' ' -f1)
if [ $? -ne 0 ]; then
echo -e "ERROR: getting SID is failed."
fail
fi
echo -e "SID = ${_SID}"
# sam.ldbを更新するldifファイルの作成
# 以下の属性を追加します
#
# gidNumber: GIDNUM
# msSFU30NisDomain: DOMAIN_LC
# msSFU30Name: NAME
# objectclass: posixGroup
#
LDIF=$(echo "/tmp/${NAME}.ldif" | tr "[:space:]" "_")
cat << _EOS_ > ${LDIF}
dn:CN=${NAME},${BASE_CN},${BASE_DN}
changetype: modify
add: gidNumber
gidNumber: ${GIDNUM}
-
add: msSFU30NisDomain
msSFU30NisDomain: ${DOMAIN_LC}
-
add: msSFU30Name
msSFU30Name: ${NAME}
-
add: objectclass
objectclass: posixGroup
_EOS_
sleep 2
# sam.ldbの更新
ldbmodify --url=${SAM_LDB} -b ${BASE_DN} ${LDIF}
if [ $? -ne 0 ]; then
echo -e "ERROR: ldbmodify failed"
fail
fi
rm ${LDIF}
# idmap.ldb を更新するldifファイルの作成
# 以下の属性を変更します
# xidNumber: GIDNUM
LDIF=$(echo "/tmp/${NAME}_idmap.ldif" | tr "[:space:]" "_")
cat << _EOS_ > ${LDIF}
dn:CN=${_SID}
changetype: modify
replace: xidNumber
xidNumber: ${GIDNUM}
_EOS_
sleep 2
# idmap.ldb の更新
ldbmodify --url=${IDMAP_LDB} ${LDIF}
if [ $? -ne 0 ]; then
echo -e "ERROR: ldbmodify failed"
fail
fi
sleep 2
rm ${LDIF}
# 結果を表示
echo
echo -e "\n>> results.."
ldbsearch --url=${SAM_LDB} samaccountname=${NAME}
ldbsearch --url=${IDMAP_LDB} objectsid=${_SID}
echo -e "Operations are all finished."
解説
シェルスクリプトの内容を見てもらいますと、まずsamba-tool group add でグループを作成した後で、ldifファイルを作成し、sam.ldbとidmap.ldb の2つのデータベースを更新しています。
sam.ldb はADのユーザやグループに関する情報が書き込まれている、メインのデータベースです。対してidmap.ldb は、ADユーザ、グループとUNIXのユーザ、グループアカウントとのマッピング情報を保持しています。
この2つのデータは、sam.ldbのSID をキーとして紐付けられています。
また、idmap.ldb の方のxidNumber を、sam.ldb のgidNumber として保持しています。