<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Simon Hönscheid</title>
    <description>The latest articles on DEV Community by Simon Hönscheid (@simonhoenscheid).</description>
    <link>https://dev.to/simonhoenscheid</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F787032%2F7d86276d-6990-4b28-b088-6cdc16e60919.jpg</url>
      <title>DEV Community: Simon Hönscheid</title>
      <link>https://dev.to/simonhoenscheid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/simonhoenscheid"/>
    <language>en</language>
    <item>
      <title>Using EYAML-GPG to store secrets in Hiera</title>
      <dc:creator>Simon Hönscheid</dc:creator>
      <pubDate>Sun, 10 Apr 2022 17:46:49 +0000</pubDate>
      <link>https://dev.to/betadots/using-eyaml-gpg-to-store-secrets-in-hiera-1if4</link>
      <guid>https://dev.to/betadots/using-eyaml-gpg-to-store-secrets-in-hiera-1if4</guid>
      <description>&lt;p&gt;There are situations when you want to store secrets like passwords, tokens&lt;br&gt;
or usernames in Hiera. The default way to do this is to use Hieras e(ncrypted)YAML&lt;br&gt;
implementation based on PKCS7.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pros and cons of the two EYAML mechanisms
&lt;/h2&gt;
&lt;h3&gt;
  
  
  eYAML
&lt;/h3&gt;

&lt;p&gt;eYAML uses a public/private keypair. The public key goes out to all users. They are able to &lt;em&gt;encrypt&lt;/em&gt; content; then, the private key is stored somewhere&lt;br&gt;
safe and on the Puppetservers. This key is the only way to &lt;em&gt;decrypt content&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is pretty easy to configure, but might become an issue if team members leave the company. In practical teams were no additional passwordmanager is in place, users often have the complete keypair to be able to look things up and use the hiera files as a password database, which increases the risk of compromising the keypair.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;+&lt;/code&gt; build in&lt;/p&gt;

&lt;p&gt;&lt;code&gt;+&lt;/code&gt; easy to configure&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-&lt;/code&gt; might cause security issues&lt;/p&gt;
&lt;h2&gt;
  
  
  eYAML-GPG
&lt;/h2&gt;

&lt;p&gt;eYAML-GPG uses public/private keypairs too, but each user and &lt;br&gt;
Puppetserver has its own pair. It is relatively easy to add/remove users from&lt;br&gt;
the allowed list of receipients. GPG is often already in use, &lt;br&gt;
so every user already has a keypair.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;+&lt;/code&gt; each user/server has its own keypair&lt;/p&gt;

&lt;p&gt;&lt;code&gt;+&lt;/code&gt; add/remove users as needed&lt;/p&gt;

&lt;p&gt;&lt;code&gt;+&lt;/code&gt; recrypt content so it is unreadable to former users, even if they take&lt;br&gt;
  data and their keys with them &lt;/p&gt;

&lt;p&gt;&lt;code&gt;-&lt;/code&gt; not build in&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-&lt;/code&gt; needs a bit of setup &lt;/p&gt;

&lt;p&gt;The project on Github: &lt;a href="https://github.com/voxpupuli/hiera-eyaml-gpg"&gt;https://github.com/voxpupuli/hiera-eyaml-gpg&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Let's set it up
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Prerequirements
&lt;/h3&gt;

&lt;p&gt;You need to have a running Puppetmaster 6 or newer and a workstation with a local Ruby which&lt;br&gt;
is &lt;em&gt;NOT&lt;/em&gt; the one shipped with Puppet. We will note why this &lt;br&gt;
is important later.&lt;/p&gt;
&lt;h3&gt;
  
  
  Install the needed Gems packages
&lt;/h3&gt;

&lt;p&gt;There are two different GPG implementations for Ruby: ruby_gpg is the native implementation, but only able to decrypt content. Gpgme is the &lt;br&gt;
full feature implementation, able to encrypt and decrypt content. However, it needs to be compiled, so it is not usable with the JRuby used by the&lt;br&gt;
Puppetserver. Therefore, we install the distributions Ruby.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo /opt/puppetlabs/bin/puppetserver gem install ruby_gpg
sudo /opt/puppetlabs/bin/puppetserver gem install hiera-eyaml hiera-eyaml-gpg
sudo /opt/puppetlabs/puppet/bin/gem install ruby_gpg
sudo opt/puppetlabs/bin/puppetserver gem install ruby_gpg
sudo apt-get install ruby ruby-dev
sudo gem install hiera-eyaml-gpg gpgme puppet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The software requirements are installed now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generating the GPG keypairs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Generating the Puppetmaster keypair
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;gpg --full-generate-key&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Follow the options and &lt;em&gt;DON'T&lt;/em&gt; protect the key with a passphrase.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generating the users cert
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;gpg --full-generate-key&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Follow the options and protect the key with a passphrase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Export the keypairs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  check the Keypairs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg -K 

sec   rsa4096 2020-05-29 [SC]
      DD186A9AE323294BA99A124977DC5816AD58E28E
