OSX:笔记-客户端对目录服务的支持

浏览:
字体:
发布时间:2013-12-21 10:33:00
来源:东方联盟

自从10.7系统之后,苹果系统内核也有了个大改变,比如客户端用户认证的服务,10.5和10.6的时候统管叫做DirectoryServices,10.7之后改称为使用OpenDirectoryd服务,当然了在10.4及其之前使用NetInfo用于用户认证以及系统配置等等,不过由于NetInfo本身的限制,另Apple转移到开放目录。这种重大改变也秉承了苹果系统之传统,在用户级别上给普通用户的使用体验上没有太大影响的同时,系统内部却会大刀阔斧地进行改变。这些系统级别的改变虽然对最终用户的影响不大,不过却常常给系统管理带来一些麻烦,这主要是因为在系统管理中不会仅仅使用Apple所提供的GUI的方式,无论是bash还是python,perl脚本才是最经常使用的,从管理的角度来说苹果的兼容性的确不如Windows,很明显的一个例子,摒弃了NetInfo致使原来的系统管理方式发生根本变化,小的方面,诸如系统登陆界面的背景,也会是不同版本不同的方式,而且它至今也没有固定下来,真不明白,这些小的细节有什么可以被神秘的。系统大的变化文档一些可以在man中找到。

说回OpenDirectoryd服务,这不仅仅是从名称上的改变,在集成到现有的目录服务系统的实践中还是有一些改变的,当初也为企业管理带来了不小的麻烦,想当初在10.7的时候,会带来一些不习惯,比如bind和unbind的时候,设置管理用户组时要使用//,后来到了10.8就更接近使用习惯了,使用/就可以了;如果计算机名中有"-"减号,Directory Utility居然会默认改变为"_"下划线,这如果没有被注意,那么bind的时候肯定会出问题;而且unbind的时候也方便了,当然,命令行也方便多了。

通过现在的OpenDirectoryd内核,系统级别上相比较之前,从底层上更好的支持对于Active Directory | LDAP | Local Database | NIS等等目录服务系统的连接和配置,这也为OS X更好地融入到Active Directory目录服务系统中提供了坚实的基础。而LDAP主要是对于诸如苹果服务器上所支持的Open Directoryd目录服务的,当然也可以用于其他符合LDAP/X500标准的轻量目录服务系统,这得益于它的定制化能力。

基于Apple的官方文档,10.9中的opendirectoryd支持模块,这是与DirectoryServices的重要不同之处。一个模块在私有空间运行,使用XPC与opendirectoryd通讯,所以它的崩溃不会影响其他模块以及opendirectoryd本身,并且

odutil命令:

为了与OpenDirectryd服务进行配置,需要使用命令行odutil,当初NetInfo时,使用的命令叫做niutil,可以看出这种命名规范还是没有改变的。

