mirror of
https://github.com/fleetdm/fleet
synced 2026-05-24 01:18:42 +00:00
Remove very old and outdated MDM docs (#16043)
Running some cleanup of very old docs around initial MDM implementation.
This commit is contained in:
parent
3b2e97db89
commit
e466b569d4
3 changed files with 0 additions and 387 deletions
|
|
@ -1,205 +0,0 @@
|
||||||
# Apple MDM Fleet Demo
|
|
||||||
|
|
||||||
## 0. Architecture
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
flowchart LR
|
|
||||||
|
|
||||||
subgraph Fleet [Fleet Server]
|
|
||||||
direction TB;
|
|
||||||
subgraph apiEndpoints ["Admin API endpoints"]
|
|
||||||
api["/api/_version_/fleet/mdm/apple/enrollmentprofiles
|
|
||||||
/api/_version_/fleet/mdm/apple/enqueue
|
|
||||||
/api/_version_/fleet/mdm/apple/commandresults
|
|
||||||
/api/_version_/fleet/mdm/apple/installers
|
|
||||||
/api/_version_/fleet/mdm/apple/devices
|
|
||||||
/api/_version_/fleet/mdm/apple/dep/devices"];
|
|
||||||
end
|
|
||||||
subgraph deviceEndpoints ["Apple Device Endpoints"];
|
|
||||||
enroll[".mobileconfig<br>/api/mdm/apple/enroll"];
|
|
||||||
installer[".mobileconfig<br>/api/mdm/apple/installer"];
|
|
||||||
end
|
|
||||||
subgraph nanoMDMModules ["nanoMDM modules"]
|
|
||||||
direction TB;
|
|
||||||
nanoSCEP["nanoSCEP<br>/mdm/apple/scep"];
|
|
||||||
nanoMDM["nanoMDM<br>/mdm/apple/mdm"];
|
|
||||||
nanoDEP["nanoDEP"];
|
|
||||||
end
|
|
||||||
fleetDB[(Fleet DB)];
|
|
||||||
end
|
|
||||||
|
|
||||||
ApplePush[https://api.push.apple.com];
|
|
||||||
AppleDEP[https://mdmenrollment.apple.com];
|
|
||||||
nanoDEP -- Apple MDM DEP API ----> AppleDEP;
|
|
||||||
nanoMDM --> ApplePush;
|
|
||||||
|
|
||||||
nanoSCEP --> fleetDB
|
|
||||||
nanoDEP --> fleetDB;
|
|
||||||
nanoMDM --> fleetDB;
|
|
||||||
```
|
|
||||||
|
|
||||||
## New Fleet Endpoints
|
|
||||||
|
|
||||||
1. API endpoints
|
|
||||||
- Path: `/api/_version_/fleet/mdm/apple/*`
|
|
||||||
- Authentication: Fleet admin authenticated
|
|
||||||
|
|
||||||
2. MDM protocol endpoints
|
|
||||||
- Path: `/mdm/apple/scep` and `/mdm/apple/mdm`.
|
|
||||||
- Authentication: MDM authentication.
|
|
||||||
|
|
||||||
3. Enroll endpoint
|
|
||||||
- Path: `/api/mdm/apple/enroll?token=`
|
|
||||||
- Authentication: A token is provided via a query parameter. SSO may be added later.
|
|
||||||
|
|
||||||
4. Installers URL (on manifest)
|
|
||||||
- Path: `/api/mdm/apple/installer?token=`
|
|
||||||
- Authentication: Secret token is provided via a query parameter.
|
|
||||||
|
|
||||||
## 1. Setup APNS Push Certificate and Key
|
|
||||||
|
|
||||||
From https://developer.apple.com/account, download push certificate and private key to:
|
|
||||||
- ~/mdm-apple-test/mdmcert.download.push.pem
|
|
||||||
- ~/mdm-apple-test/mdmcert.download.push.key
|
|
||||||
|
|
||||||
What we did for this test is:
|
|
||||||
- Zach has an account in https://mdmcert.download/
|
|
||||||
- Generate CSR with `mdmctl mdmcert.download -new -email=zach@fleetdm.com` (this step generates a private key too, place it in `~/mdm-apple-test/mdmcert.download.push.key`)
|
|
||||||
- Zach received a certificate `mdm_signed_request.20220712_121945_1267.plist.b64.p7`
|
|
||||||
- Decrypt the received CSR with `mdmctl mdmcert.download -decrypt=~/Downloads/mdm_signed_request.20220712_121945_1267.plist.b64.p7`
|
|
||||||
- Zach uploads the decrypted CSR to identity.apple.com and downloads the final certificate.
|
|
||||||
- Place certificate in `~/mdm-apple-test/mdmcert.download.push.pem`
|
|
||||||
|
|
||||||
## 2. SCEP setup
|
|
||||||
|
|
||||||
```sh
|
|
||||||
fleetctl apple-mdm setup scep \
|
|
||||||
--validity-years=1 \
|
|
||||||
--cn "Acme" \
|
|
||||||
--organization "Acme Inc." \
|
|
||||||
--organizational-unit "Acme Inc. IT" \
|
|
||||||
--country US
|
|
||||||
Successfully generated SCEP CA: fleet-mdm-apple-scep.crt, fleet-mdm-apple-scep.key.
|
|
||||||
Set FLEET_MDM_APPLE_SCEP_CA_CERT_PEM=$(cat fleet-mdm-apple-scep.crt) FLEET_MDM_APPLE_SCEP_CA_KEY_PEM=$(cat fleet-mdm-apple-scep.key) when running Fleet.
|
|
||||||
```
|
|
||||||
|
|
||||||
## 3. DEP setup
|
|
||||||
|
|
||||||
1. Init:
|
|
||||||
```sh
|
|
||||||
fleetctl apple-mdm setup dep init
|
|
||||||
Successfully generated DEP public and private key: fleet-mdm-apple-dep.crt, fleet-mdm-apple-dep.key
|
|
||||||
Upload fleet-mdm-apple-dep.crt to your Apple Business MDM server. (Don't forget to click "Save" after uploading it.)%
|
|
||||||
```
|
|
||||||
2. Copy file to ~/Downloads for easy access when uploading to Apple:
|
|
||||||
```sh
|
|
||||||
cp fleet-mdm-apple-dep.crt ~/Downloads/
|
|
||||||
```
|
|
||||||
3. In https://business.apple.com:
|
|
||||||
1. Under "Preferences" (which can be accessed via the upper-right dropdown menu), select your MDM server in "Your MDM Servers".
|
|
||||||
2. Click "Edit" and upload the generated `fleet-mdm-apple-dep.crt`.
|
|
||||||
3. Then download DEP token to a file named `./dep_encrypted_token.p7m`:
|
|
||||||
```sh
|
|
||||||
cp ~/Downloads/YourMDMServer_Token_2022-09-02T17-13-49Z_smime.p7m ./dep_encrypted_token.p7m
|
|
||||||
```
|
|
||||||
4. Finalize:
|
|
||||||
```sh
|
|
||||||
fleetctl apple-mdm setup dep finalize \
|
|
||||||
--certificate ./fleet-mdm-apple-dep.crt \
|
|
||||||
--private-key ./fleet-mdm-apple-dep.key \
|
|
||||||
--encrypted-token ./dep_encrypted_token.p7m
|
|
||||||
Successfully generated token file: fleet-mdm-apple-dep.token.
|
|
||||||
Set FLEET_MDM_APPLE_DEP_TOKEN=$(cat fleet-mdm-apple-dep.token) when running Fleet.
|
|
||||||
```
|
|
||||||
|
|
||||||
## 4. Run Fleet behind ngrok
|
|
||||||
|
|
||||||
Fleet needs to run behind TLS with a valid certificate (otherwise Apple devices won't trust it).
|
|
||||||
|
|
||||||
```sh
|
|
||||||
ngrok http https://localhost:8080
|
|
||||||
```
|
|
||||||
|
|
||||||
## 5. Run Fleet
|
|
||||||
|
|
||||||
```sh
|
|
||||||
FLEET_MDM_APPLE_SCEP_CHALLENGE=scepchallenge \
|
|
||||||
FLEET_MDM_APPLE_SCEP_CA_CERT_PEM=$(cat fleet-mdm-apple-scep.crt) \
|
|
||||||
FLEET_MDM_APPLE_SCEP_CA_KEY_PEM=$(cat fleet-mdm-apple-scep.key) \
|
|
||||||
FLEET_MDM_APPLE_DEP_TOKEN=$(cat fleet-mdm-apple-dep.token) \
|
|
||||||
FLEET_MDM_APPLE_MDM_PUSH_CERT_PEM=$(cat ~/mdm-apple-test/mdmcert.download.push.pem) \
|
|
||||||
FLEET_MDM_APPLE_MDM_PUSH_KEY_PEM=$(cat ~/mdm-apple-test/mdmcert.download.push.key) \
|
|
||||||
./build/fleet serve --dev --dev_license
|
|
||||||
```
|
|
||||||
|
|
||||||
Run the setup as usual (you will need a user for administrative commands below):
|
|
||||||
|
|
||||||
```sh
|
|
||||||
fleetctl setup \
|
|
||||||
--email foo@example.com \
|
|
||||||
--name Gandalf \
|
|
||||||
--password p4ssw0rd.123 \
|
|
||||||
--org-name "Fleet Device Management Inc."
|
|
||||||
```
|
|
||||||
|
|
||||||
Note, you will need to update the `server_settings.server_url` after setup and whenever you restart `ngrok`. This can be done with `fleetctl apply`.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
cat <<EOF > config.yaml
|
|
||||||
apiVersion: v1
|
|
||||||
kind: config
|
|
||||||
spec:
|
|
||||||
server_settings:
|
|
||||||
server_url: "{{ngrok url}}"
|
|
||||||
EOF
|
|
||||||
fleetctl apply -f config.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
## 6. Create manual enrollment
|
|
||||||
|
|
||||||
```sh
|
|
||||||
fleetctl apple-mdm enrollment-profiles create-manual
|
|
||||||
Manual enrollment created, URL: https://{{ngrog url}}/api/mdm/apple/enroll?token={{token}}.
|
|
||||||
```
|
|
||||||
|
|
||||||
## 7. Create automatic (DEP) enrollment profile
|
|
||||||
|
|
||||||
There is a sample dep profile available at `tools/mdm/apple/dep_sample_profile.json` which can be used to create an automatic (DEP) enrollment profile.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
fleetctl apple-mdm enrollment-profiles create-automatic --dep-profile ./tools/mdm/apple/dep_sample_profile.json
|
|
||||||
Automatic enrollment profile created, ID: 2
|
|
||||||
```
|
|
||||||
|
|
||||||
## 8. DEP Enroll
|
|
||||||
|
|
||||||
0. You need an uninitialized macOS VM with a specific configuration to allow for DEP testing.
|
|
||||||
Carefully follow https://travellingtechguy.blog/macos-big-sur-on-vmware-fusion-12/ to create a VMWare macOS VM with a serial number that Fleet's ABM manages (@lucasmrod has successfully created a "test DEP VM" following the above guide).
|
|
||||||
1. Assign the device to our "MDM server" in https://business.apple.com
|
|
||||||
2. Fleet should pick it up and assign an DEP enroll profile that points to itself (must wait for one minute after executing the `create-automatic` command).
|
|
||||||
3. Start the VM created in step (0).
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
Get a list of enrolled devices:
|
|
||||||
```sh
|
|
||||||
fleetctl apple-mdm devices list
|
|
||||||
+--------------------------------------+---------------+----------+
|
|
||||||
| DEVICE ID | SERIAL NUMBER | ENROLLED |
|
|
||||||
+--------------------------------------+---------------+----------+
|
|
||||||
| D2F1D7F9-8EA9-4420-AF09-4C4EC4275D8A | CMXXXXXXXX | true |
|
|
||||||
+--------------------------------------+---------------+----------+
|
|
||||||
```
|
|
||||||
|
|
||||||
```
|
|
||||||
Install a profile to allow for enabling debug mode of MDM on a device (useful when developing/testing MDM features):
|
|
||||||
```sh
|
|
||||||
fleetctl apple-mdm enqueue-command InstallProfile --device-ids=D2F1D7F9-8EA9-4420-AF09-4C4EC4275D8A --mobileconfig ./tools/mdm/apple/turn_on_debug_mdm_logging.mobileconfig
|
|
||||||
```
|
|
||||||
|
|
||||||
Install 1Password on a macOS device:
|
|
||||||
```sh
|
|
||||||
fleetctl apple-mdm installers upload --path ~/Downloads/1Password-7.9.6.pkg
|
|
||||||
|
|
||||||
fleetctl apple-mdm enqueue-command InstallEnterpriseApplication --device-ids=D2F1D7F9-8EA9-4420-AF09-4C4EC4275D8A --installer-id=1
|
|
||||||
```
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
||||||
# Guide for Infrastructure Team
|
|
||||||
|
|
||||||
## Memory requirements
|
|
||||||
|
|
||||||
Fleet and MySQL servers will need +500 MB extra of memory.
|
|
||||||
|
|
||||||
## MySQL
|
|
||||||
|
|
||||||
MySQL must be run with `--max_allowed_packet=536870912` // 512 MB
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
Apple MDM is enabled with the following configuration:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
FLEET_MDM_APPLE_ENABLE=1
|
|
||||||
```
|
|
||||||
|
|
||||||
Additional configuration is generated using `fleetctl`. These credentials are highly sensitive and should be stored securely (e.g. on AWS secretsmanager) and provided to Fleet via environment variables.
|
|
||||||
Also, ensure that `server_settings.server_url` is set to the public URL of the Fleet deployment. This should already be the case.
|
|
||||||
|
|
||||||
### SCEP
|
|
||||||
|
|
||||||
Generate SCEP CA certificate and key:
|
|
||||||
```sh
|
|
||||||
fleetctl apple-mdm setup scep \
|
|
||||||
--validity-years=5 \
|
|
||||||
--cn "FleetDM" \
|
|
||||||
--organization "Fleet Device Management Inc." \
|
|
||||||
--organizational-unit "Fleet Device Management Inc." \
|
|
||||||
--country US
|
|
||||||
```
|
|
||||||
The content of such generated files must be stored securely and then fed to Fleet via the following environment variables:
|
|
||||||
```sh
|
|
||||||
FLEET_MDM_APPLE_SCEP_CA_CERT_PEM=<contents of SCEP CA certificate>
|
|
||||||
FLEET_MDM_APPLE_SCEP_CA_KEY_PEM=<contents of SCEP CA certificate key>
|
|
||||||
```
|
|
||||||
|
|
||||||
We also need to generate a random passphrase and store it somewhere (it's less sensitive than the other credentials defined herein, but for consistency it could be stored securely).
|
|
||||||
```
|
|
||||||
FLEET_MDM_APPLE_SCEP_CHALLENGE=<some random text>
|
|
||||||
```
|
|
||||||
|
|
||||||
For example, the challenge can be generated using `openssl`
|
|
||||||
```sh
|
|
||||||
openssl rand -base64 24
|
|
||||||
```
|
|
||||||
|
|
||||||
### APN
|
|
||||||
|
|
||||||
Zach Wasserman will provide the Apple Push Notification service (APNs) certificate and key. The contents must be stored securely and be provided to Fleet via the following environment variables:
|
|
||||||
```sh
|
|
||||||
FLEET_MDM_APPLE_MDM_PUSH_CERT_PEM=<contents of APNs certificate>
|
|
||||||
FLEET_MDM_APPLE_MDM_PUSH_KEY_PEM=<contents of APNs certificate key>
|
|
||||||
```
|
|
||||||
|
|
||||||
### DEP
|
|
||||||
|
|
||||||
Follow the instructions in [DEP setup](https://github.com/fleetdm/fleet/blob/apple-mdm/tools/mdm/apple/demo.md#4-dep-setup).
|
|
||||||
The output is a `fleet-mdm-apple-dep.token` file which contents must be stored securely and then provided to Fleet via an environment variable:
|
|
||||||
```sh
|
|
||||||
FLEET_MDM_APPLE_DEP_TOKEN=<contents of DEP token>
|
|
||||||
```
|
|
||||||
|
|
@ -1,119 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
#
|
|
||||||
# Test script to setup a local Munki repository for demo/testing purposes.
|
|
||||||
# Sets latest Firefox dmg on a client manifest.
|
|
||||||
#
|
|
||||||
|
|
||||||
if [[ -z "$REPO_DIR" ]]; then
|
|
||||||
echo "Set REPO_DIR to an absolute file path."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $REPO_DIR != /* ]]; then
|
|
||||||
echo "REPO_DIR must be an absolute file path."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -d "$REPO_DIR" ]]; then
|
|
||||||
echo -n "REPO_DIR=$REPO_DIR already exists, press any key to delete and continue... "
|
|
||||||
read
|
|
||||||
rm -rf $REPO_DIR
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p $REPO_DIR/catalogs
|
|
||||||
mkdir $REPO_DIR/icons
|
|
||||||
mkdir $REPO_DIR/manifests
|
|
||||||
mkdir $REPO_DIR/pkgs
|
|
||||||
mkdir $REPO_DIR/pkgsinfo
|
|
||||||
|
|
||||||
curl -L "https://download.mozilla.org/?product=firefox-latest-ssl&os=osx&lang=en-US" --output firefox.dmg
|
|
||||||
curl -L "https://app-updates.agilebits.com/download/OPM7" --output 1password7.pkg
|
|
||||||
curl -L "https://github.com/macadmins/nudge/releases/download/v1.1.8.81422/Nudge-1.1.8.81422.pkg" --output nudge.pkg
|
|
||||||
curl -L "https://iterm2.com/downloads/stable/iTerm2-3_4_16.zip" --output iterm2.zip
|
|
||||||
unzip iterm2.zip
|
|
||||||
rm iterm2.zip
|
|
||||||
curl -L "https://central.github.com/deployments/desktop/desktop/latest/darwin" --output github.zip
|
|
||||||
unzip github.zip
|
|
||||||
rm github.zip
|
|
||||||
|
|
||||||
# No other (non-interactive) way to set the repo url for manifestutil.
|
|
||||||
defaults write ~/Library/Preferences/com.googlecode.munki.munkiimport.plist "repo_url" "file://$REPO_DIR"
|
|
||||||
defaults write ~/Library/Preferences/com.googlecode.munki.munkiimport.plist "default_catalog" "testing"
|
|
||||||
|
|
||||||
# Add Firefox with "--unattended_install" (dmg).
|
|
||||||
/usr/local/munki/munkiimport \
|
|
||||||
--nointeractive \
|
|
||||||
--subdirectory=apps/mozilla \
|
|
||||||
--displayname="Mozilla Firefox" \
|
|
||||||
--description="Fox on fire" \
|
|
||||||
--category=Internet \
|
|
||||||
--developer=Mozilla \
|
|
||||||
--catalog=testing \
|
|
||||||
--extract_icon \
|
|
||||||
--unattended_install \
|
|
||||||
firefox.dmg
|
|
||||||
|
|
||||||
# Add 1Password (pkg).
|
|
||||||
/usr/local/munki/munkiimport \
|
|
||||||
--nointeractive \
|
|
||||||
--subdirectory=apps/agilebits \
|
|
||||||
--displayname="1Password 7" \
|
|
||||||
--description="P4ssw0rd M4n4g3r" \
|
|
||||||
--category=Internet \
|
|
||||||
--developer=AgileBits \
|
|
||||||
--catalog=testing \
|
|
||||||
--extract_icon \
|
|
||||||
1password7.pkg
|
|
||||||
|
|
||||||
# Add Nudge with "--unattended_install" (pkg).
|
|
||||||
/usr/local/munki/munkiimport \
|
|
||||||
--nointeractive \
|
|
||||||
--subdirectory=apps/macadmins \
|
|
||||||
--displayname="Nudge" \
|
|
||||||
--description="Annoying but effective" \
|
|
||||||
--category=Internet \
|
|
||||||
--developer=MacAdmins \
|
|
||||||
--catalog=testing \
|
|
||||||
--extract_icon \
|
|
||||||
--unattended_install \
|
|
||||||
nudge.pkg
|
|
||||||
|
|
||||||
# Add iTerm2 app.
|
|
||||||
/usr/local/munki/munkiimport \
|
|
||||||
--nointeractive \
|
|
||||||
--subdirectory=apps/iterm2 \
|
|
||||||
--displayname="iTerm2" \
|
|
||||||
--description="Best terminal in town" \
|
|
||||||
--category=Console \
|
|
||||||
--developer=iTerm2 \
|
|
||||||
--catalog=testing \
|
|
||||||
--extract_icon \
|
|
||||||
iTerm.app
|
|
||||||
|
|
||||||
# Add Github app.
|
|
||||||
/usr/local/munki/munkiimport \
|
|
||||||
--nointeractive \
|
|
||||||
--subdirectory=apps/github \
|
|
||||||
--displayname="Github Desktop" \
|
|
||||||
--description="Github 4 Desktop" \
|
|
||||||
--category=Development \
|
|
||||||
--developer=Github \
|
|
||||||
--catalog=testing \
|
|
||||||
--extract_icon \
|
|
||||||
"Github Desktop.app"
|
|
||||||
|
|
||||||
/usr/local/munki/makecatalogs
|
|
||||||
|
|
||||||
/usr/local/munki/manifestutil new-manifest site_default
|
|
||||||
/usr/local/munki/manifestutil add-catalog testing --manifest site_default
|
|
||||||
|
|
||||||
/usr/local/munki/manifestutil add-pkg Firefox --manifest site_default
|
|
||||||
/usr/local/munki/manifestutil add-pkg 1password --manifest site_default
|
|
||||||
/usr/local/munki/manifestutil add-pkg nudge --manifest site_default
|
|
||||||
/usr/local/munki/manifestutil add-pkg iTerm2 --manifest site_default --section optional_installs
|
|
||||||
/usr/local/munki/manifestutil add-pkg "GitHub Desktop" --manifest site_default --section featured_items
|
|
||||||
/usr/local/munki/manifestutil add-pkg "GitHub Desktop" --manifest site_default --section optional_installs
|
|
||||||
|
|
||||||
rm -r firefox.dmg nudge.pkg 1password7.pkg iTerm.app "Github Desktop.app"
|
|
||||||
|
|
||||||
Loading…
Reference in a new issue