uid        [ ultimativ ] Puppet Server (the gpg key of the puppetserver) &amp;lt;puppetserver@betadots.de&amp;gt;
ssb   rsa4096 2020-05-29 [E]

sec   rsa4096 2020-05-29 [SC]
      23872B1059DD0AF63EDC8CA4E24907C2260F6FA7
uid        [ ultimativ ] Puppet User (the puppet users gpg key) &amp;lt;puppetuser@betadots.de&amp;gt;
ssb   rsa4096 2020-05-29 [E]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Export the private keys
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --export-secret-key -a "puppetuser@betadots.de" &amp;gt; puppetuser.gpg.sec
gpg --export-secret-key -a "puppetserver@betadots.de" &amp;gt; puppetserver.gpg.sec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Export the public keys
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --export -a "puppetuser@betadots.de" &amp;gt; puppetuser.gpg.pub
gpg --export -a "puppetserver@betadots.de" &amp;gt; puppetserver.gpg.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Let's get the Hiera structure ready
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vim hiera.yaml
---
version: 5
defaults:
hierarchy:
  - name: "my hierachy structure"
    lookup_key: eyaml_lookup_key
    options:
      gpg_gnupghome: /opt/puppetlabs/server/data/puppetserver/.gnupg
    paths:
      - "common.yaml"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Encrypt your first secret
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Import keypairs
&lt;/h3&gt;

&lt;p&gt;First import the keys to the system. &lt;br&gt;
Due to the fact that this is a demo system, you also need to import the &lt;br&gt;
Puppetuser's private key to a systemuser. &lt;br&gt;
Normally this would remain on a workstation or development server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo cp puppetserver.gpg.sec /opt/puppetlabs/server/data/puppetserver/key
sudo chown puppet:puppet /opt/puppetlabs/server/data/puppetserver/key
sudo su puppet -s /bin/bash -c '/usr/bin/gpg --import /opt/puppetlabs/server/data/puppetserver/key' 
gpg --import puppetuser.gpg.sec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finish by restarting the Puppetserver.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;systemctl restart puppetserver.service&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add scrips and public keys to data directory of your puppet repository
&lt;/h2&gt;

&lt;p&gt;There are two scripts which make it very handy to work&lt;br&gt;
with Hiera eYAML-GPG:&lt;/p&gt;
&lt;h3&gt;
  
  
  edit.sh
&lt;/h3&gt;

&lt;p&gt;Use this script to edit a file with encryped content or add new blocks.&lt;br&gt;
Change the Puppetserver Key to your needs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash

puppetserver_key='puppetserver@betadots.de'
recipient_file='gpg_recipients'

