OSX:笔记-客户端对目录服务的支持
自从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来方便编辑了。
- 07-30如何用u盘重装win10系统
- 07-30bios设置u盘启动
- 07-30技嘉主板bios如何设置u盘启动项
- 12-22开源视频平台:MediaCore(MediaDrop)
- 12-22JVMjavacore和heapdump文件生成选项
- 12-22使用飞信机器人发短信需要开放的端口
- 12-22TCP连接的三次握手--一次故障记录
- 12-22磁盘管理之一 逻辑卷管理
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 12-05亚马逊推出新一代基础模型 任意模态生成大模
- 12-05OpenAI拓展欧洲业务 将在苏黎世设立办公室
- 12-05微软质疑美国联邦贸易委员会泄露信息 督促其
- 12-05联交所取消宝宝树上市地位 宝宝树:不会对公
- 12-04企业微信致歉:文档打开异常已完成修复