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

Can You Keep a Secret?

Can You Keep a Secret?

Slides from DrupalSouth 2017, Auckland NZ.

Nick Santamaria

November 16, 2017
Tweet

More Decks by Nick Santamaria

Other Decks in Technology

Transcript

  1. Nick Santamaria • Drupal developer since 2006 • SysOps Engineer

    at PreviousNext • HashiCorp fanboi • @nicksanta • drupal.org/user/87915
  2. Placed by Config Management • Puppet • Ansible • CloudFormation

    • Terraform Variation Complication Baked into AMI AMI per security boundary Encrypted secrets in code Orchestrating key distribution
  3. Config Export - Before api_key: 8b777e6f871ae009da60c54db84b7eb621a296d9 cron: false batch_limit: 100

    api_classname: Mailchimp\Mailchimp test_mode: false drupal-project / config-export / mailchimp.settings.yml
  4. Config Export - After api_key: null cron: false batch_limit: 100

    api_classname: Mailchimp\Mailchimp test_mode: false drupal-project / config-export / mailchimp.settings.yml ←
  5. Config Export - After dependencies: module: - lockr - mailchimp

    id: mailchimp_token label: 'MailChimp Token' description: 'API token for mailchimp integration' key_provider: lockr key_provider_settings: encoded: aes-128-ctr-sha256$nHlAw2BcTCHVTGQ01kDe9psWgItkrZ55qY4xV36BbGo=$+xgMdEzk6lsDy21h9j…. key_input: text_field drupal-project / config-export / key.key.mailchimp_token.yml } Key safely stored in lockr storage provider
  6. Config Export - After status: true dependencies: config: - key.key.mailchimp_token

    - mailchimp.settings id: mailchimp_api label: 'MailChimp API' config_type: system.simple config_name: mailchimp.settings config_item: api_key key_id: mailchimp_token drupal-project / config-export / key.config_override.mailchimp_token.yml } mailchimp.api_key config now overridden by key.repository.mailchimp_token
  7. • Attackers can't obtain API keys from ◦ DB leaks

    ◦ Codebase leaks ◦ Stolen developer machine Advantages
  8. Setup - Code • Drupal 8.4 • drupal.org/project/key • drupal.org/project/encrypt

    • drupal.org/project/field_encrypt • Encrypt KMS ◦ drupal.org/sandbox/nickurbits/2923717
  9. • Sensitive data not exposed in DB leak • Decryption

    key not stored in codebase • Rotating AWS API token doesn't break encryption. Advantages
  10. Setup • Drupal • HashiCorp Vault ◦ vaultproject.io • Consul

    Template ◦ github.com/hashicorp/consul-template
  11. Setup - Vault $ vault mount database Successfully mounted 'database'

    at 'database'! Mount the database secret backend
  12. $ vault write database/config/mysql \ plugin_name=mysql-database-plugin \ allowed_roles="drupal" \ connection_url=

    "root:${MYSQL_ROOT_PASSWORD}@tcp(127.0.0.1:3306)/" Setup - Vault Give Vault root access to database
  13. $ vault write database/roles/drupal \ db_name=mysql \ default_ttl="15s" \ max_ttl="20s"

    \ creation_statements=" CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}'; GRANT ALL PRIVILEGES ON *.* TO '{{name}}'@'%';" Setup - Vault Create "drupal" role in Vault
  14. $ vault read database/creds/drupal Key Value --- ----- lease_id database/creds/drupal/9939e3b1-f370-f07d-c960-...

    lease_duration 1m0s lease_renewable true password A1a-07p018125t60921y username v-token-drupal-u10y6tt86y1wts01u Setup - Vault Test credentials are being generated } Created on the fly
  15. Setup - Consul Template <?php {{ with secret "database/creds/drupal" }}

    $databases['default']['default'] = [ // Dynamic credentials generated by Vault - {{ timestamp }} 'username' => '{{ .Data.username }}', 'password' => '{{ .Data.password }}', ]; {{ end }} drupal-project / consul-template / settings.php.ctmpl
  16. • Constant rotation of secrets • Credentials probably junk by

    time Attacker tries to use them. • Risk posed by "Hoarders" mitigated. Advantages