PASSDB: local and domain accounts
Gerald Carter
gcarter at valinux.com
Tue Nov 14 18:06:52 GMT 2000
Folks,
Here are my current thoughts on winbindd, passdb, group
mapping, etc... (after talking with JF and Tim). Comments
welcome :)
Basically we need to deal with a couple of design problems
(or issues, however you look at them).
o What is the relationship of and interaction between
the local passdb storage and winbindd?
o local vs. domain accounts
I see winbindd and the passdb storage at the same
abstraction layer (with possibly one abstraction
layer covering the two to make them appear as a
single mechanism). So it would appear something like
smbd
----------------------------------
GetAccountInformation()
----------------------------------
passdb winbindd
(local) (remote)
This gives us a nice distinction between local
and domain accounts. Here is my taxonomy:
o security = user
- Samba as a standalone server
- Samba as a PDC
o security = domain
- Samba as a BDC
- Samba as a domain member
I am ignoring security = share because it is really
just a variant on user mode security from the passdb
perspective. I am also ignoring security = server
because it should be superseded by domain level security.
Now given the way an actual NT host works, we have
the following
1)
o NT as a domain member has a local sam as well
as access to the domain sam
+ Samba as a domain member should have a local list
of account (those stored in the local passdb storage)
and use winbindd for access to the domain SAM
2)
o NT as a standalone server has only a local sam
+ Samba as a standalone server should utilize only
the local passdb storage
3)
o NT as a PDC has no local SAM. Rather the local
sam becomes the domain SAM
+ Samba as a PDC should utilize the local passdb
storage for domain accounts. No local accounts
are necessary
4)
o NT as a BDC replicates the domain SAM into a
copy in the local sam
+ Samba as a BDC should replicate the domain SAM
into a copy n the local passdb storage
Group mapping should be integrated into the passdb
for local accounts. This would fit with what
Jean-Francois has already started on. The winbindd
daemon already handles mapping between remote domain
accounts and the dynamically allocated gid.
Here are some thoughts from Tim...
> OK here is a bit more info on some ideas for
> passdb stuff. In my opinion you need to be able to:
>
> - Read/write/update sam entries in a tdb on a pdc.
This works.
> - Read entries from the unix password file (may have to
> store encrypted passwords in an adjuct file).
>
> - Use local users from the passwd file (may need to
> store encrypted passwords in an adjnct file)
This brings up my next thought: "The relationship between
passdb and clear text authentication."
The combining on /etc/passwd and the passdb
storage into one logical volume is an interesting
problem. I propose the following rules...
o If there is no passdb local storage
implemented, use /etc/passwd as the local
SAM and fake up account information such
as rids, profile path, etc... as we currently
do for smbpasswd.
o if a local passdb storage exists, use **only**
that as the local SAM.
This means that only accounts (and groups) in the
current local passdb storage should be enumerated.
These could be ones from /etc/passwd (if there is
no passdb storage defined) or Samba's own SAM
implementation in a TDB or LDAP.
Now for plaintext authentication, this solution will
still work. I should say that all passdb will work with
plain text passwords. The main distinction made by as
passdb storage module is which accounts should be
considered to be in the local SAM.
This solution will also work for the 'update encrypted = yes'
scenario as well.
Intuitively, things look like this
passdb modules
---------------------------------------------
libpdbpasswd.so /etc/passwd and fake
up SAM_ACCOUNT. This
one is the default in the
absence of any other modules.
libpdbsmbpasswd.so identical in functionality
to libpdbpasswd.so with the
addition of support for
password encryption
libpdbtdbsam.so full local SAM stored in a TDB
libpdbldapsam.so full local SAM stored in an LDAP
directory
> - use winbind users and pam_winbind
winbindd can point to a local Samba PDC running on the
same host.
> Be able to choose combinations of all the above
> as required. The appliance is a good example - it needs
> to be able to use local passwd users and winbind users as
> a domain member but not display any local users itself.
So for our network appliance example, as a domain member
you will have accounts in \\DOMAIN and \\SAMBASERVER.
Viola! The above proposed solution works.
There is one minor problem. Really it has not so much
to with Samba as it does with winbindd and pam_winbind.
Consider the case where you would like to configure sshd
for authenticating against remote domain accounts.
This is only case when operating as a domain member
(not as a PDC).
In this case, winbindd will only check against domain
accounts. However, I can envision cases where you would
want to validate against local Samba accounts as well.
There is currently no way to access these.
No you may be thinking to yourself, "but local
Samba accounts already exist in /etc/passwd. You can
use those." However, consider the unification of
passwords. What if the Samba lanman/nt password is
different than /etc/passwd? Also consider the case
of uid allocation upon demand for creating new local
accounts in samba. These would never exist in
/etc/passwd. Only as a uid in a Samba TDB.
This problem can be solved in one of two ways:
1) make winbind check local accounts on the
samba server (via MS-RPC) as well as domain
accounts on the PDC
or,
2) develop as pam_passdb.so and nss_passdb.so
module.
I like #2 better as it maintains the distinction
of passdb handling local accounts and winnbindd
handling remote accounts.
What is required to make all this work is an account
management tool. The following functions implemented
by the passdb API are used to actually update persistent
storage
BOOL pdb_update_sam_account(SAM_ACCOUNT*);
BOOL pdb_add_sam_account (SAM_ACCOUNT*);
BOOL pdb_delete_sam_account (char* username);
If you want to add update capabilities to the passdb
(/etc/passwd for example), then you write these routines.
Currently the pdb_add_sam_account() call for smbpasswd
requires that the UNIX account already exist. The 'add
user script' is called before pdb_add_sam_account() is. This
should be moved below the API. smbd should not have to
worry about this. By moving the 'add user script' to
a lower layer, things like "smbpasswd -a <user>" will work
even if the UNIX account did not exist beforehand.
Make sense? We can support user manager as tool. If so,
the I really think that we should follow the rpcclient /
samedit path as well.
-- Cheers, jerry
----------------------------------------------------------------------
/\ Gerald (Jerry) Carter Professional Services
\/ http://www.valinux.com VA Linux Systems gcarter at valinux.com
http://www.samba.org SAMBA Team jerry at samba.org
http://www.eng.auburn.edu/~cartegw
"...a hundred billion castaways looking for a home."
- Sting "Message in a Bottle" ( 1979 )
More information about the samba-technical
mailing list