BPuhl’s Blog

A little bit of everything without actually being much of anything

Archive for August, 2009

AD Admin Center

Posted by BPuhl on August 29, 2009

Anyone else started to play with the new Active Directory Administrative Center in the Windows 7 RSAT tools yet?  Here are my first impressions:

  • Much easier to deal with multiple domains, especially when you’re looking to get to the FOO OU that’s buried 3 deep into each of 8 domains
  • How can I make it load faster?
  • I’ve been trained for so long, to type DSA.MSC to get to ADUC, that it never occurred to me that D, S, and A are a roll of the left hand fingers across the keyboard.  Now it’s DSAC.MSC, and I’m constantly entertained at how my fingers just refuse to get in that last “C”
  • hVery annoyed that it’s actually NOT dsac.msc like I just said, but instead it’s DSAC.EXE – seriously? EXE? More training

Still need to play with it some more to figure it out, but I’m working on a project now where I needed to deal with a bunch of OU’s across multiple domains, so the ability to add starting nodes was uber-helpful – 2 thumbs up!

Posted in Active Directory | Leave a Comment »

Adventures of Exchange 2010 and AdminSDHolder

Posted by BPuhl on August 29, 2009

For those of you who haven’t heard by now, there have been many threads over the past few days around the setup of Exchange 2010, and how one of the things which it does is to modify AdminSDHolder ACL’s, and the associated security implications.

Far as I can tell, this was kicked off by this blog post, which gives a good description of what’s going on and what the fuss is about:  http://dloder.blogspot.com/2009/08/exchange-2010-rc1-and-adminsdholder.html

It didn’t take long for threads to spawn on the public forums, such as http://www.activedir.org/ListArchives/tabid/55/Default.aspx as well as several internal distribution lists.

While I won’t claim that inside Microsoft, the left hand and the right hand always know what each other is doing.  We are very security conscious and in general the product groups do go out of their way to try to do things “right”

In the meantime, who does this affect?  Well, technically Exchange 2010 is only supported for production by a small number of TAP partners.  Of course, MSIT is on that list, so you might be wondering – what do we think about it?

While it’s not an official “policy”, in general, when it comes to managing Microsoft’s internal directory, we’ve got a fairly basic principle: 

                   If you create it, it’s yours, if you don’t – leave it alone.

In this case, AdminSDHolder isn’t something that Exchange created or even ‘owns’, it’s a base AD function.  Because we know that also by policy, none of the accounts which are impacted by AdminSDHolder are mailbox enabled (and thus within the scope of Exchange), we went through and removed the ACE’s from AdminSDHolder.  Does this mean that Exchange RBAC won’t be able to touch those objects?  Yup, but that’s by design of our security model.  We require separate (in our case, smartcard required) administrator accounts for all elevated permission users, and those accounts aren’t allowed to have mailboxes.

I won’t claim to know what’s going to happen in the future with Exchange 2010, but this is how we’re approaching it internally (and why).

Posted in Active Directory, Random Tecnical Stuff | Leave a Comment »

Windows 7 RSAT Tools (RTM) now available for download

Posted by BPuhl on August 11, 2009

 

Windows 7 RSAT Tools RTM version now available for download:

http://www.microsoft.com/downloads/details.aspx?FamilyID=7d2f6ad7-656b-4313-a005-4e344e43997d&displaylang=en

Posted in Win 7 | Leave a Comment »

EASI ID (pt. 2)

Posted by BPuhl on August 7, 2009

Back in March, I posted EASI ID (pt 1.5), posting a question about who owns the rights to resources within a namespace, specifically email addresses.  The reason was to stimulate some braincells, about what could happen if users chose to protect personal content with a digital identity that they thought they owned, but which later they found out the didn’t (in this case their work email address).

Ariel Gordon, one of the rock stars on the Microsoft Identity Strategy team (along with Kim Cameron and others…), recently posted this comment:

Ariel Gordon said

August 7, 2009 at 2:34 pm e

