Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Running AutoPkg in Production

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

Running AutoPkg in Production

Avatar for Hannes Juutilainen

Hannes Juutilainen

August 30, 2018
Tweet

More Decks by Hannes Juutilainen

Other Decks in Technology

Transcript

  1. @hjuu%lainen • I live in Jyväskylä, Finland • Sysadmin at

    University of Jyväskylä for the past 15 years. • Service developer at mcare pro Oy, Finland's leading Apple ICT consultancy. • AutoPkg core maintainer
  2. AutoPkg basics • Autopkg runs recipes. A recipe describes how

    to do things. For example: • How to download the latest Firefox • How to import the latest 1Password to a Munki repo • How to create an installer package from the latest Google Chrome
  3. AutoPkg basics • A recipe is a list of processors,

    the individual steps to accomplish a task: • Download this URL • Extract this archive • Copy this file to another directory • etc.
  4. AutoPkg basics • Recipe can reference another recipe as parent

    • This allows chaining recipes together. For example: • The parent of Firefox.jss is Firefox.pkg • The parent of Firefox.pkg is Firefox.download
  5. AutoPkg basics • An override recipe is really just another

    recipe in the chain: • The parent of override Firefox.munki is the original Firefox.munki recipe • Only override recipes can have trust info • AutoPkg only treats recipes as override recipes when they are in the override directory
  6. Threat/A)ack Vectors • Two main a*ack scenarios: 1. The thing

    you're downloading might be malicious 2. The recipe you're running might be malicious
  7. Threat/A)ack Vectors • Recipes might download something unexpected • Vendor

    downloads might get compromised (HandBrake anyone?) • Man-in-the-middle possible but unlikely • Running unknown recipes • Someone injects a malicious commit to a recipe repo
  8. Security for AutoPkg users • Use a dedicated machine for

    AutoPkg • Update to the latest macOS and keep it updated • Verify the downloaded item • Keep code signature verifica@on enabled • Ask VirusTotal (hDps:/ /github.com/hjuu@lainen/autopkg- virustotalanalyzer)
  9. Security for AutoPkg users • Create overrides for every recipe

    you're running • Only overrides can store trust info • Verify the recipes and future recipe changes • Use recipe trust info • If unsure, ask #autopkg in MacAdmins Slack
  10. Security for AutoPkg recipe writers • Use HTTPS URLs •

    Verify the downloaded item to make sure it's what you expected • Use code signature verificaCon. Enable strict verificaCon if supported. • In munki recipes, make sure you import the same thing that you verified.
  11. Security for AutoPkg recipe writers • Use custom processors only

    if really needed • Audi5ng these is tricky even for experienced pythonists...
  12. Security for AutoPkg recipe writers • Write good commit messages,

    end users will see these when verifying trust info • Try to keep minor and/or superficial changes to minimum
  13. Inspec'ng recipes Ge#ng recipe info: $ autopkg info 1Password.download Description:

    Downloads the current release version of 1Password. Identifier: io.github.hjuutilainen.download.1Password Munki import recipe: False Has check phase: True Builds package: False Recipe file path: ...hjuutilainen-recipes/AgileBits/1Password.download.recipe Input values: NAME = 1Password;
  14. Inspec'ng recipes Audi%ng: $ autopkg audit Firefox.download Firefox.download File path:

    ...recipes/Mozilla/Firefox.download.recipe The following processors are non-core and can execute arbitrary code, performing any action. Be sure you understand what the processor does and/or you trust its source: MozillaURLProvider
  15. Inspec'ng recipes Audi%ng: $ autopkg audit TeXMaker.download TeXMaker.download File path:

    ...hansen-m-recipes/Texmaker/TeXMaker.download.recipe Missing CodeSignatureVerifier The following http URLs were found in the recipe: Input: SEARCH_URL: http://www.xm1math.net/texmaker/download.html Process: URLDownloader: url: http://www.xm1math.net/texmaker/%match%
  16. Verifying trust info A"er upda*ng recipes with autopkg repo-update: $

    autopkg run -v Thunderbird.download Processing Thunderbird.download... Failed local trust verification. Receipt written to .../Thunderbird-receipt-20180829-140442.plist The following recipes failed: Thunderbird.download Processor MozillaURLProvider contents differ from expected. Path: .../com.github.autopkg.recipes/Mozilla/MozillaURLProvider.py Nothing downloaded, packaged or imported.
  17. Verifying trust info Get details of the changes: $ autopkg

    verify-trust-info -vvv Thunderbird.download Thunderbird.download: FAILED Processor MozillaURLProvider contents differ from expected. Path: .../RecipeRepos/com.github.autopkg.recipes/Mozilla/MozillaURLProvider.py diff --git a/Mozilla/MozillaURLProvider.py b/Mozilla/MozillaURLProvider.py index 3ccc1c5..e6b4fab 100644 --- a/Mozilla/MozillaURLProvider.py +++ b/Mozilla/MozillaURLProvider.py @@ -15,12 +15,6 @@ # limitations under the License. """See docstring for MozillaURLProvider class""" -import re -import urllib -import urllib2 -import urlparse -from distutils.version import LooseVersion - from autopkglib import Processor, ProcessorError commit 83628dadcfbe7726c7b4fca960eef9d713384c9c Author: <redacted> Date: Tue Jun 12 14:59:51 2018 -0400 Removed erroneous/confusing library imports (#249)
  18. Verifying trust info If the changes are good, update the

    trust info: $ autopkg update-trust-info Thunderbird.download Wrote updated .../RecipeOverrides/Thunderbird.download.recipe And a reminder: If unsure, ask #autopkg in MacAdmins Slack
  19. Automa'ng AutoPkg • AutoPkgr • CI/CD solu1ons • GitLab CI

    has a macOS runner • Jenkins has a macOS slave • Scrip1ng • Numerous ar1cles and guides around the web
  20. Packaging custom things • Case example Cisco AnyConnect: • Not

    publicly available • Needs custom installer_choices_xml key in Munki • Create a custom recipe to always import with the same se=ngs
  21. AnyConnect.munki.recipe <dict> <key>Description</key> <string>Imports manually downloaded AnyConnect disk image</string> <key>Identifier</key>

    <string>com.example.munki.AnyConnect</string> <key>Input</key> <dict> <key>NAME</key> <string>AnyConnect</string> <key>MUNKI_REPO_SUBDIR</key> <string>licensed/anyconnect</string> </dict> <key>MinimumVersion</key> <string>0.2.0</string> ...
  22. <key>Process</key> <array> <dict> <key>Processor</key> <string>MunkiImporter</string> <key>Arguments</key> <dict> <key>pkg_path</key> <string>%PKG%</string> <key>repo_subdirectory</key>

    <string>%MUNKI_REPO_SUBDIR%</string> <key>pkginfo</key> <dict> ... <key>installer_choices_xml</key> <array> <dict> <key>attributeSetting</key> <integer>0</integer> <key>choiceAttribute</key> <string>selected</string> <key>choiceIdentifier</key> <string>choice_dart</string> </dict> ... <dict> <key>attributeSetting</key> <integer>1</integer> <key>choiceAttribute</key> <string>selected</string> <key>choiceIdentifier</key> <string>choice_vpn</string> </dict> </array> </dict> </dict> </dict> </array>
  23. AnyConnect.munki.recipe Now run manually whenever network personnel gives you a

    new installer... $ autopkg run -v \ -k MUNKI_REPO=/path/to/munkirepo \ --pkg /path/to/anyconnect-macos-4.6.01103-predeploy-k9.dmg \ AnyConnect.munki.recipe
  24. Common errors • You will see occasional failures, don't worry.

    Remember the days you had to update everything manually! • Report broken recipes to the recipe author • Find the repo in h@ps:/ /github.com/autopkg • Create a new issue • Describe the issue properly and include autopkg run -v <recipe> output.
  25. Common errors $ autopkg run Thunderbird.download Processing Thunderbird.download... Code signature

    verification failed. Note that all verifications can be disabled by setting the variable DISABLE_CODE_SIGNATURE_VERIFICATION to a non-empty value. Failed. The following recipes failed: Thunderbird.download Error in local.download.Thunderbird: Processor: CodeSignatureVerifier: Error: Code signature verification failed. Note that all verifications can be disabled by setting the variable DISABLE_CODE_SIGNATURE_VERIFICATION to a non-empty value. The following new items were downloaded: Download Path ------------- /autopkg-cache/local.download.Thunderbird/downloads/Thunderbird.dmg
  26. Common errors Code signature verification failed. Note that all verifications

    can be disabled by setting the variable DISABLE_CODE_SIGNATURE_VERIFICATION to a non-empty value. Please don't! Instead, troubleshoot the issue by running the recipe manually with increased verbosity.
  27. Common errors $ autopkg run -v Thunderbird.download ... CodeSignatureVerifier CodeSignatureVerifier:

    Mounted disk image /autopkg-cache/local.download.Thunderbird/downloads/Thunderbird.dmg CodeSignatureVerifier: Verifying code signature... CodeSignatureVerifier: Deep verification enabled... CodeSignatureVerifier: Strict verification not defined. Using codesign defaults... CodeSignatureVerifier: /private/tmp/dmg.0HQnMu/Thunderbird.app: a sealed resource is missing or invalid CodeSignatureVerifier: In subcomponent: /private/tmp/dmg.0HQnMu/Thunderbird.app/Contents/Library/Spotlight/thunderbird.mdimporter CodeSignatureVerifier: file added: ... thunderbird.mdimporter/Contents/._Info.plist CodeSignatureVerifier: file added: ... thunderbird.mdimporter/Contents/Resources/._schema.xml CodeSignatureVerifier: file added: ... thunderbird.mdimporter/Contents/Resources/English.lproj/._InfoPlist.strings CodeSignatureVerifier: file added: ... thunderbird.mdimporter/Contents/Resources/English.lproj/._schema.strings Code signature verification failed. Note that all verifications can be disabled by ... Nothing downloaded, packaged or imported.
  28. Common errors $ autopkg run -v Inkscape.download Processing Inkscape.download... URLTextSearcher

    URLTextSearcher: Found matching text (version): 0.92.3 URLTextSearcher: Found matching text (match): Current stable version: 0.92.3 URLTextSearcher No match found on URL: https://inkscape.org/en/release/0.92.3/mac-os-x/ Failed. Receipt written to /autopkg-cache/com.github.hansen-m.download.Inkscape/receipts/Inkscape-receipt-20180828-142251.plist The following recipes failed: Inkscape.download Error in com.github.hansen-m.download.Inkscape: Processor: URLTextSearcher: Error: No match found on URL: https://inkscape.org/en/release/0.92.3/mac-os-x/ Nothing downloaded, packaged or imported.