Windows NT provided a limited repository for user id’s and passwords. NT domain credentials had the advantage of providing single-sign-on access to other Microsoft resources such as file shares and Exchange. Exchange itself housed a secondary directory, used for the “global address list” type details for Exchange accounts. Address, phone number, manager, email addresses … basically anything other than the user’s ID and password were stored within the Exchange directory. The Exchange directory then linked each account into an NT4 domain user account for logon credentials.
With Windows 2000, Microsoft integrated the two directories into Active Directory. This allowed a more robust set of user details to be provided – and moved the LDAP compliant directory off the Exchange server onto the domain controllers. Major changes were introduced in Active Directory – an increased maximum object count (from 40,000 to ten million in a single domain with a billions of objects in an AD forest), multi-master architecture, and attribute level replication being some of the key changes.
Active Directory data is stored in ntds.dit. ESE (extensible storage engine) is used to access the data within the database. In addition to ntds.dit, there are several peripheral database files – edb.log is the current in-use transaction log file. EDB#####.log may be present if the edb.log file has been filled. EDB.CHK is the checkpoint file – this keeps track of which transactions have been committed to ntds.dit and a crash of the system will cause the transaction logs to be replayed from the pointer referenced in the chk file. Res1.log and res2.log, ten meg in total, are placeholder files just in case should the server run out of disk space the files are removed to allow continued operation.
Within NTDS.DIT there are two main tables:
- The link table – metadata for calculating linked values
- The data table – actual domain data
There are four other tables about which no additional information will be provided here-in
- System Table – metadata for the DSA-defined tables and indices
- HiddenTable – DSA metadata
- SDPropTable – Transiently stores Security Descriptor propagation, records are removed from table as propagation completes
- MSysDefrag1 – ESE database table, not specific to AD
For linked attributes, the backlinked attribute is not modified directly but rather determined when it is queried. As an example – Active Directory generates a reporting structure. An object has a manager, but the “reports” listing is calculated based on object’s managers. The linkID of a forward link attribute is always even and it’s associated backlinked attribute is always the forward linkID plus one (consequently also always odd). A full list of forward/back link pairs can be generated by looking at the linkID values.
The data table contains three different naming contexts – the schema, the configuration, and the domain data. These correspond to the three partitions shown in REPLMON – “cn=schema,cn=configuration,dc=windstream,dc=com”, “cn=configuration,dc=windstream,dc=com”, and “dc=windstream,dc=com”. The term partition in Active Directory is used to indicate a naming context – in no way related to Novell’s use of the term to indicate a replication boundry.
The schema and configuration partitions are replicated to all domain controllers in a forest – since we only have one tree in the forest rendering the point moot since all the domain controllers in the domain are also all the domain controllers in the forest. The domain partition is replicated to all domain controllers in the domain.
Active Directory – Schema
Microsoft’s documentation on unmodified schema classes and attributes can be found at http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adschema/adschema/active_directory_schema.asp The modifications Exchange makes to the AD schema can be found at http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wss/wss/wss_ldf_AD_Schema_intro.asp
The schema management MMC is not automatically available on a Windows machine. To enable the snap-in, run regsvr32 c:\winnt\system32\schmmgmt.dll – then “Active Directory Schema” will be an option when adding snap-ins to MMC
Active Directory’s schema is normally in a read-only mode and no user has rights to modify the schema. Prior to enacting a schema change, then, you must enable schema writes and add your account to the “Schema Admins” group. To enable schema writes, right click on the “Active Directory Schema” item in the MMC and select “Operation Master”. Then check the box next to “The Schema may be modified on this domain controller”
When creating new schema classes or attributes, ensure you use the correct OID for our organisation. Preferably, too, create auxiliary classes and associate the aux class with a structural class. This prevents any vendor changes to the structural class from impacting your schema attributes.
In AD, schema changes cannot be deleted (well, it can but the process is unsupported). An attribute can be deactivated, but it remains in the schema definition.
Active Directory – Configuration
The AD Configuration partition holds, as the name implies, configuration for the domain and some services within the domain.
- Display Specifiers: Under the DisplaySpecifiers CN you will see multiple three digit hex number combinations. These are codes for different languages – 409 being English. http://www.microsoft.com/globaldev/reference/win2k/setup/lcid.mspx lists the codes used within the Windows internationalisation features. Under each regional container you will find the actual display specifier for structural schema objects. On, for instance, the user-Display object, is defined what appears when you right-click a user object in Active Directory Users and Computers. Another attribute defines the pages which appear when you create a user and the order in which those pages appear. The createDialog attribute is of particular interest – we modify this to automatically create the display name as lastname, firstname MI if you manually create a user within AD. This is done by defining the createDialog value as “%<sn>, %<givenName> %<initials>”
- Extended Rights: On the controlRightsAccess object, appliesTo defines structural schema objects to which the controlRightsAccess object applies. The controlRightsAccess objects themselves have several functions.
- When validAccesses is set to 8, this is to validate writes – or check the attribute value beyond the schema definition. Implementation is not widespread.
- When validAccesses is 256, then the object defines an actual extended right – something not part of the normal ACL’s. Recieve-as and Send-As, for instance, are a special operations for Exchange which can be found in the ExtendedRights container.
- Other validAccesses codes define ACL groups which can be assigned through the “Delegate Control” function. and validAccesses indicates what rights the ACL group permits – 16 for read, 32 for write, and the sum of 48 for read/write access. The membership object in ExtendedRights, with appliesTo bf967aba-0de6-11d0-a285-00aa003049e2 and validAccess of 48 means this access group allows whomever is granted it to both read and write to user objects (bf967aba-0de6-11d0-a285-00aa003049e2 is the guid of the user schema object). On the schema object “member”, then, the rightsGUID is entered as the attributeSecurityGUID.
An example of the rights grouping is the “Personal-Information” object, rightsGUID 77B5B886-944A-11d1-AEBD-0000F80367C1. You will find the corresponding octet string, 0x86 0xb8 0xb5 0x77 0x4a 0x94 0xd1 0x11 0xae 0xbd 0x00 0x00 0xf8 0x03 0x67 0xc1, applied to several schema attributes – telephoneNumber, facsimileTelephoneNumber, streetAddress, telexNumber, and so on:
Thus using the “Delegation Of Control” wizard, it is possible to select “Read and write Personal Information” as a permission set rather than specifying each individual attribute you want editable. Note, too, in the ACL editor the listing of “Personal Information” is retained
Under ForestUpdates you will see an “Operations” CN. Operations holds a listing of updates made to the forest (e.g. exchange /forestprep). This allows the system to check that the requisite forest updates are in place prior to installation without requiring the changes to be re-run.
This is basically the same thing “LostAndFound” in the domain naming context is, but within the configuration partition. All things being equal, it should be empty. Should an object be created within the Configuration partition at the same time it’s parent is deleted, the object is moved to “LostAndFoundConfig” for holding.
Contains crossref objects to all partitions within the forest – again not as interesting here as it could be with just one tree and domain.
This is intended for use with Directory Enabled Networking. The DEN concept is maintained by DMTF (http://www.dmtf.org/standards/wbem/den/) and is not at present implemented at Windstream
Forest-wide application settings – objects within this container correspond directly to the “Services” listed within the “Active Directory Sites And Services” snapin. One of the services listed is Microsoft Exchange. Should a server fail, running setup /disasterrecovery will recover most of the Exchange settings for the server from within this container.
The “Sites” of “Active Directory Sites and Services”. IP subnets and their associated sites are defined in this container, as well as the replication partnerships between domain controllers.
WellKnown Security Principals
What I call the “virtual credentials” – system security credentials like Everyone and Self are defined herein.
Active Directory – Domain Data
Objects specific to just one domain within the forest – the obvious users, computers, printers, file shares, groups, and contacts. Less obvious items too are stored within the domain data. If Windows DNS zones are configured as “Active Directory Integrated”, the DNS entries will appear under “cn=MicrosoftDNS,cn=System,dc=…”. File replication service (FRS) shares (including the domain SYSVOL), some information on Group Polices, Oracle database connections … any of the structural schema objects … can also be found within this partition.
An object named Infrastructure is in the root of the domain naming context, this object holds the NTDS settings for the domain infrastructure operations master.
Flexible Single Master Operations (FSMO) Roles
FSMO roles are assigned for functions which cannot practically be performed by any domain controller – functionality which cannot subscribe to the multi-master principal.
There are two forest-wide FSMO roles, the Domain Naming Master and the Schema Master.
- The Schema Master is the server on which writes can be made to the schema. All domain controllers will have a read-only copy of the schema, but only the schema master can write changes.
- The Domain Naming Master is used when a new domain is created within a forest – it verifies the new domain has a unique name.
Three additional FSMO roles exist in each domain within a forest. The Infrastructure Master, RID Master, and PDC Emulator.
- The Infrastructure Master, in a multi-domain environment, handles cleanup of phantom objects created as members are added to groups via a trust. The cleanup process is detailed by Microsoft at http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q248047 As we have a single domain, this is somewhat immaterial. Should we begin implementing other domains, the Infrastructure Master will need to be moved to a non-global catalogue (GC) server. The GC functionality precludes the phantom objects from being created (and hence from being purged).
- The RID master allocates blocks of relative ID’s, RID’s, to the domain controllers within the domain to ensure unique GUID’s. Should the RID master be offline for a short interval, new objects can still be created until the already-allocated RID block has been exhausted.
- The PDC emulator is multi-function. Were the domain to be in mixed-mode and therefore support NT4 BDC’s, the PDC emulator is required by the NT4 domain controllers for backwards compatibility. Our domain is in native-mode and cannot have NT4 BDC’s. This does not preclude NT4 member servers, just domain controllers. The PDC Emulator server is authoritative for the user’s password. Any failed logons are re-checked against the PDC emulator. In the NT4 environment this was because a BDC was a read-only directory copy to which password changes could not be made. If you changed your password and attempted to authenticate prior to the domain replicating the change completely, you could receive an invalid password error using your correct new password. To prevent this issue, a password failure on the BDC was re-checked with the PDC before the logon attempt was failed. This is how we can allow CSO password changes into AD without requiring the user to wait for domain synchronisation. The DirXML AD driver is installed to the PDC emulator server to allow immediate use of the user’s new CSO password. Group Policy Objects are created and edited on the PDC Emulator’s SYSVOL share. The PDC emulator is also the time source for the domain. Our PDC emulator is configured to use time.windstream.com as its time source with a time sync period of eight hours.
Normally you can move the FSMO roles between domain controllers using MMC’s. For the three per-domain roles the change is made in Active Directory Users and Computers. The Domain Naming Operation Master is changed from Active Directory Domains and Trusts”; the Schema master is changed within Active Directory Schema Manager.
Within Active Directory Users and Computers, right click the domain and select “Connect To Domain Controller” – select the domain controller which will receive the new role. Then right click the domain and select “Operation Masters”. You just click the “Change” button to move the role.
In the event of a catastrophic server failure complete with no system state backups you can forcibly transfer the FSMO roles from a non-operational source. We have done this once in production, the ICM domain, but there is additional peripheral cleanup required to remove the failed domain controller from operation. http://support.microsoft.com/kb/255504/ contains instructions for seizing FSMO roles. Microsoft mostly documents the domain cleanup process at http://support.microsoft.com/kb/216498/ If you want to try it for the experience, build two servers, create a fake domain with the two of them, turn one off and seize all the roles onto the remaining machine. This is effectively what happened in the ICM domain, they had three domain controllers but the first which held all roles was destroyed. Be careful in production as the post-seizure cleanup is not fully documented. DNS entries will still exist in BIND. It is possible for your domain controller machine password to be out of sync with the domain. I’m sure there are other situations which could arise as well which we didn’t happen across.
Domain Registration – WINS
The WINS entries of your domain should only be used by ‘legacy’ clients, NT4 workstations and servers. If you configure your domain controllers TCP/IP properties to use your WINS servers, the registration for the domain will be created automatically. Alternately you can create an LMHOST file for import into a foreign WINS server. The only reason we do this is to establish a trust with an NT4 domain. There are two records needed – and for our domain the text is included here-in.
10.33.8.25 SCARLITNT631 #DOM:ALLTEL #PRE 10.33.8.25 "ALLTEL \0x1b" #PRE
If you are attempting to create the LMHOST file for an alternate domain, you can just change the values except the “ALLTEL \0x1b” entry. There is a quotation mark, sixteen characters only (insert holy hand grenade like joke here) followed by the \0x1b then the closing quotation mark. If your domain name is BOB you cannot replace ALLTEL with BOB, you need to replace it with BOB and three trailing space characters.
Domain Registration – DNS
There are four “underscore zones” – new DNS zones used to store the SRV records relevant to the domain. Active Directory works fine with BIND DNS servers – you need to allow dynamic updates from the domain controller IP addresses. Since I do not allow dynamic updates on the root zone, I manually add the domain controller A records.
- _sites.domain.tld. Service records advertise servers providing global catalogue, Kerberos, and LDAP services within each site. The sites are differentiated within the record name – _service._tcp.SITENAME._sites.domain.tld. The following lines are the _sites records for the TWNUserAuth site
$ORIGIN _tcp.TWNUserAuth._sites.alltel.com. _gc SRV 0 100 3268 neohtwnnt630.alltel.com. _kerberos SRV 0 100 88 neohtwnnt630.alltel.com. _ldap SRV 0 100 389 neohtwnnt630.alltel.com. _gc SRV 0 100 3268 neohtwnnt631.alltel.com. _kerberos SRV 0 100 88 neohtwnnt631.alltel.com. _ldap SRV 0 100 389 neohtwnnt631.alltel.com.
- _tcp.domain.tld. Service records advertise all domain controllers within the domain providing global catalogue, Kerberos, LDAP, and kpasswd services. The following lines are the _tcp records for the NEOHTWNNT630 server
$ORIGIN _tcp.alltel.com. _gc SRV 0 100 3268 neohtwnnt630.alltel.com. _kerberos SRV 0 100 88 neohtwnnt630.alltel.com. _kpasswd SRV 0 100 464 neohtwnnt630.alltel.com. _ldap SRV 0 100 389 neohtwnnt630.alltel.com.
- _udp.domain.tld. Used for UDP kerberos connections to get tickets and change passwords. Service records in this zone advertise the UDP Kerberos and kpasswd services for the domain. The following lines are the _udp records for the NEOHTWNNT630 server
$ORIGIN _udp.alltel.com. _kerberos SRV 0 100 88 neohtwnnt630.alltel.com. _kpasswd SRV 0 100 464 neohtwnnt630.alltel.com.
- _msdcs.domain.tld. Kerberos, ldap, and global catalogue records by site and not. In addition each domain controller’s GUID used for replication is registered here. Again the example provides the service records for NEOHTWNNT630
$ORIGIN _msdcs.alltel.com. 47c1965e-87e8-4445-8552-fd20892c08c2 CNAME neohtwnnt630.alltel.com. _ldap._tcp.e0f0a709-9edf-483b-96e6-55c0dd55c1a6.domains SRV 0 100 389 neohtwnnt630.alltel.com. gc A 10.10.90.217 $ORIGIN _tcp.dc._msdcs.alltel.com. _kerberos SRV 0 100 88 neohtwnnt630.alltel.com. _ldap SRV 0 100 389 neohtwnnt630.alltel.com. $ORIGIN _tcp.TWNUserAuth._sites.dc._msdcs.alltel.com. _kerberos SRV 0 100 88 neohtwnnt630.alltel.com. _ldap SRV 0 100 389 neohtwnnt630.alltel.com. $ORIGIN gc._msdcs.alltel.com. _ldap._tcp SRV 0 100 3268 neohtwnnt630.alltel.com. $ORIGIN _sites.gc._msdcs.alltel.com. _ldap._tcp.TWNUserAuth SRV 0 100 3268 neohtwnnt630.alltel.com.
The PDC emulator is also advertised here
$ORIGIN _msdcs.alltel.com. _ldap._tcp.pdc SRV 0 100 389 scarlitnt631.alltel.com.
A client which has already authenticated to the domain will have a registry entry which retains the client’s site.
When a client attempts to authenticate to Active Directory, the service records for the kerberos service are used to determine an appropriate authentication source. In the case of the PC above, this would be a query for _kerberos._tcp.LITUserAuth._sites.dc._msdcs.alltel.com. service records is made. An LDAP connection is initiated over udp/389 to every domain controller returned by the DNS query. Each connection is initiated in 1/10th intervals second. The receiving servers compare the client’s IP address to the subnet configuration to verify the client is reaching the correct site for it’s current subnet. The first LDAP response received is then used as the kerberosauthentication server. If the client’s site is incorrect a referral is returned for the correct site – which then prompt the client to re-query DNS for the correct new site.