| name | macos-security-and-privacy-guide |
| description | Comprehensive guide and commands for securing macOS systems, covering encryption, firewalls, DNS, privacy settings, and security hardening |
| triggers | ["how do I secure my Mac","configure macOS security settings","harden macOS privacy","set up FileVault and firewall on Mac","macOS security best practices","disable telemetry on macOS","configure DNS encryption on Mac","lock down macOS system"] |
macOS Security and Privacy Guide
Skill by ara.so — Security Skills collection.
This skill provides comprehensive guidance for securing and hardening macOS systems based on the community-maintained drduh/macOS-Security-and-Privacy-Guide. It covers threat modeling, encryption, firewalls, DNS configuration, privacy settings, and security monitoring.
Overview
The macOS Security and Privacy Guide is a collection of techniques for improving security and privacy on Apple silicon Macs. It targets power users adopting enterprise-standard security and covers:
- Threat modeling and asset protection
- Full disk encryption with FileVault
- Firewall configuration (application and kernel-level)
- DNS encryption (DNSCrypt, DoH, DoT)
- Browser hardening
- System monitoring and audit
- Privacy settings and telemetry disabling
- Physical security measures
Requirements:
- Apple silicon Mac (M1 or newer recommended)
- Currently supported macOS version
- Administrative access
Installation and Setup
This is a guide repository, not installable software. Access it at:
Core Security Commands
System Updates
softwareupdate --list
sudo softwareupdate --install --all
sudo softwareupdate --schedule on
sudo softwareupdate --install --recommended
FileVault Full Disk Encryption
sudo fdesetup enable
sudo fdesetup status
sudo fdesetup list
sudo fdesetup add -usertoadd username
Firmware Password (Legacy Intel Macs)
sudo firmwarepasswd -check
Firewall Configuration
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode on
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setloggingmode on
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setblockall on
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsigned on
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
Packet Filter (pf) Configuration
sudo nano /etc/pf.conf
sudo pfctl -e
sudo pfctl -f /etc/pf.conf
sudo pfctl -s info
sudo pfctl -s rules
sudo pfctl -d
Privacy and Telemetry
Disable Spotlight Suggestions
defaults write com.apple.Safari UniversalSearchEnabled -bool false
defaults write com.apple.Safari SuppressSearchSuggestions -bool true
defaults write com.apple.spotlight orderedItems -array \
'{"enabled" = 1;"name" = "APPLICATIONS";}' \
'{"enabled" = 1;"name" = "SYSTEM_PREFS";}' \
'{"enabled" = 1;"name" = "DIRECTORIES";}' \
'{"enabled" = 1;"name" = "PDF";}' \
'{"enabled" = 1;"name" = "DOCUMENTS";}'
killall mds
Disable Unnecessary Services
defaults write com.apple.assistant.support "Assistant Enabled" -bool false
launchctl disable "user/$UID/com.apple.assistantd"
defaults write com.apple.coreservices.useractivityd ActivityAdvertisingAllowed -bool false
defaults write com.apple.coreservices.useractivityd ActivityReceivingAllowed -bool false
defaults write com.apple.NetworkBrowser DisableAirDrop -bool true
sudo systemsetup -setremoteappleevents off
sudo systemsetup -setremotelogin off
sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.nat NAT -dict Enabled -bool false
Privacy Settings
sudo rm -rf /var/db/locationd/*
sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.captive.control Active -bool false
defaults write com.apple.CrashReporter DialogType none
sudo defaults write /Library/Preferences/com.apple.mDNSResponder.plist NoMulticastAdvertisements -bool true
sudo scutil --set ComputerName "MacBook"
sudo scutil --set LocalHostName "MacBook"
sudo scutil --set HostName "MacBook"
DNS Configuration
DNSCrypt Installation (via Homebrew)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install dnscrypt-proxy
nano /usr/local/etc/dnscrypt-proxy.toml
sudo brew services start dnscrypt-proxy
networksetup -setdnsservers Wi-Fi 127.0.0.1
networksetup -setdnsservers Ethernet 127.0.0.1
DNS over HTTPS/TLS with Configuration Profile
cat > cloudflare-doh.mobileconfig <<EOF
<?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>DNSSettings</key>
<dict>
<key>DNSProtocol</key>
<string>HTTPS</string>
<key>ServerURL</key>
<string>https://cloudflare-dns.com/dns-query</string>
</dict>
<key>PayloadType</key>
<string>com.apple.dnsSettings.managed</string>
<key>PayloadIdentifier</key>
<string>com.cloudflare.1dot1dot1dot1.dns</string>
<key>PayloadUUID</key>
<string>RANDOM-UUID-HERE</string>
<key>PayloadDisplayName</key>
<string>Cloudflare DNS over HTTPS</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</array>
<key>PayloadDisplayName</key>
<string>Cloudflare DNS</string>
<key>PayloadIdentifier</key>
<string>com.cloudflare.dns</string>
<key>PayloadUUID</key>
<string>RANDOM-UUID-HERE-2</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>
EOF
open cloudflare-doh.mobileconfig
Hosts File Configuration
sudo nano /etc/hosts
curl -o /tmp/hosts.txt https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
sudo cp /tmp/hosts.txt /etc/hosts
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
System Monitoring
OpenBSM Audit
sudo audit -n
sudo cat /etc/security/audit_control
sudo nano /etc/security/audit_control
sudo audit -s
sudo praudit -xn /var/audit/*
sudo praudit /dev/auditpipe
DTrace System Monitoring
sudo dtrace -n 'syscall::open*:entry { printf("%s %s", execname, copyinstr(arg0)); }'
sudo dtrace -n 'syscall::connect:entry { printf("%s", execname); }'
sudo dtrace -n 'proc:::exec-success { trace(curpsinfo->pr_psargs); }'
sudo dtrace -n 'syscall::getaddrinfo:entry { printf("%s", copyinstr(arg0)); }'
Network Monitoring
sudo lsof -i -P -n | grep LISTEN
nettop -P -L 0
brew install --cask lulu
sudo tcpdump -i any -n port 53
sudo tcpdump -i any -n
netstat -an
lsof -i
Process and Execution Monitoring
ps aux
top -o cpu
sudo opensnoop
sudo fs_usage
kextstat
osascript -e 'tell application "System Events" to get the name of every login item'
ls -la ~/Library/LaunchAgents/
ls -la /Library/LaunchAgents/
sudo ls -la /Library/LaunchDaemons/
User Account Security
Admin and Standard User Setup
sudo dscl . -create /Users/standarduser
sudo dscl . -create /Users/standarduser UserShell /bin/bash
sudo dscl . -create /Users/standarduser RealName "Standard User"
sudo dscl . -create /Users/standarduser UniqueID 503
sudo dscl . -create /Users/standarduser PrimaryGroupID 20
sudo dscl . -create /Users/standarduser NFSHomeDirectory /Users/standarduser
sudo dscl . -passwd /Users/standarduser
sudo createhomedir -c -u standarduser
sudo dseditgroup -o edit -d username -t user admin
defaults write com.apple.screensaver askForPassword -int 1
defaults write com.apple.screensaver askForPasswordDelay -int 0
defaults -currentHost write com.apple.screensaver idleTime -int 300
Password Policies
sudo pwpolicy -n /Local/Default -setglobalpolicy "minChars=14"
sudo pwpolicy -n /Local/Default -setglobalpolicy "requiresMixedCase=1"
sudo pwpolicy -n /Local/Default -setglobalpolicy "usingHistory=5"
sudo pwpolicy -n /Local/Default -setglobalpolicy "maxFailedLoginAttempts=5"
sudo pwpolicy -n /Local/Default -getglobalpolicy
Browser Security
Safari Hardening
defaults write com.apple.Safari AutoFillPasswords -bool false
defaults write com.apple.Safari AutoFillCreditCardData -bool false
defaults write com.apple.Safari AutoFillFromAddressBook -bool false
defaults write com.apple.Safari AutoFillMiscellaneousForms -bool false
defaults write com.apple.Safari SendDoNotTrackHTTPHeader -bool true
defaults write com.apple.Safari PreloadTopHit -bool false
defaults write com.apple.Safari ShowFullURLInSmartSearchField -bool true
defaults write com.apple.Safari WarnAboutFraudulentWebsites -bool true
defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2PluginsEnabled -bool false
defaults write com.apple.Safari IncludeDevelopMenu -bool true
defaults write com.apple.Safari WebKitDeveloperExtrasEnabledPreferenceKey -bool true
defaults write com.apple.Safari ClearHistoryOnQuit -bool true
Firefox Hardening
brew install --cask firefox
mkdir -p ~/Library/Application\ Support/Firefox/Profiles/*.default-release/
cat > ~/Library/Application\ Support/Firefox/Profiles/*.default-release/user.js <<EOF
// Privacy settings
user_pref("privacy.trackingprotection.enabled", true);
user_pref("privacy.trackingprotection.socialtracking.enabled", true);
user_pref("privacy.donottrackheader.enabled", true);
user_pref("privacy.firstparty.isolate", true);
user_pref("privacy.resistFingerprinting", true);
// Disable telemetry
user_pref("datareporting.healthreport.uploadEnabled", false);
user_pref("datareporting.policy.dataSubmissionEnabled", false);
user_pref("toolkit.telemetry.enabled", false);
user_pref("toolkit.telemetry.unified", false);
user_pref("toolkit.telemetry.archive.enabled", false);
// Security
user_pref("security.ssl.require_safe_negotiation", true);
user_pref("security.tls.version.min", 3);
user_pref("network.cookie.cookieBehavior", 1);
user_pref("network.cookie.lifetimePolicy", 2);
// Disable WebRTC leak
user_pref("media.peerconnection.enabled", false);
EOF
SSH Configuration
Secure SSH Setup
ssh-keygen -t ed25519 -a 100 -C "user@hostname"
ssh-keygen -t rsa -b 4096 -o -a 100 -C "user@hostname"
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
cat > ~/.ssh/config <<EOF
Host *
UseKeychain yes
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519
Protocol 2
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256
ServerAliveInterval 60
ServerAliveCountMax 3
EOF
chmod 600 ~/.ssh/config
sudo systemsetup -setremotelogin on
sudo nano /etc/ssh/sshd_config
sudo launchctl stop com.openssh.sshd
sudo launchctl start com.openssh.sshd
VPN and Tor
OpenVPN Configuration
brew install openvpn
cat > ~/vpn-config.ovpn <<EOF
client
dev tun
proto udp
remote vpn.example.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
auth SHA256
verb 3
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
EOF
sudo openvpn --config ~/vpn-config.ovpn
Tor Configuration
brew install tor
nano /usr/local/etc/tor/torrc
brew services start tor
brew install proxychains-ng
nano /usr/local/etc/proxychains.conf
proxychains4 curl https://check.torproject.org
Metadata and Privacy
Remove Metadata from Files
brew install exiftool
exiftool -all= image.jpg
exiftool -all= document.pdf
exiftool image.jpg
exiftool -all= -r /path/to/directory/
mdls file.pdf
xattr file.pdf
xattr -c file.pdf
Secure File Deletion
rm -P sensitive_file.txt
brew install srm
srm -v sensitive_file.txt
diskutil secureErase freespace 0 /Volumes/Macintosh\ HD
Backup Security
Time Machine Encrypted Backup
diskutil list
diskutil eraseDisk JHFS+ "Backup" GPT disk2
diskutil apfs encryptVolume /Volumes/Backup -user disk
sudo tmutil setdestination /Volumes/Backup
sudo tmutil startbackup
sudo tmutil addexclusion ~/Downloads
sudo tmutil addexclusion ~/.Trash
sudo tmutil isexcluded ~/Downloads
Encrypted Archives
zip -er archive.zip /path/to/files/
hdiutil create -encryption AES-256 -size 1g -fs APFS -volname "Secure" ~/secure.dmg
hdiutil attach ~/secure.dmg
tar czf - /path/to/files/ | gpg -c > backup.tar.gz.gpg
gpg -d backup.tar.gz.gpg | tar xzf -
Lockdown Mode
defaults read /Library/Preferences/com.apple.security.lockdownmode.plist LockdownModeEnabled
Certificate Authorities
Managing Trusted CAs
security dump-keychain /System/Library/Keychains/SystemRootCertificates.keychain
security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain > system-certs.pem
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain custom-ca.crt
sudo security delete-certificate -c "Certificate Name" /Library/Keychains/System.keychain
security find-certificate -a /Library/Keychains/System.keychain
Common Security Patterns
Security Audit Script
#!/bin/bash
echo "=== macOS Security Audit ==="
echo -e "\n[FileVault Status]"
sudo fdesetup status
echo -e "\n[Firewall Status]"
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
echo -e "\n[Gatekeeper Status]"
spctl --status
echo -e "\n[SIP Status]"
csrutil status
echo -e "\n[Firmware Password - Intel Only]"
sudo firmwarepasswd -check 2>/dev/null || echo "Not available on Apple Silicon"
echo -e "\n[Remote Login]"
sudo systemsetup -getremotelogin
echo -e "\n[Remote Management]"
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -status
echo -e "\n[Listening Ports]"
sudo lsof -i -P -n | grep LISTEN
echo -e "\n[Failed Login Attempts]"
grep "Failed" /var/log/system.log 2>/dev/null | tail -n 5 || echo "No recent failed logins"
echo -e "\n[System Updates Available]"
softwareupdate --list 2>&1
echo -e "\n[LaunchDaemons]"
ls -la /Library/LaunchDaemons/ 2>/dev/null | grep -v "com.apple"
Privacy Hardening Script
#!/bin/bash
echo "Applying privacy settings..."
defaults write com.apple.AdLib allowApplePersonalizedAdvertising -bool false
defaults write com.apple.AdLib allowIdentifierForAdvertising -bool false
defaults write com.apple.assistant.support "Assistant Enabled" -bool false
defaults write com.apple.coreservices.useractivityd ActivityAdvertisingAllowed -bool false
defaults write com.apple.Safari SendDoNotTrackHTTPHeader -bool true
defaults write com.apple.Safari UniversalSearchEnabled -bool false
defaults write com.apple.CrashReporter DialogType none
sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.captive.control Active -bool false
sudo scutil --set ComputerName "MacBook"
sudo scutil --set LocalHostName "MacBook"
echo "Privacy settings applied. Restart may be required for some changes."
Troubleshooting
Firewall Issues
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --listapps
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /Applications/MyApp.app
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --remove /Applications/MyApp.app
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate off
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on
DNS Not Working
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
scutil --dns
networksetup -setdnsservers Wi-Fi Empty
dig example.com
nslookup example.com
brew services list | grep dnscrypt
VPN Connection Issues
sudo killall openvpn
tail -f /var/log/system.log | grep vpn
sudo ifconfig en0 down
sudo ifconfig en0 up
sudo networksetup -setnetworkserviceenabled Wi-Fi off
sudo networksetup -setnetworkserviceenabled Wi-Fi on
SIP and Security Issues
csrutil status
codesign -v /Applications/App.app
spctl -a -v /Applications/App.app
Audit Logs Not Recording
sudo launchctl list | grep audit
sudo launchctl stop com.apple.auditd
sudo launchctl start com.apple.auditd
sudo cat /etc/security/audit_control
ls -la /var/audit/
Environment Variables
Reference environment variables for sensitive data:
export VPN_USER="${VPN_USERNAME}"
export VPN_PASS="${VPN_PASSWORD}"
export CLOUDFLARE_API_KEY="${CF_API_KEY}"
Additional Resources