odutil命令主要是用于状态监测和配置opendirectoryd服务。因为具体到不同的目录服务,比如Active Directory,可以使用dsconfigad来配置,而LDAPv3使用dsconfigldap来控制客户端,一般情况下,不用odutil来变更它的具体配置,而设置opendirectoryd的日志级别用于排错是最常见的情况。
调试 odutil set log debug命令用来设置调试信息,无论是调试Open directory插件, 还是监测配置情况,或者排除配置错误都是有用的。用命令: odutil set log default来设置到默认设置。
有的时候可能需要清空opendirectoryd的缓存,可以使用odutil reset cache. 缓存的内容在后面可以看到。
节点配置:配置每个模块和节点的配置信息,如果不是特别熟悉,可以组合下面两个命令一边学习一边操作: odutil show configuration <node name> [module <modulename>] [option <option> value] odutil set configuration <node name> [module <modulename>] [option <option> <value>]
第一个可以显示现在的配置信息,后面的命令可以改变。
比如,显示我当前机器的Active Directory中节点Edu的配置信息:
$ odutil show configuration "/Active Directory/ORG"{    "module options" =     {        ActiveDirectory =         {            "admin group list" =             (                "ORG//WSAdmins_L",                "ORG//CS_ITS_G"            );            "admin group list enabled" = 1;            "allow multi-domain" = 1;            "cache last user logon" = 1;            "cache last user warning" = 0;            "default user shell" = "/bin/bash";            "default user shell enabled" = 1;            domain = "org.youcompany.com";            "force home local" = 1;            forest = "youcompany.com";            "generate authentication authority" = 1;            "managed client template" =             {                "mcx_application_data" =                 {                    "com.apple.MCX" =                     {                        Forced =                         (                                                        {                                "mcx_precedence" = 500;                                "mcx_preference_settings" =                                 {                                    "com.apple.cachedaccounts.CreateAtLogin" = 1;                                    "com.apple.cachedaccounts.WarnOnCreate" = 1;                                };                            }                        );                    };                    "com.apple.dock" =                     {                        Forced =                         (                                                        {                                "mcx_precedence" = 500;                                "mcx_preference_settings" =                                 {                                    "AppItems-Raw" =                                     (                                    );                                    "DocItems-Raw" =                                     (                                    );                                    "MCXDockSpecialFolders-Raw" =                                     (                                        AddDockMCXOriginalNetworkHomeFolder                                    );                                };                                "mcx_union_policy_keys" =                                 (                                                                        {                                        "mcx_input_key_names" =                                         (                                            "AppItems-Raw"                                        );                                        "mcx_output_key_name" = "static-apps";                                        "mcx_remove_duplicates" = 1;                                    },                                                                        {                                        "mcx_input_key_names" =                                         (                                            "DocItems-Raw"                                        );                                        "mcx_output_key_name" = "static-others";                                        "mcx_remove_duplicates" = 1;                                    },                                                                        {                                        "mcx_input_key_names" =                                         (                                            "MCXDockSpecialFolders-Raw"                                        );                                        "mcx_output_key_name" = MCXDockSpecialFolders;                                        "mcx_remove_duplicates" = 1;                                    }                                );                            }                        );                    };                    loginwindow =                     {                        Forced =                         (                                                        {                                "mcx_precedence" = 500;                                "mcx_preference_settings" =                                 {                                    "AutoLaunchedApplicationDictionary-raw" =                                     (                                                                                {                                            AuthenticateAsLoginUserShortName = 1;                                            "MCX-NetworkHomeDirectoryItem" = 1;                                        }                                    );                                };                                "mcx_union_policy_keys" =                                 (                                                                        {                                        "mcx_input_key_names" =                                         (                                            "AutoLaunchedApplicationDictionary-raw"                                        );                                        "mcx_output_key_name" = "AutoLaunchedApplicationDictionary-managed";                                        "mcx_remove_duplicates" = 1;                                    }                                );                            }                        );                    };                };            };            "mount home as sharepoint" = 1;            "mount style" = smb;            "reject MD5 servers" = 0;            "require sign or seal" = 1;            "require strong key" = 0;            "seal secure channel" = 1;            "sign secure channel" = 1;            "trust domain" = "org.youcompany.com";            "trust password change in days" = 14;            "use Windows UNC path" = 1;        };    };    "node name" = ORG;    options =     {        "connection idle disconnect" = 90;        "connection setup timeout" = 10;        "man-in-the-middle" = 1;        "no cleartext authentication" = 1;        "packet encryption" = 0;        "packet signing" = 0;        "query timeout" = 30;    };    template = "Active Directory";    trustaccount = "w430-275$";    trustkerberosprincipal = "430-275$@ORG.youcompany.com";    trustoptions =     (        "system keychain"    );    trusttype = joined;    "virtual subnodes" =     (        "All Domains"    );}

其中主要的node name, Options, Virtual subnotes是比较重要的。
更有用的命令: odutil show [nodes | cache | nodenames | statistic | all]
统计信息:如果想看他的统计信息,首先要打开统计功能(odutil set statistic on)。统计信息可以显示各种目录服务的耗时,主要是三个部分:Kernal, User和Queries, 这在调试查找系统缓慢原因时还是挺有用的。比如它会显示:
$ odutil show statisticsStatistics:Report for Kernel=================Counters:    Translation (Cache Hit) - 5914    Translation (Cache Miss) - 16    Membership Checks (Cache Hit) - 1452    Membership Checks (Cache Miss) - 79Translation (Cache Hit) metrics:               10%  20%  30%  40%  50%  60%  70%  80%  90%  100%           +----+----+----+----+----+----+----+----+----+----+     1 us  |*********     2 us  |**     4 us  |************     8 us  |*************    16 us  |**********    32 us  |*Membership Checks (Cache Miss) metrics:               10%  20%  30%  40%  50%  60%  70%  80%  90%  100%           +----+----+----+----+----+----+----+----+----+----+     4 ms  |*****     8 ms  |**********    16 ms  |***    32 ms  |*********    64 ms  |*****   128 ms  |   256 ms  |*   512 ms  |****     1 s   |*****     2 s   |*     4 s   |*     8 s   |*Report for Userland=================Counters:    Translation (Cache Hit) - 5591    Translation (Cache Miss) - 4    Membership Checks (Cache Hit) - 3321    Membership Checks (Cache Miss) - 51    GetGrouplist (Cache Hit) - 320    GetGrouplist (Cache Miss) - 15GetGrouplist (Cache Hit) metrics:               10%  20%  30%  40%  50%  60%  70%  80%  90%  100%           +----+----+----+----+----+----+----+----+----+----+     1 us  |     2 us  |*     4 us  |***********************     8 us  |*******************    16 us  |****    32 us  |*    64 us  |GetGrouplist (Cache Miss) metrics:               10%  20%  30%  40%  50%  60%  70%  80%  90%  100%           +----+----+----+----+----+----+----+----+----+----+     8 ms  |****************    16 ms  |**********    32 ms  |    64 ms  |   128 ms  |*************   256 ms  |   512 ms  |***     1 s   |***     2 s   |***Report for Queries=================Counters:    Total Queries - 6271    Failed Queries - 3423    GroupMembership - 172    GroupMembers - 79    NestedGroups - 7245GroupMembers metrics:               10%  20%  30%  40%  50%  60%  70%  80%  90%  100%           +----+----+----+----+----+----+----+----+----+----+     2 ms  |     4 ms  |********     8 ms  |********    16 ms  |*    32 ms  |*    64 ms  |********   128 ms  |******   256 ms  |   512 ms  |**     1 s   |*****     2 s   |***     4 s   |NestedGroups metrics:               10%  20%  30%  40%  50%  60%  70%  80%  90%  100%           +----+----+----+----+----+----+----+----+----+----+   256 us  |   512 us  |     1 ms  |*     2 ms  |     4 ms  |     8 ms  |    16 ms  |******************************    32 ms  |*********    64 ms  |***   128 ms  |
这里只是选取了一些比较缓慢的请求统计。可以看出,不在缓存中而且是组/嵌套组查询会非常耗时,不过还不算太坏,这与AD服务器配置和性能息息相关,除了增加缓存击中率外,客户端基本上没有可优化的。

节点名称列表:这个更加有用,比如当你不知道该电脑都连接了那些目录服务,那么就用这条命令: odutil show nodenames
$ odutil show nodenamesNodenames:Name                                           State  Refs Type         External Locked Hidden ---------------------------------------------- ------ ---- ------------ -------- ------ ------ /Active Directory                              Online 2                          X      X      /Active Directory/ORG                          Online 17                                       /Active Directory/ORG/All Domains              Online 21   Virtual node                        /Active Directory/ORG/Global Catalog           Online 21   Virtual node                 X      /Active Directory/ORG/youcompany.com           Online 8    Virtual node                 X      /Active Directory/ORG/org.youcompany.com       Online 24   Virtual node                 X      /Active Directory/ORG/public.youcompany.com    Online 4    Virtual node                 X      /Configure                                     Online 1                          X      X      /Contacts                                      Online 4                                        /LDAPv3                                        Online 1                          X      X      /Local                                                2                          X      X      /Local/Default                                 Online 53                         X             /NIS                                                  1                          X      X      /Search                                        Online 94                                    
这样,就明确知道,这台机器连接到Active Directory, 域是ORG, 其它的虚拟节点,一般用不到。之后就可以用dscl来查询用户/组等等信息了。

