このツールで一応ユーザ登録はできるけど、primaryGroupIDの問題が残ります#w13b05f9

samba-toolを使ったユーザ登録は、samba4ActiveDirectoryドメインコントローラとしては問題なく、windowsのリモートサーバ管理ツール「ActiveDirectoryユーザとコンピュータ」に表れる。だが、samba4ADドメインコントローラを中心にLinuxのUID/GID/SHELL/HomeDirectoryを管理するためには不十分でsamba4ADのLDAPデータを直接操作する必要があるみたい。

その直接操作してwindowsにもlinuxにも十分に対応したアカウントを作る方法が下記に掲載されている。ここはこのサイトを参考にしてます。
http://linuxcostablanca.blogspot.jp/2012/02/samba-4-posix-domain-user.html

っで、これを使ってユーザ登録を行ってみた。
直接ldbファイルを修正してますが、実際に何が書かれているかは下記コマンドで見えます。

[root@c ~]# /opt/samba/bin/ldbedit -H /opt/samba/private/idmap.ldb
[root@c ~]# /opt/samba/bin/ldbedit -H /opt/samba/private/sam.ldb
 
 
[root@c ~]# ldapsearch -D "CN=Administrator,CN=Users,DC=CERIUS,dc=local" -w xxxxxxxx |less
*ユーザ/パスワード認証でデータ表示
 
[root@c ~]# kinit administrator@CERIUS.LOCAL
[root@c ~]# ldapsearch  -Y GSSAPI | less
*cyrus-sasl-gssapi経由でkerberosとGSSAPIを結ばせて、kinitによるkerberos認証でデータ表示。
*kdestroyでチケットが破棄されると見れなくなる

*xxxxxxxx はAdministratorのパスワード。

s4group

ってユーザ登録と言いながらまずはグループの登録です。
既に登録したいグループ名が/etc/groupやsamba4ADに存在するか調べます。
/opt/samba/binのwbinfoを使用してます。/usr/bin/wbinfoではありません

[root@c ~]# cat /etc/group
[root@c ~]# PATH=/opt/samba/bin:$PATH; IFS=$'\n'; for s4g in `wbinfo -g`; do wbinfo --group-info=$s4g; done

とすれば、既存状況が判明されるかと。
っで、実際にグループを登録するには下記スクリプトを使う

