mSCP 2.0
The newest version, runs in a container or locally (with dependencies), supports all macOS/iOS/visionOS versions in one place without switching branches.
Decide which version to set up with, then follow the steps below.
mSCP 2.0
The newest version, runs in a container or locally (with dependencies), supports all macOS/iOS/visionOS versions in one place without switching branches.
mSCP 1.0
The stable release, runs locally (with dependencies), uses separate branches for each macOS/iOS/visionOS version and requires switching branches to change versions.
Requirements:
Create Local Folders
mkdir -p ~/Desktop/mscp/customAnything placed in this custom folder overrides the project’s rules and is included in everything you generate. If you are reusing an existing folder, make sure its contents are customizations you intentionally added.
Run the Container
Using Apple Container:
container run -it \ --volume ~/Desktop/mscp:/mscp/build \ --volume ~/Desktop/mscp/custom:/mscp/custom \ ghcr.io/usnistgov/mscp_2.0:latestStart the container service (required before first run):
container system startExit the container:
exitStop the container service:
container system stopCheck container service status:
container system statusOr Using Docker:
# Note: Docker requires full paths for volume mountsdocker run -it \ --volume /Users/<username>/Desktop/mscp:/mscp/build \ --volume /Users/<username>/Desktop/mscp/custom:/mscp/custom \ ghcr.io/usnistgov/mscp_2.0:latestGenerate Content
# Create a baseline./mscp.py baseline -k cis_lvl1# Generate guidance with all outputs./mscp.py guidance custom/baselines/cis_lvl1_macos_27.0.yaml -A# Output: MSCP DOCUMENT GENERATION COMPLETE! All documents in: /build/cis_lvl1_macos_27.0/Manual setup with Python.
Requirements:
No Ruby toolchain is required. Guidance documents are generated entirely in Python — PDF rendering uses typst, which installs as a regular Python dependency, so there is nothing extra to set up.
Clone the Repository
git clone https://github.com/usnistgov/macos_security.gitcd macos_securityVerify your clone
Confirm that what you have locally matches what the project is serving. The two hashes should be identical:
# Your local commitgit rev-parse HEAD
# Current commit on the official repositorygit ls-remote https://github.com/usnistgov/macos_security refs/heads/mainIf they differ, your copy may be out of date or may have come from a fork or mirror. Run git pull, or re-clone from the URL above.
Check your custom/ folder
Anything in custom/ overrides the project’s rules and is included in everything you generate. A fresh clone contains no customizations, so if files are present, make sure they are ones you intentionally added.
Python Setup
# Create virtual environmentpython3 -m venv .venvsource .venv/bin/activate
# Update and install toolspython3 -m pip install --upgrade pip setuptools wheelpython3 -m pip install --upgrade -r requirements.txtGenerate Content
# Create a baseline./mscp.py baseline -k cis_lvl1
# Generate guidance with all outputs./mscp.py guidance custom/baselines/cis_lvl1_macos_27.0.yaml -A
# When done, deactivate the virtual environmentdeactivateRequirements:
Clone the Repository
git clone https://github.com/usnistgov/macos_security.gitcd macos_securitygit checkout sequoiaReplace sequoia with your target macOS version (sequoia, sonoma, ventura, etc.).
Verify your clone
Confirm that what you have locally matches what the project is serving. The two hashes should be identical:
# Your local commitgit rev-parse HEAD
# Current commit on the official repositorygit ls-remote https://github.com/usnistgov/macos_security refs/heads/sequoiaReplace sequoia with the branch you checked out.
If they differ, your copy may be out of date or may have come from a fork or mirror. Run git pull, or re-clone from the URL above.
Check your custom/ folder
Anything in custom/ overrides the project’s rules and is included in everything you generate. A fresh clone contains no customizations, so if files are present, make sure they are ones you intentionally added.
Note that a ZIP download cannot be verified with the git commands above. If you need to confirm your copy matches the project, use git clone instead.
Python Setup
# Create virtual environmentpython3 -m venv .venvsource .venv/bin/activate
# Install requirementspip3 install -r requirements.txtCheck your Python version:
python3 --versionCheck version inside the venv:
source .venv/bin/activatepython --versionList all installed Python versions:
ls /opt/homebrew/bin/python3*ls /usr/local/bin/python3*Create venv with a specific version:
# Remove old venv if neededrm -rf .venv
# Use full path to the Python version you want/opt/homebrew/bin/python3.13 -m venv .venvsource .venv/bin/activateRuby Setup (Optional — for PDF output)
bundle install --binstubs --path mscp_gemsVerify Setup
Run this command to confirm everything works:
./scripts/generate_baseline.py -l
# When done, deactivate the virtual environmentdeactivateYou should see a list of available baselines.
With the project set up, you can:
Or explore specific topics: