WheezyでSamba3ユーザ管理

■Samba3ユーザ管理

$ pdbedit -L | grep "許可"
tdb(/var/lib/samba/passdb.tdb): tdb_open_ex: could not open file /var/lib/samba/passdb.tdb: 許可がありません
Could not open tdb: 許可がありません

$ sudo pdbedit -L | grep ":.*:"
labunix:1000:labunix

■smbpasswdで追加した場合

$ sudo smbpasswd -a labunix && sudo smbpasswd -e labunix
New SMB password:
Retype new SMB password:

$ sudo pdbedit -L -v -u labunix
Attempting to register passdb backend ldapsam
Successfully added passdb backend 'ldapsam'
Attempting to register passdb backend ldapsam_compat
Successfully added passdb backend 'ldapsam_compat'
Attempting to register passdb backend NDS_ldapsam
Successfully added passdb backend 'NDS_ldapsam'
Attempting to register passdb backend NDS_ldapsam_compat
Successfully added passdb backend 'NDS_ldapsam_compat'
Attempting to register passdb backend IPA_ldapsam
Successfully added passdb backend 'IPA_ldapsam'
Attempting to register passdb backend smbpasswd
Successfully added passdb backend 'smbpasswd'
Attempting to register passdb backend tdbsam
Successfully added passdb backend 'tdbsam'
Attempting to register passdb backend wbc_sam
Successfully added passdb backend 'wbc_sam'
Attempting to find a passdb backend to match tdbsam (tdbsam)
Found pdb backend tdbsam
pdb backend tdbsam has a valid init
tdbsam_open: successfully opened /var/lib/samba/passdb.tdb
Forcing Primary Group to 'Domain Users' for labunix
Unix username:        labunix
NT username:          
Account Flags:        [U          ]
User SID:             S-1-5-21-3265833510-197033004-3638118188-1003
Primary Group SID:    S-1-5-21-3265833510-197033004-3638118188-513
Full Name:            labunix
Home Directory:       \\lpic3\labunix
HomeDir Drive:        
Logon Script:         
Profile Path:         \\lpic3\labunix\profile
Domain:               LPIC3
Account desc:         
Workstations:         
Munged dial:          
Logon time:           0
Logoff time:          never
Kickoff time:         never
Password last set:    金, 03  5月 2013 13:00:27 JST
Password can change:  金, 03  52013 13:00:27 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

$ sudo smbpasswd -x labunix

■pdbeditで追加した場合

$ sudo pdbedit -a labunix
new password:
retype new password:

$ sudo pdbedit -L -v -u labunix
...
Unix username:        labunix
NT username:          
Account Flags:        [U          ]
User SID:             S-1-5-21-3265833510-197033004-3638118188-1004
Primary Group SID:    S-1-5-21-3265833510-197033004-3638118188-513
Full Name:            labunix
Home Directory:       \\lpic3\labunix
HomeDir Drive:        
Logon Script:         
Profile Path:         \\lpic3\labunix\profile
Domain:               LPIC3
Account desc:         
Workstations:         
Munged dial:          
Logon time:           0
Logoff time:          never
Kickoff time:         never
Password last set:    金, 03  5月 2013 13:04:14 JST
Password can change:  金, 03  52013 13:04:14 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

■削除すると、UIDが増分を割り当てられるので、以下のように指定する。
 RHEL系のUIDと同じには出来ない。間違っても500を割り当てないように。

$ sudo pdbedit -x labunix
$ sudo pdbedit -a labunix -U S-1-5-21-3265833510-197033004-3638118188-1000
...
new password:
retype new password:
tdbsam_open: successfully opened /var/lib/samba/passdb.tdb
pdb_getsampwnam (TDB): error fetching database.
 Key: USER_labunix
lookup_global_sam_rid: looking up RID 1005.
pdb_getsampwrid (TDB): error looking up RID 1005 by key RID_000003ed.
Forcing Primary Group to 'Domain Users' for labunix
Storing (new) account labunix with RID 1005
Forcing Primary Group to 'Domain Users' for labunix
Storing account labunix with RID 1005
Forcing Primary Group to 'Domain Users' for labunix
Storing account labunix with RID 1000
Forcing Primary Group to 'Domain Users' for labunix
Unix username:        labunix
NT username:          
Account Flags:        [U          ]
User SID:             S-1-5-21-3265833510-197033004-3638118188-1000
Primary Group SID:    S-1-5-21-3265833510-197033004-3638118188-513
Full Name:            labunix
Home Directory:       \\lpic3\labunix
HomeDir Drive:        
Logon Script:         
Profile Path:         \\lpic3\labunix\profile
Domain:               LPIC3
Account desc:         
Workstations:         
Munged dial:          
Logon time:           0
Logoff time:          never
Kickoff time:         never
Password last set:    金, 03  5月 2013 13:11:48 JST
Password can change:  金, 03  52013 13:11:48 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

