deployment/macos/mobiledevicemanagement/mobile_config_gen.py (23 lines of code) (raw):
#!/usr/bin/python
# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
# or more contributor license agreements. Licensed under the Elastic License
# 2.0; you may not use this file except in compliance with the Elastic License
# 2.0.
import sys
import uuid
import argparse
import os
template = """<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDescription</key>
<string></string>
<key>PayloadDisplayName</key>
<string>Privacy Preferences Policy Control</string>
<key>PayloadEnabled</key>
<true/>
<key>PayloadIdentifier</key>
<string>com.apple.TCC.configuration-profile-policy.{0}</string>
<key>PayloadOrganization</key>
<string>{6}</string>
<key>PayloadType</key>
<string>com.apple.TCC.configuration-profile-policy</string>
<key>PayloadUUID</key>
<string>{0}</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>Services</key>
<dict>
<key>SystemPolicyAllFiles</key>
<array>
<dict>
<key>Allowed</key>
<integer>1</integer>
<key>CodeRequirement</key>
<string>identifier "co.elastic.elastic-agent" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "2BT3HPN62Z"</string>
<key>Identifier</key>
<string>co.elastic.elastic-agent</string>
<key>IdentifierType</key>
<string>bundleID</string>
<key>StaticCode</key>
<integer>1</integer>
</dict>
<dict>
<key>Allowed</key>
<integer>1</integer>
<key>CodeRequirement</key>
<string>identifier "64_Bit_Endpoint_Macos" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "2BT3HPN62Z"</string>
<key>Identifier</key>
<string>/Library/Elastic/Endpoint/elastic-endpoint</string>
<key>IdentifierType</key>
<string>path</string>
<key>StaticCode</key>
<integer>1</integer>
</dict>
<dict>
<key>Allowed</key>
<integer>1</integer>
<key>CodeRequirement</key>
<string>identifier "co.elastic.systemextension" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "2BT3HPN62Z"</string>
<key>Identifier</key>
<string>co.elastic.systemextension</string>
<key>IdentifierType</key>
<string>bundleID</string>
<key>StaticCode</key>
<integer>1</integer>
</dict>
<dict>
<key>Allowed</key>
<integer>1</integer>
<key>CodeRequirement</key>
<string>identifier "co.elastic.endpoint" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "2BT3HPN62Z" </string>
<key>Identifier</key>
<string>co.elastic.endpoint</string>
<key>IdentifierType</key>
<string>bundleID</string>
<key>StaticCode</key>
<integer>1</integer>
</dict>
</array>
</dict>
</dict>
<dict>
<key>FilterBrowsers</key>
<true/>
<key>FilterDataProviderBundleIdentifier</key>
<string>co.elastic.systemextension</string>
<key>FilterDataProviderDesignatedRequirement</key>
<string>identifier "co.elastic.systemextension" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "2BT3HPN62Z"</string>
<key>FilterPacketProviderBundleIdentifier</key>
<string>co.elastic.systemextension</string>
<key>FilterPacketProviderDesignatedRequirement</key>
<string>identifier "co.elastic.systemextension" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "2BT3HPN62Z"</string>
<key>FilterPackets</key>
<true/>
<key>FilterSockets</key>
<true/>
<key>FilterType</key>
<string>Plugin</string>
<key>PayloadDisplayName</key>
<string>Web Content Filter Payload</string>
<key>PayloadIdentifier</key>
<string>com.apple.webcontent-filter.{1}</string>
<key>PayloadOrganization</key>
<string>{6}</string>
<key>PayloadType</key>
<string>com.apple.webcontent-filter</string>
<key>PayloadUUID</key>
<string>{1}</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>PluginBundleID</key>
<string>co.elastic.endpoint</string>
<key>UserDefinedName</key>
<string>ElasticEndpoint</string>
</dict>
<dict>
<key>AllowUserOverrides</key>
<true/>
<key>AllowedSystemExtensions</key>
<dict>
<key>2BT3HPN62Z</key>
<array>
<string>co.elastic.systemextension</string>
</array>
</dict>
<key>PayloadDescription</key>
<string></string>
<key>PayloadDisplayName</key>
<string>System Extensions</string>
<key>PayloadEnabled</key>
<true/>
<key>PayloadIdentifier</key>
<string>com.apple.system-extension-policy.{2}</string>
<key>PayloadOrganization</key>
<string>{6}</string>
<key>PayloadType</key>
<string>com.apple.system-extension-policy</string>
<key>PayloadUUID</key>
<string>{2}</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
<dict>
<key>NotificationSettings</key>
<array>
<dict>
<key>AlertType</key>
<integer>2</integer>
<key>BadgesEnabled</key>
<true/>
<key>BundleIdentifier</key>
<string>co.elastic.alert</string>
<key>CriticalAlertEnabled</key>
<true/>
<key>NotificationsEnabled</key>
<true/>
<key>ShowInLockScreen</key>
<true/>
<key>ShowInNotificationCenter</key>
<true/>
<key>SoundsEnabled</key>
<true/>
</dict>
</array>
<key>PayloadDisplayName</key>
<string>Notifications Payload</string>
<key>PayloadIdentifier</key>
<string>com.apple.notificationsettings.{3}</string>
<key>PayloadOrganization</key>
<string>{6}</string>
<key>PayloadType</key>
<string>com.apple.notificationsettings</string>
<key>PayloadUUID</key>
<string>{3}</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</array>
<key>PayloadDescription</key>
<string>Grants Elastic Agent the necessary permissions to secure your Mac</string>
<key>PayloadDisplayName</key>
<string>Elastic Agent Endpoint Configuration</string>
<key>PayloadEnabled</key>
<true/>
<key>PayloadIdentifier</key>
<string>{4}</string>
<key>PayloadOrganization</key>
<string>{6}</string>
<key>PayloadRemovalDisallowed</key>
<true/>
<key>PayloadScope</key>
<string>System</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>{5}</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>
"""
def main(argv):
output_file = str()
parser = argparse.ArgumentParser()
parser.add_argument("-n", "--name", help="The name of your company", action="store", required=True, type=str, dest="name")
parser.add_argument("-o", "--output", help="The absolute path to the mobileconfig that will be written out by this script", action="store", required=True, type=str, dest="output_file_path")
args = parser.parse_args()
output_file = args.output_file_path
# Ensure a directory is not specified
if os.path.isdir(output_file):
print("Please specify a file name in the output path")
exit(-1)
# Ensure the file ends with .mobileconfig extension
if output_file.endswith(".mobileconfig") == False:
output_file += ".mobileconfig"
with open(output_file, 'w', encoding='utf-8') as output_config_file:
pos_args = [str(uuid.uuid4()).upper() for _ in range ( 6)]
output_data = template.format(*pos_args, args.name)
output_config_file.write(output_data)
if __name__ == "__main__":
main(sys.argv[1:])