[root@c ~]# vi /opt/samba/bin/s4group
#!/bin/bash
PATH=/opt/samba/bin:$PATH
if [ $# -ne 1 ]; then
  echo "usage: $0 <group_name>"
  exit 1
fi
#
IFS=$'\n'
for s4g in `wbinfo -g`                         # samba4 既存チェック
do
s4gm=$(echo $s4g|grep -wxci $1)
  if [ $s4gm -ne 0 ]; then
    echo "already registered(samba4): $1"
    exit 1
  fi
done
#
for hostg in `cat /etc/group|cut -d":" -f1`    # /etc/group 既存チェック
do
hostg_m=$(echo $hostg|grep -wxci $1)
  if [ $hostg_m -ne 0 ]; then
    echo "already registered(host): $1"
    exit 1
  fi
done
#
echo "Creating s4 posix group "$1
samba-tool group add $1                        # samba4に登録
if [ $? -ne 0 ]; then
   echo "error";
   exit 1
fi
#
strgid=$(wbinfo --group-info=$1)
gid=$(echo $strgid | cut -d ":" -f 3)          # posixGroupの追加とxidNumberをgidnumberにするldifファイルを作成
echo "dn: cn=$1,cn=Users,dc=cerius,dc=local
changetype: modify
add:objectclass
objectclass: posixGroup
-
add: gidnumber
gidnumber: $gid" > /tmp/$1
ldbmodify --url=/opt/samba/private/sam.ldb -b dc=cerius,dc=local /tmp/$1
rm /tmp/$1
[root@c ~]#
[root@c ~]# chmod 700 /opt/samba/bin/s4group  # 実行権をrootに限定

っで早速グループを追加してみる

[root@c ~]# /opt/samba/bin/s4group fate
Creating s4 posix group fate
Added group fate
Modified 1 records successfully
[root@c ~]#

s4domaingroup-change-gid

上記s4groupで新規にグループは作れたが、gidはsamba4AD側で勝手に付けられている。その確認は下記コマンドで得られる

[root@c ~]# PATH=/opt/samba/bin:$PATH; IFS=$'\n'; for s4g in `wbinfo -g`; do wbinfo --group-info=$s4g; done
(略)
CERIUS\fate:*:3000024:
CERIUS\crystal:*:3000036:
(略)
[root@c ~]#

*getent groupでも一応確認できるが、samba4AD内の全てのgroupがgetent groupでは得られない
下記スクリプトで特定のgidに変更する

[root@c ~]# vi /opt/samba/bin/s4domaingroup-change-gid
#!/bin/bash
PATH=/opt/samba/bin:$PATH
if [ $# -ne 2 ]; then
  echo "usage: $0 <group_name> <gid>"
  exit 1
fi
#
IFS=$'\n'
for s4g in `wbinfo -g`                                   # samba4 全グループ名
do
s4gstr=$(wbinfo --group-info=$s4g)
s4gid_m=$(echo $s4gstr|cut -d":" -f 3|grep -wxci $2)     # samba4 既存gid
if [ $s4gid_m -ne 0 ]; then
  echo "already registered group id(samba4): $2"
  exit 1
fi
done
#
for hostg in `cat /etc/group`                           # /etc/group
do
hostgname_m=$(echo $hostg|cut -d":" -f1|grep -wxci $1)  # /etc/groupのgroup name
hostgid_m=$(echo $hostg|cut -d":" -f3|grep -wxci $2)    # /etc/groupのgid
if [ $hostgname_m -ne 0 ]; then
  echo "<group_name> exist in /etc/group"
  exit 1
fi
if [ $hostgid_m -ne 0 ]; then
  echo "<gid> exist in /etc/group"
  exit 1
fi
done
#
echo "Modifying s4 posix group "$1
sid=$(wbinfo --name-to-sid="$1")                        # 指定したgroupのsidを取得
if [ $? -ne 0 ]; then
  echo "not found $1 group in samba4AD"
  exit 1
fi
 
gsid=$(echo "$sid" | cut -d " " -f1)
echo "found $1 sid= $gsid"                              # sidのxidNumberを指定したgidに変更(idmap)
echo "dn: cn=$gsid
changetype: modify
replace: xidNumber
xidNumber: $2" > /tmp/xid.ldif
echo "sleeping. . ."
echo ""
sleep 2
ldbmodify --url=/opt/samba/private/idmap.ldb /tmp/xid.ldif
if [ $? -ne 0 ]; then
  exit 1
fi
#                                                       # groupのgidNumberを変更(sam)
echo "dn: CN=$1,CN=Users,DC=cerius,DC=local
changetype: modify
replace: gidNumber
gidNumber: $2" > /tmp/gid.ldif
echo "sleeping. . ."
sleep 2
ldbmodify --url=/opt/samba/private/sam.ldb /tmp/gid.ldif
echo "$1 changed from gid $gsid to $2"
[root@c ~]#
[root@c ~]# chmod 700 /opt/samba/bin/s4domaingroup-change-gid       # 実行権をrootに限定

っで、先ほど作ったグループfateをgid 2001 にします。

[root@c ~]# getent group | grep fate
fate:*:3000024:
[root@c ~]#
[root@c ~]# /opt/samba/bin/s4domaingroup-change-gid  fate 2001
Modifying s4 posix group fate
found fate sid= S-1-5-21-2319864515-1460465753-1282873610-1116
sleeping. . .
 
Modified 1 records successfully
sleeping. . .
Modified 1 records successfully
crystal changed from gid S-1-5-21-2319864515-1460465753-1282873610-1116 to 2001
[root@c ~]#
[root@c ~]# getent  group | grep fate
fate:*:2001:
[root@c ~]#

とグループfateは2001になりました。(getentへの反映に暫く時間が必要かもしれない。)

グループの削除は要注意です。
samba4ADにはidmap.ldbとsam.ldbの2つのデータベースがあります(他にもあるけど)。
samba-tool group deleteを実行するとsam.ldbからはデータは消えますが、idmap.ldbからは消えません。
「S-1-5-21-2319864515-1460465753-1282873610-1116」のsidとxidNumberが残ったままです。
このページのスクリプトはこのidmap.ldbのxidNumberにgidNumberの値を与えてます。
samba-tool group deleteを行ってもxidNumber(gidNumber)は残ったまま。
sidを残すことで、唯一無二のsidが得られる仕様なのだが、gidNumberを絡ませると難しいみたい。

なので、ここではsamba-tool group deleteの後にidmap.ldbのsidも消します。

[root@c ~]# wbinfo --name-to-sid=fate|cut -d " " -f1
S-1-5-21-2319864515-1460465753-1282873610-1116
[root@c ~]# samba-tool group delete fate
Deleted group fate
[root@c ~]# ldbdel --url=/opt/samba/private/idmap.ldb CN=S-1-5-21-2319864515-1460465753-1282873610-1116

だが、、、getent groupで残ってしまう現象がある....少し経てば消えますが。

s4user

最後、ユーザを作る。
現在のユーザは/etc/passwdの他にsamba4ADで管理されているユーザになるのだが、そのsamaba4AD由来のユーザは下記より得られる

[root@c ~]# PATH=/opt/samba/bin:$PATH; IFS=$'\n'; for s4u in `wbinfo -u`; do wbinfo --user-info=$s4u; done
CERIUS\Administrator:*:0:100::/home/CERIUS/Administrator:/bin/false
CERIUS\Guest:*:3000011:3000012::/home/CERIUS/Guest:/bin/false
CERIUS\krbtgt:*:3000017:100::/home/CERIUS/krbtgt:/bin/false
CERIUS\dns-c:*:3000018:100::/home/CERIUS/dns-c:/bin/false
CERIUS\illya:*:1002:100:Illyasviel von. Einzbern:/home/CERIUS/illya:/bin/false
CERIUS\ldap-connect:*:3000035:100::/home/CERIUS/ldap-connect:/bin/false
[root@c ~]#

既に、samba4/userで示したようにsamba-toolでユーザを登録してもgroupの付与に問題が残った。
下記スクリプトではsamba-toolを使って、同時にldbmodifyコマンドでこのgroupの付与を行わせる。

[root@c ~]# vi /opt/samba/bin/s4user
#!/bin/bash
PATH=/opt/samba/bin:$PATH
if [ $# -ne 3 ]; then
  echo "usage: $0 <user_name> <uid> <group_name>"
  exit 1
fi
#
IFS=$'\n'
for s4n in `wbinfo -u`
do
  s4n_m=$(echo $s4n|grep -wxci $1)                     # samba4AD  ユーザ名チェック
  if [ $s4n_m -ne 0 ]; then
     echo "already registered user(samaba4): $1"
     exit 1
  fi
  s4uid=$(wbinfo -i $s4n|cut -d":" -f3|grep -wxci $2)  # samba4AD  uidチェック
  if [ $s4uid -ne 0 ]; then
     echo "already registered uid(samba4): $2"
     exit 1
  fi
done
#
for hostn in `cat /etc/passwd`
do
  hostn_m=$(echo $hostn|cut -d":" -f1|grep -wxci $1)   # /etc/passwd ユーザ名チェック
  if [ $hostn_m -ne 0 ]; then
     echo "already used user(/etc/passwd): $1"
     exit 1
  fi
  hostnid_m=$(echo $hostn|cut -d":" -f3|grep -wxci $2) # /etc/passwd uidチェック
  if [ $hostnid_m -ne 0 ]; then
     echo "already used uid(/etc/passwd): $2"
     exit 1
  fi
done
#
strgid=$(wbinfo --group-info=$3)                       # samba4AD グループ取得
if [ $? -ne 0 ]; then                                  # グループが存在していればOK
   echo "no such found group name in samaba4AD: $3";
   exit 1
fi
#------------------------------------------------------#
#
echo "Creating s4 posix user "$1
echo "Please enter password for "$1
samba-tool user add $1 --uid-number=$2                 # ユーザ登録
if [ $? -ne 0 ]; then                                  # ユーザ名、UIDが不適切なら落ちる
   echo "ERR";
   exit 1
fi
sleep 2
#
#get the uid
struid=$(wbinfo -i $1)
uid=$(echo $struid | cut -d ":" -f 3)
#
# get the gid                                          # チェック段階で取得済み
gid=$(echo $strgid | cut -d ":" -f 3)
#
# get the group from the sid
strsid=$(wbinfo --gid-to-sid=$gid)
primarygid=$(echo $strsid | cut -d "-" -f 8)
strwg=$(echo $struid | cut -d "\\" -f 1)
#
# add the posix attributes to the user
echo "dn: CN=$1,CN=Users,DC=cerius,DC=local
changetype: modify
add: gidnumber
gidnumber: $gid
-
add:uid
uid: $1
-
add:unixhomedirectory
unixhomedirectory: /home/$strwg/$1
-
add: loginshell
loginshell: /bin/bash" > /tmp/$1
ldbmodify --url=/opt/samba/private/sam.ldb -b dc=cerius,dc=local /tmp/$1
if [ $? -ne 0 ]; then                                  #チェック
   echo "ERR";
   exit 1
fi
#
samba-tool group addmembers $3 $1                      # グループにユーザを登録
if [ $? -ne 0 ]; then                                  #チェック
   echo "ERR";
   exit 1
fi
#
# set the user to the posix group
echo "dn: CN=$1,CN=Users,DC=cerius,DC=local
changetype: modify
replace: primarygroupid
primarygroupid: $primarygid" > /tmp/$1
#
echo "sleeping. . ."
sleep 5
ldbmodify --url=/opt/samba/private/sam.ldb -b dc=cerius,dc=local /tmp/$1
if [ $? -ne 0 ]; then                                  #チェック
   echo "ERR";
   exit 1
fi
#
mkdir -p /home/$strwg/$1                               # ホームディレクトリ作成
cp /etc/skel/.[A-z]* /home/$strwg/$1                   # /etc/skelもコピー
chown -R $1:$3 /home/$strwg/$1
rm /tmp/$1
hostname=$(hostname -s)                                # samaba4ADがストレージサイトになるが...
#
echo "dn: CN=$1,CN=Users,DC=cerius,DC=local
changetype: modify
add: profilePath
profilePath: \\\\$hostname\\profiles\\$1
-
add: homeDrive
homeDrive: Z:
-
add: homeDirectory
homeDirectory: \\\\$hostname\\home\\$1" > /tmp/$1
#
echo "sleeping. . ."
sleep 5
ldbmodify --url=/opt/samba/private/sam.ldb -b dc=cerius,dc=local /tmp/$1
echo "New user: "  $1 "POSIX-ified as follows:"
echo "uid " $uid
echo "gid " $gid
echo "primaryGroupID " $primarygid " :$2"
echo "getent passwd $1"
echo $(getent passwd $1)
echo "sid " $(wbinfo --gid-to-sid=$gid)
db=/opt/samba/private/sam.ldb
ldbsearch --url=$db cn=$1 | grep \\\\$hostname
ldbsearch --url=$db cn=$1 | grep homeDrive
rm /tmp/$1
[root@c ~]# chmod 700 /opt/samba/bin/s4user

っで実際にユーザ登録をします。

[root@c ~]# /opt/samba/bin/s4user saber 1003 fate
Creating s4 posix user saber
Please enter password for saber
New Password:
Retype Password:
User 'saber' created successfully
Modified 1 records successfully
Added members to group fate
sleeping. . .
Modified 1 records successfully
sleeping. . .
Modified 1 records successfully
New user:  saber POSIX-ified as follows:
uid  1003
gid  2001
primaryGroupID  1128  :1003
getent passwd saber
saber:*:1003:2001:saber:/home/CERIUS/saber:/bin/bash
sid  S-1-5-21-2319864515-1460465753-1282873610-1128
profilePath: \\c\profiles\saber
homeDirectory: \\c\home\saber
homeDrive: Z:
[root@c ~]#
[root@c ~]# getent passwd|grep saber
saber:*:1003:2001:saber:/home/CERIUS/saber:/bin/bash
[root@c ~]#
[root@c ~]# ls -ld /home/CERIUS/saber
drwxr-xr-x 1 saber fate 64  3月 31 21:25 2014 /home/CERIUS/saber
[root@c ~]#

とアカウントが作れた。

dbcheck

正直な話、上記のスクリプトは稼働中のデータベースファイルを直接修正している感じかな。
だとすると不整合とかが気になる。本来はldbmodifyとかを使わず、samaba-toolとか、
windowsのADSIエディッタで対処すべきなのかな?と思う。

まあーそんな思いを持つのだが、そう思うなら dbcheck を走らせるべきなのかもしれない。

[root@c ~]# samba-tool dbcheck
Checking 292 objects
ERROR: incorrect DN string component for member in object CN=Domain Users,CN=Users,DC=cerius,DC=local - 
<GUID=ef16af85-791f-4145-8ff6-db1030afd42b>;CN=archer,CN=Users,DC=cerius,DC=local
Not fixing incorrect string version of DN
ERROR: orphaned backlink attribute 'memberOf' in CN=archer,CN=Users,DC=cerius,DC=local for link member in 
CN=Domain Users,CN=Users,DC=cerius,DC=local
Not removing orphaned backlink member
Please use --fix to fix these errors
Checked 292 objects (2 errors)
[root@c ~]#

っとエラーが出てしまった。。。。
調べると「Samba4 primaryGroupID problem」として挙げられているらしい。まあーsamba-tool dbcheckに--fixを付けて実行すれば直せるようだけど。やっぱりユーザの追加はwindowsのリモート管理ツールで行って、Linux側で使うgid/home/shellは手動でLDIFファイルを作って対処すべきなのかな?
と言っても一応、上記ツールで作ったユーザはなんら問題なく使えます。


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2014-09-12 (金) 01:29:49 (1528d)