■アカウントの無効、有効の切り替え

$ sudo smbpasswd -d labunix
$ sudo smbpasswd -e labunix

$ sudo pdbedit -c [D] -u labunix
$ sudo pdbedit -c -r [D] -u labunix

■pdbeditならロック、アンロックも可能

$ sudo pdbedit -c "[L]" -u labunix
$ sudo pdbedit -c -r "[L]" -u labunix

■他にもフラグがある。

$ man pdbedit | grep ""
           ・   N: No password required
           ・   D: Account disabled
           ・   H: Home directory required
           ・   T: Temporary duplicate of other account
           ・   U: Regular user account
           ・   M: MNS logon user account
           ・   W: Workstation Trust Account
           ・   S: Server Trust Account
           ・   L: Automatic Locking
           ・   X: Password does not expire
           ・   I: Domain Trust Account

■パスワード同期の設定の確認

 Windows認証はtdbで行う。
 UNIXパスワード認証をPAM認証で連携する設定がされている。
 idmapはNFS連携用である。

 「/etc/samba/smbpasswd」ファイルは無い。
 smbpasswdは互換性の為に残されている。

 「pam password change = Yes」なので、「passwd progrm」のパラメータを無視して
 PAMと連携したパスワード変更が可能。

$ testparm -s 2>&1 | grep "passw\|baackend"
	pam password change = Yes
	passwd program = /usr/bin/passwd %u
	passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
	unix password sync = Yes

$ testparm -s -v 2>&1 | grep "passw\|backend"
	encrypt passwords = Yes
	null passwords = No
	password server = *
	smb passwd file = /etc/samba/smbpasswd
	passdb backend = tdbsam
	pam password change = Yes
	passwd program = /usr/bin/passwd %u
	passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
	passwd chat debug = No
	passwd chat timeout = 2
	check password script = 
	password level = 0
	unix password sync = Yes
	machine password timeout = 604800
	ldap passwd sync = no
	idmap backend = tdb
	idmap config * : backend = tdb

■「ldap pssword sync = no」なのは、LDAP認証サーバの設定が空だから。

$ testparm -s -v  2>&1 | grep ldap
	client ldap sasl wrapping = plain
	ldap admin dn = 
	ldap delete dn = No
	ldap group suffix = 
	ldap idmap suffix = 
	ldap machine suffix = 
	ldap passwd sync = no
	ldap replication sleep = 1000
	ldap suffix = 
	ldap ssl = start tls
	ldap ssl ads = No
	ldap deref = auto
	ldap follow referral = Auto
	ldap timeout = 15
	ldap connection timeout = 2
	ldap page size = 1024
	ldap user suffix = 
	ldap debug level = 0
	ldap debug threshold = 10

■WindowsのadministratorユーザはUNIXユーザのnobodyになる。
 「!」によって以降の行は読み込まないので、
 administrator以外のWindowsユーザはUNIXユーザのguestにマッピングされる。

 ただし、UNIXユーザへのマッピングは、
 Windowsからのアクセス時にWindowsユーザで認証に成功した場合に限る。

 また、guestを許可しないのにguestにマッピングしようとすると
 smbdの起動に失敗する。

$ cat /etc/samba/smbusers 
!nobody = administrator
guest = *

$ echo | sudo tee /etc/samba/smbusers

■guestを禁止するには以下のように「map to guest = Never」とする。

$ testparm -s -v 2>&1 | grep "guest"
	map to guest = Never
	guest account = nobody
	usershare allow guests = No
	guest only = No
	guest ok = No

■どうしてもpdbからsmbpasswd形式に変更したい場合
 ユーザIDは変えないとダメですね。

$ sudo pdbedit -i tdbsam:/var/lib/samba/passdb.tdb -e smbpasswd:/etc/samba/smbpasswd

$ sudo cat /etc/samba/smbpasswd 
labunix:0:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:A1A9521XXXA81A8417950EDF0E360892:[U          ]:LCT-51833904:

