OSX: 判断用户/系统的所属域以及LKDC

原创 2013年12月03日 13:05:16

前言:

这几天在改进一个过去的脚本,该脚本根据用户所属的认证域,自动把该部门的所有共享资源,在用户登陆之后,自动地安装,便于用户访问使用。在我的环境中的域有三种情况:AD(微软的Active Directory目录服务),OD(Apple的Open Directory目录服务)以及Local(本地登陆服务)。之前,因为只考虑了比较简单的情况,比如本地只有一个特定的管理员用户,其它都是AD网络用户,而且机器配置AD认证插件中,没有打开Mobile用户,所以,判断一个用户的所属域,可以很简单地使用下面的命令:

dscl . list /Users/$userName
这个命令在本地用户库中查找该用户,找到了,就认为是本地用户。

但是问题是,如果开启Mobile选项,那么一个其它域认证的用户,第一次登陆后,系统也会在本地用户库中生成该用户。因为Mobile选项的意思是,所有在这台机器上登陆过的用户,都可以在没有该认证服务时的任何其它地方登陆;也就是,该用户可以拿着这台电脑回家/出差继续工作,或者在没有网络联机的情况下登陆。这样一来,上面的命令就会误判该用户是本地用户。

其实解决的方式也很简单,比如判断用户是否属于一个特定目录服务的用户组,也可以完成判断。

不过,通过网上的搜索后,发现了更多的OSX系统认证命令的使用和内部机制,所以,记录下来整理下思路。


LKDC:

自从10.5之后,苹果引进了新的认证机制,它为苹果机之间简单的一对一共享提供SSO(Single-Sign-On)认证服务, 这个就是Local KDC,简称LKDC.

对于KDC的作用, 以及Kerberos认证机制协议的详细内容,网上一大堆,当然最权威的还要说是麻省理工的官方网站了。

每一个苹果系统,都有自己的KDC(Key Distribution Center),当一个用户访问机器的一个服务时,向KDC请求,KDC根据用户的情况,发给他一个Key用于访问该服务。

在OS X系统初始化的时候,它会为本台电脑,生成一个证书,这个证书可以在system钥匙链中找到,如下图。它是使用SHA1加密的。



在钥匙链中的com.apple.kerberos.kdc证书中的最后的Fingerprints,可以看到SHA1加密的证书的字符形式,

在命令行中,怎么找到呢,既然本地用户要得到本地的认证,那么在用户信息中应该有体现,那么就找找看:
dscl . read /Users/$(users)
不难发现就在AuthenticationAuthority中就有相关的信息,那么:
dscl . read /Users/$(users) AuthenticationAuthority | grep $(users)@LKDC:
为了验证一个用户的认证域是不是本地,可以使用上面的命令。
上面的方法的限制:居于上面的分析,这个方法,只适用于OS X 10.5之后的系统,也就是支持LKDC的系统内。


LKDC用途:

OD在管理电脑帐户的时候也会使用机器本身的LKDC证书。在一台机器加入到OD的时候,虽然加入的时候使用的是机器名,但是苹果的OD也会使用机器本身的LKDC证书。比如laptopA电脑帐户在OD中的记录是:

1) laptopA$
2) laptopA.local$
3) LKDC:SHA1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$
最后的就是LKDC证书。这样有可能出现问题,比如,使用克隆的方式制作的内部系统镜像后,把这个系统应用到另外一台机器后,这两台机器会得到相同的LKDC证书,那么第二台相同LKDC证书的机器加入OD的时候,虽然两台机器使用不同的机器名,OD还会报错说具有相同LKDC证书的机器已经加入过了。这个证书和我们上面看到的com.apple.kerberos.kdc证书一模一样。

为了解决这个问题,使用下面的命令来重新生成一个,就可以解决问题了。
rm -fr /var/db/krb5kdc
/usr/libexec/configureLocalKDC

LKDC的用途不仅如此简单,当你使用在你的苹果机上登陆了Apple ID/iClound后,OS X使用LKDC证书来建立加密的IPSec连接,以实现基于广域Bonjour的临时应答式点对点的会话,这不仅限与屏幕和文件共享,从MobileMe就开始提供的远程控制你的Mac的功能-这个Mac的一个用户要与MobileMe/iCloud帐户关联,那么MobileMe/iCloud的帐户所有者就可以远程连接到该Mac.

找出所有的域:
还记得从前说过的金三角架构吧,就是AD-OD-Client架构的连接,也就是AD用户提供用户认证,OD提供用户/电脑配置管理的架构模式。就目前普遍的情况来说,苹果电脑的用户认证使用最多的就是AD, OD, Local这三个域,当然其它Linux/Unix的LDAPv3的实现,也是基于同样的原理,这里没有环境,所以只能就前面三个做试验。这三个域通过不同的组合实现在不同网络环境中的对客户端的管理。比如单独的AD, AD+Local(Mobile用户的一种), OD(苹果网络用户的一种),OD+Local, AD+OD, AD+OD+Local等等,管理员可以根据不同的管理需求和网络环境实施。
即便是同样的网络环境,基于管理的需求,也可能使用不同的方式。那么使用什么办法可以比较通用地解释当前电脑的连接域的实际情况呢?
通过尝试,使用odutil show nodenames可以把每个节点域的名称罗列出来,然后使用注入dscl命令就可以遍历访问所有节点域了。

下面就是一个比较普通的AD+OD+Local的节点域的例子:

Nodenames:

Name                                      State  Refs Type         External Locked Hidden 
----------------------------------------- ------ ---- ------------ -------- ------ ------ 
/Active Directory                         Online 2                          X      X      
/Active Directory/EDU                     Online 14                                       
/Active Directory/EDU/All Domains         Online 17   Virtual node                        
/Active Directory/EDU/Global Catalog      Online 18   Virtual node                 X      
/Active Directory/EDU/ebc.bc.com                 2    Virtual node                 X      
/Active Directory/EDU/edu.ebc.com         Online 15   Virtual node                 X      
/Active Directory/EDU/org.ebc.com         Online 5    Virtual node                 X      
/Active Directory/EDU/public.ebc.com             2
/Active Directory/EDU/tss.ebc.com                2    Virtual node                 X      
/Configure                                Online 1                          X      X      
/Contacts                                 Online 3                                        
/LDAPv3                                   Online 2                          X      X      
/LDAPv3/S379ees2.edu.ebc.com              Online 15                                       
/Local                                           2                          X      X      
/Local/Default                            Online 30                         X             
/NIS                                             1                          X      X      
/Search                                   Online 39                                       



Ref: 
LKDC question: http://www.afp548.com/forums/topic/lkdc-question/

Peer-To-Peer Kerberos: http://www.painless-security.com/blog/2007/10/31/p2p-kerberos

LKDC: http://dreness.com/wikimedia/index.php?title=LKDC

Back to My Mac: http://en.wikipedia.org/wiki/Back_to_My_Mac


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C++判断当前用户所属组

情景:A用B用户安装某服务。B用户必须有本地管理员和exchange 管理员权限。 解决方案:比较笨的方法,用CLR和。net的函数,上代码。 bool bRet = false; HANDL...

windows驱动里通过进程ID获得进程名和所属用户

在windows驱动中,通过 进程ID,可以获得进程完整路径和进程名, 也可以获得进程所属的用户名。 以下代码是整理出来完成这些功能的 两个实现函数。 // By fanxiushu 2013...

手机所属区域自动查询系统

  • 2012年12月09日 11:27
  • 1.05MB
  • 下载

查看文件夹大小及所属用户组

df -lh

修改已存在用户的所属组(usermod用法)

转载自:http://blog.163.com/zhzh_lin/blog/static/40538715200771503221224/ 修改使用者帐号   名称  usermod - 修 改...

Linux更改文件文件夹所属用户组(chgrp)

chown x:x ./xxx   更改所属用户组, chgrp 改变文件的用户组很简单,直接用chgrp即可,这个命令就是change group(改变用户组)的缩写。这样就很好记了。不过,请...
  • zhwei_87
  • zhwei_87
  • 2013年01月24日 16:26
  • 18082

Day15 - id 显示用户id及其所属群组id

指令名称 功能介绍 语法 参数介绍 基本使用 参考文献 1.《Linux指令从入门到精通》1.31...

Linux中用户权限与所属组问题

Linux系统中创建一个hadoop用户,在/etc/passwd路径下有该用户的信息:hadoop:x:500:500::/home/hadoop:/bin/bash对于一个具体的用户,所属用户组主...

linux 闲谈杂记1(查看,修改 用户所属的群组、设置linux的环境变量、ubuntu15.04更换源)

查看用户所属的群组:[groups -username] 修改用户所属的用户组:[usermod ]
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OSX: 判断用户/系统的所属域以及LKDC
举报原因:
原因补充:

(最多只允许输入30个字)