原创文章,如需转载请在下面留言让我知道。不留言不在开头标明出处链接的坏同学,1字1元索赔
引言
之前写了一篇文章讲了 MDM 的基本概念和原理,对大部分想了解一下 MDM 的同学应该足够了,但是如果你想要从 0 开始部署一套 MDM 的系统,还是比较复杂的,而且网络上的资料很少很分散,之前花了很长时间才搞清楚所有环节。今天我们来点干货,对照这份指南,你也可以部署一套自己的 MDM。记录下来也防止自己忘了,后面维护工作做起来比较顺畅。
上一篇文章已经讲过,命令需要通过 MDM 服务器通知 APNs,等待设备到 MDM 服务器上取命令然后执行。这里的 MDM 服务看起来非常关键,它的网络协议有兴趣可以看看。虽然可以选择收费的商业服务提供商,我们当然不会做这种事。本着多快好省的原则,开源方案是不二之选。
其实可选的开源方案不多,我选用的是 MicroMDM,公司内使用 MDM 的产品已经上线运行两年多,目前功能和稳定性都能满足我们的需求。下面涉及到 MDM 服务的部分,会以 MicroMDM 进行演示。
插播一条广告,对 iOS 相关技术有兴趣的同学可以私信我,拉你进某信群聊,简书评论区实在不方便交流。
先决条件
-
已经阅读了《iOS MDM 无敌入门&零基础搭建指南(上)》
-
苹果企业级开发者账号 (Apple Developer Enterprise Program),对,就是每年 299 美金那个 (如果没有,可以私我进群聊,问下群里有没有人愿意帮忙做你的 Vendor,详见下文申请 APNs 证书章节);
-
服务器,用于部署 MicroMDM,推荐用 linux 服务器,只是自己玩一玩的话也可以用 macOS 电脑;
-
macOS 电脑,本文中示例会用到 macOS 的应用程序;
-
域名和对应的 https 证书,用于 MicroMDM 服务和 APNs 、苹果设备之间的通信。这项条件必须具备,否则苹果设备不会和 MDM 服务进行通信;
-
苹果商务 (Apple Business Manager) 或 苹果校园账号 (Apple School),苹果校园我没接触过,苹果商务的账号是免费申请和使用的(具体操作可以参考我的另一篇文章 )。
上手
先把 MDM 服务跑起来
开始之前稍微了解下 MicroMDM 的大致结构,不然会有点懵,没有整体的结构性概念。
micromdm 架构
MicroMDM 主要包含两部分,一个是长期运行在服务器上的 MDM 服务,另一个是用于配置 MDM 服务的客户端(一般在管理员自己的办公电脑上运行,需要用的时候才运行一下)。前者对应的可执行文件名为micromdm,后者名为mdmctl. 两者之间一般不在同一台电脑上,所以它们之间的通信必须安全可靠,通信过程使用 api-key 进行安全认证。
下载 MicroMDM 之后,把可执行文件放到任意的路径下,然后使用下面的命令开始运行 MDM 服务:
sudo micromdm serve \
-server-url=https://my-server-url \
-api-key MySecretAPIKey \
-filerepo /path/to/pkg/folder \
-tls-cert /path/to/tls.crt \
-tls-key /path/to/tls.key
server-url
就是我们 MDM 服务器的域名,必须是 https 的;
api-key
的作用上面已经提到了,建议设置一个比较长的随机字符串,确保不要泄露;
filerepo
是 micromdm 命令可以读写的一个 MDM 服务器上的文件路径。用于存储安装到 iOS 或 macOS 设备上的应用安装包,如果不需要通过 InstallApplication 命令安装应用,可以不传;
tls-cert
和 tls-key
是 MDM 服务器中存储 https 证书的文件路径,证书应该是 PEM 编码的;
这里我直接用 shell 运行 micromdm 命令是为了方便演示和上手,如果要在生产环境使用 micromdm,可以考虑使用 systemd ;
配置 mdmctl
先要把 mdmctl 配置好,不然它根本找不到我们的 MDM 服务在哪。使用下面的命令,就配置好 mdmctl:
mdmctl config set \
-name production \
-api-token MySecretAPIKey \
-server-url https://my-server-url
api-token
和上面的 api-key
配置成一样的。
然后运行下面的命令,就可以让配置生效:
mdmctl config switch -name production
从参数看得出,mdmctl 支持通过 name
设置和切换多套配置。我们这里用 production 作为当前配置的名称。
配置 APNs 证书
至此,MDM 服务已经运行起来了,但是它的大部分功能还不能正常使用,因为我们还没有给他配置 APNs 证书。
之前我们已经了解了 APNs 证书的作用,实际上这里的 APNs 证书申请方法和一般的 App 消息推送的 APNs 证书是不一样的。这里是个难点,睁大眼睛 集中精神,开始吧。
申请 APNs 证书
这里一定要分清两个角色,Vendor
和 Customer
。Vendor 是拥有企业级应用开发者账号的人,Customer 是实际部署 MDM 的人(也就是拥有苹果商务或苹果校园账号的人),两个角色可以是同一个组织机构,也可以是不同的。苹果把流程设计得有点复杂,但独立的 Vendor 和 Customer 有个好处就是你可以作为 Vender 为其他组织机构提供 MDM 服务,你也可以作为 Customer 只是简单地使用第三方的 Vendor 为你提供的 MDM 服务。
-
【Vendor】默认情况下企业级开发者账号中是没有 MDM Vendor 相关功能的,所以账号管理员需要先在 https://developer.apple.com/contact/submit/ 提交申请,申请成为 MDM Vendor,一般来说一两天就会收到邮件回复。忘记当时申请内容具体是怎么写的了,大概意思就是我的企业需要使用 MDM 管理公司的 iPhone 资产之类的。收到邮件回复之后,再登录到开发者网站进入创建证书页面,证书可选的类型会多出一个 MDM CSR 选项,如下图:
成为 MDM Vendor
-
【Vendor】接下来就很简单了,和创建其他证书类似。在 macOS 的钥匙串中创建一个证书请求文件 CSR (文件名后缀为.certSigningRequest )上传上去,把 MDM CSR 证书创建好并下载到本地,下文我会把这个证书叫做
MDM Vender 证书
。 -
【Customer】然后 Customer (可能也是你) 需要用钥匙串应用创建一个证书请求文件 CSR,然后把 CSR 文件交给 Vendor,等待 Vendor 签名 CSR 文件。
-
【Vendor】Vendor 要用 MDM Vendor 证书给 Customer 的 CSR 文件签名,然后转换为 plist 格式文件。可以用开源工具 mdmvendorsign,类似这样:
cd path/to/mdmvendorsign
python mdm_vendor_sign.py --csr custom_CSR.certSigningRequest --mdm mdm_vendor.cer --key mdm_vendor_private.key
mdm_vendor_sign.py
是开源工具提供的脚本文件名
--csr
参数是 Customer 生成的 CSR 文件路径
--mdm
和 --key
参数是 MDM Vender 证书和私钥;
我们上面第2步已经讲过 Vendor MDM 证书如何创建和下载,此时把证书双击打开,证书会被安装到 macOS 中(注意:必须安装到创建 MDM Vendor CSR 的电脑中,因为证书关联的私钥存储在创建 CSR 的电脑钥匙串中),方便导出证书的私钥。然后到钥匙串应用中找到 MDM Vender: 开头的证书,证书项左侧应该有个小箭头,点击箭头可以看到和该证书关联的私钥,如果没有私钥说明上面第2步中的 MDM Vendor CSR 不是你创建的。右键点击证书项目,将证书和私钥导出为 p12 文件,可以加个密码,防止私钥被泄露。最后使用 openssl 命令行工具把 p12 文件中的私钥导出:
openssl pkcs12 -in /path/to/MDM_Vendor.p12 -nocerts -nodes -out /path/to/mdm_vendor.key
至此,我们就获取到了 Vendor MDM 私钥,再加上第2步创建的证书,就可以为 Customer 签名 CSR 了。上面的 mdm_vendor_sign.py 脚本运行成功后会在当前文件夹生成一个 encoded_plist
文件。
由于苹果最近更新了证书链,你可能需要手动把 mdmvendorsign 中的 python 脚本需要做一些修改,搜索脚本中的
intermediate_cer
变量,将其 url 修改为苹果最新证书下载地址https://www.apple.com/certificateauthority/AppleWWDRCAG3.cer
。如果不做该修改,Customer 申请 APNs 证书时可能会提示签名错误。
-
【Customer】使用 Vender 签名过的 CSR 文件申请 APNs 推送证书。Customer 从 Vender 手里拿到 encoded_plist 文件,上传到 identity.apple.com 即可下载到 APNs 证书,如下图:
identity.apple.com 网站截图
上传推送证书到服务器
Customer 双击 APNs 证书文件,将证书安装到创建 Customer CSR 的同一个 macOS 的钥匙串中(方便导出证书对应的私钥),然后在钥匙串中可以看到 APSP:
开头的证书。这个证书项目前面同样会有有个小箭头,说明这台电脑的钥匙串中同时存在 APNs 推送证书以及证书的私钥。邮件点击该证书,导出为带私钥的 p12 文件。
虽然我们已经有了 APNs 证书、存储有 APNs 证书和私钥的 p12 文件,但把它上传到 MDM 服务之前,还要把文件格式转换一下:
openssl pkcs12 -in /path/to/customer_mdm_apns.p12 -nocerts -nodes -out customer_apns_pkcs8.key
openssl rsa -in costomer_apns_pkcs8.key -out customer_apns_pkcs1.key
上面两个命令是把推送证书 p12 中的私钥提出,并转换为 pkcs#1 格式。
把从 identity.apple.com 下载到的 APNs 证书和刚刚导出的 pkcs#1 私钥上传到 MDM 服务中:
mdmctl mdmcert upload \
-cert path/to/customer_mdm_apns_certificate.pem \
-private-key path/to/customer_apns_pkcs1.key \
-password=secret
如果你发现上面这个命令会持续很长时间,最后报超时错误,可能需要检查一下你的 MDM 服务器防火墙是否允许来自 443 端口的访问。
使用 mdmctl 把证书和私钥上传到 MDM 服务器之后,micromdm 会把这些文件都存储好。
APNs 证书有效期一年,所以每年都需要更新!如果你正准备更新证书,一定要在 APNs 网站中点击更新,不要重新创建新的推送证书!
配置苹果商务 (DEP)
配置 DEP 是可选步骤,如果不需要用相关的话,可以跳过这个章节。 DEP (Device Enrollment Program) 是一种把设备加入到 MDM 管理的方式。从苹果官方或授权经销商购买设备,设备开箱后直接自动注册到 MDM 中,无需任何人提前进行任何操作。非常适合大批量采购苹果设备的组织,可以节省很多设备注册到 MDM 的时间和人力成本。 本文不过多介绍(因为我也没用过...)。其他将设备注册到 MDM 的方式请参考下个章节。
使用下面的命令创建一个公钥文件
mdmctl get dep-tokens -export-public-key /tmp/DEPPublicKey.pem
参考苹果商务官方文档,将公钥上传到苹果商务后,下载服务器 DEP token;
通过下面的命令把服务器 token 上传到 MDM 服务:
mdmctl apply dep-tokens \
-import /path/to/Some_Server_Token_smime.p7
-
服务器 token 需要每年更新;
-
重启 MDM 服务
至此,MicroMDM 就配置好了,最好把 MDM 服务重启一下再继续后面的工作。
把设备注册到 MDM
设备注册(Enrollment)方法主要有3种,都需要设备安装一个MDM Configuration Profile:
-
DEP:上面已经提到过这种方式,DEP 的具体使用问题可以参考下苹果的文档,我没有用过这种方式,所以对细节不是很了解。这种方式支持将设备设置为受监督的;
-
手动安装:可以邮件发送给用户,或让用户通过浏览器下载安装 MDM 配置的描述文件。这种方式不支持将 iOS/iPadOS 设备配置为受监督的,上一篇文章介绍过,比如远程锁定、定位、抹除设备这种权限比较敏感的命令或配置只支持那些受监督的设备,macOS/AppleTV 设备具体情况不是很清楚,需要读者自己探索一下。
-
Apple Configurator 2:这是一款苹果官方出品的 macOS 端应用,包括 GUI 和命令行工具,我用的就是这种方式,支持将设备设置为受监督的。这种方式支持 iPhone/iPad/iPod Touch/AppleTV 设备,需要将设备通过 USB 数据线连接到 Mac 上。
这里我主要讲讲第三种方式。注册到 MDM 需要安装一个 MDM 配置描述文件,除了上面第二种方法,其他方法的描述文件都是保存在 MDM 服务器上的,在注册到 MDM 的过程中,设备会自动去下载安装。MicroMDM 已经为我们默认生成了一个包含所有权限且未签名的描述文件,URL 是 MDM 服务器的 /mdm/enroll 。下载默认的描述文件之后,对其进行修改和签名(只想跑个 demo 的话就不需要签名了),然后通过下面的命令将描述文件更新到 MDM 服务器中:
mdmctl apply profiles -f /path/to/enroll.mobileconfig
此时再访问https://yourServer.com/mdm/enroll,下载到的就是更新后的描述文件了。
Apple Configrator 2 注册 MDM
我这里用一台 iPad 进行演示。在 Apple Configurator 2 (建议从 Mac App Store 安装)中选中设备,点击工具栏的 “准备” 按钮。我选择了手动配置方式,如果选择自动配置方式,会用 DEP 的方式把我们接下来手动配置的选项全部自动获取到。
在 Apple Configurator 2 中“准备”设备
这里的配置可以自己尝试一下,主要是留意一下 “监督设备” 选项,这个就是我们频繁提到的 受监督。 下一步。
选择 MDM 服务器选择 MDM 服务器,如果没添加过,会提示新建服务器
主要留意 URL 要填写我们 MDM 服务器下载配置描述文件的地址(默认为 mdm/enroll)。 下一步。
接下来选择监管组织,也就是 Customer 的苹果商务管理或苹果校园 所对应的组织,填写登录用户名和密码。
选择 MDM 组织
再接下来是选择要显示的用户设置引导步骤、配置要连接的 Wi-Fi 描述文件。之所以需要配置 Wi-Fi 描述文件,是因为需要抹掉设备所有数据和设置!,抹掉之后的设备可以自动连接到 Wi-Fi 并完成后续的联网注册工作。当然,也可以在抹掉设备之后手动连上 Wi-Fi,不使用描述文件。
因为设备配置为
受监管
的,就必须完全抹掉或者设备处于设置引导状态,总之不能是已经进入桌面的状态,我也很不理解这一点,但苹果就是这么规定的,如果有同学发现不需要抹掉的方法,请留言让大家了解一下情况。
练练手,重启一下设备
MDM 服务的 /v1/commands 接口是接收设备命令的 URL,我们做个简单的实验,测试一下完整的流程是否已经走通。
向 MDM 服务发送一个 POST 请求,获取设备上安装的所有应用:
curl -X 'POST' -u "micromdm:MySecretAPIKey" -d '{"udid": "00008110-000208993EA1801E", "request_type": "RestartDevice"}' https://yourServer.com/v1/commands
MySecretAPIKey
替换为你的 Api Key;
结语
限于篇幅,有些步骤不是十分详细,但从头至尾的整体过程基本都已经包含了。MDM 相关的内容非常多,还有些没有涉及到的内容,比如 DEP、MDM 命令、描述文件内容等等,可以参考下列链接继续探索。也欢迎简书私信我拉你进群聊。
https://github.com/micromdm/micromdm
https://developer.apple.com/documentation/devicemanagement
https://support.apple.com/guide/apple-business-manager/welcome/web
https://developer.apple.com/business/documentation/MDM-Protocol-Reference.pdf
网友评论