[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 として保持しています。
0件のコメント