[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 として保持しています。

sam.ldbとidmap.ldb

sam.ldbとidmap.ldb

関連記事

Ubuntu 18.04 に Samba 4.7 を導入

カテゴリー: Samba4

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。