缓存caches: 上面多处提到过缓存,那么这个命令可以看看缓存里都有什么: odutil show cache 它缓存的内容主要包括5个部分:User Entries, Group Entries, LibInfo, Global HashTable Counts, 和Defaults。其中LibInfo主要包括各种服务信息,而最有用的要说User和Group Entries,这里面有缓存的一些本地和AD域用户/用户组的信息。比如:
    {      "Libinfo": {        "pw_gid": 24,        "pw_passwd": "*",        "pw_uid": "24",        "pw_gecos": "Network Services",        "pw_name": "_networkd",        "pw_shell": "/usr/bin/false",        "pw_dir": "/var/empty",        "pw_uuid": FFFFEEEE-1111-222-3333-000000000000      },      "Member Of": [        "065C3919-0000-4444-0000-CDEF000000E1",        "ABCDEFAB-0001-ABCD-EFAB-CDEF00000000",        "ABCDEFAB-0001-ABCD-EFAB-CDEF00000001",        "ABCDEFAB-0001-ABCD-EFAB-CDEF00000002",        "D7306BDC-0011-4444-0000-CDEF000000E0"      ],      "Membership Phase": "Pending Network Direct Member Query",      "Found By": [        "Name",        "ID",        "UUID",        "SID"      ],      "Expires": "13071",      "Last Refresh": "1329",      "Last Access": "627",      "Entry Flags": [        "Local",        "Membership Refresh Required"      ],      "Node": "/Local/Default",      "Names": [        "_networkd"      ],      "NFSv4": [        "_networkd@430-275.local"      ],      "ID": "24",      "UUID": "FFFFEEEE-1111-2222-3333-000000000000",      "SID": "S-1-5-21-3838272839-0101010101-1898976543-1111",      "RefCount": "5",      "Detail Flags": "0x000009F1"    },
可以得到用户的UUID, SID, name, 用户文件夹位置等等。

不过要想使用bash命令行来处理这些并不容易,这些内容都是用JSON格式显示的,在Mac上使用plist的XML格式最容易操作,所以需要把JSON转化过来,内置的命令plutil可以做到。不过,由于各种原因,Apple生成的JSON格式可能并不严格符合规范,所以直接处理导致plutil异常退出。比如上面的 "pw_uuid": FFFFEEEE-1111-2222-333-000000000000 一行,右边的会被认为是数字处理,导致出错。有的时候可能还要借用第三方工具,比如jq,以彻底纠正OS X所生成的错误JSON格式. 比如在字符串中存在有特殊字符的情况。在我的网络环境中,从AD得来的一个用户组的Membership Phase中,有个Line Feed(0x0A)字符,也会导致plutil出错。那么下面的命令行可以处理这些问题。
odutil show cache > ~/Desktop/odutilCache.txtsed -i 's/ : /([A-Z0-9-]*/),/ : "/1",/g' ~/Desktop/odutilCache.txtcat ~/Desktop/odutilCache.txt | jq '.' >jq.txtplutil -covert xml1 jq.txt -o jq.plist
这样就可以使用Property List Editor来方便编辑了。
>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 下载 | 关于东盟 | 安全雇佣 | 搞笑视频大全 | 微信学院 |
关于我们 | 联系我们 | 广告服务 | 人才招聘 | 服务条款 | 免责申明 | 帮助中心 | 作品发布 | 网站地图 | 技术培训
Copyright © 2007 - 2018 Vm888.Com. All Rights Reserved
东方联盟 版权所有