<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Identity on TurboVision</title>
    <link>https://turbovision.in6-addr.net/tags/identity/</link>
    <description>Recent content in Identity on TurboVision</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Tue, 21 Apr 2026 14:06:12 +0000</lastBuildDate>
    <atom:link href="https://turbovision.in6-addr.net/tags/identity/index.xml" rel="self" type="application/rss&#43;xml" />
    
    
    
    <item>
      <title>From Mailboxes to Everything Internet, Part 3: Identity, File Services, and Mixed Networks</title>
      <link>https://turbovision.in6-addr.net/linux/migrations/from-mailboxes-to-everything-internet-part-3-identity-file-services-and-mixed-networks/</link>
      <pubDate>Thu, 18 Sep 2008 00:00:00 +0000</pubDate>
      <lastBuildDate>Thu, 18 Sep 2008 00:00:00 +0000</lastBuildDate>
      <guid>https://turbovision.in6-addr.net/linux/migrations/from-mailboxes-to-everything-internet-part-3-identity-file-services-and-mixed-networks/</guid>
      <description>&lt;p&gt;By the time mail became stable, the next migration pressure arrived exactly where everyone knew it would: file shares, printers, and user identity.&lt;/p&gt;
&lt;p&gt;In theory this is straightforward. In reality, this is where organizations discover the true complexity of their own history. Shared drives are business process. Printer queues are department politics. User accounts are unwritten social contracts. You are not migrating servers. You are migrating habits.&lt;/p&gt;
&lt;p&gt;In the 1995-2010 arc, Linux earned trust in this space because it solved practical problems at sane cost. But it only worked when we treated mixed environments as first-class architecture, not temporary embarrassment.&lt;/p&gt;
&lt;h2 id=&#34;the-mixed-network-reality-we-actually-had&#34;&gt;The mixed-network reality we actually had&lt;/h2&gt;
&lt;p&gt;Our baseline looked familiar to many geeks in 2008:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;some old Windows clients&lt;/li&gt;
&lt;li&gt;a few newer Windows clients&lt;/li&gt;
&lt;li&gt;Linux workstations in technical teams&lt;/li&gt;
&lt;li&gt;legacy scripts depending on share paths nobody wanted to rename&lt;/li&gt;
&lt;li&gt;printers with &amp;ldquo;special driver behavior&amp;rdquo; that existed only in rumor&lt;/li&gt;
&lt;li&gt;user account sprawl with inconsistent naming conventions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No greenfield, no clean slate.&lt;/p&gt;
&lt;p&gt;The migration target was equally practical:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;centralize file and print services on Linux&lt;/li&gt;
&lt;li&gt;standardize authentication path as much as feasible&lt;/li&gt;
&lt;li&gt;keep client disruption low&lt;/li&gt;
&lt;li&gt;preserve existing share semantics long enough for staged cleanup&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;why-samba-became-a-migration-weapon&#34;&gt;Why Samba became a migration weapon&lt;/h2&gt;
&lt;p&gt;Samba was not exciting in a conference-slide way. It was exciting in a &amp;ldquo;we can migrate without breaking payroll&amp;rdquo; way.&lt;/p&gt;
&lt;p&gt;It gave us leverage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;speak SMB to existing clients&lt;/li&gt;
&lt;li&gt;keep Unix-native storage and tooling under the hood&lt;/li&gt;
&lt;li&gt;centralize access control in files we could version&lt;/li&gt;
&lt;li&gt;run on hardware we could afford and replace&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The strongest outcome was operational consistency. We could finally inspect and manage share policy as code-like config, not opaque GUI state.&lt;/p&gt;
&lt;p&gt;A conceptual share policy looked like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[finance]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/srv/shares/finance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;read only&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;valid users&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;@finance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;create mask&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;0660&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;directory mask&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;0770&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[public]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/srv/shares/public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;read only&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;guest ok&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;yes&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The syntax is less important than explicitness: who can access what, with which defaults.&lt;/p&gt;
&lt;h2 id=&#34;naming-and-identity-cleanup-the-hard-part-nobody-budgets&#34;&gt;Naming and identity cleanup: the hard part nobody budgets&lt;/h2&gt;
&lt;p&gt;The technical install was rarely the blocker. Identity cleanup was.&lt;/p&gt;
&lt;p&gt;We inherited user namespaces like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;initials on one system&lt;/li&gt;
&lt;li&gt;full names elsewhere&lt;/li&gt;
&lt;li&gt;legacy aliases kept alive by scripts&lt;/li&gt;
&lt;li&gt;contractor accounts with no lifecycle policy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A migration that ignores identity normalization creates permanent complexity debt.&lt;/p&gt;
&lt;p&gt;We built a mapping file and treated it as a controlled artifact:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;legacy_id   canonical_uid   display_name
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;jd          jdoe            John Doe
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;finance1    finance.ops     Finance Operations
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;svcprint    svc.print       Print Service Account&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then we staged migrations by team, not by technology component. That one decision reduced support calls dramatically.&lt;/p&gt;
&lt;h2 id=&#34;directory-services-useful-but-only-with-boundaries&#34;&gt;Directory services: useful, but only with boundaries&lt;/h2&gt;
&lt;p&gt;NIS, LDAP, local files, and domain-style approaches all appeared in real deployments. The important mistake to avoid was trying to force full centralization in one leap.&lt;/p&gt;
&lt;p&gt;Our pattern:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;centralize high-value user groups first&lt;/li&gt;
&lt;li&gt;keep local emergency admin path on each critical server&lt;/li&gt;
&lt;li&gt;document source-of-truth per account class&lt;/li&gt;
&lt;li&gt;automate consistency checks&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A central directory without local break-glass access is an outage multiplier.&lt;/p&gt;
&lt;h2 id=&#34;file-migration-strategy-that-survived-reality&#34;&gt;File migration strategy that survived reality&lt;/h2&gt;
&lt;p&gt;The best sequence we found:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;classify shares by business criticality&lt;/li&gt;
&lt;li&gt;migrate low-risk shares first&lt;/li&gt;
&lt;li&gt;preserve path compatibility through aliases/symlinks where possible&lt;/li&gt;
&lt;li&gt;run side-by-side read validation&lt;/li&gt;
&lt;li&gt;migrate write ownership after validation window&lt;/li&gt;
&lt;li&gt;freeze and archive old share with explicit retention date&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This gave users confidence because rollbacks remained feasible.&lt;/p&gt;
&lt;p&gt;We also learned to publish &amp;ldquo;what changed this week&amp;rdquo; notes with plain language and exact examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;old path&lt;/li&gt;
&lt;li&gt;new path&lt;/li&gt;
&lt;li&gt;unchanged behavior&lt;/li&gt;
&lt;li&gt;changed behavior&lt;/li&gt;
&lt;li&gt;support contact&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Silence is interpreted as instability.&lt;/p&gt;
&lt;h2 id=&#34;printers-where-migrations-go-to-get-humbled&#34;&gt;Printers: where migrations go to get humbled&lt;/h2&gt;
&lt;p&gt;Print migration seems trivial until one department uses a bizarre tray/font/duplex combination that only one driver profile handles.&lt;/p&gt;
&lt;p&gt;We created printer profile inventories before cutover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;model + firmware revision&lt;/li&gt;
&lt;li&gt;required driver mode&lt;/li&gt;
&lt;li&gt;known paper/duplex quirks&lt;/li&gt;
&lt;li&gt;department-specific defaults&lt;/li&gt;
&lt;li&gt;fallback queue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then we tested with actual user documents, not vendor test pages.&lt;/p&gt;
&lt;p&gt;An immaculate test page proves nothing about accounting reports with embedded fonts.&lt;/p&gt;
&lt;h2 id=&#34;permissions-model-deny-ambiguity-early&#34;&gt;Permissions model: deny ambiguity early&lt;/h2&gt;
&lt;p&gt;Permission bugs are expensive because they damage trust from both sides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;too permissive -&amp;gt; security concern&lt;/li&gt;
&lt;li&gt;too restrictive -&amp;gt; productivity concern&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We moved to group-based share ownership and banned ad-hoc one-off user ACL edits in production without change notes. This felt strict and paid off quickly.&lt;/p&gt;
&lt;p&gt;The rule was simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if access need is recurring, represent it as group policy&lt;/li&gt;
&lt;li&gt;if access need is temporary, represent it with explicit expiry&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Temporary exceptions without expiry become permanent architecture by accident.&lt;/p&gt;
&lt;h2 id=&#34;migration-observability-for-fileidentity-services&#34;&gt;Migration observability for file/identity services&lt;/h2&gt;
&lt;p&gt;For this phase, useful metrics were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;auth failures per source host&lt;/li&gt;
&lt;li&gt;file server latency during peak office windows&lt;/li&gt;
&lt;li&gt;share-level error rates&lt;/li&gt;
&lt;li&gt;print queue backlog and failure codes&lt;/li&gt;
&lt;li&gt;top denied access paths&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &amp;ldquo;top denied paths&amp;rdquo; report became our best policy feedback loop. It showed where documentation was wrong, where group membership drifted, and where users still followed old habits.&lt;/p&gt;
&lt;h2 id=&#34;incident-story-the-phantom-permission-outage&#34;&gt;Incident story: the phantom permission outage&lt;/h2&gt;
&lt;p&gt;We once lost half a day to what looked like widespread permission corruption after a migration wave. Root cause was not ACL damage. Root cause was client-side credential caching from old identities on a batch of desktops that were never fully logged out after account mapping changes.&lt;/p&gt;
&lt;p&gt;Fix:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;clear cached credentials&lt;/li&gt;
&lt;li&gt;force re-auth&lt;/li&gt;
&lt;li&gt;re-test representative access matrix&lt;/li&gt;
&lt;li&gt;update runbook with pre-cutover &amp;ldquo;credential cache reset&amp;rdquo; step&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The lesson: mixed-network incidents often come from boundary behavior, not core service logic.&lt;/p&gt;
&lt;h2 id=&#34;change-control-without-bureaucracy-theater&#34;&gt;Change control without bureaucracy theater&lt;/h2&gt;
&lt;p&gt;By 2008, we had enough scars to adopt lightweight but real change control:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;one-page change intent&lt;/li&gt;
&lt;li&gt;explicit rollback&lt;/li&gt;
&lt;li&gt;affected services/users&lt;/li&gt;
&lt;li&gt;pre/post validation checklist&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not a ticketing cathedral. Just enough structure to prevent repeat mistakes.&lt;/p&gt;
&lt;p&gt;Migration work tempts improvisation. Improvisation is useful during investigation, dangerous during production rollout.&lt;/p&gt;
&lt;h2 id=&#34;the-cultural-upgrade-hidden-inside-technical-migration&#34;&gt;The cultural upgrade hidden inside technical migration&lt;/h2&gt;
&lt;p&gt;The largest win from this phase was cultural:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;infrastructure became more legible&lt;/li&gt;
&lt;li&gt;ownership became less tribal&lt;/li&gt;
&lt;li&gt;junior operators could contribute safely&lt;/li&gt;
&lt;li&gt;users got clearer communication&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Linux did not magically deliver this. Clear boundaries and documented policy delivered it.&lt;/p&gt;
&lt;p&gt;Samba, directory services, and Unix tooling gave us the implementation path.&lt;/p&gt;
&lt;h2 id=&#34;if-you-are-planning-this-now&#34;&gt;If you are planning this now&lt;/h2&gt;
&lt;p&gt;If you are a small or mid-size team in 2008 planning a mixed-network migration, here is the short list that matters:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;inventory identities before touching auth backends&lt;/li&gt;
&lt;li&gt;migrate by team/business workflow, not by software component&lt;/li&gt;
&lt;li&gt;use group policy over user-by-user exceptions&lt;/li&gt;
&lt;li&gt;keep local emergency admin access&lt;/li&gt;
&lt;li&gt;test printers with real documents&lt;/li&gt;
&lt;li&gt;track top denied paths and act on them weekly&lt;/li&gt;
&lt;li&gt;publish plain-language migration notes users can forward internally&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If these are in place, tooling choice becomes manageable.
If these are missing, tooling choice will not save you.&lt;/p&gt;
&lt;h2 id=&#34;what-we-documented-after-every-team-migration&#34;&gt;What we documented after every team migration&lt;/h2&gt;
&lt;p&gt;A useful discipline in this phase was writing a short &amp;ldquo;migration memo&amp;rdquo; after each department cutover. Not a giant postmortem deck. One page, same headings every time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what changed&lt;/li&gt;
&lt;li&gt;what broke&lt;/li&gt;
&lt;li&gt;what surprised us&lt;/li&gt;
&lt;li&gt;what to do differently next wave&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Patterns appeared quickly. We discovered, for example, that teams with the fewest technical customizations still generated many support requests if communications were vague, while highly customized teams generated fewer tickets when we sent exact path/credential examples ahead of time.&lt;/p&gt;
&lt;p&gt;The lesson was uncomfortable and valuable: support volume was often a documentation quality metric, not a complexity metric.&lt;/p&gt;
&lt;h2 id=&#34;decommissioning-old-services-without-creating-panic&#34;&gt;Decommissioning old services without creating panic&lt;/h2&gt;
&lt;p&gt;One more operational gap deserves mention: graceful decommissioning. Teams often migrate to new shares and auth paths, then leave old services half-alive &amp;ldquo;just in case.&amp;rdquo; Six months later those half-alive systems become shadow dependencies nobody can explain.&lt;/p&gt;
&lt;p&gt;We fixed this by adding an explicit retirement protocol:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;announce decommission date in advance&lt;/li&gt;
&lt;li&gt;publish list of known remaining users/scripts&lt;/li&gt;
&lt;li&gt;provide one final migration clinic window&lt;/li&gt;
&lt;li&gt;switch old service to read-only for a short grace period&lt;/li&gt;
&lt;li&gt;archive and remove with signed-off checklist&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Read-only grace periods were particularly effective. They surfaced hidden dependencies safely without encouraging indefinite delay.&lt;/p&gt;
&lt;p&gt;Another small but effective trick was publishing a &amp;ldquo;last-seen usage&amp;rdquo; report for legacy shares during the retirement window. Seeing concrete timestamps and hostnames moved conversations from fear to evidence. Teams could decide with confidence instead of intuition, and decommission dates stopped slipping for emotional reasons.&lt;/p&gt;
&lt;p&gt;Related reading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://turbovision.in6-addr.net/retro/linux/migrations/from-mailboxes-to-everything-internet-part-2-mail-migration-under-real-traffic/&#34;&gt;From Mailboxes to Everything Internet, Part 2: Mail Migration Under Real Traffic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://turbovision.in6-addr.net/musings/clarity-is-an-operational-advantage/&#34;&gt;Clarity Is an Operational Advantage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