$ sudo pdbedit -L -w -u labunix | grep ^labunix
labunix:1000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:A1A9521XXXA81A8417950EDF0E360892:[U          ]:LCT-51833904:

■smbpasswdのユーザIDを修正してpasswd.pdbを作成
 逆も全く同じにはなりませんが、違いは「store test」や「transaction test」なので
 問題なさそうです。

$ sudo pdbedit -i smbpasswd:/etc/samba/smbpasswd -e tdbsam:/tmp/passwd.tdb
$ sudo tdbdump /tmp/passwd.tdb
$ sudo tdbdump /tmp/passwd.tdb | wc -c
801
$ sudo tdbdump /var/lib/samba/passdb.tdb | wc -c
907
$ sudo rm /tmp/passwd.tdb

■pdbeditにファイル指定が無いようなので、tdbtoolで。

$ tdbtool
tdb> ?
database not open

tdbtool: 
  create    dbname     : create a database
  open      dbname     : open an existing database
  transaction_start    : start a transaction
  transaction_commit   : commit a transaction
  transaction_cancel   : cancel a transaction
  erase                : erase the database
  dump                 : dump the database as strings
  keys                 : dump the database keys as strings
  hexkeys              : dump the database keys as hex values
  info                 : print summary info about the database
  insert    key  data  : insert a record
  move      key  file  : move a record to a destination tdb
  store     key  data  : store a record (replace)
  show      key        : show a record by key
  delete    key        : delete a record by key
  list                 : print the database hash table and freelist
  free                 : print the database freelist
  check                : check the integrity of an opened database
  repack               : repack the database
  speed                : perform speed tests on the database
  ! command            : execute system command
  1 | first            : print the first record
  n | next             : print the next record
  q | quit             : terminate
  \n                   : repeat 'next' command

tdb> open /tmp/passwd.tdb
tdb_open_ex: could not open file /tmp/passwd.tdb: Permission denied
Could not open /tmp/passwd.tdb: Permission denied
tdb> quit
labunix@lpic3:~$ sudo tdbtool
tdb> open /tmp/passwd.tdb
tdb> check
Database integrity is OK and has 5 records.
tdb> quit

$ sudo tdbtool
tdb> open /var/lib/samba/passdb.tdb
tdb> check
Database integrity is OK and has 7 records.
tdb> quit

■tdbのバックアップとリストア
 「.bak」を退避するなどしておけば良さそうです。

$ man tdbbackup | grep -A 2 "\-v\$"
       -v
           The -v will check the database for damages (currupt data) which if
           detected causes the backup to be restored.

$ cd /var/lib/samba/; \
  for list in *.tdb;do
    sudo tdbbackup "$list";
    sudo tdbbackup -v "$list";
  done

■Windowsで言うローカルアカウントのGuestユーザとlabunixユーザ
 pdbeditでほぼカバー出来るようですね。

> net user Guest
ユーザー名                           Guest
フル ネーム
コメント                             コンピュータ/ドメインへのゲスト アクセス用
(ビルトイン アカウント)
ユーザーのコメント
国コード                             000 (システム既定)
アカウント有効                       Yes
アカウントの期限                     無期限

最終パスワード変更日時               2013/05/03 18:49
パスワード有効期間                   無期限
パスワード次回変更可能日時           2013/05/03 18:49
パスワードあり                       No
ユーザーによるパスワード変更可能     No

ログオン可能なワークステーション     すべて
ログオン スクリプト
ユーザー プロファイル
ホーム ディレクトリ
最終ログオン日時                     2012/08/13 3:22

ログオン可能時間                     すべて

所属しているローカル グループ        *Guests
所属しているグローバル グループ      *なし
コマンドは正常に終了しました。

> net user labunix
ユーザー名                           labunix
フル ネーム
コメント
ユーザーのコメント
国コード                             000 (システム既定)
アカウント有効                       Yes
アカウントの期限                     無期限

最終パスワード変更日時               2012/01/19 17:47
パスワード有効期間                   無期限
パスワード次回変更可能日時           2012/01/19 17:47
パスワードあり                       No
ユーザーによるパスワード変更可能     Yes

ログオン可能なワークステーション     すべて
ログオン スクリプト
ユーザー プロファイル
ホーム ディレクトリ
最終ログオン日時                     2013/05/03 17:00

ログオン可能時間                     すべて

所属しているローカル グループ        *Administrators
所属しているグローバル グループ      *なし
コマンドは正常に終了しました。