if [ $# -ne 1 ]; then
    echo "[-] Please specify a file to edit.."
    exit 1
fi

grep $puppetserver_key $recipient_file &amp;gt; /dev/null || { echo "ERROR: ${puppetserver_key} not in recipient file ${recipient_file}. This may NEVER happen!"; exit 1; }

if [ ! -e $1 ]; then
    echo "[*] Specified file argument $1 does not exist, creating it for you..."
    touch $1
fi

echo -e "[*] Importing new public keys..."
gpg --import gpg_pubkeys/*

echo -e "[*] Editing the following file: $1"
echo -e "[*] Recipients are:"
cat $recipient_file
echo ""

eyaml edit --gpg-always-trust --gpg-recipients-file $recipient_file $1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  recrypt_all.sh
&lt;/h3&gt;

&lt;p&gt;Use this script to recrypt all files with encryped content&lt;br&gt;
after a team member joins or leaves.&lt;br&gt;
Change the Puppetserver key to fit your needs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash

if [ $# -eq 0 ]; then
    encrypted_files=`grep -Rl "ENC\[GPG" *`
else
    encrypted_files=$*
fi
puppetserver_key='puppetserver@betadots.de'
recipient_file='gpg_recipients'

grep $puppetserver_key $recipient_file &amp;gt; /dev/null || { echo "ERROR: ${puppetserver_key} not in recipient file ${recipient_file}. This must NEVER happen!"; exit 1; }

echo -e "[*] Reencrypting the following files:\n $encrypted_files\n"
echo -e "[*] Recipients are:"
cat $recipient_file
echo ""

for item in $encrypted_files ; do
    echo "[*] Reencrypting $item"
    eyaml recrypt --gpg-always-trust --gpg-recipients-file $recipient_file $item
    if [ $? -eq 0 ] ; then
        echo -e "[+] Successfully reencrypted $item\n"
    else
        echo "[-] Reencryption of $item failed, this is bad!"
        echo "[-] Please investigate what went wrong and DO NOT PUSH THIS!!"
        exit 1
    fi
done
echo "[+] Reencryption of all files was successful"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Populate the gpg_recipients file
&lt;/h3&gt;

&lt;p&gt;This file contains all email adresses or key IDs of all puppetservers&lt;br&gt;
or team members.&lt;br&gt;
If a team member joins or leaves, add or remove their key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppetserver@betadots.de
puppetuser@betadots.de
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Put GPG public keys in gpg_pubkeys directory
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cp puppetserver.gpg.pub gpg_pubkeys/
cp puppetuser.gpg.pub gpg_pubkeys/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a team member joins or leaves, add or remove their key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting it all together
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Copy scrips and files to your Hiera data directory.
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cp -r edit.sh recrypt_all.sh gpg_recipients gpg_pubkeys/ data/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Time to encrypt your first secret
&lt;/h2&gt;

&lt;p&gt;The script will open your favorite editor. If this has not been defined yet, a prompt will open up to ask.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./edit.sh common.yaml
[*] Importing new public keys...
gpg: key 77DC5816AD58E28E: "Puppet Server (the gpg key of the puppetserver) &amp;lt;puppetserver@betadots.de&amp;gt;" not changed
gpg: key E24907C2260F6FA7: "Puppet User (the puppet users gpg key) &amp;lt;puppetuser@betadots.de&amp;gt;" not changed
gpg: Total number processed: 2
gpg:              unchanged: 2
[*] Editing the following file: common.yaml
[*] Recipients are:
puppetserver@betadots.de
puppetuser@betadots.de

# | This is eyaml edit mode. This text (lines starting with # | at the top of
# | the file) will be removed when you save and exit.
# |  - To edit encrypted values, change the content of the DEC(&amp;lt;num&amp;gt;)::PKCS7[]!
# |    block (or DEC(&amp;lt;num&amp;gt;)::GPG[]!).
# |    WARNING: DO NOT change the number in the parentheses.
# |  - To add a new encrypted value copy and paste a new block from the
# |    appropriate example below. Note that:
# |     * the text to encrypt goes in the square brackets
# |     * ensure you include the exclamation mark when you copy and paste
# |     * you must not include a number when adding a new block
# |    e.g. DEC::PKCS7[]! -or- DEC::GPG[]!
---
super_secret_test: 'DEC::GPG[super secret string]!'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save this. The output with &lt;code&gt;cat&lt;/code&gt; will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
super_secret_test: 'ENC[GPG,hQIMA0HLK7hFkXxnAQ//RqmeCG1vG7QVpTaaQ3NXJ7sb4/kd8PYtc9jL/P10z76KAuuid2CR1rlGczmCsDLasHGcQDLQuXpfcIOdKN1CxK3M2fJUDWsOn+oK+LK21W+0YsTHLmSUm6k/2pp36q03QlIaNcWL2BFzSs/fGskM6V57p97a3Fm27i32dGJRVyZ071G9f2lgismTK09sk50+xtIS3OCT8S4uWZkCst7TBnon3RQvfr80xKFOBYfJoo4NJob/XQi5/j00IMmF7KmrX76LZBeJV4X5PqRvOWTmlRGFT9JpDLi1fWR6hGvzSDNaL5JL6e1Wl/EsCMZgaTL7VxYwvRCvD0sAkyESD2LLMGULVT9MRO5mwhmoR1E5AMVt0FwFXwL9kQnfWS7us/TJfSPgovrZmMAav+oIZOzAv/Q1c6381urpdHtfbP17iz1jfggfDgmowcCH1UJ7R8kZ7C5RcZa/j+Uv+ll8SqbAQo/yX8mXe627OOD/WfzXP++UF7nsvdxCHpk2me+hUjo6XUWt0h2bkZKc2GinY29oojd/2FoI4EZBpTow6TgpFhw0hK2tiU1PWaAU5v6oi2BSrpIqFaZ0Fowd1fNT+86NjvArb6JY8vOWbqbh2Y6DKoTqWtZV/pxB42iXe1I59h7CsGHMtp71S37XwXDcie51EZOpEfiTmBuR4xFg7eEEiwOFAgwD+3NwktMooowBD/wNxeOWG2fH9raBl1G671JdyzNhWZq/3wyK8As7nC2P8dqK9OBT4GXfSif1ssLwvabix4C9SAiET1+JJVPPnhh3tGOCye4TUjkpdMjWNf8NXIkUXd7qwbtNNqu1TTpuSfTNpGc9cgaonuvr8SLiwGpKm57kdcuPVfrTVkeRns6h6ahTsgy4kbAXSD8b+FMApMCnJFyjEu2ne+IKfCmYbnhExj5S2qeedW0509XhVLR4cPAMQ6tefYmzRrrgm+3P3mHkNULtbrXmZWmpt0HhrVyT0axDVvuvcz+g3poByDBPsrHdhMTjkOqY6ikyS9a+H85OM9HECxQD/X1oseMrnaoCr9Ds+In9aFV2gmXHoraSEfVecHNhHyU470lx5X0CI8clICYsZzCKFea2IjG34myb2xNwQSQyg6pX7iUR4zafOsUImOacc30HX+XUoaOLn/GEcHiiBucRnso57CLICN474TXIEqEqBpaJEHnwxozxyQI7mlf2mfpdGt1X+ECjQth7lzKDJeapcK6uxy7g+9GALhjGC+dKXWY+MvM/7fvj+yUls798a4f05PivMDXmwysxYr3W/CCxzKOwSJNZ3SZkSRcpMg0zeIrk617jHsKI6ehJ1ADr8on3wfLjlD9Yg+4YqGxQxcTHN+IDexAZVO9erZR1C+02kTsqMmdyxjaTBdJOARxyzTCNeUDweVLIwXKPT8Bq5IX7CGEsySRDmqYxZpACzbvP0xIlZskuJ0ybKJUCLEmRDikJBIx0n/DcQEK2jthFidOgy6nnVv2Bc2LO]'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Congrats! Check the lookup&lt;/p&gt;

&lt;p&gt;Let's check if we can use &lt;code&gt;puppet lookup&lt;/code&gt; to check the value. We should get cleartext.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; HIERA_EYAML_GPG_GNUPGHOME=~/.gnupg puppet lookup 'super_secret_test'
--- super secret string
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding and removing team members
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;edit gpg_recipients&lt;/li&gt;
&lt;li&gt;add/remove public key to/from gpg_pubkeys directory&lt;/li&gt;
&lt;li&gt;run recrypt.sh&lt;/li&gt;
&lt;li&gt;commit&lt;/li&gt;
&lt;li&gt;merge&lt;/li&gt;
&lt;li&gt;done&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Known pitfalls
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Data Structures
&lt;/h3&gt;

&lt;p&gt;YAML literal blocks do not work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;key: |
  content
  more content
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other complex structures might not work either.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quoting
&lt;/h3&gt;

&lt;p&gt;The quote always goes around the encryption.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'DEC(1)::GPG[super secret string]!'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The index number and copying values
&lt;/h3&gt;

&lt;p&gt;Yes, it's totally valid to copy a value in edit mode and paste it again,&lt;br&gt;
but be aware:&lt;/p&gt;

&lt;p&gt;Index numbers are counted by file and are always uneven. So if you copy, don't forget to remove the index. It will be added automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
super_secret_test: 'DEC(1)::GPG[super secret string]!'
super_secret_test_two: 'DEC::GPG[super secret string too]!'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next edit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
super_secret_test: 'DEC(1)::GPG[super secret string]!'
super_secret_test_two: 'DEC(3)::GPG[super secret string too]!'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Have fun using Hiera eYAML-GPG!&lt;/p&gt;

</description>
      <category>puppet</category>
      <category>hiera</category>
      <category>secrets</category>
      <category>passwords</category>
    </item>
    <item>
      <title>Passwörter mit eYAML-GPG in Hiera speichern</title>
      <dc:creator>Simon Hönscheid</dc:creator>
      <pubDate>Sun, 10 Apr 2022 17:46:30 +0000</pubDate>
      <link>https://dev.to/betadots/passworter-mit-eyaml-gpg-in-hiera-speichern-1p20</link>
      <guid>https://dev.to/betadots/passworter-mit-eyaml-gpg-in-hiera-speichern-1p20</guid>
      <description>&lt;p&gt;Manchmal ist es notwendig, Zugangsdaten wie Passwörter, Tokens oder Benutzernamen in Hiera zu speichern. Puppet bringt die Implementation Hiera e(ncryted)YAML auf Basis von PKCS7 mit um dies zu ermöglichen,&lt;/p&gt;

&lt;h2&gt;
  
  
  Vor- und Nachteile der beiden eYAML Implementierungen
&lt;/h2&gt;

&lt;h3&gt;
  
  
  eYAML
&lt;/h3&gt;

&lt;p&gt;eYAML basiert auf einem öffentlichen/privatem Schlüsselpaar. Der öffentliche Schlüssel wird an die Benutzer verteilt und ermöglicht Ihnen das &lt;em&gt;verschlüsseln&lt;/em&gt; von Inhalten. Der private Schlüssel wird an einem sicheren Ort und auf den Puppetservern abgelegt. Dieser Schlüssel ist in der Lage Inhalte zu &lt;em&gt;entschlüsseln&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Die Konfiguration ist einfach, kann aber zum Problem werden wenn Teammitglieder die Firma verlassen. In vielen Teams, in denen kein zusätzlicher Passwortmanager existiert, wird häufig das komplette Schlüsselpaar an die User herausgegeben um Hiera als Passwort Datenbank zu benutzen. Dies erhöht das Risiko das Schlüsselpaar zu kompromittieren. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;+&lt;/code&gt; mitgeliefert&lt;/p&gt;

&lt;p&gt;&lt;code&gt;+&lt;/code&gt; einfach zu konfigurieren&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-&lt;/code&gt; kann zu Sicherheitsproblemen führen&lt;/p&gt;

&lt;h3&gt;
  
  
  eYAML-GPG
&lt;/h3&gt;

&lt;p&gt;eYAML-GPG verwendet ebenfalls ein öffentliches/privates Schlüsselpaar, jedoch nutzt jeder Server und jeder Benutzer sein eigenes. Es ist ziemlich einfach Benutzer zur Liste der Empfänger hinzuzufügen oder zu entfernen. Häufig ist GPG bereits im Einsatz und Nutzer haben bereits ein Schlüsselpaar.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;+&lt;/code&gt; jeder Benutzer/Server hat sein eigenes Schlüsselpaar&lt;/p&gt;

&lt;p&gt;&lt;code&gt;+&lt;/code&gt; hinzufügen oder löschen von Benutzern nach Bedarf&lt;/p&gt;

&lt;p&gt;&lt;code&gt;+&lt;/code&gt; neuverschlüsseln von Inhalten sodass dieser für ehemalige Benutzer unlesbar wird, selbst wenn  Sie Daten und Schlüssel mitnehmen. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;-&lt;/code&gt; nicht mitgeliefert&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-&lt;/code&gt; muss eingerichtet werden &lt;/p&gt;

&lt;p&gt;Das Projekt auf Github: &lt;a href="https://github.com/voxpupuli/hiera-eyaml-gpg"&gt;https://github.com/voxpupuli/hiera-eyaml-gpg&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Voraussetzungen
&lt;/h3&gt;

&lt;p&gt;Eine laufende Installation des Puppet Servers 6 oder neuer ist eine Grundvoraussetzung, genau wie eine Workstation mit einer Ruby Installation. Dies sollte nicht das Ruby sein, das im Puppet Agent mitgeliefert wird. Warum das wichtig ist, dazu später mehr. &lt;/p&gt;

&lt;h3&gt;
  
  
  Installation der benötigten Gems
&lt;/h3&gt;

&lt;p&gt;Für Ruby existieren zwei GPG Implementierungen, ruby_gpg ist die native Implementierung aber soweit mir bekannt nur in der Lage Inhalte zu entschlüsseln. Gpgme ist die Implementierung mit allen Funktionen, das sowohl verschlüsseln als auch entschlüsseln kann. &lt;br&gt;
Es muss kompiliert werden, sodass es weder mit dem JRuby des Puppet Servers, noch mit dem Agent Ruby funktioniert, da diese keine Quellen für die Kompilierung mitbringen. Wir installieren das Ruby der Linux Distribution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo /opt/puppetlabs/bin/puppetserver gem install ruby_gpg
sudo /opt/puppetlabs/bin/puppetserver gem install hiera-eyaml hiera-eyaml-gpg
sudo /opt/puppetlabs/puppet/bin/gem install ruby_gpg
sudo opt/puppetlabs/bin/puppetserver gem install ruby_gpg
sudo apt-get install ruby ruby-dev
sudo gem install hiera-eyaml-gpg gpgme puppet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Die benötigten Pakete sind nun installiert..&lt;/p&gt;

&lt;h2&gt;
  
  
  GPG Schlüsselpaare erstellen
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Puppet Server Schlüsselpaar
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;gpg --full-generate-key&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Folge dem Dialog und schütze den Key NICHT mit einem Passwort&lt;/p&gt;

&lt;h3&gt;
  
  
  Schlüsselpaar für den Benutzer generieren
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;gpg --full-generate-key&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Folge dem Dialog und schütze den Key mit einem Passwort&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Schlüsselpaare exportieren
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Die Schlüsselpaare prüfen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg -K 

sec   rsa4096 2020-05-29 [SC]
      DD186A9AE323294BA99A124977DC5816AD58E28E
uid        [ ultimativ ] Puppet Server (the gpg key of the puppetserver) &amp;lt;puppetserver@betadots.de&amp;gt;
ssb   rsa4096 2020-05-29 [E]

sec   rsa4096 2020-05-29 [SC]
      23872B1059DD0AF63EDC8CA4E24907C2260F6FA7
uid        [ ultimativ ] Puppet User (the puppet users gpg key) &amp;lt;puppetuser@betadots.de&amp;gt;
ssb   rsa4096 2020-05-29 [E]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Export der privaten Schlüssel
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --export-secret-key -a "puppetuser@betadots.de" &amp;gt; puppetuser.gpg.sec
gpg --export-secret-key -a "puppetserver@betadots.de" &amp;gt; puppetserver.gpg.sec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Export der öffentlichen Schlüssel
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --export -a "puppetuser@betadots.de" &amp;gt; puppetuser.gpg.pub
gpg --export -a "puppetserver@betadots.de" &amp;gt; puppetserver.gpg.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Vorbereiten der Hiera Struktur
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vim hiera.yaml
---
version: 5
defaults:
hierarchy:
  - name: "my hierachy structure"
    lookup_key: eyaml_lookup_key
    options:
      gpg_gnupghome: /opt/puppetlabs/server/data/puppetserver/.gnupg
    paths:
      - "common.yaml"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Verschlüsselung des ersten Werts
&lt;/h2&gt;

&lt;p&gt;Import der Schlüssel(paare)&lt;br&gt;
Zuerst importieren wir die Schlüssel auf dem Puppet Server.&lt;br&gt;
Da es sich hier um ein demo System handelt, importieren wir den Privaten Schlüssel des Puppet Users bei einem Systembenutzer.&lt;br&gt;
Normalerweise verbleibt dieser auf der Workstation oder dem Entwickungsserver&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo cp puppetserver.gpg.sec /opt/puppetlabs/server/data/puppetserver/key
sudo chown puppet:puppet /opt/puppetlabs/server/data/puppetserver/key
sudo su puppet -s /bin/bash -c '/usr/bin/gpg --import /opt/puppetlabs/server/data/puppetserver/key' 
gpg --import puppetuser.gpg.sec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abschließend starten wir den Puppet server neu&lt;/p&gt;

&lt;p&gt;&lt;code&gt;systemctl restart puppetserver.service&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Füge die Scripte und öffentlichen Schlüssel zum data directory des control-repositories hinzu
&lt;/h2&gt;

&lt;p&gt;Es gibt zwei scripte die es sehr einfach machen mit Hiera eYAML-GPG zu arbeiten&lt;/p&gt;

&lt;h3&gt;
  
  
  edit.sh
&lt;/h3&gt;

&lt;p&gt;Dieses script erlaubt es eine Datei mit verschlüsselten Werten zu editieren oder neue Werte hinzuzufügen. Anpassen des puppetserver_keys nach Bedarf&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash

puppetserver_key='puppetserver@betadots.de'
recipient_file='gpg_recipients'

if [ $# -ne 1 ]; then
    echo "[-] Please specify a file to edit.."
    exit 1
fi

grep $puppetserver_key $recipient_file &amp;gt; /dev/null || { echo "ERROR: ${puppetserver_key} not in recipient file ${recipient_file}. This may NEVER happen!"; exit 1; }

if [ ! -e $1 ]; then
    echo "[*] Specified file argument $1 does not exist, creating it for you..."
    touch $1
fi

echo -e "[*] Importing new public keys..."
gpg --import gpg_pubkeys/*

echo -e "[*] Editing the following file: $1"
echo -e "[*] Recipients are:"
cat $recipient_file
echo ""

eyaml edit --gpg-always-trust --gpg-recipients-file $recipient_file $1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  recrypt_all.sh
&lt;/h3&gt;

&lt;p&gt;Mit diesem Script lassen sich alle Dateien mit verschlüsseltem Inhalt neu verschlüsseln, wenn Mitarbeiter das Unternehmen verlassen oder neu hinzu kommen.&lt;br&gt;
Anpassen des puppetserver_keys nach Bedarf&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash

if [ $# -eq 0 ]; then
    encrypted_files=`grep -Rl "ENC\[GPG" *`
else
    encrypted_files=$*
fi
puppetserver_key='puppetserver@betadots.de'
recipient_file='gpg_recipients'

grep $puppetserver_key $recipient_file &amp;gt; /dev/null || { echo "ERROR: ${puppetserver_key} not in recipient file ${recipient_file}. This must NEVER happen!"; exit 1; }

echo -e "[*] Reencrypting the following files:\n $encrypted_files\n"
echo -e "[*] Recipients are:"
cat $recipient_file
echo ""

for item in $encrypted_files ; do
    echo "[*] Reencrypting $item"
    eyaml recrypt --gpg-always-trust --gpg-recipients-file $recipient_file $item
    if [ $? -eq 0 ] ; then
        echo -e "[+] Successfully reencrypted $item\n"
    else
        echo "[-] Reencryption of $item failed, this is bad!"
        echo "[-] Please investigate what went wrong and DO NOT PUSH THIS!!"
        exit 1
    fi
done
echo "[+] Reencryption of all files was successful"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Füllen der gpg_recipients Datei
&lt;/h3&gt;

&lt;p&gt;Diese Datei enthält alle Mailadressen oder KeyIDs der Puppetserver und aller Teammitglieder.&lt;br&gt;
Wenn ein Teammitglied geht oder dazu kommt, füge den Schlüssel hinzu und entferne diesen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppetserver@betadots.de
puppetuser@betadots.de
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  GPG public Keys ins gpg_pubkeys Verzeichnis legen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cp puppetserver.gpg.pub gpg_pubkeys/
cp puppetuser.gpg.pub gpg_pubkeys/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wenn ein Teammitglied geht oder dazu kommt, füge den Schlüssel hinzu und entferne diesen. &lt;/p&gt;

&lt;h2&gt;
  
  
  Abschließende Arbeiten
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Kopieren der Scripte und Dateien in Hiera Daten Verzeichnis.
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cp -r edit.sh recrypt_all.sh gpg_recipients gpg_pubkeys/ data/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Das erste Secret verschlüsseln
&lt;/h3&gt;

&lt;p&gt;Das Script wird den bevorzugten Editor öffnen, im Zweifelsfall wird gefragt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./edit.sh common.yaml
[*] Importing new public keys...
gpg: key 77DC5816AD58E28E: "Puppet Server (the gpg key of the puppetserver) &amp;lt;puppetserver@betadots.de&amp;gt;" not changed
gpg: key E24907C2260F6FA7: "Puppet User (the puppet users gpg key) &amp;lt;puppetuser@betadots.de&amp;gt;" not changed
gpg: Total number processed: 2
gpg:              unchanged: 2
[*] Editing the following file: common.yaml
[*] Recipients are:
puppetserver@betadots.de
puppetuser@betadots.de

# | This is eyaml edit mode. This text (lines starting with # | at the top of
# | the file) will be removed when you save and exit.
# |  - To edit encrypted values, change the content of the DEC(&amp;lt;num&amp;gt;)::PKCS7[]!
# |    block (or DEC(&amp;lt;num&amp;gt;)::GPG[]!).
# |    WARNING: DO NOT change the number in the parentheses.
# |  - To add a new encrypted value copy and paste a new block from the
# |    appropriate example below. Note that:
# |     * the text to encrypt goes in the square brackets
# |     * ensure you include the exclamation mark when you copy and paste
# |     * you must not include a number when adding a new block
# |    e.g. DEC::PKCS7[]! -or- DEC::GPG[]!
---
super_secret_test: 'DEC::GPG[super secret string]!'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Speichern. Die Ausgabe mit cat sieht so aus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
super_secret_test: 'ENC[GPG,hQIMA0HLK7hFkXxnAQ//RqmeCG1vG7QVpTaaQ3NXJ7sb4/kd8PYtc9jL/P10z76KAuuid2CR1rlGczmCsDLasHGcQDLQuXpfcIOdKN1CxK3M2fJUDWsOn+oK+LK21W+0YsTHLmSUm6k/2pp36q03QlIaNcWL2BFzSs/fGskM6V57p97a3Fm27i32dGJRVyZ071G9f2lgismTK09sk50+xtIS3OCT8S4uWZkCst7TBnon3RQvfr80xKFOBYfJoo4NJob/XQi5/j00IMmF7KmrX76LZBeJV4X5PqRvOWTmlRGFT9JpDLi1fWR6hGvzSDNaL5JL6e1Wl/EsCMZgaTL7VxYwvRCvD0sAkyESD2LLMGULVT9MRO5mwhmoR1E5AMVt0FwFXwL9kQnfWS7us/TJfSPgovrZmMAav+oIZOzAv/Q1c6381urpdHtfbP17iz1jfggfDgmowcCH1UJ7R8kZ7C5RcZa/j+Uv+ll8SqbAQo/yX8mXe627OOD/WfzXP++UF7nsvdxCHpk2me+hUjo6XUWt0h2bkZKc2GinY29oojd/2FoI4EZBpTow6TgpFhw0hK2tiU1PWaAU5v6oi2BSrpIqFaZ0Fowd1fNT+86NjvArb6JY8vOWbqbh2Y6DKoTqWtZV/pxB42iXe1I59h7CsGHMtp71S37XwXDcie51EZOpEfiTmBuR4xFg7eEEiwOFAgwD+3NwktMooowBD/wNxeOWG2fH9raBl1G671JdyzNhWZq/3wyK8As7nC2P8dqK9OBT4GXfSif1ssLwvabix4C9SAiET1+JJVPPnhh3tGOCye4TUjkpdMjWNf8NXIkUXd7qwbtNNqu1TTpuSfTNpGc9cgaonuvr8SLiwGpKm57kdcuPVfrTVkeRns6h6ahTsgy4kbAXSD8b+FMApMCnJFyjEu2ne+IKfCmYbnhExj5S2qeedW0509XhVLR4cPAMQ6tefYmzRrrgm+3P3mHkNULtbrXmZWmpt0HhrVyT0axDVvuvcz+g3poByDBPsrHdhMTjkOqY6ikyS9a+H85OM9HECxQD/X1oseMrnaoCr9Ds+In9aFV2gmXHoraSEfVecHNhHyU470lx5X0CI8clICYsZzCKFea2IjG34myb2xNwQSQyg6pX7iUR4zafOsUImOacc30HX+XUoaOLn/GEcHiiBucRnso57CLICN474TXIEqEqBpaJEHnwxozxyQI7mlf2mfpdGt1X+ECjQth7lzKDJeapcK6uxy7g+9GALhjGC+dKXWY+MvM/7fvj+yUls798a4f05PivMDXmwysxYr3W/CCxzKOwSJNZ3SZkSRcpMg0zeIrk617jHsKI6ehJ1ADr8on3wfLjlD9Yg+4YqGxQxcTHN+IDexAZVO9erZR1C+02kTsqMmdyxjaTBdJOARxyzTCNeUDweVLIwXKPT8Bq5IX7CGEsySRDmqYxZpACzbvP0xIlZskuJ0ybKJUCLEmRDikJBIx0n/DcQEK2jthFidOgy6nnVv2Bc2LO]'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Herzlichen Glückwunsch!&lt;/p&gt;

&lt;h3&gt;
  
  
  Prüfen des lookup:
&lt;/h3&gt;

&lt;p&gt;Wenn alles passt sollten wir mit puppet lookup den Wert abfragen können und den Klartext als Antwort bekommen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; HIERA_EYAML_GPG_GNUPGHOME=~/.gnupg puppet lookup 'super_secret_test'
--- super secret string
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das Setup ist damit abgeschlossen&lt;/p&gt;

&lt;h2&gt;
  
  
  Hinzufügen oder entfernen von Team Mitgliedern
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;editieren der gpg_recipients datei&lt;/li&gt;
&lt;li&gt;hinzufügen/entfernen des öffentlichen Schlüssels zum/aus dem gpg_pubkeys Verzeichnis&lt;/li&gt;
&lt;li&gt;recrypt.sh laufen lassen&lt;/li&gt;
&lt;li&gt;commit&lt;/li&gt;
&lt;li&gt;merge&lt;/li&gt;
&lt;li&gt;fertig&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Bekannte Stolpersteine
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Daten Strukturen
&lt;/h3&gt;

&lt;p&gt;YAML Blöcke funktionieren nicht.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;key: |
  content
  more content
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Es ist gut möglich das weitere komplexe Strukturen ebenfalls nicht funktionieren&lt;/p&gt;

&lt;h3&gt;
  
  
  Anführungszeichen
&lt;/h3&gt;

&lt;p&gt;Wenn ein String mit Anführungszeichen begrenzt wird, schließen diese den Verschlüsselungs-Block ein&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'DEC(1)::GPG[super secret string]!'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Der Index und das kopieren von Werten
&lt;/h3&gt;

&lt;p&gt;Das kopieren und einfügen von Werten im Editier-Modus ist ohne Probleme möglich, wenn man folgendes beachtet:&lt;/p&gt;

&lt;p&gt;Die Indexnummer werden pro Datei hochgezählt und sind immer ungerade. Beim kopieren ist darauf zu achten den Index zu entfernen, dieser wird automatisch wieder hinzugefügt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
super_secret_test: 'DEC(1)::GPG[super secret string]!'
super_secret_test_two: 'DEC::GPG[super secret string too]!'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beim erneuten editieren:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
super_secret_test: 'DEC(1)::GPG[super secret string]!'
super_secret_test_two: 'DEC(3)::GPG[super secret string too]!'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Viel Spass beim benutzen von Hiera eYAML-GPG!&lt;/p&gt;

</description>
      <category>puppet</category>
      <category>hiera</category>
      <category>secrets</category>
      <category>passwords</category>
    </item>
    <item>
      <title>Ein gesundes und frohes neues Jahr von der betadots GmbH</title>
      <dc:creator>Simon Hönscheid</dc:creator>
      <pubDate>Thu, 20 Jan 2022 09:02:53 +0000</pubDate>
      <link>https://dev.to/betadots/ein-gesundes-und-frohes-neues-jahr-von-der-betadots-gmbh-h27</link>
      <guid>https://dev.to/betadots/ein-gesundes-und-frohes-neues-jahr-von-der-betadots-gmbh-h27</guid>
      <description>&lt;p&gt;Wir freuen uns unser neues Team bei der betadots GmbH vorstellen zu können. Ziel der betadots GmbH ist es, unsere Kunden und Geschäftspartner mit Wissen und konkreten Lösungen zu unterstützen. Wir sind in der Lage IT Abteilungen beim Kennenlernen und Einführen von IT Automatisierung mit Puppet und Cloud Technologien zu unterstützen.&lt;/p&gt;

&lt;p&gt;Unsere Erfahrung basiert auf Tätigkeiten in vielen unterschiedlichen IT Organisationen und Branchen wie Finanzwesen, Telekommunikation, Gesundheitssektor, Behörden sowie der Internet Branche. Dazu gehören Konfigurationsmanagement und allgemeines IT Service Management, Orchestrierung und das Verständnis für die Funktionsweise komplexer Plattformen, Metriken und Alarmierung, Speicher und Netzwerke sowie Cloud und Container.&lt;/p&gt;

&lt;p&gt;Unsere Trainer haben umfangreiche Erfahrung mit Kursen zu Foreman und Katello, Puppet und Puppet Enterprise sowie Git und Gitlab.&lt;/p&gt;

&lt;p&gt;Wir freuen uns Sie und Ihre Firma bei den Themen DevOps Kultur, Agile Systemadministration und IT Automatisierung zu unterstützen.&lt;br&gt;
Schreiben Sie uns: &lt;a href="mailto:info@betadots.de"&gt;info@betadots.de&lt;/a&gt;&lt;/p&gt;

</description>
      <category>puppet</category>
      <category>automation</category>
      <category>cloud</category>
      <category>kubernetes</category>
    </item>
  </channel>
</rss>