Contoso owns the domain and any identifier in its realm.
Email addresses bear a claim of employment. I.e. my @contoso.com address shows (with a certain level of certainty) that I work for Contoso. Using this address after I leave the company is akin to keeping distributing business cards with the address on it.

Today, 99% websites leverage email providers’ infrastructure for user authentication: you type your email address as a login then create a password that can be reset/resend via email, effectively handing the keys to the account to anyone who controls the mailboxn including the new guy–Jerry Smith in your example.

Websites who implement authentication delegation (aka federation in the consumer sense of the term), could be informed by the IdP of user account deprovisionning and, as best practice, take action to close the account, prompt the user to create alternate credentials (if they have a fallback email address or phone #), etc.

Thoughts?
-Ariel.

I started to reply with a bit of the backstory in the comments, but figured I’d give this it’s own post, if for no other reason than (I think) it’s a fun look into some of the dynamics of digital identity…not to mention internal politics… So here is my response:

 

Hi Ariel!

Thanks for replying.  Yes, you’re correct, this is exactly what happens, and I agree with you.

The motivation for this post, was a series of conversations that I was in with an internal group here at Microsoft, about who "owned" the @microsoft.com namespace for user identities.  Historically, the internal identity management team has owned corp.microsoft.com, but the actual microsoft.com namespace was owned by the team that supports the www.microsoft.com website.  However, way back when, somebody in the Live ID team also decided that the microsoft.com namespace was theirs (in the Live ID sense)

It turns out, that today, there are approx. 2.5 million Windows Live ID’s in the @microsoft.com namespace.  Obviously we haven’t had that many employees.  But back in the day, there was a time when the Live ID team believed that @microsoft.com would be a good namespace for customers to use, similar to @hotmail.com or @live.com.  This isn’t really as crazy as it sounds, because it’s analogous to users creating a Yahoo ID in the @yahoo.com namespace. 

However many years later though, as we enter the age of federation, the challenge is that Microsoft Corporation uses @microsoft.com as our corporate namespace.  In contrast, Yahoo Corporation uses @yahoo-inc.com for their corporate email addresses.  So Yahoo can choose to give @yahoo.com to their customers, whereas Microsoft had a conflict.

This was a fun debate at the time, and ultimately we came to the decision that @microsoft.com is our corporate identity.  The question though, of what should come to those 2.5 million user ID’s.  Fortunately the Live ID team has the solution for this, and added a flag into the federation setup so that a company can choose to “evict on reserve” or “allow merge” of any existing users when they federate.

Allow Merge means that anyone with an existing user account in a namespace that’s federated, will have the option of associating their existing WLID with their new federated ID.  In Live ID speak, it means they keep the same PUID.  The result is that you keep anything you had access to, but you do so with your new corporate-account-backed, federated Live ID rather than your older, separate username/pw WLID.

Evict on reserve is just what it sounds like, where any user accounts which exist in a namespace when it’s reserved, will be moved into a “forced rename” state.  This means that the next time the user logs on with their separate user name and password, they will be forced to change their user name (keeping the same account/PUID) to a different email address, one which is hopefully their personal address.

For Microsoft employees, we chose evict-on-reserve, and are in the process of working through the details of implementation.  Our thinking behind this, is that even though they are in the @microsoft.com namespace, any existing accounts are all “personal use” accounts.  Therefore, we should protect the personal data, and have a user rename their account to a personal account.  When a user logs in with their “new” federated @microsoft.com account, they will be doing “business” work with an account that is backed by their corporate credentials (and which goes away when their employment ends).  And yes, we’re working with the Live ID team to get some controls put in place for companies that federate, so that they can limit where corporate backed WLID’s are used.

So that’s where we’re at.  Hopefully this gives other folks who are federating something to think about as well, as they integrate with service providers such as Live ID.

I’d love to hear what you, or anyone else thinks about these fun, “moving to the cloud” challenges!

~Brian

Posted in ADFS, Digital Identity, Randomness | 1 Comment »

Federation Services and Direct Access

Posted by BPuhl on August 6, 2009

Now here’s an interesting combination.  What do you do when you have a service which has both an internal and internet facing components, with different behavior for each, and then you deploy Direct Access?

Quick aside:  For those not aware, Direct Access is a feature which allows domain joined Win7 laptops to behave as though they were on the corporate network and have full access to internal resources, regardless of where they are.

The important detail here, is that one of the control mechanisms is an idea of split DNS.  Internal domains are flagged as such, so that clients route that traffic internally, and everything else is considered “internet”.

So the question is, if you have your ADFS servers deployed in a unique namespace (we use *.sts.microsoft.com), then do you call that an internal namespace or an external one?  I’m not sure of the right answer at this point, but I’ve been bouncing around and just recently (this past week) requested a change.

Another quick note:  Remember, that we’ve got ADFS deployed so that users who are on corpnet get integrated authentication – no prompts – when they hit the ADFS servers.  Users on the internet get forms based auth, and have to enter credentials

So for your DA users, what kind of experience should they have?  Initially, when we first started rolling out DA, it made sense to me that DA enabled clients on the internet should have the “corpnet” experience.  In other words, even though I’m at home, I should still get integrated authentication. 

Just recently though, we ran into some issues where DA enabled users would be in situations (client issues, behind firewalls, etc…) where they were able to traverse the internet but were not able to get the DA connection back to corpnet.  In these cases, users were actually able to hit the internet based, federated resource.  But because the client thought that the ADFS servers were internal (and DA wasn’t working), they were failing to authenticate.  They could see the app, just not get into it.

So we had the DNS policy on DA clients changed, and now our DA clients believe that the ADFS servers are external.  This takes us back to our pre-DA behavior, where clients physically on corpnet (DA or not) will get integrated auth, but clients on the internet (DA or not) will always get FBA.  At least with FBA though, they can get access to the resources.

The change hasn’t been in place long enough, and we don’t have a critical mass of users on our DA pilot yet, so I haven’t heard the rumblings about the change to see whether anyone has noticed. Yet.  I’m sure this won’t be the last time we need to think about ADFS and DA, but all other things considered, right now I think the best thing to do is keep the 2 separate.

Posted in ADFS, Random Tecnical Stuff, Win 7 | 1 Comment »

Enabling RSAT tools in Win7

Posted by BPuhl on August 6, 2009

Does anyone else think it’s odd that you have to go through and click every one of these darn little boxes to enable all of the RSAT tools?  Odd defaults…

rsat

Posted in Randomness, Rants, Win 7 | 2 Comments »

PoSH for ADFS

Posted by BPuhl on August 6, 2009

* This post applies to the Beta 2 release of ADFS and may or may not apply to the final product *

Some useful snippets from the ADFS/PowerShell world  (by no means exhaustive, just enough to get you going):

PS C:\Users\bpuhl> get-pssnapin -registered

Name        : Microsoft.IdentityServer.PowerShell
PSVersion   : 1.0
Description : This powershell snap-in contains cmdlets used to manage Microsoft Identity Server resources.

PS C:\Users\bpuhl> get-pssnapin -registered | add-pssnapin
PS C:\Users\bpuhl> get-command get-GS*

CommandType     Name                                                Definition
———–     —-                                                ———-
Cmdlet          Get-GSAttributeStore                                Get-GSAttributeStore [[-Name] <String[]>] [-Verb...
Cmdlet          Get-GSCertificate                                   Get-GSCertificate [[-CertificateType] <String[]>…
Cmdlet          Get-GSClaimType                                     Get-GSClaimType [[-Name] <String[]>] [-Verbose] …
Cmdlet          Get-GSDelegate                                      Get-GSDelegate [[-Name] <String[]>] [-Verbose] [...
Cmdlet          Get-GSEndpoint                                      Get-GSEndpoint [[-Address] <String[]>] [-Verbose...
Cmdlet          Get-GSIdentityProvider                              Get-GSIdentityProvider [[-Name] <String[]>] [-Ve...
Cmdlet          Get-GSInformationCard                               Get-GSInformationCard [[-CardName] <String[]>] [...
Cmdlet          Get-GSProperties                                    Get-GSProperties [-Verbose] [-Debug] [-ErrorActi...
Cmdlet          Get-GSProxy                                         Get-GSProxy [-Verbose] [-Debug] [-ErrorAction <A...
Cmdlet          Get-GSProxyProperties                               Get-GSProxyProperties [-Verbose] [-Debug] [-Erro...
Cmdlet          Get-GSRelyingParty                                  Get-GSRelyingParty [[-Name] <String[]>] [-Verbos…

PS C:\Users\bpuhl>

But I will throw out one really useful tidbit for those of you who are playing with the proxy component of the ADFS beta release and are pulling your hair out trying to get it to talk back to your full server (this is assuming you’ve already got the proxy certificates in place):

Disable CRL checking on STS servers

set-gsproperties –proxyCertRevocationCheck “None”

Even if you have access to the CRL’s and everything *should* work for you.  In the Beta release, you need to disable CRL checking on the proxy certificate…

Posted in ADFS | 1 Comment »

Laura’s Rule for ADFS Troubleshooting

Posted by BPuhl on August 6, 2009

“If your ADFS is broken, it’s PKI. If it’s not PKI, you’ve got a typo. If it’s not a typo, it’s PKI.” – Laura Hunter

Posted in ADFS | 2 Comments »

ADFS Event ID 111

Posted by BPuhl on August 6, 2009

Event ID 111 is a useful one to recognize when you’re scrolling through the logs of your ADFS server.  It will look something like this:

Log Name:      Application
Source:        GenevaServer
Date:          8/5/2009 3:27:35 PM
Event ID:      111
Task Category: None
Level:         Error
Keywords:      Classic
User:          N/A
Computer:      RED-ADFS-05.redmond.corp.microsoft.com
Description:
The Federation Service encountered a serious error while processing the WS-Trust request.
Request type:
http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue

Additional Data
Exception details:
System.IdentityModel.Tokens.SecurityTokenValidationException: ID4063: LogonUser failed for the ’1234@windows.microsoft.com’ user. Ensure that the user has a valid Windows account. —> System.ComponentModel.Win32Exception: Logon failure: unknown user name or bad password
   — End of inner exception stack trace —
   at Microsoft.IdentityModel.Tokens.WindowsUserNameSecurityTokenHandler.ValidateToken(SecurityToken token)
   at Microsoft.IdentityServer.SecurityTokenService.MSISSecurityTokenService.BeginGetScope(IClaimsPrincipal principal, RequestSecurityToken request, AsyncCallback callback, Object state)
   at Microsoft.IdentityModel.SecurityTokenService.SecurityTokenService.BeginIssue(IClaimsPrincipal principal, RequestSecurityToken request, AsyncCallback callback, Object state)
   at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceContract.DispatchRequestAsyncResult..ctor(DispatchContext dispatchContext, AsyncCallback asyncCallback, Object asyncState)
   at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceContract.BeginDispatchRequest(DispatchContext dispatchContext, AsyncCallback asyncCallback, Object asyncState)
   at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceContract.ProcessCoreAsyncResult..ctor(WSTrustServiceContract contract, DispatchContext dispatchContext, MessageVersion messageVersion, WSTrustResponseSerializer responseSerializer, WSTrustSerializationContext serializationContext, AsyncCallback asyncCallback, Object asyncState)
   at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceContract.BeginProcessCore(Message requestMessage, WSTrustRequestSerializer requestSerializer, WSTrustResponseSerializer responseSerializer, String requestAction, String responseAction, String trustNamespace, AsyncCallback callback, Object state)

System.ComponentModel.Win32Exception: Logon failure: unknown user name or bad password
Event Xml:
<Event xmlns="
http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="GenevaServer" />
    <EventID Qualifiers="0">111</EventID>
    <Level>2</Level>
    <Task>0</Task>
    <Keywords>0×80000000000000</Keywords>
    <TimeCreated SystemTime="2009-08-05T22:27:35.000Z" />
    <EventRecordID>601453</EventRecordID>
    <Channel>Application</Channel>
    <Computer>RED-ADFS-05.redmond.corp.microsoft.com</Computer>
    <Security />
  </System>
  <EventData>
    <Data>
http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</Data>
    <Data>System.IdentityModel.Tokens.SecurityTokenValidationException: ID4063: LogonUser failed for the ’1234@windows.microsoft.com’ user. Ensure that the user has a valid Windows account. —&gt; System.ComponentModel.Win32Exception: Logon failure: unknown user name or bad password
   — End of inner exception stack trace —
   at Microsoft.IdentityModel.Tokens.WindowsUserNameSecurityTokenHandler.ValidateToken(SecurityToken token)
   at Microsoft.IdentityServer.SecurityTokenService.MSISSecurityTokenService.BeginGetScope(IClaimsPrincipal principal, RequestSecurityToken request, AsyncCallback callback, Object state)
   at Microsoft.IdentityModel.SecurityTokenService.SecurityTokenService.BeginIssue(IClaimsPrincipal principal, RequestSecurityToken request, AsyncCallback callback, Object state)
   at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceContract.DispatchRequestAsyncResult..ctor(DispatchContext dispatchContext, AsyncCallback asyncCallback, Object asyncState)
   at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceContract.BeginDispatchRequest(DispatchContext dispatchContext, AsyncCallback asyncCallback, Object asyncState)
   at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceContract.ProcessCoreAsyncResult..ctor(WSTrustServiceContract contract, DispatchContext dispatchContext, MessageVersion messageVersion, WSTrustResponseSerializer responseSerializer, WSTrustSerializationContext serializationContext, AsyncCallback asyncCallback, Object asyncState)
   at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceContract.BeginProcessCore(Message requestMessage, WSTrustRequestSerializer requestSerializer, WSTrustResponseSerializer responseSerializer, String requestAction, String responseAction, String trustNamespace, AsyncCallback callback, Object state)

System.ComponentModel.Win32Exception: Logon failure: unknown user name or bad password</Data>
  </EventData>
</Event>

What makes it interesting, is that this is the same as the server saying, “Oh Snap! Something just happened and I don’t know what that was!”

In this case, you can look at the event data in a little more detail, and pretty clearly see what happened.  But you do need to check these out. 

When we first upgraded our production ADFS servers to the Beta 2 release, we found that nearly all of our claims processing rules were sending multiple identity claims to the relying parties.  We were throwing Event 111 on nearly every authentication, and had to go in and correct the claims rules for each one to get the errors to go away.

Posted in ADFS | Leave a Comment »

Finding the SQL server ADFS is using

Posted by BPuhl on August 6, 2009

* This post applies to the Beta 2 release of ADFS and may or may not apply to the final product *

 

This was harder than I thought it should be, until I found out that there aren’t 2 administrative interfaces for ADFS, but rather there are 3!  You can either use the console on the ADFS server itself, the Powershell commandlets, or you can use WMI to gather data about the server. 

So if you want to figure out which SQL server your ADFS web server is using as it’s policy store, here you go:

PS C:\> Get-WmiObject -Namespace "Root\MicrosoftIdentityServer" -class SecurityTokenService
__GENUS                          : 2
__CLASS                          : SecurityTokenService
__SUPERCLASS                     :
__DYNASTY                        : SecurityTokenService
__RELPATH                        : SecurityTokenService=@
__PROPERTY_COUNT                 : 3
__DERIVATION                     : {}
__SERVER                         : DSP20A61
__NAMESPACE                      : Root\MicrosoftIdentityServer
__PATH                           : \\DSP20A61\Root\MicrosoftIdentityServer:SecurityTokenService=@
EventLogLevel                    : 63
PolicyStoreAdministrationAddress : net.pipe://localhost/policy
PolicyStoreConnectionAddress     : Data Source=DSP20A61\SQLEXPRESS;Initial Catalog=GenevaPolicyStore;Integrated Security=True

Yes, I have asked that this specific bit of information be made slightly more accessible, so the request is in.  We’ll see if it makes the cut when the product ships, but more important is to know that in general, you can use WMI to get at some of the configuration information.

Posted in ADFS | Leave a Comment »

 
Follow

Get every new post delivered to your Inbox.